@davi-ai/retorik-framework 4.0.2 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/{AttachmentDetail.53ba969a.js → AttachmentDetail.637ad44f.js} +2 -2
  2. package/dist/{AttachmentDetail.53ba969a.js.map → AttachmentDetail.637ad44f.js.map} +1 -1
  3. package/dist/{AttachmentDetail.37a709af.js → AttachmentDetail.83788045.js} +2 -2
  4. package/dist/{AttachmentDetail.37a709af.js.map → AttachmentDetail.83788045.js.map} +1 -1
  5. package/dist/{Emergency.1e63c85f.js → Emergency.1112c09f.js} +6 -6
  6. package/dist/Emergency.1112c09f.js.map +1 -0
  7. package/dist/{Emergency.89b4d9ed.js → Emergency.d5810ff2.js} +6 -6
  8. package/dist/Emergency.d5810ff2.js.map +1 -0
  9. package/dist/{NewsContainer.c3331d80.js → NewsContainer.463e74de.js} +2 -2
  10. package/dist/{NewsContainer.c3331d80.js.map → NewsContainer.463e74de.js.map} +1 -1
  11. package/dist/{NewsContainer.c0a24775.js → NewsContainer.d9de093c.js} +2 -2
  12. package/dist/{NewsContainer.c0a24775.js.map → NewsContainer.d9de093c.js.map} +1 -1
  13. package/dist/{PrintingPreview.6d70355b.js → PrintingPreview.375e62b0.js} +2 -2
  14. package/dist/PrintingPreview.375e62b0.js.map +1 -0
  15. package/dist/{PrintingPreview.5351c733.js → PrintingPreview.c0ca7706.js} +2 -2
  16. package/dist/PrintingPreview.c0ca7706.js.map +1 -0
  17. package/dist/{ThreeJsWrapper.4302165c.js → ThreeJsWrapper.c02a077f.js} +1 -4
  18. package/dist/ThreeJsWrapper.c02a077f.js.map +1 -0
  19. package/dist/{ThreeJsWrapper.cb253b3a.js → ThreeJsWrapper.dd4906ff.js} +1 -4
  20. package/dist/ThreeJsWrapper.dd4906ff.js.map +1 -0
  21. package/dist/{VeilleManager.26dcadac.js → VeilleManager.85967e7c.js} +8 -5
  22. package/dist/VeilleManager.85967e7c.js.map +1 -0
  23. package/dist/{VeilleManager.72cf0e9c.js → VeilleManager.f3bafdec.js} +8 -5
  24. package/dist/VeilleManager.f3bafdec.js.map +1 -0
  25. package/dist/{Weather.bb414852.js → Weather.7e945307.js} +17 -75
  26. package/dist/Weather.7e945307.js.map +1 -0
  27. package/dist/{Weather.ced9b467.js → Weather.e81b7205.js} +17 -75
  28. package/dist/Weather.e81b7205.js.map +1 -0
  29. package/dist/index.d.ts +25 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +7396 -6324
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.modern.js +7386 -6318
  34. package/dist/index.modern.js.map +1 -1
  35. package/package.json +3 -3
  36. package/dist/Emergency.1e63c85f.js.map +0 -1
  37. package/dist/Emergency.89b4d9ed.js.map +0 -1
  38. package/dist/PrintingPreview.5351c733.js.map +0 -1
  39. package/dist/PrintingPreview.6d70355b.js.map +0 -1
  40. package/dist/ThreeJsWrapper.4302165c.js.map +0 -1
  41. package/dist/ThreeJsWrapper.cb253b3a.js.map +0 -1
  42. package/dist/VeilleManager.26dcadac.js.map +0 -1
  43. package/dist/VeilleManager.72cf0e9c.js.map +0 -1
  44. package/dist/Weather.bb414852.js.map +0 -1
  45. package/dist/Weather.ced9b467.js.map +0 -1
@@ -72,9 +72,6 @@ const $929a5fce6d871a46$var$ThreeJsWrapper = ({ agentData: agentData, visible: v
72
72
  case (0, $7WHA7.Source3DEngine).cc3:
73
73
  case (0, $7WHA7.Source3DEngine).cc4:
74
74
  return (0, $4gYsi$daviaireactbodyenginethree.CreationTool).cc3;
75
- case (0, $7WHA7.Source3DEngine).rpm:
76
- case (0, $7WHA7.Source3DEngine).readyplayerme:
77
- return (0, $4gYsi$daviaireactbodyenginethree.CreationTool).rpm;
78
75
  case (0, $7WHA7.Source3DEngine).avaturn:
79
76
  default:
80
77
  return (0, $4gYsi$daviaireactbodyenginethree.CreationTool).avaturn;
@@ -663,4 +660,4 @@ var $8d9a75d3aaaf531b$export$2e2bcd8739ae039 = $8d9a75d3aaaf531b$var$FaceDetecto
663
660
 
664
661
 
665
662
 
666
- //# sourceMappingURL=ThreeJsWrapper.4302165c.js.map
663
+ //# sourceMappingURL=ThreeJsWrapper.c02a077f.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/components/ChatbotAndSubtitles/ThreeJsWrapper.tsx","src/components/ChatbotAndSubtitles/CalibrationScreen.tsx","src/components/Veille/FaceDetector.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\r\nimport { Character, CreationTool, setCharacterState, addViseme, setVisemes, flushLipSyncData, CharacterState, presets, Object3D } from '@davi-ai/react-bodyengine-three'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport type { CalibrationData } from '../../store/models/types'\r\nimport { RecognitionState, Source3DEngine } from '../../models/enums'\r\nimport MicrophoneLoader from '../Loader/MicrophoneLoader'\r\nimport CalibrationScreen from './CalibrationScreen'\r\n\r\ninterface EyeTrackingData {\r\n webcamHeight: number\r\n webcamRotation: number\r\n ratioPixelToCentimeter: number\r\n agentEyesHeight: number\r\n distanceFromDevice: number\r\n worldDistancePerDegree: number\r\n cameraX: number\r\n cameraZ: number\r\n}\r\n\r\ninterface ThreeJsWrapperAgentData {\r\n url: string\r\n animationsUrl?: string\r\n source?: string\r\n gender: 'male' | 'female' | 'other'\r\n}\r\n\r\ninterface ThreeJsWrapperProps {\r\n agentData: ThreeJsWrapperAgentData\r\n visible: boolean\r\n height?: string | number\r\n size?: string | number\r\n cameraPreset?: keyof typeof presets\r\n calibration?: CalibrationData\r\n centered: boolean\r\n}\r\n\r\nconst ThreeJsWrapper = ({ agentData, visible, height, size, cameraPreset, calibration, centered }: ThreeJsWrapperProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const gpuData = useSelector((state: RootState) => state.retorikReducer.gpuData)\r\n const speaking = useSelector((state: RootState) => state.speechReducer.speaking)\r\n const loaderClosed = useSelector((state: RootState) => state.retorikReducer.loaderClosed)\r\n const recognitionState = useSelector((state: RootState) => state.speechReducer.activeRecognitionState)\r\n const lastRecognitionInterim = useSelector((state: RootState) => state.speechReducer.lastRecognitionInterim)\r\n const singleViseme = useSelector((state: RootState) => state.speechReducer.singleVisemeAdded)\r\n const multiVisemes = useSelector((state: RootState) => state.speechReducer.multiVisemesAdded)\r\n const streamingQueue = useSelector((state: RootState) => state.speechReducer.streamingQueue)\r\n const characterLoaded = useSelector((state: RootState) => state.viewReducer.characterLoaded)\r\n const isMobile = useSelector((state: RootState) => state.viewReducer.isMobile)\r\n\r\n const [targets, setTargets] = useState<Array<Object3D>>([])\r\n const [dynamicData, setDynamicData] = useState<\r\n | {\r\n webcamHeight: number\r\n ratioPixelToCentimeter: number\r\n deltaAgentHeightAgentWorldHeightInCentimeters: number\r\n cameraRotationInDegrees: number\r\n distanceFromAgentToCameraInCentimeters: number\r\n }\r\n | undefined\r\n >(undefined)\r\n const [openCalibration, setOpenCalibration] = useState<boolean>(false)\r\n\r\n /**\r\n * Use model's source to get the right loader. Default to avaturn loader\r\n */\r\n const type = useMemo<CreationTool | null>(() => {\r\n if (agentData.source) {\r\n switch (agentData.source.toLowerCase()) {\r\n case Source3DEngine.avatarsdk:\r\n case Source3DEngine.avatarsdkbis:\r\n return CreationTool.avatarsdk\r\n case Source3DEngine.cc3:\r\n case Source3DEngine.cc4:\r\n return CreationTool.cc3\r\n case Source3DEngine.avaturn:\r\n default:\r\n return CreationTool.avaturn\r\n }\r\n }\r\n\r\n return CreationTool.avaturn\r\n }, [agentData])\r\n\r\n useEffect(() => {\r\n if ((!calibration?.static?.enabled && !calibration?.dynamic?.enabled) || isMobile) dispatch(storeActions.view.setCalibrationCompleted(true))\r\n }, [calibration, isMobile])\r\n\r\n useEffect(() => {\r\n // Check if we should open the calibration screen or not\r\n if ((calibration?.static?.enabled || calibration?.dynamic?.enabled) && !isMobile) {\r\n // If there are some static data in the props or the local storage, we can directly set the targets without opening the calibration screen\r\n if (calibration?.static?.enabled && calibration.static.staticTarget) {\r\n const o = new Object3D()\r\n o.position.set(calibration.static.staticTarget.x, calibration.static.staticTarget.y, calibration.static.staticTarget.z)\r\n setTargets([o])\r\n setOpenCalibration(false)\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n } else if (calibration?.static?.enabled && calibration.static.loadStaticTargetFromLocalStorage && localStorage.getItem('Retorik.Framework.Static.Target')) {\r\n const calibrationData = JSON.parse(localStorage.getItem('Retorik.Framework.Static.Target') || '{}') as {\r\n x: number\r\n y: number\r\n z: number\r\n }\r\n const o = new Object3D()\r\n o.position.set(calibrationData.x, calibrationData.y, calibrationData.z)\r\n setTargets([o])\r\n setOpenCalibration(false)\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n } else if (calibration.dynamic?.enabled && calibration.dynamic.dynamicData) {\r\n // Check if all the mandatory dynamic data are in the props\r\n if (\r\n calibration.dynamic.dynamicData.webcamHeight &&\r\n calibration.dynamic.dynamicData.ratioPixelToCentimeter &&\r\n calibration.dynamic.dynamicData.deltaAgentHeightAgentWorldHeightInCentimeters &&\r\n calibration.dynamic.dynamicData.distanceFromAgentToCameraInCentimeters\r\n ) {\r\n setDynamicData({ ...calibration.dynamic.dynamicData, cameraRotationInDegrees: calibration.dynamic.dynamicData.cameraRotationInDegrees || 0 })\r\n }\r\n\r\n setOpenCalibration(true)\r\n } else if (calibration.dynamic?.enabled && calibration.dynamic.loadDynamicDataFromLocalStorage && localStorage.getItem('Retorik.Framework.Dynamic.Data')) {\r\n // Check if the local storage data is complete\r\n const calibrationData = JSON.parse(localStorage.getItem('Retorik.Framework.Dynamic.Data') || '{}')\r\n if (\r\n calibrationData.webcamHeight &&\r\n calibrationData.ratioPixelToCentimeter &&\r\n calibrationData.deltaAgentHeightAgentWorldHeightInCentimeters &&\r\n calibrationData.distanceFromAgentToCameraInCentimeters\r\n ) {\r\n setDynamicData({ ...calibrationData, cameraRotationInDegrees: calibrationData.cameraRotationInDegrees || 0 })\r\n }\r\n\r\n setOpenCalibration(true)\r\n } else {\r\n setOpenCalibration(true)\r\n }\r\n } else {\r\n setOpenCalibration(false)\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n }\r\n }, [calibration, isMobile])\r\n\r\n useEffect(() => {\r\n singleViseme && addViseme(singleViseme)\r\n }, [singleViseme])\r\n\r\n useEffect(() => {\r\n multiVisemes.length && setVisemes(multiVisemes)\r\n }, [multiVisemes])\r\n\r\n useEffect(() => {\r\n if (speaking || streamingQueue.length) {\r\n setCharacterState(CharacterState.speaking)\r\n } else if (recognitionState === RecognitionState.Closed) {\r\n setCharacterState(CharacterState.idle)\r\n } else if (lastRecognitionInterim) {\r\n setCharacterState(CharacterState.listening)\r\n } else {\r\n setCharacterState(CharacterState.waiting)\r\n }\r\n }, [speaking, recognitionState, lastRecognitionInterim, streamingQueue])\r\n\r\n useEffect(() => {\r\n !speaking && flushLipSyncData()\r\n }, [speaking])\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n style={{\r\n height: size || '100%',\r\n paddingTop: height || 0,\r\n visibility: characterLoaded && visible ? 'visible' : 'hidden'\r\n }}\r\n >\r\n {type && (\r\n <Character\r\n url={agentData.url}\r\n type={type}\r\n animationsUrl={agentData?.animationsUrl || 'https://cdn.retorik.ai/bodyengine-three/animations/cc4/female/standing/'}\r\n gender={agentData?.gender === 'male' ? 'male' : 'female'}\r\n onLoadingCompleted={() => dispatch(storeActions.view.setCharacterLoaded(true))}\r\n camera={presets[cameraPreset || 'default']}\r\n targets={targets}\r\n autoLookAt={true}\r\n detectGpuData={gpuData}\r\n license='fake-license'\r\n />\r\n )}\r\n </div>\r\n {!characterLoaded && (\r\n <div className='rf-absolute rf-top-0 rf-left-0 rf-w-full rf-h-full rf-flex rf-justify-center rf-items-center'>\r\n <div className='rf-w-1/4 rf-aspect-square'>\r\n <MicrophoneLoader />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {openCalibration && loaderClosed && (\r\n <CalibrationScreen\r\n centered={centered}\r\n staticCalibrationEnabled={!!calibration?.static?.enabled}\r\n dynamicCalibrationEnabled={!!calibration?.dynamic?.enabled}\r\n setTargets={(targets: Array<Object3D>) => setTargets(targets)}\r\n dynamicData={dynamicData}\r\n />\r\n )}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default ThreeJsWrapper\r\nexport type { EyeTrackingData }\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport { Object3D, getCameraPosition, getCharacterHeight, setLookAtCamera, setShowFirstTarget } from '@davi-ai/react-bodyengine-three'\r\nimport type { Detection } from '@mediapipe/tasks-vision'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport FaceDetector from '../Veille/FaceDetector'\r\n\r\ninterface CalibrationScreenProps {\r\n centered: boolean\r\n staticCalibrationEnabled: boolean\r\n dynamicCalibrationEnabled: boolean\r\n dynamicData?: {\r\n webcamHeight: number\r\n ratioPixelToCentimeter: number\r\n deltaAgentHeightAgentWorldHeightInCentimeters: number\r\n cameraRotationInDegrees: number\r\n distanceFromAgentToCameraInCentimeters: number\r\n }\r\n setTargets: (targets: Array<Object3D>) => void\r\n}\r\n\r\nenum CalibrationMode {\r\n none = 1,\r\n static,\r\n dynamic\r\n}\r\n\r\nconst CalibrationScreen = ({ centered, staticCalibrationEnabled, dynamicCalibrationEnabled, dynamicData, setTargets }: CalibrationScreenProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const cameraPosition = getCameraPosition()\r\n const characterHeight = getCharacterHeight()\r\n const characterLoaded = useSelector((state: RootState) => state.viewReducer.characterLoaded)\r\n const calibrationCompleted = useSelector((state: RootState) => state.viewReducer.calibrationCompleted)\r\n\r\n const [calibrationMode, setCalibrationMode] = useState<CalibrationMode>(dynamicData ? CalibrationMode.dynamic : CalibrationMode.none)\r\n const [distanceFromDevice, setDistanceFromDevice] = useState<number>(dynamicData?.distanceFromAgentToCameraInCentimeters || 0)\r\n const [webcamRotation, setWebcamRotation] = useState<number>(0)\r\n const [agentEyesHeightOnScreen, setAgentEyesHeightOnScreen] = useState<number>(0)\r\n const [worldDistancePerDegree, setWorldDistancePerDegree] = useState<number>(0)\r\n const [currentAngleInDegrees, setCurrentAngleInDegrees] = useState<number>(0)\r\n const [cameraX, setCameraX] = useState<number>(0)\r\n const [cameraY, setCameraY] = useState<number>(0)\r\n const [cameraZ, setCameraZ] = useState<number>(0)\r\n\r\n const cameraXRef = useRef<number>(0)\r\n const cameraYRef = useRef<number>(0)\r\n const cameraZRef = useRef<number>(0)\r\n const currentAngleInDegreesRef = useRef<number>(0)\r\n const webcamHeightRef = useRef<number>(dynamicData?.webcamHeight || 0)\r\n const userEyesHeightRef = useRef<number>(0)\r\n const agentEyesHeightRef = useRef<number>(0)\r\n const distanceFromDeviceRef = useRef<number>(0)\r\n const webcamRotatedRef = useRef<number>(dynamicData?.cameraRotationInDegrees || 0)\r\n const deltaAgentHeightAgentWorldHeightInCentimetersRef = useRef<number>(dynamicData?.deltaAgentHeightAgentWorldHeightInCentimeters || 0)\r\n const ratioPixelToCentimeterRef = useRef<number>(dynamicData?.ratioPixelToCentimeter || 0)\r\n const calibrationCompletedRef = useRef<boolean>(calibrationCompleted)\r\n const counterRef = useRef<number>(0)\r\n\r\n useEffect(() => {\r\n // If dynamic data are given, let's validate immediately to set calibratoin as completed\r\n dynamicData && handleValidate()\r\n }, [])\r\n\r\n useEffect(() => {\r\n characterLoaded && !dynamicData && setLookAtCamera(true)\r\n\r\n return () => {\r\n setLookAtCamera(false)\r\n }\r\n }, [characterLoaded])\r\n\r\n useEffect(() => {\r\n if (worldDistancePerDegree && !dynamicData) {\r\n const o = new Object3D()\r\n o.position.set(cameraX, cameraY + currentAngleInDegrees * worldDistancePerDegree, Math.max(cameraZ / 5, 0.3))\r\n setTargets([o])\r\n }\r\n }, [currentAngleInDegrees, worldDistancePerDegree, distanceFromDevice, cameraX, cameraY, cameraZ])\r\n\r\n useEffect(() => {\r\n if (cameraPosition && !(cameraPosition.x === 0 && cameraPosition.y === 0)) {\r\n const zDistanceCameraPlusUser = cameraPosition.z + distanceFromDevice / 100\r\n setCameraX(cameraPosition.x)\r\n setCameraY(cameraPosition.y)\r\n setCameraZ(zDistanceCameraPlusUser)\r\n cameraXRef.current = cameraPosition.x\r\n cameraYRef.current = cameraPosition.y\r\n cameraZRef.current = zDistanceCameraPlusUser\r\n // Get Y world distance for one degree using tangent. The z distance is divided by 5 with 0.3 at the lowest to show a visible height bar when calibrating\r\n setWorldDistancePerDegree(Math.tan(Math.PI / 180) * Math.max(zDistanceCameraPlusUser / 5, 0.3))\r\n }\r\n }, [cameraPosition, distanceFromDevice])\r\n\r\n useEffect(() => {\r\n if (!dynamicData) {\r\n characterHeight && agentEyesHeightOnScreen && (deltaAgentHeightAgentWorldHeightInCentimetersRef.current = (characterHeight - characterHeight / 16) * 100 - agentEyesHeightOnScreen)\r\n }\r\n }, [characterHeight, agentEyesHeightOnScreen])\r\n\r\n useEffect(() => {\r\n !dynamicData && (webcamRotatedRef.current = webcamRotation)\r\n }, [webcamRotation])\r\n\r\n useEffect(() => {\r\n calibrationCompletedRef.current = calibrationCompleted\r\n }, [calibrationCompleted])\r\n\r\n useEffect(() => {\r\n if (!dynamicData && calibrationMode === CalibrationMode.static) {\r\n setShowFirstTarget(!calibrationCompleted)\r\n }\r\n }, [calibrationMode, calibrationCompleted])\r\n\r\n const handleReset = () => {\r\n setCurrentAngleInDegrees(0)\r\n currentAngleInDegreesRef.current = 0\r\n }\r\n\r\n const handleValidate = () => {\r\n setLookAtCamera(false)\r\n if (calibrationMode === CalibrationMode.static) {\r\n // In static mode, store the target in local storage to be able to reuse it later and avoid asking the user to calibrate again if the data are valid\r\n localStorage.setItem('Retorik.Framework.Static.Target', JSON.stringify({ x: cameraX, y: cameraY + currentAngleInDegrees * worldDistancePerDegree, z: cameraZ }))\r\n } else if (calibrationMode === CalibrationMode.dynamic && ratioPixelToCentimeterRef.current) {\r\n localStorage.setItem(\r\n 'Retorik.Framework.Dynamic.Data',\r\n JSON.stringify({\r\n webcamHeight: webcamHeightRef.current,\r\n ratioPixelToCentimeter: ratioPixelToCentimeterRef.current,\r\n deltaAgentHeightAgentWorldHeightInCentimeters: deltaAgentHeightAgentWorldHeightInCentimetersRef.current,\r\n cameraRotationInDegrees: webcamRotatedRef.current,\r\n distanceFromAgentToCameraInCentimeters: distanceFromDeviceRef.current\r\n })\r\n )\r\n setTargets([])\r\n }\r\n\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n }\r\n\r\n const handleFaceDetected = (detections?: Array<Detection>, width?: number, height?: number): void => {\r\n counterRef.current++\r\n if (detections?.length && width && height) {\r\n // The detections are inverted in X and Y axis (the origin is the top right corner of the image)\r\n const webcamPositionY = webcamRotatedRef.current === 0 ? height / 2 : width / 2\r\n const userPositionY = webcamRotatedRef.current === 0 ? height * (1 - detections[0].keypoints[0].y) : width * (1 - detections[0].keypoints[0].x)\r\n\r\n if (calibrationCompletedRef.current) {\r\n // Check if the mandatory data have been filled (webcam / agent / user heights + distance user <-> device)\r\n if (webcamHeightRef.current && ratioPixelToCentimeterRef.current && deltaAgentHeightAgentWorldHeightInCentimetersRef.current !== 0) {\r\n const deltaHeightInPixels = webcamPositionY - userPositionY\r\n const userEyesHeightInCentimeters = webcamHeightRef.current - deltaHeightInPixels * ratioPixelToCentimeterRef.current\r\n const targetYInWorldCoordinates = (userEyesHeightInCentimeters + deltaAgentHeightAgentWorldHeightInCentimetersRef.current) / 100\r\n\r\n const o = new Object3D()\r\n o.position.set(cameraXRef.current, targetYInWorldCoordinates, cameraZRef.current)\r\n setTargets([o])\r\n }\r\n } else {\r\n // The detections are inverted in X and Y axis (the origin is the top right corner of the image)\r\n if (webcamHeightRef.current && userEyesHeightRef.current && distanceFromDeviceRef.current) {\r\n // Get the difference in height between the webcam and the user's eyes in cm, then use the detection to get the same difference in pixels on the webcam's image\r\n const deltaHeightInCentimeters = Math.abs(webcamHeightRef.current - userEyesHeightRef.current)\r\n const deltaHeightInPixels = Math.abs(webcamPositionY - userPositionY)\r\n\r\n deltaHeightInPixels && (ratioPixelToCentimeterRef.current = deltaHeightInCentimeters / deltaHeightInPixels)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n id='retorik-framework-animation-container-calibration'\r\n className={`rf-absolute rf-top-0 rf-h-full rf-w-full rf-grid rf-grid-cols-1 rf-grid-rows-1 ${!centered && 'landscape-retorik:rf-translate-x-1/4'}`}\r\n >\r\n {calibrationMode === CalibrationMode.dynamic && (\r\n <div className='rf-relative rf-z-1 rf-h-full rf-w-full rf-col-start-1 rf-col-span-1 rf-row-start-1 rf-row-span-1 rf-flex rf-justify-start rf-items-start'>\r\n <FaceDetector detectionThreshold={0.8} onFaceDetected={handleFaceDetected} showThumbnail={!calibrationCompleted} rotation={webcamRotation} />\r\n </div>\r\n )}\r\n\r\n {!calibrationCompleted && (\r\n <React.Fragment>\r\n {calibrationMode === CalibrationMode.none ? (\r\n <div className='rf-h-full rf-w-full rf-col-start-1 rf-col-span-1 rf-row-start-1 rf-row-span-1 rf-flex rf-flex-col rf-justify-center rf-items-center rf-gap-4 rf-bg-white rf-bg-opacity-50'>\r\n <p className='rf-text-medium-size-auto'>Choisissez un mode de calibrage :</p>\r\n <div className='rf-flex rf-flex-row rf-gap-4'>\r\n {staticCalibrationEnabled && (\r\n <div\r\n className='rf-px-4 rf-py-2 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer'\r\n onClick={() => setCalibrationMode(CalibrationMode.static)}\r\n >\r\n STATIQUE\r\n </div>\r\n )}\r\n\r\n {dynamicCalibrationEnabled && (\r\n <div\r\n className='rf-px-4 rf-py-2 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer'\r\n onClick={() => setCalibrationMode(CalibrationMode.dynamic)}\r\n >\r\n DYNAMIQUE\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <div className='rf-relative rf-h-full rf-w-full rf-col-start-1 rf-col-span-1 rf-row-start-1 rf-row-span-1 rf-flex rf-flex-col rf-justify-center rf-gap-4'>\r\n {calibrationMode === CalibrationMode.dynamic ? (\r\n <div className='rf-absolute rf-left-32 rf-flex rf-flex-col rf-justify-center rf-items-center rf-gap-4'>\r\n <div className='rf-grid rf-grid-cols-2 rf-grid-rows-3 rf-gap-4'>\r\n <p className='rf-font-bold'>Hauteur webcam (en cm)</p>\r\n <input\r\n type='number'\r\n min={0}\r\n max={300}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n webcamHeightRef.current = parseInt(e.target.value!)\r\n }}\r\n />\r\n <p className='rf-font-bold'>Votre taille (en cm)</p>\r\n <input\r\n type='number'\r\n min={50}\r\n max={300}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n // We estimate the height of the user's eyes is 12 cm less than their total height\r\n userEyesHeightRef.current = parseInt(e.target.value!) - 12\r\n }}\r\n />\r\n <p className='rf-font-bold'>Hauteur des yeux de l'agent (en cm)</p>\r\n <input\r\n type='number'\r\n min={50}\r\n max={300}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n setAgentEyesHeightOnScreen(parseInt(e.target.value!))\r\n agentEyesHeightRef.current = parseInt(e.target.value!)\r\n }}\r\n />\r\n <p className='rf-font-bold'>Distance utilisateur - borne (en cm)</p>\r\n <input\r\n type='number'\r\n min={20}\r\n max={100}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n setDistanceFromDevice(parseInt(e.target.value!))\r\n distanceFromDeviceRef.current = parseInt(e.target.value!)\r\n }}\r\n />\r\n <p className='rf-font-bold'>Rotation de la webcam (en degrés)</p>\r\n <div className='rf-flex rf-flex-row rf-gap-2'>\r\n <button\r\n className={`rf-px-2 rf-py-1 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer ${webcamRotation === 0 && 'rf-bg-opacity-100'}`}\r\n onClick={() => setWebcamRotation(0)}\r\n >\r\n 0\r\n </button>\r\n <button\r\n className={`rf-px-2 rf-py-1 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer ${webcamRotation === 90 && 'rf-bg-opacity-100'}`}\r\n onClick={() => setWebcamRotation(90)}\r\n >\r\n 90\r\n </button>\r\n <button\r\n className={`rf-px-2 rf-py-1 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer ${webcamRotation === -90 && 'rf-bg-opacity-100'}`}\r\n onClick={() => setWebcamRotation(-90)}\r\n >\r\n -90\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className='rf-h-16 rf-w-16 rf-flex rf-justify-center rf-items-center rf-bg-white rf-border rf-border-black rf-rounded-lg hover: rf-cursor-pointer' onClick={handleValidate}>\r\n Done\r\n </div>\r\n </div>\r\n ) : (\r\n <div className='rf-ml-4 rf-flex rf-flex-col rf-gap-4'>\r\n <div className='rf-flex rf-flex-row rf-items-center rf-gap-4'>\r\n <input\r\n type='range'\r\n min={-25}\r\n max={25}\r\n step={1}\r\n value={currentAngleInDegrees}\r\n onChange={(e) => {\r\n const val = parseInt(e.target.value)\r\n setCurrentAngleInDegrees(val)\r\n currentAngleInDegreesRef.current = val\r\n }}\r\n className='rf-range-vertical rf-w-8 rf-h-80 rf-appearance-none rf-border rf-border-black rf-rounded-lg rf-cursor-pointer'\r\n style={{ writingMode: 'vertical-lr', direction: 'rtl' }}\r\n />\r\n <div className='rf-w-fit rf-p-4 rf-flex rf-flex-col rf-justify-center rf-gap-2 rf-bg-white rf-border rf-border-black rf-rounded-lg'>\r\n <p>Position actuelle de la cible : </p>\r\n <p>{`x: ${cameraX}`}</p>\r\n <p>{`y: ${cameraY + (currentAngleInDegrees ? currentAngleInDegrees * worldDistancePerDegree : 0)}`}</p>\r\n <p>{`z: ${Math.max(cameraZ / 5, 0.3)}`}</p>\r\n <p>{`angle: ${currentAngleInDegrees}°`}</p>\r\n </div>\r\n </div>\r\n\r\n <div className='rf-flex rf-flex-row rf-gap-2'>\r\n <div className='rf-h-10 rf-px-4 rf-flex rf-justify-center rf-items-center rf-bg-white rf-border rf-border-black rf-rounded-lg rf-cursor-pointer' onClick={() => handleReset()}>\r\n Reset\r\n </div>\r\n <div className='rf-h-10 rf-px-4 rf-flex rf-justify-center rf-items-center rf-bg-white rf-border rf-border-black rf-rounded-lg rf-cursor-pointer' onClick={handleValidate}>\r\n Done\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </React.Fragment>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default CalibrationScreen\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { FaceDetector as MediapipeFaceDetector, FilesetResolver, Detection } from '@mediapipe/tasks-vision'\r\n\r\ninterface FaceDetectorProps {\r\n detectionThreshold: number\r\n onFaceDetected: (detections?: Array<Detection>, imageWidth?: number, imageHeight?: number) => void\r\n showThumbnail?: boolean\r\n rotation?: number\r\n}\r\n\r\nconst runningMode = 'VIDEO'\r\nlet lastVideoTime = -1\r\nconst defaultConstraints: MediaStreamConstraints = {\r\n video: {\r\n facingMode: 'user'\r\n }\r\n}\r\n\r\nconst FaceDetector = ({ detectionThreshold, onFaceDetected, showThumbnail, rotation }: FaceDetectorProps): JSX.Element => {\r\n const [webcamWidth, setWebcamWidth] = useState<number>(0)\r\n const [webcamHeight, setWebcamHeight] = useState<number>(0)\r\n const [faceDetector, setFaceDetector] = useState<MediapipeFaceDetector | undefined>()\r\n const videoRef = useRef<HTMLVideoElement>(null)\r\n const rotationRef = useRef<number>(rotation || 0)\r\n\r\n useEffect(() => {\r\n rotationRef.current = rotation || 0\r\n }, [rotation])\r\n\r\n useEffect(() => {\r\n const createfaceDetector = async () => {\r\n const vision = await FilesetResolver.forVisionTasks('https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm')\r\n const newFaceDetector = await MediapipeFaceDetector.createFromOptions(vision, {\r\n baseOptions: {\r\n modelAssetPath: `https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite`,\r\n delegate: 'GPU'\r\n },\r\n runningMode: runningMode\r\n })\r\n\r\n newFaceDetector && setFaceDetector(newFaceDetector)\r\n }\r\n\r\n const initializefaceDetector = async () => {\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((display) => {\r\n const settings = display.getVideoTracks()[0].getSettings()\r\n setWebcamWidth(settings.width || 0)\r\n setWebcamHeight(settings.height || 0)\r\n createfaceDetector()\r\n })\r\n .catch((error) => console.warn('Retorik Framework > an error occured when trying to use the webcam : ', error))\r\n }\r\n\r\n initializefaceDetector()\r\n }, [])\r\n\r\n const predictWebcam = async () => {\r\n if (faceDetector && videoRef.current) {\r\n let startTimeMs = performance.now()\r\n\r\n // Detect faces using detectForVideo\r\n if (videoRef.current.currentTime !== lastVideoTime) {\r\n lastVideoTime = videoRef.current.currentTime\r\n const detections = faceDetector.detectForVideo(videoRef.current, startTimeMs, { rotationDegrees: rotationRef.current }).detections\r\n\r\n if (detections.length) {\r\n const score = detections[0].categories[0].score\r\n score > detectionThreshold && onFaceDetected(detections, videoRef.current.videoWidth, videoRef.current.videoHeight)\r\n }\r\n }\r\n }\r\n\r\n // Call this function again to keep predicting when the browser is ready\r\n window.requestAnimationFrame(predictWebcam)\r\n }\r\n\r\n useEffect(() => {\r\n if (faceDetector && videoRef.current) {\r\n // Activate the webcam stream\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((stream) => {\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = stream\r\n videoRef.current.addEventListener('loadeddata', predictWebcam)\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n })\r\n }\r\n }, [faceDetector])\r\n\r\n return (\r\n <div id='retorik-framework-face-detector' className={`rf-absolute rf-top-0 rf-left-0 ${!showThumbnail && 'rf-invisible'}`}>\r\n <video\r\n ref={videoRef}\r\n src=''\r\n autoPlay\r\n style={{\r\n rotate: `${rotation}deg`,\r\n width: showThumbnail ? webcamWidth / 2 : webcamWidth,\r\n height: showThumbnail ? webcamHeight / 2 : webcamHeight\r\n }}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default FaceDetector\r\n"],"names":[],"version":3,"file":"ThreeJsWrapper.c02a077f.js.map","sourceRoot":"../"}
@@ -58,9 +58,6 @@ const $22f0b0bb3c6ec1e7$var$ThreeJsWrapper = ({ agentData: agentData, visible: v
58
58
  case (0, $4ucVo.Source3DEngine).cc3:
59
59
  case (0, $4ucVo.Source3DEngine).cc4:
60
60
  return (0, $313pz$CreationTool).cc3;
61
- case (0, $4ucVo.Source3DEngine).rpm:
62
- case (0, $4ucVo.Source3DEngine).readyplayerme:
63
- return (0, $313pz$CreationTool).rpm;
64
61
  case (0, $4ucVo.Source3DEngine).avaturn:
65
62
  default:
66
63
  return (0, $313pz$CreationTool).avaturn;
@@ -646,4 +643,4 @@ var $741aef3293d0db11$export$2e2bcd8739ae039 = $741aef3293d0db11$var$FaceDetecto
646
643
 
647
644
 
648
645
 
649
- //# sourceMappingURL=ThreeJsWrapper.cb253b3a.js.map
646
+ //# sourceMappingURL=ThreeJsWrapper.dd4906ff.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/components/ChatbotAndSubtitles/ThreeJsWrapper.tsx","src/components/ChatbotAndSubtitles/CalibrationScreen.tsx","src/components/Veille/FaceDetector.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\r\nimport { Character, CreationTool, setCharacterState, addViseme, setVisemes, flushLipSyncData, CharacterState, presets, Object3D } from '@davi-ai/react-bodyengine-three'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport type { CalibrationData } from '../../store/models/types'\r\nimport { RecognitionState, Source3DEngine } from '../../models/enums'\r\nimport MicrophoneLoader from '../Loader/MicrophoneLoader'\r\nimport CalibrationScreen from './CalibrationScreen'\r\n\r\ninterface EyeTrackingData {\r\n webcamHeight: number\r\n webcamRotation: number\r\n ratioPixelToCentimeter: number\r\n agentEyesHeight: number\r\n distanceFromDevice: number\r\n worldDistancePerDegree: number\r\n cameraX: number\r\n cameraZ: number\r\n}\r\n\r\ninterface ThreeJsWrapperAgentData {\r\n url: string\r\n animationsUrl?: string\r\n source?: string\r\n gender: 'male' | 'female' | 'other'\r\n}\r\n\r\ninterface ThreeJsWrapperProps {\r\n agentData: ThreeJsWrapperAgentData\r\n visible: boolean\r\n height?: string | number\r\n size?: string | number\r\n cameraPreset?: keyof typeof presets\r\n calibration?: CalibrationData\r\n centered: boolean\r\n}\r\n\r\nconst ThreeJsWrapper = ({ agentData, visible, height, size, cameraPreset, calibration, centered }: ThreeJsWrapperProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const gpuData = useSelector((state: RootState) => state.retorikReducer.gpuData)\r\n const speaking = useSelector((state: RootState) => state.speechReducer.speaking)\r\n const loaderClosed = useSelector((state: RootState) => state.retorikReducer.loaderClosed)\r\n const recognitionState = useSelector((state: RootState) => state.speechReducer.activeRecognitionState)\r\n const lastRecognitionInterim = useSelector((state: RootState) => state.speechReducer.lastRecognitionInterim)\r\n const singleViseme = useSelector((state: RootState) => state.speechReducer.singleVisemeAdded)\r\n const multiVisemes = useSelector((state: RootState) => state.speechReducer.multiVisemesAdded)\r\n const streamingQueue = useSelector((state: RootState) => state.speechReducer.streamingQueue)\r\n const characterLoaded = useSelector((state: RootState) => state.viewReducer.characterLoaded)\r\n const isMobile = useSelector((state: RootState) => state.viewReducer.isMobile)\r\n\r\n const [targets, setTargets] = useState<Array<Object3D>>([])\r\n const [dynamicData, setDynamicData] = useState<\r\n | {\r\n webcamHeight: number\r\n ratioPixelToCentimeter: number\r\n deltaAgentHeightAgentWorldHeightInCentimeters: number\r\n cameraRotationInDegrees: number\r\n distanceFromAgentToCameraInCentimeters: number\r\n }\r\n | undefined\r\n >(undefined)\r\n const [openCalibration, setOpenCalibration] = useState<boolean>(false)\r\n\r\n /**\r\n * Use model's source to get the right loader. Default to avaturn loader\r\n */\r\n const type = useMemo<CreationTool | null>(() => {\r\n if (agentData.source) {\r\n switch (agentData.source.toLowerCase()) {\r\n case Source3DEngine.avatarsdk:\r\n case Source3DEngine.avatarsdkbis:\r\n return CreationTool.avatarsdk\r\n case Source3DEngine.cc3:\r\n case Source3DEngine.cc4:\r\n return CreationTool.cc3\r\n case Source3DEngine.avaturn:\r\n default:\r\n return CreationTool.avaturn\r\n }\r\n }\r\n\r\n return CreationTool.avaturn\r\n }, [agentData])\r\n\r\n useEffect(() => {\r\n if ((!calibration?.static?.enabled && !calibration?.dynamic?.enabled) || isMobile) dispatch(storeActions.view.setCalibrationCompleted(true))\r\n }, [calibration, isMobile])\r\n\r\n useEffect(() => {\r\n // Check if we should open the calibration screen or not\r\n if ((calibration?.static?.enabled || calibration?.dynamic?.enabled) && !isMobile) {\r\n // If there are some static data in the props or the local storage, we can directly set the targets without opening the calibration screen\r\n if (calibration?.static?.enabled && calibration.static.staticTarget) {\r\n const o = new Object3D()\r\n o.position.set(calibration.static.staticTarget.x, calibration.static.staticTarget.y, calibration.static.staticTarget.z)\r\n setTargets([o])\r\n setOpenCalibration(false)\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n } else if (calibration?.static?.enabled && calibration.static.loadStaticTargetFromLocalStorage && localStorage.getItem('Retorik.Framework.Static.Target')) {\r\n const calibrationData = JSON.parse(localStorage.getItem('Retorik.Framework.Static.Target') || '{}') as {\r\n x: number\r\n y: number\r\n z: number\r\n }\r\n const o = new Object3D()\r\n o.position.set(calibrationData.x, calibrationData.y, calibrationData.z)\r\n setTargets([o])\r\n setOpenCalibration(false)\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n } else if (calibration.dynamic?.enabled && calibration.dynamic.dynamicData) {\r\n // Check if all the mandatory dynamic data are in the props\r\n if (\r\n calibration.dynamic.dynamicData.webcamHeight &&\r\n calibration.dynamic.dynamicData.ratioPixelToCentimeter &&\r\n calibration.dynamic.dynamicData.deltaAgentHeightAgentWorldHeightInCentimeters &&\r\n calibration.dynamic.dynamicData.distanceFromAgentToCameraInCentimeters\r\n ) {\r\n setDynamicData({ ...calibration.dynamic.dynamicData, cameraRotationInDegrees: calibration.dynamic.dynamicData.cameraRotationInDegrees || 0 })\r\n }\r\n\r\n setOpenCalibration(true)\r\n } else if (calibration.dynamic?.enabled && calibration.dynamic.loadDynamicDataFromLocalStorage && localStorage.getItem('Retorik.Framework.Dynamic.Data')) {\r\n // Check if the local storage data is complete\r\n const calibrationData = JSON.parse(localStorage.getItem('Retorik.Framework.Dynamic.Data') || '{}')\r\n if (\r\n calibrationData.webcamHeight &&\r\n calibrationData.ratioPixelToCentimeter &&\r\n calibrationData.deltaAgentHeightAgentWorldHeightInCentimeters &&\r\n calibrationData.distanceFromAgentToCameraInCentimeters\r\n ) {\r\n setDynamicData({ ...calibrationData, cameraRotationInDegrees: calibrationData.cameraRotationInDegrees || 0 })\r\n }\r\n\r\n setOpenCalibration(true)\r\n } else {\r\n setOpenCalibration(true)\r\n }\r\n } else {\r\n setOpenCalibration(false)\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n }\r\n }, [calibration, isMobile])\r\n\r\n useEffect(() => {\r\n singleViseme && addViseme(singleViseme)\r\n }, [singleViseme])\r\n\r\n useEffect(() => {\r\n multiVisemes.length && setVisemes(multiVisemes)\r\n }, [multiVisemes])\r\n\r\n useEffect(() => {\r\n if (speaking || streamingQueue.length) {\r\n setCharacterState(CharacterState.speaking)\r\n } else if (recognitionState === RecognitionState.Closed) {\r\n setCharacterState(CharacterState.idle)\r\n } else if (lastRecognitionInterim) {\r\n setCharacterState(CharacterState.listening)\r\n } else {\r\n setCharacterState(CharacterState.waiting)\r\n }\r\n }, [speaking, recognitionState, lastRecognitionInterim, streamingQueue])\r\n\r\n useEffect(() => {\r\n !speaking && flushLipSyncData()\r\n }, [speaking])\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n style={{\r\n height: size || '100%',\r\n paddingTop: height || 0,\r\n visibility: characterLoaded && visible ? 'visible' : 'hidden'\r\n }}\r\n >\r\n {type && (\r\n <Character\r\n url={agentData.url}\r\n type={type}\r\n animationsUrl={agentData?.animationsUrl || 'https://cdn.retorik.ai/bodyengine-three/animations/cc4/female/standing/'}\r\n gender={agentData?.gender === 'male' ? 'male' : 'female'}\r\n onLoadingCompleted={() => dispatch(storeActions.view.setCharacterLoaded(true))}\r\n camera={presets[cameraPreset || 'default']}\r\n targets={targets}\r\n autoLookAt={true}\r\n detectGpuData={gpuData}\r\n license='fake-license'\r\n />\r\n )}\r\n </div>\r\n {!characterLoaded && (\r\n <div className='rf-absolute rf-top-0 rf-left-0 rf-w-full rf-h-full rf-flex rf-justify-center rf-items-center'>\r\n <div className='rf-w-1/4 rf-aspect-square'>\r\n <MicrophoneLoader />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {openCalibration && loaderClosed && (\r\n <CalibrationScreen\r\n centered={centered}\r\n staticCalibrationEnabled={!!calibration?.static?.enabled}\r\n dynamicCalibrationEnabled={!!calibration?.dynamic?.enabled}\r\n setTargets={(targets: Array<Object3D>) => setTargets(targets)}\r\n dynamicData={dynamicData}\r\n />\r\n )}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default ThreeJsWrapper\r\nexport type { EyeTrackingData }\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport { Object3D, getCameraPosition, getCharacterHeight, setLookAtCamera, setShowFirstTarget } from '@davi-ai/react-bodyengine-three'\r\nimport type { Detection } from '@mediapipe/tasks-vision'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport FaceDetector from '../Veille/FaceDetector'\r\n\r\ninterface CalibrationScreenProps {\r\n centered: boolean\r\n staticCalibrationEnabled: boolean\r\n dynamicCalibrationEnabled: boolean\r\n dynamicData?: {\r\n webcamHeight: number\r\n ratioPixelToCentimeter: number\r\n deltaAgentHeightAgentWorldHeightInCentimeters: number\r\n cameraRotationInDegrees: number\r\n distanceFromAgentToCameraInCentimeters: number\r\n }\r\n setTargets: (targets: Array<Object3D>) => void\r\n}\r\n\r\nenum CalibrationMode {\r\n none = 1,\r\n static,\r\n dynamic\r\n}\r\n\r\nconst CalibrationScreen = ({ centered, staticCalibrationEnabled, dynamicCalibrationEnabled, dynamicData, setTargets }: CalibrationScreenProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const cameraPosition = getCameraPosition()\r\n const characterHeight = getCharacterHeight()\r\n const characterLoaded = useSelector((state: RootState) => state.viewReducer.characterLoaded)\r\n const calibrationCompleted = useSelector((state: RootState) => state.viewReducer.calibrationCompleted)\r\n\r\n const [calibrationMode, setCalibrationMode] = useState<CalibrationMode>(dynamicData ? CalibrationMode.dynamic : CalibrationMode.none)\r\n const [distanceFromDevice, setDistanceFromDevice] = useState<number>(dynamicData?.distanceFromAgentToCameraInCentimeters || 0)\r\n const [webcamRotation, setWebcamRotation] = useState<number>(0)\r\n const [agentEyesHeightOnScreen, setAgentEyesHeightOnScreen] = useState<number>(0)\r\n const [worldDistancePerDegree, setWorldDistancePerDegree] = useState<number>(0)\r\n const [currentAngleInDegrees, setCurrentAngleInDegrees] = useState<number>(0)\r\n const [cameraX, setCameraX] = useState<number>(0)\r\n const [cameraY, setCameraY] = useState<number>(0)\r\n const [cameraZ, setCameraZ] = useState<number>(0)\r\n\r\n const cameraXRef = useRef<number>(0)\r\n const cameraYRef = useRef<number>(0)\r\n const cameraZRef = useRef<number>(0)\r\n const currentAngleInDegreesRef = useRef<number>(0)\r\n const webcamHeightRef = useRef<number>(dynamicData?.webcamHeight || 0)\r\n const userEyesHeightRef = useRef<number>(0)\r\n const agentEyesHeightRef = useRef<number>(0)\r\n const distanceFromDeviceRef = useRef<number>(0)\r\n const webcamRotatedRef = useRef<number>(dynamicData?.cameraRotationInDegrees || 0)\r\n const deltaAgentHeightAgentWorldHeightInCentimetersRef = useRef<number>(dynamicData?.deltaAgentHeightAgentWorldHeightInCentimeters || 0)\r\n const ratioPixelToCentimeterRef = useRef<number>(dynamicData?.ratioPixelToCentimeter || 0)\r\n const calibrationCompletedRef = useRef<boolean>(calibrationCompleted)\r\n const counterRef = useRef<number>(0)\r\n\r\n useEffect(() => {\r\n // If dynamic data are given, let's validate immediately to set calibratoin as completed\r\n dynamicData && handleValidate()\r\n }, [])\r\n\r\n useEffect(() => {\r\n characterLoaded && !dynamicData && setLookAtCamera(true)\r\n\r\n return () => {\r\n setLookAtCamera(false)\r\n }\r\n }, [characterLoaded])\r\n\r\n useEffect(() => {\r\n if (worldDistancePerDegree && !dynamicData) {\r\n const o = new Object3D()\r\n o.position.set(cameraX, cameraY + currentAngleInDegrees * worldDistancePerDegree, Math.max(cameraZ / 5, 0.3))\r\n setTargets([o])\r\n }\r\n }, [currentAngleInDegrees, worldDistancePerDegree, distanceFromDevice, cameraX, cameraY, cameraZ])\r\n\r\n useEffect(() => {\r\n if (cameraPosition && !(cameraPosition.x === 0 && cameraPosition.y === 0)) {\r\n const zDistanceCameraPlusUser = cameraPosition.z + distanceFromDevice / 100\r\n setCameraX(cameraPosition.x)\r\n setCameraY(cameraPosition.y)\r\n setCameraZ(zDistanceCameraPlusUser)\r\n cameraXRef.current = cameraPosition.x\r\n cameraYRef.current = cameraPosition.y\r\n cameraZRef.current = zDistanceCameraPlusUser\r\n // Get Y world distance for one degree using tangent. The z distance is divided by 5 with 0.3 at the lowest to show a visible height bar when calibrating\r\n setWorldDistancePerDegree(Math.tan(Math.PI / 180) * Math.max(zDistanceCameraPlusUser / 5, 0.3))\r\n }\r\n }, [cameraPosition, distanceFromDevice])\r\n\r\n useEffect(() => {\r\n if (!dynamicData) {\r\n characterHeight && agentEyesHeightOnScreen && (deltaAgentHeightAgentWorldHeightInCentimetersRef.current = (characterHeight - characterHeight / 16) * 100 - agentEyesHeightOnScreen)\r\n }\r\n }, [characterHeight, agentEyesHeightOnScreen])\r\n\r\n useEffect(() => {\r\n !dynamicData && (webcamRotatedRef.current = webcamRotation)\r\n }, [webcamRotation])\r\n\r\n useEffect(() => {\r\n calibrationCompletedRef.current = calibrationCompleted\r\n }, [calibrationCompleted])\r\n\r\n useEffect(() => {\r\n if (!dynamicData && calibrationMode === CalibrationMode.static) {\r\n setShowFirstTarget(!calibrationCompleted)\r\n }\r\n }, [calibrationMode, calibrationCompleted])\r\n\r\n const handleReset = () => {\r\n setCurrentAngleInDegrees(0)\r\n currentAngleInDegreesRef.current = 0\r\n }\r\n\r\n const handleValidate = () => {\r\n setLookAtCamera(false)\r\n if (calibrationMode === CalibrationMode.static) {\r\n // In static mode, store the target in local storage to be able to reuse it later and avoid asking the user to calibrate again if the data are valid\r\n localStorage.setItem('Retorik.Framework.Static.Target', JSON.stringify({ x: cameraX, y: cameraY + currentAngleInDegrees * worldDistancePerDegree, z: cameraZ }))\r\n } else if (calibrationMode === CalibrationMode.dynamic && ratioPixelToCentimeterRef.current) {\r\n localStorage.setItem(\r\n 'Retorik.Framework.Dynamic.Data',\r\n JSON.stringify({\r\n webcamHeight: webcamHeightRef.current,\r\n ratioPixelToCentimeter: ratioPixelToCentimeterRef.current,\r\n deltaAgentHeightAgentWorldHeightInCentimeters: deltaAgentHeightAgentWorldHeightInCentimetersRef.current,\r\n cameraRotationInDegrees: webcamRotatedRef.current,\r\n distanceFromAgentToCameraInCentimeters: distanceFromDeviceRef.current\r\n })\r\n )\r\n setTargets([])\r\n }\r\n\r\n dispatch(storeActions.view.setCalibrationCompleted(true))\r\n }\r\n\r\n const handleFaceDetected = (detections?: Array<Detection>, width?: number, height?: number): void => {\r\n counterRef.current++\r\n if (detections?.length && width && height) {\r\n // The detections are inverted in X and Y axis (the origin is the top right corner of the image)\r\n const webcamPositionY = webcamRotatedRef.current === 0 ? height / 2 : width / 2\r\n const userPositionY = webcamRotatedRef.current === 0 ? height * (1 - detections[0].keypoints[0].y) : width * (1 - detections[0].keypoints[0].x)\r\n\r\n if (calibrationCompletedRef.current) {\r\n // Check if the mandatory data have been filled (webcam / agent / user heights + distance user <-> device)\r\n if (webcamHeightRef.current && ratioPixelToCentimeterRef.current && deltaAgentHeightAgentWorldHeightInCentimetersRef.current !== 0) {\r\n const deltaHeightInPixels = webcamPositionY - userPositionY\r\n const userEyesHeightInCentimeters = webcamHeightRef.current - deltaHeightInPixels * ratioPixelToCentimeterRef.current\r\n const targetYInWorldCoordinates = (userEyesHeightInCentimeters + deltaAgentHeightAgentWorldHeightInCentimetersRef.current) / 100\r\n\r\n const o = new Object3D()\r\n o.position.set(cameraXRef.current, targetYInWorldCoordinates, cameraZRef.current)\r\n setTargets([o])\r\n }\r\n } else {\r\n // The detections are inverted in X and Y axis (the origin is the top right corner of the image)\r\n if (webcamHeightRef.current && userEyesHeightRef.current && distanceFromDeviceRef.current) {\r\n // Get the difference in height between the webcam and the user's eyes in cm, then use the detection to get the same difference in pixels on the webcam's image\r\n const deltaHeightInCentimeters = Math.abs(webcamHeightRef.current - userEyesHeightRef.current)\r\n const deltaHeightInPixels = Math.abs(webcamPositionY - userPositionY)\r\n\r\n deltaHeightInPixels && (ratioPixelToCentimeterRef.current = deltaHeightInCentimeters / deltaHeightInPixels)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n id='retorik-framework-animation-container-calibration'\r\n className={`rf-absolute rf-top-0 rf-h-full rf-w-full rf-grid rf-grid-cols-1 rf-grid-rows-1 ${!centered && 'landscape-retorik:rf-translate-x-1/4'}`}\r\n >\r\n {calibrationMode === CalibrationMode.dynamic && (\r\n <div className='rf-relative rf-z-1 rf-h-full rf-w-full rf-col-start-1 rf-col-span-1 rf-row-start-1 rf-row-span-1 rf-flex rf-justify-start rf-items-start'>\r\n <FaceDetector detectionThreshold={0.8} onFaceDetected={handleFaceDetected} showThumbnail={!calibrationCompleted} rotation={webcamRotation} />\r\n </div>\r\n )}\r\n\r\n {!calibrationCompleted && (\r\n <React.Fragment>\r\n {calibrationMode === CalibrationMode.none ? (\r\n <div className='rf-h-full rf-w-full rf-col-start-1 rf-col-span-1 rf-row-start-1 rf-row-span-1 rf-flex rf-flex-col rf-justify-center rf-items-center rf-gap-4 rf-bg-white rf-bg-opacity-50'>\r\n <p className='rf-text-medium-size-auto'>Choisissez un mode de calibrage :</p>\r\n <div className='rf-flex rf-flex-row rf-gap-4'>\r\n {staticCalibrationEnabled && (\r\n <div\r\n className='rf-px-4 rf-py-2 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer'\r\n onClick={() => setCalibrationMode(CalibrationMode.static)}\r\n >\r\n STATIQUE\r\n </div>\r\n )}\r\n\r\n {dynamicCalibrationEnabled && (\r\n <div\r\n className='rf-px-4 rf-py-2 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer'\r\n onClick={() => setCalibrationMode(CalibrationMode.dynamic)}\r\n >\r\n DYNAMIQUE\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <div className='rf-relative rf-h-full rf-w-full rf-col-start-1 rf-col-span-1 rf-row-start-1 rf-row-span-1 rf-flex rf-flex-col rf-justify-center rf-gap-4'>\r\n {calibrationMode === CalibrationMode.dynamic ? (\r\n <div className='rf-absolute rf-left-32 rf-flex rf-flex-col rf-justify-center rf-items-center rf-gap-4'>\r\n <div className='rf-grid rf-grid-cols-2 rf-grid-rows-3 rf-gap-4'>\r\n <p className='rf-font-bold'>Hauteur webcam (en cm)</p>\r\n <input\r\n type='number'\r\n min={0}\r\n max={300}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n webcamHeightRef.current = parseInt(e.target.value!)\r\n }}\r\n />\r\n <p className='rf-font-bold'>Votre taille (en cm)</p>\r\n <input\r\n type='number'\r\n min={50}\r\n max={300}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n // We estimate the height of the user's eyes is 12 cm less than their total height\r\n userEyesHeightRef.current = parseInt(e.target.value!) - 12\r\n }}\r\n />\r\n <p className='rf-font-bold'>Hauteur des yeux de l'agent (en cm)</p>\r\n <input\r\n type='number'\r\n min={50}\r\n max={300}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n setAgentEyesHeightOnScreen(parseInt(e.target.value!))\r\n agentEyesHeightRef.current = parseInt(e.target.value!)\r\n }}\r\n />\r\n <p className='rf-font-bold'>Distance utilisateur - borne (en cm)</p>\r\n <input\r\n type='number'\r\n min={20}\r\n max={100}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n setDistanceFromDevice(parseInt(e.target.value!))\r\n distanceFromDeviceRef.current = parseInt(e.target.value!)\r\n }}\r\n />\r\n <p className='rf-font-bold'>Rotation de la webcam (en degrés)</p>\r\n <div className='rf-flex rf-flex-row rf-gap-2'>\r\n <button\r\n className={`rf-px-2 rf-py-1 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer ${webcamRotation === 0 && 'rf-bg-opacity-100'}`}\r\n onClick={() => setWebcamRotation(0)}\r\n >\r\n 0\r\n </button>\r\n <button\r\n className={`rf-px-2 rf-py-1 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer ${webcamRotation === 90 && 'rf-bg-opacity-100'}`}\r\n onClick={() => setWebcamRotation(90)}\r\n >\r\n 90\r\n </button>\r\n <button\r\n className={`rf-px-2 rf-py-1 rf-border rf-border-primary rf-rounded-lg rf-bg-primary rf-bg-opacity-50 rf-cursor-pointer ${webcamRotation === -90 && 'rf-bg-opacity-100'}`}\r\n onClick={() => setWebcamRotation(-90)}\r\n >\r\n -90\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className='rf-h-16 rf-w-16 rf-flex rf-justify-center rf-items-center rf-bg-white rf-border rf-border-black rf-rounded-lg hover: rf-cursor-pointer' onClick={handleValidate}>\r\n Done\r\n </div>\r\n </div>\r\n ) : (\r\n <div className='rf-ml-4 rf-flex rf-flex-col rf-gap-4'>\r\n <div className='rf-flex rf-flex-row rf-items-center rf-gap-4'>\r\n <input\r\n type='range'\r\n min={-25}\r\n max={25}\r\n step={1}\r\n value={currentAngleInDegrees}\r\n onChange={(e) => {\r\n const val = parseInt(e.target.value)\r\n setCurrentAngleInDegrees(val)\r\n currentAngleInDegreesRef.current = val\r\n }}\r\n className='rf-range-vertical rf-w-8 rf-h-80 rf-appearance-none rf-border rf-border-black rf-rounded-lg rf-cursor-pointer'\r\n style={{ writingMode: 'vertical-lr', direction: 'rtl' }}\r\n />\r\n <div className='rf-w-fit rf-p-4 rf-flex rf-flex-col rf-justify-center rf-gap-2 rf-bg-white rf-border rf-border-black rf-rounded-lg'>\r\n <p>Position actuelle de la cible : </p>\r\n <p>{`x: ${cameraX}`}</p>\r\n <p>{`y: ${cameraY + (currentAngleInDegrees ? currentAngleInDegrees * worldDistancePerDegree : 0)}`}</p>\r\n <p>{`z: ${Math.max(cameraZ / 5, 0.3)}`}</p>\r\n <p>{`angle: ${currentAngleInDegrees}°`}</p>\r\n </div>\r\n </div>\r\n\r\n <div className='rf-flex rf-flex-row rf-gap-2'>\r\n <div className='rf-h-10 rf-px-4 rf-flex rf-justify-center rf-items-center rf-bg-white rf-border rf-border-black rf-rounded-lg rf-cursor-pointer' onClick={() => handleReset()}>\r\n Reset\r\n </div>\r\n <div className='rf-h-10 rf-px-4 rf-flex rf-justify-center rf-items-center rf-bg-white rf-border rf-border-black rf-rounded-lg rf-cursor-pointer' onClick={handleValidate}>\r\n Done\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </React.Fragment>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default CalibrationScreen\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { FaceDetector as MediapipeFaceDetector, FilesetResolver, Detection } from '@mediapipe/tasks-vision'\r\n\r\ninterface FaceDetectorProps {\r\n detectionThreshold: number\r\n onFaceDetected: (detections?: Array<Detection>, imageWidth?: number, imageHeight?: number) => void\r\n showThumbnail?: boolean\r\n rotation?: number\r\n}\r\n\r\nconst runningMode = 'VIDEO'\r\nlet lastVideoTime = -1\r\nconst defaultConstraints: MediaStreamConstraints = {\r\n video: {\r\n facingMode: 'user'\r\n }\r\n}\r\n\r\nconst FaceDetector = ({ detectionThreshold, onFaceDetected, showThumbnail, rotation }: FaceDetectorProps): JSX.Element => {\r\n const [webcamWidth, setWebcamWidth] = useState<number>(0)\r\n const [webcamHeight, setWebcamHeight] = useState<number>(0)\r\n const [faceDetector, setFaceDetector] = useState<MediapipeFaceDetector | undefined>()\r\n const videoRef = useRef<HTMLVideoElement>(null)\r\n const rotationRef = useRef<number>(rotation || 0)\r\n\r\n useEffect(() => {\r\n rotationRef.current = rotation || 0\r\n }, [rotation])\r\n\r\n useEffect(() => {\r\n const createfaceDetector = async () => {\r\n const vision = await FilesetResolver.forVisionTasks('https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm')\r\n const newFaceDetector = await MediapipeFaceDetector.createFromOptions(vision, {\r\n baseOptions: {\r\n modelAssetPath: `https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite`,\r\n delegate: 'GPU'\r\n },\r\n runningMode: runningMode\r\n })\r\n\r\n newFaceDetector && setFaceDetector(newFaceDetector)\r\n }\r\n\r\n const initializefaceDetector = async () => {\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((display) => {\r\n const settings = display.getVideoTracks()[0].getSettings()\r\n setWebcamWidth(settings.width || 0)\r\n setWebcamHeight(settings.height || 0)\r\n createfaceDetector()\r\n })\r\n .catch((error) => console.warn('Retorik Framework > an error occured when trying to use the webcam : ', error))\r\n }\r\n\r\n initializefaceDetector()\r\n }, [])\r\n\r\n const predictWebcam = async () => {\r\n if (faceDetector && videoRef.current) {\r\n let startTimeMs = performance.now()\r\n\r\n // Detect faces using detectForVideo\r\n if (videoRef.current.currentTime !== lastVideoTime) {\r\n lastVideoTime = videoRef.current.currentTime\r\n const detections = faceDetector.detectForVideo(videoRef.current, startTimeMs, { rotationDegrees: rotationRef.current }).detections\r\n\r\n if (detections.length) {\r\n const score = detections[0].categories[0].score\r\n score > detectionThreshold && onFaceDetected(detections, videoRef.current.videoWidth, videoRef.current.videoHeight)\r\n }\r\n }\r\n }\r\n\r\n // Call this function again to keep predicting when the browser is ready\r\n window.requestAnimationFrame(predictWebcam)\r\n }\r\n\r\n useEffect(() => {\r\n if (faceDetector && videoRef.current) {\r\n // Activate the webcam stream\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((stream) => {\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = stream\r\n videoRef.current.addEventListener('loadeddata', predictWebcam)\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n })\r\n }\r\n }, [faceDetector])\r\n\r\n return (\r\n <div id='retorik-framework-face-detector' className={`rf-absolute rf-top-0 rf-left-0 ${!showThumbnail && 'rf-invisible'}`}>\r\n <video\r\n ref={videoRef}\r\n src=''\r\n autoPlay\r\n style={{\r\n rotate: `${rotation}deg`,\r\n width: showThumbnail ? webcamWidth / 2 : webcamWidth,\r\n height: showThumbnail ? webcamHeight / 2 : webcamHeight\r\n }}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default FaceDetector\r\n"],"names":[],"version":3,"file":"ThreeJsWrapper.dd4906ff.js.map"}
@@ -195,9 +195,10 @@ var $58ljk = parcelRequire("58ljk");
195
195
  var $69ngO = parcelRequire("69ngO");
196
196
  const $42bad5eabafac04e$var$CallToAction = ()=>{
197
197
  const themeColors = (0, $ehKZo$reactredux.useSelector)((state)=>state.viewReducer.themeColors);
198
+ const translation = (0, $ehKZo$reactredux.useSelector)((state)=>state.localeReducer.currentTranslations);
198
199
  const [colorWithTransparency] = (0, $ehKZo$react.useState)((0, $58ljk.getColorWithTransparency)(themeColors.primary, 0.5));
199
200
  return /*#__PURE__*/ (0, $ehKZo$reactjsxruntime.jsxs)("div", {
200
- className: "rf-absolute rf-z-ui rf-bottom-0 rf-right-0 rf-w-80 rf-h-80 rf-grid rf-grid-cols-1 rf-grid-rows-1 rf-justify-end rf-justify-items-end rf-content-end rf-items-end rf-text-center rf-overflow-hidden rf-z-10",
201
+ className: "rf-absolute rf-z-ui rf-bottom-0 rf-right-0 rf-w-64 rf-h-80 rf-grid rf-grid-cols-1 rf-grid-rows-1 rf-justify-end rf-justify-items-end rf-content-end rf-items-end rf-text-center rf-overflow-hidden rf-z-10",
201
202
  children: [
202
203
  /*#__PURE__*/ (0, $ehKZo$reactjsxruntime.jsx)("div", {
203
204
  className: "rf-relative rf-col-start-1 rf-col-end-2 rf-row-start-1 rf-row-end-2 rf-w-48 rf-h-36 rf-rotate-45 rf-translate-y-8",
@@ -210,8 +211,8 @@ const $42bad5eabafac04e$var$CallToAction = ()=>{
210
211
  children: [
211
212
  /*#__PURE__*/ (0, $ehKZo$reactjsxruntime.jsx)((0, $69ngO.default), {}),
212
213
  /*#__PURE__*/ (0, $ehKZo$reactjsxruntime.jsx)("p", {
213
- className: "rf-mx-4",
214
- children: "Click on screen to start"
214
+ className: "rf-ml-16 rf-mr-4",
215
+ children: translation.veille.calltoaction
215
216
  })
216
217
  ]
217
218
  })
@@ -345,12 +346,14 @@ parcelRegister("8KeRZ", function(module, exports) {
345
346
  $parcel$export(module.exports, "default", () => $dadec6c8a2c8bf97$export$2e2bcd8739ae039);
346
347
 
347
348
 
349
+
348
350
  const $dadec6c8a2c8bf97$var$EmptyVeille = ()=>{
351
+ const translation = (0, $ehKZo$reactredux.useSelector)((state)=>state.localeReducer.currentTranslations);
349
352
  return /*#__PURE__*/ (0, $ehKZo$reactjsxruntime.jsx)("div", {
350
353
  className: "rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-bg-black rf-flex rf-justify-center rf-items-center",
351
354
  children: /*#__PURE__*/ (0, $ehKZo$reactjsxruntime.jsx)("div", {
352
355
  className: "rf-uppercase rf-font-bold rf-text-3xl rf-text-white rf-animate-pulse",
353
- children: "click or tap on the screen..."
356
+ children: translation.veille.emptyveille
354
357
  })
355
358
  });
356
359
  };
@@ -506,4 +509,4 @@ var $a2463c3887d0d0a1$export$2e2bcd8739ae039 = $a2463c3887d0d0a1$var$SlideShow;
506
509
 
507
510
 
508
511
 
509
- //# sourceMappingURL=VeilleManager.26dcadac.js.map
512
+ //# sourceMappingURL=VeilleManager.85967e7c.js.map
@@ -0,0 +1 @@
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAM,uCAAiB;AAMvB,MAAM,sCAAgB,CAAC,WAAE,OAAO,EAAsB;QA0FrC,wCAAA,4BACE,yCAAA,6BAQD,sCAAA,6BACC,uCAAA;IAnGjB,MAAM,WAAW,CAAA,GAAA,6BAAU;IAC3B,MAAM,QAAQ,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,WAAW,CAAC,KAAK;IACvE,MAAM,sBAAsB,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,WAAW,CAAC,mBAAmB;IACnG,MAAM,QAAQ,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,KAAK;IAEzE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,qBAAO,EAAW;IAE1C,MAAM,gBAAgB,CAAA,GAAA,mBAAK,EAAuB;IAClD,MAAM,6BAA6B,CAAA,GAAA,mBAAK,EAAiB,EAAE;IAC3D,MAAM,0BAA0B,CAAA,GAAA,mBAAK,EAAU;IAC/C,MAAM,eAAe,CAAA,GAAA,mBAAK,EAAwC;IAClE,MAAM,cAAc,CAAA,GAAA,mBAAK,EAAW;IAEpC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAA,GAAA,+BAAQ,EAAE,IAAO,CAAA;YACrC,MAAM;gBAAE,SAAS;YAAE;QACrB,CAAA;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,KAAK,CAAC;YACR,MAAM;gBAAE,SAAS;YAAE;YACnB,IAAI;gBAAE,SAAS;YAAE;YACjB,QAAQ;gBAAE,UAAU;YAAe;QACrC;IACF,GAAG,EAAE;IAEL,MAAM,cAAc;QAClB,IAAI,KAAK,CAAC;YACR,MAAM;gBAAE,SAAS;YAAE;YACnB,IAAI;gBAAE,SAAS;YAAE;YACjB,QAAQ;gBAAE,UAAU;YAAe;QACrC;QAEA,CAAA,yBAAA,mCAAA,aAAc,OAAO,KAAI,aAAa,aAAa,OAAO;QAC1D,aAAa,OAAO,GAAG,WAAW;YAChC,6FAA6F;YAC7F,SAAS,CAAA,GAAA,mBAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,OAAO;YACzD,wBAAwB;YACxB,SAAS,CAAA,GAAA,mBAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA,GAAA,aAAK,EAAE,IAAI;YAC/C;QACF,GAAG;IACL;IAEA,MAAM,kBAAkB;QACtB,IAAI,2BAA2B,OAAO,CAAC,MAAM,GAAG,wBAAwB,OAAO,GAAG,GAAG;YACnF,wBAAwB,OAAO;YAC/B,SAAS,CAAA,GAAA,mBAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,OAAO,CAAC,wBAAwB,OAAO,CAAC;QACzG,OAAO;YACL,wBAAwB,OAAO,GAAG;YAClC,SAAS,CAAA,GAAA,mBAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,OAAO,CAAC,EAAE;QAC3E;IACF;IAEA,CAAA,GAAA,sBAAQ,EAAE;YAGR,wCAAA,4BACA,iCAAA,6BACA,sCAAA,6BAKA,uDAAuD;QACvD,mCAAA;QAVA,cAAc,OAAO,GAAG;QACxB,MAAM,gBAA+B,EAAE;QACvC,EAAA,6BAAA,oBAAoB,KAAK,cAAzB,kDAAA,yCAAA,2BAA2B,WAAW,cAAtC,6DAAA,uCAAwC,OAAO,KAAI,cAAc,IAAI,CAAC,CAAA,GAAA,aAAK,EAAE,WAAW;QACxF,EAAA,8BAAA,oBAAoB,KAAK,cAAzB,mDAAA,kCAAA,4BAA2B,IAAI,cAA/B,sDAAA,gCAAiC,OAAO,KAAI,cAAc,IAAI,CAAC,CAAA,GAAA,aAAK,EAAE,YAAY;QAClF,EAAA,8BAAA,oBAAoB,KAAK,cAAzB,mDAAA,uCAAA,4BAA2B,SAAS,cAApC,2DAAA,qCAAsC,OAAO,KAAI,cAAc,IAAI,CAAC,CAAA,GAAA,aAAK,EAAE,SAAS;QACpF,8CAA8C;QAC9C,QAAQ,cAAc,MAAM,KAAK;QACjC,2BAA2B,OAAO,GAAG;QACrC,wBAAwB,OAAO,GAAG;QAElC,EAAA,+BAAA,cAAc,OAAO,CAAC,KAAK,cAA3B,oDAAA,oCAAA,6BAA6B,IAAI,cAAjC,wDAAA,kCAAmC,KAAK,KAAI,SAAS,CAAA,GAAA,mBAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;QAClF,SAAS,CAAA,GAAA,mBAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,OAAO,CAAC,MAAM,GAAG,2BAA2B,OAAO,CAAC,EAAE,GAAG,CAAA,GAAA,aAAK,EAAE,WAAW;QAE1I,OAAO;YACL,CAAA,yBAAA,mCAAA,aAAc,OAAO,KAAI,aAAa,aAAa,OAAO;YAC1D,6FAA6F;YAC7F,SAAS,CAAA,GAAA,mBAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,OAAO;QAC3D;IACF,GAAG,EAAE;IAEL,qBACE,iCAAC,CAAA,GAAA,sCAAI,EAAE,QAAQ;;0BACb,iCAAC,CAAA,GAAA,8BAAO,EAAE,GAAG;gBACX,IAAG;gBACH,WAAU;gBACV,OAAO;oBACL,GAAG,MAAM;gBACX;;kCAEA,gCAAC,CAAA,GAAA,cAAW;oBACX,oBAAoB,kBAAkB,kBAAI,gCAAC,CAAA,GAAA,cAAW;wBAAE,oBAAoB;wBAAM,gBAAgB,IAAM;;oBAExG,UAAU,CAAA,GAAA,aAAK,EAAE,WAAW,kBAAI,gCAAC,CAAA,GAAA,cAAU;oBAC3C,UAAU,CAAA,GAAA,aAAK,EAAE,YAAY,kBAAI,gCAAC,CAAA,GAAA,cAAO;wBAAE,UAAU;wBAAM,eAAe;wBAAM,wBAAwB;wBAAiB,MAAM;wBAAM,YAAY;;oBACjJ,UAAU,CAAA,GAAA,aAAK,EAAE,WAAW,kBAC3B,gCAAC,CAAA,GAAA,cAAU;wBACT,GAAG,GAAE,6BAAA,oBAAoB,KAAK,cAAzB,kDAAA,yCAAA,2BAA2B,WAAW,cAAtC,6DAAA,uCAAwC,GAAG;wBAChD,KAAK,GAAE,8BAAA,oBAAoB,KAAK,cAAzB,mDAAA,0CAAA,4BAA2B,WAAW,cAAtC,8DAAA,wCAAwC,0BAA0B;wBACzE,MAAM;wBACN,gBAAgB;wBAChB,iBAAiB;;oBAGpB,UAAU,CAAA,GAAA,aAAK,EAAE,SAAS,kBACzB,gCAAC,CAAA,GAAA,cAAQ;wBACP,IAAI,GAAE,8BAAA,oBAAoB,KAAK,cAAzB,mDAAA,uCAAA,4BAA2B,SAAS,cAApC,2DAAA,qCAAsC,IAAI;wBAChD,KAAK,GAAE,8BAAA,oBAAoB,KAAK,cAAzB,mDAAA,wCAAA,4BAA2B,SAAS,cAApC,4DAAA,sCAAsC,0BAA0B;wBACvE,MAAM;wBACN,gBAAgB;wBAChB,iBAAiB;;;;0BAMvB,gCAAC;gBAAI,WAAU;gBAAmH,SAAS,IAAM;;;;AAGvJ;IAEA,2CAAe;;;;;;;;;;;;;ACjIf,MAAM,qCAAe;IACnB,MAAM,cAAc,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,WAAW,CAAC,WAAW;IACnF,MAAM,cAAc,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,mBAAmB;IAC7F,MAAM,CAAC,sBAAsB,GAAG,CAAA,GAAA,qBAAO,EAAU,CAAA,GAAA,+BAAuB,EAAE,YAAY,OAAO,EAAE;IAE/F,qBACE,iCAAC;QAAI,WAAU;;0BACb,gCAAC;gBAAI,WAAU;gBAAoH,OAAO;oBAAE,iBAAiB;gBAAsB;;0BACnL,iCAAC;gBAAI,WAAU;;kCACb,gCAAC,CAAA,GAAA,cAAQ;kCACT,gCAAC;wBAAE,WAAU;kCAAoB,YAAY,MAAM,CAAC,YAAY;;;;;;AAIxE;IAEA,2CAAe;;;;;;;;ACnBf,MAAM,kCAAY,CAAC,aAAE,SAAS,SAAE,KAAK,EAAoB;IACvD,qBACE,gCAAC;QACC,SAAQ;QACR,OAAM;QACN,QAAQ,SAAS;QACjB,MAAM,SAAS;QACf,WAAW,aAAa;kBAExB,cAAA,gCAAC;YACC,GAAE;YACF,aAAY;;;AAIpB;IAEA,2CAAe;;;;;;;;;;;ACVf,MAAM,oCAAc;AACpB,IAAI,sCAAgB;AACpB,MAAM,2CAA6C;IACjD,OAAO;QACL,YAAY;IACd;AACF;AAEA,MAAM,qCAAe,CAAC,sBAAE,kBAAkB,kBAAE,cAAc,iBAAE,aAAa,YAAE,QAAQ,EAAqB;IACtG,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,qBAAO,EAAU;IACvD,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,qBAAO,EAAU;IACzD,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,qBAAO;IAC/C,MAAM,WAAW,CAAA,GAAA,mBAAK,EAAoB;IAC1C,MAAM,cAAc,CAAA,GAAA,mBAAK,EAAU,YAAY;IAE/C,CAAA,GAAA,sBAAQ,EAAE;QACR,YAAY,OAAO,GAAG,YAAY;IACpC,GAAG;QAAC;KAAS;IAEb,CAAA,GAAA,sBAAQ,EAAE;QACR,MAAM,qBAAqB;YACzB,MAAM,SAAS,MAAM,CAAA,GAAA,2CAAc,EAAE,cAAc,CAAC;YACpD,MAAM,kBAAkB,MAAM,CAAA,GAAA,wCAAoB,EAAE,iBAAiB,CAAC,QAAQ;gBAC5E,aAAa;oBACX,gBAAgB,CAAC,4HAA4H,CAAC;oBAC9I,UAAU;gBACZ;gBACA,aAAa;YACf;YAEA,mBAAmB,gBAAgB;QACrC;QAEA,MAAM,yBAAyB;YAC7B,UAAU,YAAY,CACnB,YAAY,CAAC,0CACb,IAAI,CAAC,CAAC;gBACL,MAAM,WAAW,QAAQ,cAAc,EAAE,CAAC,EAAE,CAAC,WAAW;gBACxD,eAAe,SAAS,KAAK,IAAI;gBACjC,gBAAgB,SAAS,MAAM,IAAI;gBACnC;YACF,GACC,KAAK,CAAC,CAAC,QAAU,QAAQ,IAAI,CAAC,yEAAyE;QAC5G;QAEA;IACF,GAAG,EAAE;IAEL,MAAM,gBAAgB;QACpB,IAAI,gBAAgB,SAAS,OAAO,EAAE;YACpC,IAAI,cAAc,YAAY,GAAG;YAEjC,oCAAoC;YACpC,IAAI,SAAS,OAAO,CAAC,WAAW,KAAK,qCAAe;gBAClD,sCAAgB,SAAS,OAAO,CAAC,WAAW;gBAC5C,MAAM,aAAa,aAAa,cAAc,CAAC,SAAS,OAAO,EAAE,aAAa;oBAAE,iBAAiB,YAAY,OAAO;gBAAC,GAAG,UAAU;gBAElI,IAAI,WAAW,MAAM,EAAE;oBACrB,MAAM,QAAQ,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK;oBAC/C,QAAQ,sBAAsB,eAAe,YAAY,SAAS,OAAO,CAAC,UAAU,EAAE,SAAS,OAAO,CAAC,WAAW;gBACpH;YACF;QACF;QAEA,wEAAwE;QACxE,OAAO,qBAAqB,CAAC;IAC/B;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,gBAAgB,SAAS,OAAO,EAClC,6BAA6B;QAC7B,UAAU,YAAY,CACnB,YAAY,CAAC,0CACb,IAAI,CAAC,CAAC;YACL,IAAI,SAAS,OAAO,EAAE;gBACpB,SAAS,OAAO,CAAC,SAAS,GAAG;gBAC7B,SAAS,OAAO,CAAC,gBAAgB,CAAC,cAAc;YAClD;QACF,GACC,KAAK,CAAC,CAAC;YACN,QAAQ,KAAK,CAAC;QAChB;IAEN,GAAG;QAAC;KAAa;IAEjB,qBACE,gCAAC;QAAI,IAAG;QAAkC,WAAW,CAAC,+BAA+B,EAAE,CAAC,iBAAiB,gBAAgB;kBACvH,cAAA,gCAAC;YACC,KAAK;YACL,KAAI;YACJ,QAAQ;YACR,OAAO;gBACL,QAAQ,GAAG,SAAS,GAAG,CAAC;gBACxB,OAAO,gBAAgB,cAAc,IAAI;gBACzC,QAAQ,gBAAgB,eAAe,IAAI;YAC7C;;;AAIR;IAEA,2CAAe;;;;;;;;;;AC3Gf,MAAM,oCAAc;IAClB,MAAM,cAAc,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,mBAAmB;IAE7F,qBACE,gCAAC;QAAI,WAAU;kBACb,cAAA,gCAAC;YAAI,WAAU;sBAAwE,YAAY,MAAM,CAAC,WAAW;;;AAG3H;IAEA,2CAAe;;;;;;;;;;ACHf,MAAM,oCAAc,CAAC,OAAE,GAAG,SAAE,KAAK,QAAE,IAAI,kBAAE,cAAc,mBAAE,eAAe,EAAoB;IAC1F,MAAM,WAAW,CAAA,GAAA,mBAAK,EAAwC;IAC9D,MAAM,eAAe,CAAA,GAAA,mBAAK,EAAwC;IAElE,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAA,GAAA,+BAAQ,EAAE,IAAO,CAAA;YACrC,MAAM;gBACJ,SAAS;YACX;QACF,CAAA;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,KAAK,CAAC;YACR,MAAM;gBACJ,SAAS;YACX;YACA,IAAI;gBACF,SAAS;YACX;YACA,QAAQ;gBACN,UAAU;YACZ;QACF;IACF,GAAG,EAAE;IAEL,MAAM,cAAc;QAClB,IAAI,KAAK,CAAC;YACR,MAAM;gBACJ,SAAS;YACX;YACA,IAAI;gBACF,SAAS;YACX;YACA,QAAQ;gBACN,UAAU;YACZ;QACF;QAEA,CAAA,yBAAA,mCAAA,aAAc,OAAO,KAAI,aAAa,aAAa,OAAO;QAC1D,aAAa,OAAO,GAAG,WAAW;YAChC,wBAAwB;YACxB;QACF,GAAG;IACL;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,CAAC,MACH,SAAS,OAAO,GAAG,WAAW;YAC5B;QACF,GAAG,AAAC,CAAA,SAAS,CAAA,IAAK,OAAO;QAG3B,OAAO;YACL,SAAS,OAAO,IAAI,aAAa,SAAS,OAAO;YACjD,aAAa,OAAO,IAAI,aAAa,aAAa,OAAO;QAC3D;IACF,GAAG,EAAE;IAEL,qBACE,gCAAC,CAAA,GAAA,8BAAO,EAAE,GAAG;QACX,WAAU;QACV,OAAO;YACL,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,oBAAoB;YACpB,kBAAkB;YAClB,gBAAgB;YAChB,GAAG,MAAM;QACX;;AAGN;IAEA,2CAAe;;;;;;;;;;ACvEf,MAAM,kCAAY,CAAC,QAAE,IAAI,SAAE,KAAK,QAAE,IAAI,kBAAE,cAAc,mBAAE,eAAe,EAAkB;IACvF,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,qBAAO,EAAU;IACzD,MAAM,WAAW,CAAA,GAAA,mBAAK,EAAwC;IAC9D,MAAM,eAAe,CAAA,GAAA,mBAAK,EAAwC;IAElE,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAA,GAAA,+BAAQ,EAAE,IAAO,CAAA;YACrC,MAAM;gBACJ,SAAS;YACX;QACF,CAAA;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,KAAK,CAAC;YACR,MAAM;gBACJ,SAAS;YACX;YACA,IAAI;gBACF,SAAS;YACX;YACA,QAAQ;gBACN,UAAU;YACZ;QACF;IACF,GAAG,EAAE;IAEL,MAAM,cAAc;QAClB,IAAI,KAAK,CAAC;YACR,MAAM;gBACJ,SAAS;YACX;YACA,IAAI;gBACF,SAAS;YACX;YACA,QAAQ;gBACN,UAAU;YACZ;QACF;QAEA,CAAA,yBAAA,mCAAA,aAAc,OAAO,KAAI,aAAa,aAAa,OAAO;QAC1D,aAAa,OAAO,GAAG,WAAW;YAChC,wBAAwB;YACxB;QACF,GAAG;IACL;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,CAAA,qBAAA,+BAAA,SAAU,OAAO,KAAI,aAAa,SAAS,OAAO;QAClD,IAAI,iBAAA,2BAAA,KAAM,MAAM,EACd,SAAS,OAAO,GAAG,WAAW;YAC5B,iBAAiB,KAAK,MAAM,GAAG,IAAK,OAAO,gBAAgB,KAAK,gBAAiB,gBAAgB,eAAe;QAClH,GAAG,AAAC,CAAA,SAAS,CAAA,IAAK;aAElB;IAEJ,GAAG;QAAC;KAAa;IAEjB,CAAA,GAAA,sBAAQ,EAAE;QACR,OAAO;YACL,CAAA,qBAAA,+BAAA,SAAU,OAAO,KAAI,aAAa,SAAS,OAAO;YAClD,CAAA,yBAAA,mCAAA,aAAc,OAAO,KAAI,aAAa,aAAa,OAAO;QAC5D;IACF,GAAG,EAAE;IAEL,qBACE,gCAAC,CAAA,GAAA,8BAAO,EAAE,GAAG;QAAC,WAAU;QAAwH,OAAO;YAAE,GAAG,MAAM;QAAC;kBACjK,cAAA,gCAAC;YAAI,WAAW,GAAG,OAAO,WAAW,GAAG,OAAO,UAAU,GAAG,cAAc,aAAa;YAAE,KAAK,CAAA,iBAAA,2BAAA,IAAM,CAAC,aAAa,KAAI;YAAI,KAAI;;;AAGpI;IAEA,2CAAe","sources":["src/components/Veille/VeilleManager.tsx","src/components/Veille/CallToAction.tsx","src/components/Icons/Miscellaneous/TouchIcon.tsx","src/components/Veille/FaceDetector.tsx","src/components/Veille/EmptyVeille.tsx","src/components/Veille/ScreenSaver.tsx","src/components/Veille/SlideShow.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\r\nimport { useSpring, animated } from '@react-spring/web'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\n\r\nimport { Routes } from '../../models/enums'\r\nimport type { VeilleConfiguration } from '../../models/types'\r\n\r\nimport NewsView from '../Views/NewsView'\r\nimport CallToAction from './CallToAction'\r\nimport FaceDetector from './FaceDetector'\r\nimport EmptyVeille from './EmptyVeille'\r\nimport ScreenSaver from './ScreenSaver'\r\nimport SlideShow from './SlideShow'\r\n\r\nconst springDuration = 500\r\n\r\ninterface VeilleManagerProps {\r\n onClose: () => void\r\n}\r\n\r\nconst VeilleManager = ({ onClose }: VeilleManagerProps) => {\r\n const dispatch = useDispatch()\r\n const route = useSelector((state: RootState) => state.viewReducer.route)\r\n const veilleConfiguration = useSelector((state: RootState) => state.viewReducer.veilleConfiguration)\r\n const muted = useSelector((state: RootState) => state.speechReducer.muted)\r\n\r\n const [loop, setLoop] = useState<boolean>(false)\r\n\r\n const veilleDataRef = useRef<VeilleConfiguration>(veilleConfiguration)\r\n const availableItemsToDisplayRef = useRef<Array<Routes>>([])\r\n const currentItemDisplayedRef = useRef<number>(0)\r\n const fadeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const oldMutedRef = useRef<boolean>(muted)\r\n\r\n const [spring, api] = useSpring(() => ({\r\n from: { opacity: 0 }\r\n }))\r\n\r\n useEffect(() => {\r\n api.start({\r\n from: { opacity: 0 },\r\n to: { opacity: 1 },\r\n config: { duration: springDuration }\r\n })\r\n }, [])\r\n\r\n const handleClose = (): void => {\r\n api.start({\r\n from: { opacity: 1 },\r\n to: { opacity: 0 },\r\n config: { duration: springDuration }\r\n })\r\n\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n fadeTimerRef.current = setTimeout(() => {\r\n // Switch back the muted state (it could have not been changed but for security let's set it)\r\n dispatch(storeActions.speech.setMuted(oldMutedRef.current))\r\n // Get back to home view\r\n dispatch(storeActions.view.setRoute(Routes.Home))\r\n onClose()\r\n }, springDuration)\r\n }\r\n\r\n const switchComponent = (): void => {\r\n if (availableItemsToDisplayRef.current.length > currentItemDisplayedRef.current + 1) {\r\n currentItemDisplayedRef.current++\r\n dispatch(storeActions.view.setRoute(availableItemsToDisplayRef.current[currentItemDisplayedRef.current]))\r\n } else {\r\n currentItemDisplayedRef.current = 0\r\n dispatch(storeActions.view.setRoute(availableItemsToDisplayRef.current[0]))\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n veilleDataRef.current = veilleConfiguration\r\n const tempViewArray: Array<Routes> = []\r\n veilleConfiguration.views?.screenSaver?.enabled && tempViewArray.push(Routes.ScreenSaver)\r\n veilleConfiguration.views?.news?.enabled && tempViewArray.push(Routes.NewsInVeille)\r\n veilleConfiguration.views?.slideShow?.enabled && tempViewArray.push(Routes.SlideShow)\r\n // Set loop if there is only 1 item to display\r\n setLoop(tempViewArray.length === 1)\r\n availableItemsToDisplayRef.current = tempViewArray\r\n currentItemDisplayedRef.current = 0\r\n // Mute the sound if the news in veille has to be muted\r\n veilleDataRef.current.views?.news?.muted && dispatch(storeActions.speech.setMuted(true))\r\n dispatch(storeActions.view.setRoute(availableItemsToDisplayRef.current.length ? availableItemsToDisplayRef.current[0] : Routes.EmptyVeille))\r\n\r\n return () => {\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n // Switch back the muted state (it could have not been changed but for security let's set it)\r\n dispatch(storeActions.speech.setMuted(oldMutedRef.current))\r\n }\r\n }, [])\r\n\r\n return (\r\n <React.Fragment>\r\n <animated.div\r\n id='retorik-framework-veille-manager'\r\n className='rf-relative rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-grid rf-grid-cols-8 rf-grid-rows-12'\r\n style={{\r\n ...spring\r\n }}\r\n >\r\n <CallToAction />\r\n {veilleConfiguration.autoExitFromWebcam && <FaceDetector detectionThreshold={0.95} onFaceDetected={() => handleClose()} />}\r\n\r\n {route === Routes.EmptyVeille && <EmptyVeille />}\r\n {route === Routes.NewsInVeille && <NewsView hideMenu={true} isRetorikNews={true} handleEndedWithoutloop={switchComponent} loop={loop} fromVeille={true} />}\r\n {route === Routes.ScreenSaver && (\r\n <ScreenSaver\r\n url={veilleConfiguration.views?.screenSaver?.url}\r\n timer={veilleConfiguration.views?.screenSaver?.timerBeforeSwitchInSeconds}\r\n loop={loop}\r\n springDuration={springDuration}\r\n switchComponent={switchComponent}\r\n />\r\n )}\r\n {route === Routes.SlideShow && (\r\n <SlideShow\r\n urls={veilleConfiguration.views?.slideShow?.urls}\r\n timer={veilleConfiguration.views?.slideShow?.timerBeforeSwitchInSeconds}\r\n loop={loop}\r\n springDuration={springDuration}\r\n switchComponent={switchComponent}\r\n />\r\n )}\r\n </animated.div>\r\n\r\n {/* Overlay to exit the veille */}\r\n <div className='rf-z-overlay rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-bg-transparent rf-cursor-pointer' onClick={() => handleClose()} />\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default VeilleManager\r\n","import React, { useState } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\nimport { getColorWithTransparency } from '../../utils/colorUtils'\r\nimport TouchIcon from '../Icons/Miscellaneous/TouchIcon'\r\n\r\nconst CallToAction = (): JSX.Element => {\r\n const themeColors = useSelector((state: RootState) => state.viewReducer.themeColors)\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const [colorWithTransparency] = useState<string>(getColorWithTransparency(themeColors.primary, 0.5))\r\n\r\n return (\r\n <div className='rf-absolute rf-z-ui rf-bottom-0 rf-right-0 rf-w-64 rf-h-80 rf-grid rf-grid-cols-1 rf-grid-rows-1 rf-justify-end rf-justify-items-end rf-content-end rf-items-end rf-text-center rf-overflow-hidden rf-z-10'>\r\n <div className='rf-relative rf-col-start-1 rf-col-end-2 rf-row-start-1 rf-row-end-2 rf-w-48 rf-h-36 rf-rotate-45 rf-translate-y-8' style={{ backgroundColor: colorWithTransparency }}></div>\r\n <div className='rf-relative rf-col-start-1 rf-col-end-2 rf-row-start-1 rf-row-end-2 rf-w-50 rf-h-32 rf-flex rf-flex-col rf-gap-2 rf-justify-center rf-items-center rf-text-white'>\r\n <TouchIcon />\r\n <p className='rf-ml-16 rf-mr-4'>{translation.veille.calltoaction}</p>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default CallToAction\r\n","import React from \"react\";\r\nimport type { IconDefaultProps } from '../../../models/types'\r\n\r\nconst TouchIcon = ({ className, color }: IconDefaultProps) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 48 67\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n stroke={color || 'currentColor'}\r\n fill={color || 'currentColor'}\r\n className={className || 'rf-h-12 rf-w-12'}\r\n >\r\n <path\r\n d=\"m41 24c-1.7 0-3.2 0.65-4.4 1.7-1.2-1.1-2.7-1.7-4.4-1.7-1.7 0-3.2 0.65-4.4 1.7-0.48-0.44-1-0.8-1.6-1.1 2.1-2.6 3.4-6 3.4-9.5 2.8e-4 -8.3-6.7-15-15-15-8.3 0-15 6.7-15 15 0 5.8 3.3 11 8.4 13v18c0 11 8.9 20 20 20 11 0 20-8.9 20-20v-16c0-3.6-2.9-6.6-6.6-6.6zm-37-8.8c0-5.9 4.8-11 11-11 5.9 0 11 4.8 11 11 0 3.4-1.6 6.5-4.1 8.5v-8.5c0-3.6-2.9-6.6-6.6-6.6-3.6 0-6.6 2.9-6.6 6.6v8.5c-2.6-2-4.1-5.1-4.1-8.5zm39 32c0 8.5-6.9 15-15 15-8.5 0-15-6.9-15-15v-20c4e-3 -0.072 4e-3 -0.14 0-0.22v-12c0-1.2 1-2.3 2.3-2.3 1.2 0 2.3 1 2.3 2.3v20c0 1.2 0.96 2.1 2.1 2.1 1.2 0 2.1-0.96 2.1-2.1v-4.7c0-1.2 1-2.3 2.3-2.3s2.3 1 2.3 2.3v4.7c0 1.2 0.96 2.1 2.1 2.1 1.2 0 2.1-0.96 2.1-2.1v-4.7c0-1.2 1-2.3 2.3-2.3 1.2 0 2.3 1 2.3 2.3v4.7c0 1.2 0.96 2.1 2.1 2.1s2.1-0.96 2.1-2.1v-4.7c0-1.2 1-2.3 2.3-2.3 1.2 0 2.3 1 2.3 2.3v16z\"\r\n strokeWidth=\".29\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default TouchIcon;\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { FaceDetector as MediapipeFaceDetector, FilesetResolver, Detection } from '@mediapipe/tasks-vision'\r\n\r\ninterface FaceDetectorProps {\r\n detectionThreshold: number\r\n onFaceDetected: (detections?: Array<Detection>, imageWidth?: number, imageHeight?: number) => void\r\n showThumbnail?: boolean\r\n rotation?: number\r\n}\r\n\r\nconst runningMode = 'VIDEO'\r\nlet lastVideoTime = -1\r\nconst defaultConstraints: MediaStreamConstraints = {\r\n video: {\r\n facingMode: 'user'\r\n }\r\n}\r\n\r\nconst FaceDetector = ({ detectionThreshold, onFaceDetected, showThumbnail, rotation }: FaceDetectorProps): JSX.Element => {\r\n const [webcamWidth, setWebcamWidth] = useState<number>(0)\r\n const [webcamHeight, setWebcamHeight] = useState<number>(0)\r\n const [faceDetector, setFaceDetector] = useState<MediapipeFaceDetector | undefined>()\r\n const videoRef = useRef<HTMLVideoElement>(null)\r\n const rotationRef = useRef<number>(rotation || 0)\r\n\r\n useEffect(() => {\r\n rotationRef.current = rotation || 0\r\n }, [rotation])\r\n\r\n useEffect(() => {\r\n const createfaceDetector = async () => {\r\n const vision = await FilesetResolver.forVisionTasks('https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm')\r\n const newFaceDetector = await MediapipeFaceDetector.createFromOptions(vision, {\r\n baseOptions: {\r\n modelAssetPath: `https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite`,\r\n delegate: 'GPU'\r\n },\r\n runningMode: runningMode\r\n })\r\n\r\n newFaceDetector && setFaceDetector(newFaceDetector)\r\n }\r\n\r\n const initializefaceDetector = async () => {\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((display) => {\r\n const settings = display.getVideoTracks()[0].getSettings()\r\n setWebcamWidth(settings.width || 0)\r\n setWebcamHeight(settings.height || 0)\r\n createfaceDetector()\r\n })\r\n .catch((error) => console.warn('Retorik Framework > an error occured when trying to use the webcam : ', error))\r\n }\r\n\r\n initializefaceDetector()\r\n }, [])\r\n\r\n const predictWebcam = async () => {\r\n if (faceDetector && videoRef.current) {\r\n let startTimeMs = performance.now()\r\n\r\n // Detect faces using detectForVideo\r\n if (videoRef.current.currentTime !== lastVideoTime) {\r\n lastVideoTime = videoRef.current.currentTime\r\n const detections = faceDetector.detectForVideo(videoRef.current, startTimeMs, { rotationDegrees: rotationRef.current }).detections\r\n\r\n if (detections.length) {\r\n const score = detections[0].categories[0].score\r\n score > detectionThreshold && onFaceDetected(detections, videoRef.current.videoWidth, videoRef.current.videoHeight)\r\n }\r\n }\r\n }\r\n\r\n // Call this function again to keep predicting when the browser is ready\r\n window.requestAnimationFrame(predictWebcam)\r\n }\r\n\r\n useEffect(() => {\r\n if (faceDetector && videoRef.current) {\r\n // Activate the webcam stream\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((stream) => {\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = stream\r\n videoRef.current.addEventListener('loadeddata', predictWebcam)\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n })\r\n }\r\n }, [faceDetector])\r\n\r\n return (\r\n <div id='retorik-framework-face-detector' className={`rf-absolute rf-top-0 rf-left-0 ${!showThumbnail && 'rf-invisible'}`}>\r\n <video\r\n ref={videoRef}\r\n src=''\r\n autoPlay\r\n style={{\r\n rotate: `${rotation}deg`,\r\n width: showThumbnail ? webcamWidth / 2 : webcamWidth,\r\n height: showThumbnail ? webcamHeight / 2 : webcamHeight\r\n }}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default FaceDetector\r\n","import React from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\n\r\nconst EmptyVeille = () => {\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n\r\n return (\r\n <div className='rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-bg-black rf-flex rf-justify-center rf-items-center'>\r\n <div className='rf-uppercase rf-font-bold rf-text-3xl rf-text-white rf-animate-pulse'>{translation.veille.emptyveille}</div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default EmptyVeille\r\n","import React, { useEffect, useRef } from 'react'\r\nimport { useSpring, animated } from '@react-spring/web'\r\n\r\ninterface ScreenSaverProps {\r\n url?: string\r\n timer?: number\r\n loop?: boolean\r\n springDuration: number\r\n switchComponent: () => void\r\n}\r\n\r\nconst ScreenSaver = ({ url, timer, loop, springDuration, switchComponent }: ScreenSaverProps) => {\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const fadeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n const [spring, api] = useSpring(() => ({\r\n from: {\r\n opacity: 0\r\n }\r\n }))\r\n\r\n useEffect(() => {\r\n api.start({\r\n from: {\r\n opacity: 0\r\n },\r\n to: {\r\n opacity: 1\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n }, [])\r\n\r\n const handleClose = (): void => {\r\n api.start({\r\n from: {\r\n opacity: 1\r\n },\r\n to: {\r\n opacity: 0\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n fadeTimerRef.current = setTimeout(() => {\r\n // Get back to home view\r\n switchComponent()\r\n }, springDuration)\r\n }\r\n\r\n useEffect(() => {\r\n if (!loop) {\r\n timerRef.current = setTimeout(() => {\r\n handleClose()\r\n }, (timer || 8) * 1000 - springDuration)\r\n }\r\n\r\n return () => {\r\n timerRef.current && clearTimeout(timerRef.current)\r\n fadeTimerRef.current && clearTimeout(fadeTimerRef.current)\r\n }\r\n }, [])\r\n\r\n return (\r\n <animated.div\r\n className='rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full'\r\n style={{\r\n backgroundImage: `url(${url})`,\r\n backgroundPosition: 'center',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundSize: 'cover',\r\n ...spring\r\n }}\r\n />\r\n )\r\n}\r\n\r\nexport default ScreenSaver\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { useSpring, animated } from '@react-spring/web'\r\n\r\ninterface SlideShowProps {\r\n urls?: Array<string>\r\n timer?: number\r\n loop?: boolean\r\n springDuration: number\r\n switchComponent: () => void\r\n}\r\n\r\nconst SlideShow = ({ urls, timer, loop, springDuration, switchComponent }: SlideShowProps) => {\r\n const [currentIndex, setCurrentIndex] = useState<number>(0)\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const fadeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n const [spring, api] = useSpring(() => ({\r\n from: {\r\n opacity: 0\r\n }\r\n }))\r\n\r\n useEffect(() => {\r\n api.start({\r\n from: {\r\n opacity: 0\r\n },\r\n to: {\r\n opacity: 1\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n }, [])\r\n\r\n const handleClose = (): void => {\r\n api.start({\r\n from: {\r\n opacity: 1\r\n },\r\n to: {\r\n opacity: 0\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n fadeTimerRef.current = setTimeout(() => {\r\n // Get back to home view\r\n switchComponent()\r\n }, springDuration)\r\n }\r\n\r\n useEffect(() => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n if (urls?.length) {\r\n timerRef.current = setTimeout(() => {\r\n currentIndex === urls.length - 1 ? (loop ? setCurrentIndex(0) : handleClose()) : setCurrentIndex(currentIndex + 1)\r\n }, (timer || 5) * 1000)\r\n } else {\r\n switchComponent()\r\n }\r\n }, [currentIndex])\r\n\r\n useEffect(() => {\r\n return () => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n }\r\n }, [])\r\n\r\n return (\r\n <animated.div className='rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-flex rf-justify-center rf-items-center rf-bg-black' style={{ ...spring }}>\r\n <img className={`${window.innerHeight > window.innerWidth ? 'rf-w-full' : 'rf-h-full'}`} src={urls?.[currentIndex] || ''} alt='slideshow' />\r\n </animated.div>\r\n )\r\n}\r\n\r\nexport default SlideShow\r\n"],"names":[],"version":3,"file":"VeilleManager.85967e7c.js.map","sourceRoot":"../"}
@@ -180,9 +180,10 @@ var $i1OHx = parcelRequire("i1OHx");
180
180
  var $9hDpx = parcelRequire("9hDpx");
181
181
  const $8d9fce4b03a5e10a$var$CallToAction = ()=>{
182
182
  const themeColors = (0, $1cDKu$useSelector)((state)=>state.viewReducer.themeColors);
183
+ const translation = (0, $1cDKu$useSelector)((state)=>state.localeReducer.currentTranslations);
183
184
  const [colorWithTransparency] = (0, $1cDKu$useState)((0, $i1OHx.getColorWithTransparency)(themeColors.primary, 0.5));
184
185
  return /*#__PURE__*/ (0, $1cDKu$jsxs)("div", {
185
- className: "rf-absolute rf-z-ui rf-bottom-0 rf-right-0 rf-w-80 rf-h-80 rf-grid rf-grid-cols-1 rf-grid-rows-1 rf-justify-end rf-justify-items-end rf-content-end rf-items-end rf-text-center rf-overflow-hidden rf-z-10",
186
+ className: "rf-absolute rf-z-ui rf-bottom-0 rf-right-0 rf-w-64 rf-h-80 rf-grid rf-grid-cols-1 rf-grid-rows-1 rf-justify-end rf-justify-items-end rf-content-end rf-items-end rf-text-center rf-overflow-hidden rf-z-10",
186
187
  children: [
187
188
  /*#__PURE__*/ (0, $1cDKu$jsx)("div", {
188
189
  className: "rf-relative rf-col-start-1 rf-col-end-2 rf-row-start-1 rf-row-end-2 rf-w-48 rf-h-36 rf-rotate-45 rf-translate-y-8",
@@ -195,8 +196,8 @@ const $8d9fce4b03a5e10a$var$CallToAction = ()=>{
195
196
  children: [
196
197
  /*#__PURE__*/ (0, $1cDKu$jsx)((0, $9hDpx.default), {}),
197
198
  /*#__PURE__*/ (0, $1cDKu$jsx)("p", {
198
- className: "rf-mx-4",
199
- children: "Click on screen to start"
199
+ className: "rf-ml-16 rf-mr-4",
200
+ children: translation.veille.calltoaction
200
201
  })
201
202
  ]
202
203
  })
@@ -330,12 +331,14 @@ parcelRegister("9fA0k", function(module, exports) {
330
331
  $parcel$export(module.exports, "default", () => $bdd3afba8bcb9c3a$export$2e2bcd8739ae039);
331
332
 
332
333
 
334
+
333
335
  const $bdd3afba8bcb9c3a$var$EmptyVeille = ()=>{
336
+ const translation = (0, $1cDKu$useSelector)((state)=>state.localeReducer.currentTranslations);
334
337
  return /*#__PURE__*/ (0, $1cDKu$jsx)("div", {
335
338
  className: "rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-bg-black rf-flex rf-justify-center rf-items-center",
336
339
  children: /*#__PURE__*/ (0, $1cDKu$jsx)("div", {
337
340
  className: "rf-uppercase rf-font-bold rf-text-3xl rf-text-white rf-animate-pulse",
338
- children: "click or tap on the screen..."
341
+ children: translation.veille.emptyveille
339
342
  })
340
343
  });
341
344
  };
@@ -491,4 +494,4 @@ var $8ccf4a1e66e2b9e3$export$2e2bcd8739ae039 = $8ccf4a1e66e2b9e3$var$SlideShow;
491
494
 
492
495
 
493
496
 
494
- //# sourceMappingURL=VeilleManager.72cf0e9c.js.map
497
+ //# sourceMappingURL=VeilleManager.f3bafdec.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/components/Veille/VeilleManager.tsx","src/components/Veille/CallToAction.tsx","src/components/Icons/Miscellaneous/TouchIcon.tsx","src/components/Veille/FaceDetector.tsx","src/components/Veille/EmptyVeille.tsx","src/components/Veille/ScreenSaver.tsx","src/components/Veille/SlideShow.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\r\nimport { useSpring, animated } from '@react-spring/web'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\n\r\nimport { Routes } from '../../models/enums'\r\nimport type { VeilleConfiguration } from '../../models/types'\r\n\r\nimport NewsView from '../Views/NewsView'\r\nimport CallToAction from './CallToAction'\r\nimport FaceDetector from './FaceDetector'\r\nimport EmptyVeille from './EmptyVeille'\r\nimport ScreenSaver from './ScreenSaver'\r\nimport SlideShow from './SlideShow'\r\n\r\nconst springDuration = 500\r\n\r\ninterface VeilleManagerProps {\r\n onClose: () => void\r\n}\r\n\r\nconst VeilleManager = ({ onClose }: VeilleManagerProps) => {\r\n const dispatch = useDispatch()\r\n const route = useSelector((state: RootState) => state.viewReducer.route)\r\n const veilleConfiguration = useSelector((state: RootState) => state.viewReducer.veilleConfiguration)\r\n const muted = useSelector((state: RootState) => state.speechReducer.muted)\r\n\r\n const [loop, setLoop] = useState<boolean>(false)\r\n\r\n const veilleDataRef = useRef<VeilleConfiguration>(veilleConfiguration)\r\n const availableItemsToDisplayRef = useRef<Array<Routes>>([])\r\n const currentItemDisplayedRef = useRef<number>(0)\r\n const fadeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const oldMutedRef = useRef<boolean>(muted)\r\n\r\n const [spring, api] = useSpring(() => ({\r\n from: { opacity: 0 }\r\n }))\r\n\r\n useEffect(() => {\r\n api.start({\r\n from: { opacity: 0 },\r\n to: { opacity: 1 },\r\n config: { duration: springDuration }\r\n })\r\n }, [])\r\n\r\n const handleClose = (): void => {\r\n api.start({\r\n from: { opacity: 1 },\r\n to: { opacity: 0 },\r\n config: { duration: springDuration }\r\n })\r\n\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n fadeTimerRef.current = setTimeout(() => {\r\n // Switch back the muted state (it could have not been changed but for security let's set it)\r\n dispatch(storeActions.speech.setMuted(oldMutedRef.current))\r\n // Get back to home view\r\n dispatch(storeActions.view.setRoute(Routes.Home))\r\n onClose()\r\n }, springDuration)\r\n }\r\n\r\n const switchComponent = (): void => {\r\n if (availableItemsToDisplayRef.current.length > currentItemDisplayedRef.current + 1) {\r\n currentItemDisplayedRef.current++\r\n dispatch(storeActions.view.setRoute(availableItemsToDisplayRef.current[currentItemDisplayedRef.current]))\r\n } else {\r\n currentItemDisplayedRef.current = 0\r\n dispatch(storeActions.view.setRoute(availableItemsToDisplayRef.current[0]))\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n veilleDataRef.current = veilleConfiguration\r\n const tempViewArray: Array<Routes> = []\r\n veilleConfiguration.views?.screenSaver?.enabled && tempViewArray.push(Routes.ScreenSaver)\r\n veilleConfiguration.views?.news?.enabled && tempViewArray.push(Routes.NewsInVeille)\r\n veilleConfiguration.views?.slideShow?.enabled && tempViewArray.push(Routes.SlideShow)\r\n // Set loop if there is only 1 item to display\r\n setLoop(tempViewArray.length === 1)\r\n availableItemsToDisplayRef.current = tempViewArray\r\n currentItemDisplayedRef.current = 0\r\n // Mute the sound if the news in veille has to be muted\r\n veilleDataRef.current.views?.news?.muted && dispatch(storeActions.speech.setMuted(true))\r\n dispatch(storeActions.view.setRoute(availableItemsToDisplayRef.current.length ? availableItemsToDisplayRef.current[0] : Routes.EmptyVeille))\r\n\r\n return () => {\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n // Switch back the muted state (it could have not been changed but for security let's set it)\r\n dispatch(storeActions.speech.setMuted(oldMutedRef.current))\r\n }\r\n }, [])\r\n\r\n return (\r\n <React.Fragment>\r\n <animated.div\r\n id='retorik-framework-veille-manager'\r\n className='rf-relative rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-grid rf-grid-cols-8 rf-grid-rows-12'\r\n style={{\r\n ...spring\r\n }}\r\n >\r\n <CallToAction />\r\n {veilleConfiguration.autoExitFromWebcam && <FaceDetector detectionThreshold={0.95} onFaceDetected={() => handleClose()} />}\r\n\r\n {route === Routes.EmptyVeille && <EmptyVeille />}\r\n {route === Routes.NewsInVeille && <NewsView hideMenu={true} isRetorikNews={true} handleEndedWithoutloop={switchComponent} loop={loop} fromVeille={true} />}\r\n {route === Routes.ScreenSaver && (\r\n <ScreenSaver\r\n url={veilleConfiguration.views?.screenSaver?.url}\r\n timer={veilleConfiguration.views?.screenSaver?.timerBeforeSwitchInSeconds}\r\n loop={loop}\r\n springDuration={springDuration}\r\n switchComponent={switchComponent}\r\n />\r\n )}\r\n {route === Routes.SlideShow && (\r\n <SlideShow\r\n urls={veilleConfiguration.views?.slideShow?.urls}\r\n timer={veilleConfiguration.views?.slideShow?.timerBeforeSwitchInSeconds}\r\n loop={loop}\r\n springDuration={springDuration}\r\n switchComponent={switchComponent}\r\n />\r\n )}\r\n </animated.div>\r\n\r\n {/* Overlay to exit the veille */}\r\n <div className='rf-z-overlay rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-bg-transparent rf-cursor-pointer' onClick={() => handleClose()} />\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default VeilleManager\r\n","import React, { useState } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\nimport { getColorWithTransparency } from '../../utils/colorUtils'\r\nimport TouchIcon from '../Icons/Miscellaneous/TouchIcon'\r\n\r\nconst CallToAction = (): JSX.Element => {\r\n const themeColors = useSelector((state: RootState) => state.viewReducer.themeColors)\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const [colorWithTransparency] = useState<string>(getColorWithTransparency(themeColors.primary, 0.5))\r\n\r\n return (\r\n <div className='rf-absolute rf-z-ui rf-bottom-0 rf-right-0 rf-w-64 rf-h-80 rf-grid rf-grid-cols-1 rf-grid-rows-1 rf-justify-end rf-justify-items-end rf-content-end rf-items-end rf-text-center rf-overflow-hidden rf-z-10'>\r\n <div className='rf-relative rf-col-start-1 rf-col-end-2 rf-row-start-1 rf-row-end-2 rf-w-48 rf-h-36 rf-rotate-45 rf-translate-y-8' style={{ backgroundColor: colorWithTransparency }}></div>\r\n <div className='rf-relative rf-col-start-1 rf-col-end-2 rf-row-start-1 rf-row-end-2 rf-w-50 rf-h-32 rf-flex rf-flex-col rf-gap-2 rf-justify-center rf-items-center rf-text-white'>\r\n <TouchIcon />\r\n <p className='rf-ml-16 rf-mr-4'>{translation.veille.calltoaction}</p>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default CallToAction\r\n","import React from \"react\";\r\nimport type { IconDefaultProps } from '../../../models/types'\r\n\r\nconst TouchIcon = ({ className, color }: IconDefaultProps) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 48 67\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n stroke={color || 'currentColor'}\r\n fill={color || 'currentColor'}\r\n className={className || 'rf-h-12 rf-w-12'}\r\n >\r\n <path\r\n d=\"m41 24c-1.7 0-3.2 0.65-4.4 1.7-1.2-1.1-2.7-1.7-4.4-1.7-1.7 0-3.2 0.65-4.4 1.7-0.48-0.44-1-0.8-1.6-1.1 2.1-2.6 3.4-6 3.4-9.5 2.8e-4 -8.3-6.7-15-15-15-8.3 0-15 6.7-15 15 0 5.8 3.3 11 8.4 13v18c0 11 8.9 20 20 20 11 0 20-8.9 20-20v-16c0-3.6-2.9-6.6-6.6-6.6zm-37-8.8c0-5.9 4.8-11 11-11 5.9 0 11 4.8 11 11 0 3.4-1.6 6.5-4.1 8.5v-8.5c0-3.6-2.9-6.6-6.6-6.6-3.6 0-6.6 2.9-6.6 6.6v8.5c-2.6-2-4.1-5.1-4.1-8.5zm39 32c0 8.5-6.9 15-15 15-8.5 0-15-6.9-15-15v-20c4e-3 -0.072 4e-3 -0.14 0-0.22v-12c0-1.2 1-2.3 2.3-2.3 1.2 0 2.3 1 2.3 2.3v20c0 1.2 0.96 2.1 2.1 2.1 1.2 0 2.1-0.96 2.1-2.1v-4.7c0-1.2 1-2.3 2.3-2.3s2.3 1 2.3 2.3v4.7c0 1.2 0.96 2.1 2.1 2.1 1.2 0 2.1-0.96 2.1-2.1v-4.7c0-1.2 1-2.3 2.3-2.3 1.2 0 2.3 1 2.3 2.3v4.7c0 1.2 0.96 2.1 2.1 2.1s2.1-0.96 2.1-2.1v-4.7c0-1.2 1-2.3 2.3-2.3 1.2 0 2.3 1 2.3 2.3v16z\"\r\n strokeWidth=\".29\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default TouchIcon;\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { FaceDetector as MediapipeFaceDetector, FilesetResolver, Detection } from '@mediapipe/tasks-vision'\r\n\r\ninterface FaceDetectorProps {\r\n detectionThreshold: number\r\n onFaceDetected: (detections?: Array<Detection>, imageWidth?: number, imageHeight?: number) => void\r\n showThumbnail?: boolean\r\n rotation?: number\r\n}\r\n\r\nconst runningMode = 'VIDEO'\r\nlet lastVideoTime = -1\r\nconst defaultConstraints: MediaStreamConstraints = {\r\n video: {\r\n facingMode: 'user'\r\n }\r\n}\r\n\r\nconst FaceDetector = ({ detectionThreshold, onFaceDetected, showThumbnail, rotation }: FaceDetectorProps): JSX.Element => {\r\n const [webcamWidth, setWebcamWidth] = useState<number>(0)\r\n const [webcamHeight, setWebcamHeight] = useState<number>(0)\r\n const [faceDetector, setFaceDetector] = useState<MediapipeFaceDetector | undefined>()\r\n const videoRef = useRef<HTMLVideoElement>(null)\r\n const rotationRef = useRef<number>(rotation || 0)\r\n\r\n useEffect(() => {\r\n rotationRef.current = rotation || 0\r\n }, [rotation])\r\n\r\n useEffect(() => {\r\n const createfaceDetector = async () => {\r\n const vision = await FilesetResolver.forVisionTasks('https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm')\r\n const newFaceDetector = await MediapipeFaceDetector.createFromOptions(vision, {\r\n baseOptions: {\r\n modelAssetPath: `https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite`,\r\n delegate: 'GPU'\r\n },\r\n runningMode: runningMode\r\n })\r\n\r\n newFaceDetector && setFaceDetector(newFaceDetector)\r\n }\r\n\r\n const initializefaceDetector = async () => {\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((display) => {\r\n const settings = display.getVideoTracks()[0].getSettings()\r\n setWebcamWidth(settings.width || 0)\r\n setWebcamHeight(settings.height || 0)\r\n createfaceDetector()\r\n })\r\n .catch((error) => console.warn('Retorik Framework > an error occured when trying to use the webcam : ', error))\r\n }\r\n\r\n initializefaceDetector()\r\n }, [])\r\n\r\n const predictWebcam = async () => {\r\n if (faceDetector && videoRef.current) {\r\n let startTimeMs = performance.now()\r\n\r\n // Detect faces using detectForVideo\r\n if (videoRef.current.currentTime !== lastVideoTime) {\r\n lastVideoTime = videoRef.current.currentTime\r\n const detections = faceDetector.detectForVideo(videoRef.current, startTimeMs, { rotationDegrees: rotationRef.current }).detections\r\n\r\n if (detections.length) {\r\n const score = detections[0].categories[0].score\r\n score > detectionThreshold && onFaceDetected(detections, videoRef.current.videoWidth, videoRef.current.videoHeight)\r\n }\r\n }\r\n }\r\n\r\n // Call this function again to keep predicting when the browser is ready\r\n window.requestAnimationFrame(predictWebcam)\r\n }\r\n\r\n useEffect(() => {\r\n if (faceDetector && videoRef.current) {\r\n // Activate the webcam stream\r\n navigator.mediaDevices\r\n .getUserMedia(defaultConstraints)\r\n .then((stream) => {\r\n if (videoRef.current) {\r\n videoRef.current.srcObject = stream\r\n videoRef.current.addEventListener('loadeddata', predictWebcam)\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err)\r\n })\r\n }\r\n }, [faceDetector])\r\n\r\n return (\r\n <div id='retorik-framework-face-detector' className={`rf-absolute rf-top-0 rf-left-0 ${!showThumbnail && 'rf-invisible'}`}>\r\n <video\r\n ref={videoRef}\r\n src=''\r\n autoPlay\r\n style={{\r\n rotate: `${rotation}deg`,\r\n width: showThumbnail ? webcamWidth / 2 : webcamWidth,\r\n height: showThumbnail ? webcamHeight / 2 : webcamHeight\r\n }}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default FaceDetector\r\n","import React from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\n\r\nconst EmptyVeille = () => {\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n\r\n return (\r\n <div className='rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-bg-black rf-flex rf-justify-center rf-items-center'>\r\n <div className='rf-uppercase rf-font-bold rf-text-3xl rf-text-white rf-animate-pulse'>{translation.veille.emptyveille}</div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default EmptyVeille\r\n","import React, { useEffect, useRef } from 'react'\r\nimport { useSpring, animated } from '@react-spring/web'\r\n\r\ninterface ScreenSaverProps {\r\n url?: string\r\n timer?: number\r\n loop?: boolean\r\n springDuration: number\r\n switchComponent: () => void\r\n}\r\n\r\nconst ScreenSaver = ({ url, timer, loop, springDuration, switchComponent }: ScreenSaverProps) => {\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const fadeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n const [spring, api] = useSpring(() => ({\r\n from: {\r\n opacity: 0\r\n }\r\n }))\r\n\r\n useEffect(() => {\r\n api.start({\r\n from: {\r\n opacity: 0\r\n },\r\n to: {\r\n opacity: 1\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n }, [])\r\n\r\n const handleClose = (): void => {\r\n api.start({\r\n from: {\r\n opacity: 1\r\n },\r\n to: {\r\n opacity: 0\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n fadeTimerRef.current = setTimeout(() => {\r\n // Get back to home view\r\n switchComponent()\r\n }, springDuration)\r\n }\r\n\r\n useEffect(() => {\r\n if (!loop) {\r\n timerRef.current = setTimeout(() => {\r\n handleClose()\r\n }, (timer || 8) * 1000 - springDuration)\r\n }\r\n\r\n return () => {\r\n timerRef.current && clearTimeout(timerRef.current)\r\n fadeTimerRef.current && clearTimeout(fadeTimerRef.current)\r\n }\r\n }, [])\r\n\r\n return (\r\n <animated.div\r\n className='rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full'\r\n style={{\r\n backgroundImage: `url(${url})`,\r\n backgroundPosition: 'center',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundSize: 'cover',\r\n ...spring\r\n }}\r\n />\r\n )\r\n}\r\n\r\nexport default ScreenSaver\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { useSpring, animated } from '@react-spring/web'\r\n\r\ninterface SlideShowProps {\r\n urls?: Array<string>\r\n timer?: number\r\n loop?: boolean\r\n springDuration: number\r\n switchComponent: () => void\r\n}\r\n\r\nconst SlideShow = ({ urls, timer, loop, springDuration, switchComponent }: SlideShowProps) => {\r\n const [currentIndex, setCurrentIndex] = useState<number>(0)\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const fadeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n const [spring, api] = useSpring(() => ({\r\n from: {\r\n opacity: 0\r\n }\r\n }))\r\n\r\n useEffect(() => {\r\n api.start({\r\n from: {\r\n opacity: 0\r\n },\r\n to: {\r\n opacity: 1\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n }, [])\r\n\r\n const handleClose = (): void => {\r\n api.start({\r\n from: {\r\n opacity: 1\r\n },\r\n to: {\r\n opacity: 0\r\n },\r\n config: {\r\n duration: springDuration\r\n }\r\n })\r\n\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n fadeTimerRef.current = setTimeout(() => {\r\n // Get back to home view\r\n switchComponent()\r\n }, springDuration)\r\n }\r\n\r\n useEffect(() => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n if (urls?.length) {\r\n timerRef.current = setTimeout(() => {\r\n currentIndex === urls.length - 1 ? (loop ? setCurrentIndex(0) : handleClose()) : setCurrentIndex(currentIndex + 1)\r\n }, (timer || 5) * 1000)\r\n } else {\r\n switchComponent()\r\n }\r\n }, [currentIndex])\r\n\r\n useEffect(() => {\r\n return () => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n fadeTimerRef?.current && clearTimeout(fadeTimerRef.current)\r\n }\r\n }, [])\r\n\r\n return (\r\n <animated.div className='rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-flex rf-justify-center rf-items-center rf-bg-black' style={{ ...spring }}>\r\n <img className={`${window.innerHeight > window.innerWidth ? 'rf-w-full' : 'rf-h-full'}`} src={urls?.[currentIndex] || ''} alt='slideshow' />\r\n </animated.div>\r\n )\r\n}\r\n\r\nexport default SlideShow\r\n"],"names":[],"version":3,"file":"VeilleManager.f3bafdec.js.map"}