import { useEffect, useState } from 'react' import { toast } from '@redwoodjs/web/toast' import { toJpeg } from 'html-to-image' import { useIdeContext } from 'src/helpers/hooks/useIdeContext' import { canvasToBlob, blobTo64 } from 'src/helpers/canvasToBlob' import { useUpdateProjectImages } from 'src/helpers/hooks/useUpdateProjectImages' import { requestRenderStateless } from 'src/helpers/hooks/useIdeState' import { PureIdeViewer } from 'src/components/IdeViewer/PureIdeViewer' import { State } from 'src/helpers/hooks/useIdeState' import SocialCardCell from 'src/components/SocialCardCell/SocialCardCell' export const captureSize = { width: 500, height: 522 } const CaptureButtonViewer = ({ onInit, onScadImage, canvasRatio = 1, }: { onInit: (a: any) => void onScadImage: (a: any) => void canvasRatio: number }) => { const { state } = useIdeContext() const threeInstance = React.useRef(null) const [dataType, dataTypeSetter] = useState(state?.objectData?.type) const [artifact, artifactSetter] = useState(state?.objectData?.data) const [ideType] = useState(state?.ideType) const [isLoading, isLoadingSetter] = useState(false) const [camera, cameraSetter] = useState(null) const getThreeInstance = (_threeInstance) => { threeInstance.current = _threeInstance onInit(_threeInstance) } const onCameraChange = (camera, isFirstCameraChange) => { const renderPromise = (state.ideType === 'openscad' || state.ideType === 'curv') && requestRenderStateless({ state, camera, viewerSize: { width: threeInstance.current.size.width * canvasRatio, height: threeInstance.current.size.height * canvasRatio, }, viewAll: isFirstCameraChange, }) if (!renderPromise) { return } isLoadingSetter(true) renderPromise.then(async ({ objectData, camera }) => { if (camera?.isScadUpdate) { cameraSetter(camera) } isLoadingSetter(false) dataTypeSetter(objectData?.type) artifactSetter(objectData?.data) if (objectData?.type === 'png') { onScadImage(await blobTo64(objectData?.data)) } }) } return ( ) } function TabContent() { return (
) } function SocialCardLiveViewer({ forwardRef, onUpload, children, partSnapShot64, }) { const { project } = useIdeContext() return ( <>

Set social Image

{children}
) } function ThumbnailViewer({ forwardRef, onUpload, children, partSnapShot64 }) { return ( <>

Set thumbnail

{children} {partSnapShot64 && ( )}
) } function IsolatedCanvas({ RenderComponent, canvasRatio = 1, size, uploadKey, }: { canvasRatio?: number uploadKey: 'socialCard64' | 'mainImage64' size: { width: number height: number } RenderComponent: React.FC<{ forwardRef: React.Ref children: React.ReactNode partSnapShot64: string onUpload: (a: any) => void }> }) { const { project } = useIdeContext() const { updateProjectImages } = useUpdateProjectImages({}) const [partSnapShot64, partSnapShot64Setter] = React.useState('') const [scadSnapShot64, scadSnapShot64Setter] = React.useState('') const captureRef = React.useRef(null) const threeInstance = React.useRef(null) const onInit = (_threeInstance) => (threeInstance.current = _threeInstance) const upload = async () => { const uploadPromise = new Promise((resolve, reject) => { const asyncHelper = async () => { if (!scadSnapShot64) { partSnapShot64Setter( await blobTo64(await canvasToBlob(threeInstance.current, size)) ) } else { partSnapShot64Setter(scadSnapShot64) } setTimeout(async () => { const capturedImage = await toJpeg(captureRef.current, { cacheBust: true, quality: 0.7, }) await updateProjectImages({ variables: { id: project?.id, [uploadKey]: capturedImage, }, }) partSnapShot64Setter('') resolve(capturedImage) }) } asyncHelper() }) toast.promise(uploadPromise, { loading: 'Saving Image', success: (finalImg: string) => (
Image saved!
), error: Problem saving., }) } return (
) } export default function CaptureButton({ TheButton }) { const { state, thunkDispatch } = useIdeContext() return ( { thunkDispatch({ type: 'addEditorModel', payload: { type: 'component', label: 'Social Media Card', Component: TabContent, }, }) thunkDispatch({ type: 'switchEditorModel', payload: state.editorTabs.length, }) }} /> ) }