UNPKG

focalxaiinspection

Version:

Focalx AI Inspection

162 lines (146 loc) 6.43 kB
import React, { useRef, useState, useEffect } from 'react'; import Webcam from 'react-webcam'; import { Link, useNavigate } from 'react-router-dom'; import { Thumbs } from '../../Data/Thumbs'; import { NavigationArrows } from '../../Data/NavigationArrows'; import { BodyPart } from '../../Data/BodyPart'; import InspectImage from '../../services/Api/InspectImage'; import './BeautyshotsPage.scss'; const BeautyshotsPage = () => { const webcamRef = useRef(null); const [activeImagePreviewIndex, setActiveImagePreviewIndex] = useState(0); const [activeNavigationArrow, setActiveNavigationArrow] = useState(NavigationArrows[0]); const [activeBodyType, setActiveBodyType] = useState(BodyPart[0]); const [allImagesCaptured, setAllImagesCaptured] = useState(false); const [loading, setLoading] = useState(false); const navigate = useNavigate(); const constraints = { // facingMode: facingMode, facingMode: { exact: "environment" } // facingMode: isRearCameraAvailable ? { exact: 'environment' } : 'user' }; const handleCapturePhoto = async () => { const base64Data = webcamRef.current.getScreenshot(); const newImagePreviewIndex = activeImagePreviewIndex + 1; if (newImagePreviewIndex < Thumbs.length) { setActiveImagePreviewIndex(newImagePreviewIndex); setActiveNavigationArrow(NavigationArrows[newImagePreviewIndex]); setActiveBodyType(BodyPart[newImagePreviewIndex]); const activeImagePreview = document.querySelector('.image-preview.active'); activeImagePreview.scrollIntoView({ behavior: 'smooth', block: 'center' }); } const activeImagePreview = document.querySelector('.image-preview.active'); const blob = await (await fetch(base64Data)).blob(); let formData = new FormData(); formData.append('image_type', 'beauty-shot'); formData.append('image', blob, 'test1.jpg'); formData.append('position', 'rear-right'); //formData.append('custom_label', 'testing'); const imageUrl = window.URL.createObjectURL(blob); activeImagePreview.querySelector('img').src = imageUrl; if (newImagePreviewIndex === Thumbs.length) { setAllImagesCaptured(true); const imageUploadPromises = []; for (let i = 0; i < Thumbs.length; i++) { const base64Data_1 = document.querySelector(`.image-preview:nth-child(${i+1}) img`).src; const blob_1 = await (await fetch(base64Data_1)).blob(); let formData_1 = new FormData(); formData_1.append('image_type', 'beauty-shot'); formData_1.append('image', blob_1, `test${i+1}.jpg`); formData_1.append('position', 'rear-right'); //formData_1.append('custom_label', 'testing'); imageUploadPromises.push(InspectImage(formData_1)); } Promise.all(imageUploadPromises).then((data) => { //console.log("imageUploadPromises", data); setLoading(false); navigate('/damage-report'); }).catch(function(err) { setLoading(false); console.log(err.message); alert("Something Went Wrong. Please try Again"); navigate('/'); }); } }; const handleYes = () => { setAllImagesCaptured(false); setLoading(true); //navigate('/damage-report'); }; const handleNo = () => { setAllImagesCaptured(false); }; return ( <> <div className='phone-rotate-message'> <img src={require('../../Assets/images/rotated.svg').default} alt='' /> <h3>Please rotate your screen</h3> </div> <div className="camera-container"> <div className='image-preview-list'> {Thumbs.map((res, index) => { const {photo} = res; return ( <div className={`image-preview ${activeImagePreviewIndex === index ? 'active' : ''}`} key={index} > <img src={photo} alt={`navigation-arrow-${index}`} /> </div> ); })} </div> <Webcam className='camera' audio={false} ref={webcamRef} screenshotFormat='image/jpeg' videoConstraints={constraints} /> <div className='body-type-container'> <div className='body-type'> <img src={activeBodyType.photo} alt={`navigation-arrow-${activeImagePreviewIndex}`} /> </div> </div> <div className='camera-bottom'> <div className='navigation-arrow-container'> <div className='navigation-arrow'> {/* <img src={NavigationArrows[activeImagePreviewIndex].image} alt={`navigation-arrow-${activeImagePreviewIndex}`} /> */} <img src={activeNavigationArrow.image} alt={`navigation-arrow-${activeImagePreviewIndex}`} /> </div> </div> <button className='capture-photo' onClick={handleCapturePhoto}> {/* <img src={require('../../Assets/images/camera.svg').default} alt='' /> */} </button> {/* <button className='facing-mode' onClick={handleFacingModeToggle}> <img src={require('../../Assets/images/rotate.svg').default} alt='' /> </button> */} <Link to='/' className='close-button'> <img src={require('../../Assets/images/close-with-circle.svg').default} alt='' /> </Link> </div> {allImagesCaptured === true && ( <div className='popup-container'> <div className='popup'> <h3>Upload confirmation</h3> <p>We are proccessing your inspection. Hold on a few moments and we'll have it ready for you.</p> <div className='button-container'> <div className='cancel' onClick={handleNo}>No</div> <div className='upload' onClick={handleYes}>Yes</div> </div> </div> </div> )} {loading && ( <> <div className="lds-roller-overlay"> <div className="lds-roller"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div> </div> </> )} </div> </> ); }; export default BeautyshotsPage;