diff --git a/packages/apps/proof-of-us/package.json b/packages/apps/proof-of-us/package.json index 28201a6d65..e1558805ec 100644 --- a/packages/apps/proof-of-us/package.json +++ b/packages/apps/proof-of-us/package.json @@ -22,8 +22,10 @@ "next-themes": "~0.2.1", "peerjs": "^1.5.2", "react": "^18.2.0", + "react-canvas-draw": "^1.2.1", "react-dom": "^18.2.0", "react-qrcode-logo": "^2.9.0", + "react-sketch-canvas": "^6.2.0", "socket.io": "^4.7.4", "socket.io-client": "^4.7.4" }, diff --git a/packages/apps/proof-of-us/src/app/scan/[id]/page.tsx b/packages/apps/proof-of-us/src/app/scan/[id]/page.tsx index c31cdb32f8..0e6f393c6e 100644 --- a/packages/apps/proof-of-us/src/app/scan/[id]/page.tsx +++ b/packages/apps/proof-of-us/src/app/scan/[id]/page.tsx @@ -1,4 +1,5 @@ 'use client'; +import { CapturePhoto } from '@/components/CapturePhoto/CapturePhoto'; import { ListSignees } from '@/components/ListSignees/ListSignees'; import { useAccount } from '@/hooks/account'; import { useSocket } from '@/hooks/socket'; @@ -38,6 +39,7 @@ const Page: FC = ({ params }) => { )} + scanned Proof Of Us with ID ({params.id}) diff --git a/packages/apps/proof-of-us/src/app/user/proof-of-us/[id]/page.tsx b/packages/apps/proof-of-us/src/app/user/proof-of-us/[id]/page.tsx index 00fe205abf..88a28f6ac0 100644 --- a/packages/apps/proof-of-us/src/app/user/proof-of-us/[id]/page.tsx +++ b/packages/apps/proof-of-us/src/app/user/proof-of-us/[id]/page.tsx @@ -1,4 +1,5 @@ 'use client'; +import { CapturePhoto } from '@/components/CapturePhoto/CapturePhoto'; import { ListSignees } from '@/components/ListSignees/ListSignees'; import { PROOFOFUS_QR_URL } from '@/constants'; import { useProofOfUs } from '@/hooks/proofOfUs'; @@ -46,6 +47,7 @@ const Page: FC = ({ params }) => {
Proof Of Us with ID ({data.tokenId})
+

Communication

diff --git a/packages/apps/proof-of-us/src/components/CapturePhoto/CapturePhoto.tsx b/packages/apps/proof-of-us/src/components/CapturePhoto/CapturePhoto.tsx new file mode 100644 index 0000000000..aafa37ec96 --- /dev/null +++ b/packages/apps/proof-of-us/src/components/CapturePhoto/CapturePhoto.tsx @@ -0,0 +1,72 @@ +import type { FC, MouseEvent } from 'react'; +import { useEffect, useRef, useState } from 'react'; +import ReactSketchCanvas from 'react-canvas-draw'; +import { modalClass } from './styles.css'; + +export const CapturePhoto: FC = () => { + const videoRef = useRef(null); + const canvasRef = useRef(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [bg, setBg] = useState(undefined); + + useEffect(() => { + if (!videoRef.current && !isModalOpen) return; + + navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => { + if (!videoRef.current) return; + videoRef.current.srcObject = stream; + }); + }, [isModalOpen]); + + const handleCapture = (evt: MouseEvent) => { + evt.preventDefault(); + if (!canvasRef.current || !videoRef.current) return; + console.log(canvasRef.current); + //const canvas = canvasRef.current.querySelector('svg'); + const context = canvasRef.current.ctx.drawing; + + console.log(videoRef.current, canvasRef.current.innerHTML); + //setBg(videoRef.current); + + context?.drawImage(videoRef.current, 0, 0, 320, 240); + + (videoRef.current?.srcObject as MediaStream) + ?.getTracks() + .forEach((t) => t.stop()); + + setIsModalOpen(false); + }; + + const handleToggleCaptureModal = (evt: MouseEvent) => { + evt.preventDefault(); + + setIsModalOpen((v) => !v); + }; + + return ( +
+ + +
+ +
+ + {isModalOpen && ( +
+ + + + +
+ )} +
+ ); +}; diff --git a/packages/apps/proof-of-us/src/components/CapturePhoto/styles.css.ts b/packages/apps/proof-of-us/src/components/CapturePhoto/styles.css.ts new file mode 100644 index 0000000000..c4af55e1cf --- /dev/null +++ b/packages/apps/proof-of-us/src/components/CapturePhoto/styles.css.ts @@ -0,0 +1,11 @@ +import { style } from '@vanilla-extract/css'; + +export const modalClass = style([ + { + position: 'absolute', + background: 'white', + inset: 0, + }, +]); + +export const notificationWrapperClass = style({});