import { api } from "@fileone/convex/_generated/api" import type { Doc } from "@fileone/convex/_generated/dataModel" import { DialogTitle } from "@radix-ui/react-dialog" import { useQuery as useConvexQuery } from "convex/react" import { atom, useAtom, useAtomValue, useSetAtom } from "jotai" import { DownloadIcon, Maximize2Icon, Minimize2Icon, XIcon, ZoomInIcon, ZoomOutIcon, } from "lucide-react" import { useEffect, useRef } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogClose, DialogContent, DialogHeader, DialogOverlay, } from "@/components/ui/dialog" import { LoadingSpinner } from "@/components/ui/loading-spinner" const zoomLevelAtom = atom( 1, (get, set, update: number | ((current: number) => number)) => { const current = get(zoomLevelAtom) console.log("current", current) const newValue = typeof update === "function" ? update(current) : update if (newValue >= 0.1) { set(zoomLevelAtom, newValue) } }, ) export function ImagePreviewDialog({ file, onClose, }: { file: Doc<"files"> onClose: () => void }) { const fileUrl = useConvexQuery(api.filesystem.fetchFileUrl, { fileId: file._id, }) const setZoomLevel = useSetAtom(zoomLevelAtom) useEffect( () => () => { setZoomLevel(1) }, [setZoomLevel], ) return ( { if (!open) { onClose() } }} > {!fileUrl ? ( ) : null} {fileUrl ? : null} ) } function PreviewContent({ fileUrl, file, }: { fileUrl: string file: Doc<"files"> }) { return ( {file.name}
) } function Toolbar({ fileUrl, file }: { fileUrl: string; file: Doc<"files"> }) { const setZoomLevel = useSetAtom(zoomLevelAtom) const zoomInterval = useRef | null>(null) useEffect( () => () => { if (zoomInterval.current) { clearInterval(zoomInterval.current) console.log("clearInterval") zoomInterval.current = null } }, [], ) function startZooming(delta: number) { setZoomLevel((zoom) => zoom + delta) zoomInterval.current = setInterval(() => { setZoomLevel((zoom) => zoom + delta) }, 100) } function stopZooming() { if (zoomInterval.current) { clearInterval(zoomInterval.current) zoomInterval.current = null } } return (
) } function ResetZoomButton() { const [zoomLevel, setZoomLevel] = useAtom(zoomLevelAtom) if (zoomLevel === 1) { return null } return ( ) } function ImagePreview({ fileUrl, file, }: { fileUrl: string file: Doc<"files"> }) { const zoomLevel = useAtomValue(zoomLevelAtom) return ( {file.name} ) }