// Skincare AI Scanner Web App - Full Project (React + TailwindCSS + Webcam + TensorFlow.js) import React, { useState, useRef, useEffect } from "react"; import * as faceapi from "face-api.js"; import './App.css'; export default function App() { const videoRef = useRef(null); const canvasRef = useRef(null); const [isScanning, setIsScanning] = useState(false); const [results, setResults] = useState(null); const [manualConcerns, setManualConcerns] = useState([]); const concernsList = [ "Crows Feet", "Frown Lines", "Laugh Lines", "Dark Spots", "Red Spots", "Dry Skin", "Oily Skin", ]; const productRecommendations = { "Crows Feet": { name: "Peptide Firming Eye Cream", benefit: "Reduces fine lines and firms skin." }, "Frown Lines": { name: "Retinol Repair Serum", benefit: "Smooths deep wrinkles and boosts collagen." }, "Laugh Lines": { name: "Hyaluronic Filler Gel", benefit: "Plumps skin and restores moisture." }, "Dark Spots": { name: "Vitamin C Brightening Serum", benefit: "Fades pigmentation and evens tone." }, "Red Spots": { name: "Calming Chamomile Cream", benefit: "Soothes redness and irritation." }, "Dry Skin": { name: "Deep Hydration Cream", benefit: "Locks in moisture for all-day hydration." }, "Oily Skin": { name: "Mattifying Gel Moisturizer", benefit: "Controls shine and balances oil." }, }; useEffect(() => { Promise.all([ faceapi.nets.tinyFaceDetector.loadFromUri('/models'), faceapi.nets.faceLandmark68Net.loadFromUri('/models') ]).then(() => console.log("Models loaded")); }, []); const handleStartScan = async () => { setIsScanning(true); try { const stream = await navigator.mediaDevices.getUserMedia({ video: true }); if (videoRef.current) { videoRef.current.srcObject = stream; videoRef.current.play(); } setTimeout(async () => { const detections = await faceapi.detectSingleFace(videoRef.current, new faceapi.TinyFaceDetectorOptions()).withFaceLandmarks(); const canvas = canvasRef.current; canvas.innerHTML = ''; faceapi.matchDimensions(canvas, { width: 480, height: 360 }); const resized = faceapi.resizeResults(detections, { width: 480, height: 360 }); faceapi.draw.drawDetections(canvas, resized); faceapi.draw.drawFaceLandmarks(canvas, resized); const simulatedIssues = concernsList.sort(() => 0.5 - Math.random()).slice(0, 3); setResults(simulatedIssues); setIsScanning(false); stream.getTracks().forEach((track) => track.stop()); }, 5000); } catch (err) { alert("Error accessing webcam."); setIsScanning(false); } }; const toggleManualConcern = (concern) => { setManualConcerns((prev) => prev.includes(concern) ? prev.filter((c) => c !== concern) : [...prev, concern] ); }; return (

MySkin AI

? Manual Entry of Concerns

{concernsList.map((concern) => ( ))}
{manualConcerns.length > 0 && (

Recommended Products

{manualConcerns.map((c) => (
{productRecommendations[c].name}: {productRecommendations[c].benefit}
))}
)}

? Real-Time Skin Scanner

{results && (

Scan Results:

{results.map((r) => (
{r}: {productRecommendations[r].name} — {productRecommendations[r].benefit}
))}
)}
); }