"use client"; import { useState, useCallback } from "react"; import { Scan } from "lucide-react"; import { UploadZone } from "@/components/tools/upload-zone"; import { ProgressBar } from "@/components/tools/progress-bar"; import { ResultPreview } from "@/components/tools/result-preview"; import { useUpload } from "@/hooks/use-upload"; import { useJobStatus } from "@/hooks/use-job-status"; type PageState = "upload" | "processing" | "result" | "error"; interface ScanOptions { ocr: boolean; enhance: boolean; output_format: "pdf" | "jpeg" | "png"; dpi: number; color_mode: "black_and_white" | "grayscale" | "color"; } export default function ScanPage() { const [pageState, setPageState] = useState("upload"); const [jobId, setJobId] = useState(null); const [errorMsg, setErrorMsg] = useState(null); const [opts, setOpts] = useState({ ocr: true, enhance: true, output_format: "pdf", dpi: 300, color_mode: "black_and_white", }); const { upload, isUploading } = useUpload({ tool: "scan", options: opts as unknown as Record, }); const handleComplete = useCallback(() => { setPageState("result"); }, []); const handleError = useCallback((err: string) => { setErrorMsg(err); setPageState("error"); }, []); const { progress, stage, message, status, result } = useJobStatus(jobId, { onComplete: handleComplete, onError: handleError, }); const handleUpload = useCallback( async (file: File) => { setErrorMsg(null); const res = await upload(file); if (res) { setJobId(res.job_id); setPageState("processing"); } }, [upload], ); const handleRetry = useCallback(() => { setPageState("upload"); setJobId(null); setErrorMsg(null); }, []); return (

Document Scanner

Foto dokumen pake HP — auto-detect, lurusin, enhance, OCR

{pageState === "upload" && (
{/* Interactive Options */}

Scan Options

{/* OCR Toggle */} {/* Enhance Toggle */} {/* Output Format */} {/* Color Mode */} {/* DPI */}
)} {pageState === "processing" && jobId && ( )} {pageState === "result" && result && ( )} {pageState === "error" && (

{errorMsg || "Terjadi kesalahan"}

)}
); }