Garima1030/mediaforensics-platform
0
1import { useState, useRef, useCallback } from "react"2import { api } from "../api/client"3 4export function useAnalysis() {5 const [jobId, setJobId] = useState(null)6 const [status, setStatus] = useState("idle") // idle | uploading | pending | processing | completed | failed7 const [progress, setProgress] = useState(0)8 const [result, setResult] = useState(null)9 const [error, setError] = useState(null)10 const pollRef = useRef(null)11 12 const stopPolling = () => {13 if (pollRef.current) {14 clearInterval(pollRef.current)15 pollRef.current = null16 }17 }18 19 const pollForResult = useCallback((id) => {20 pollRef.current = setInterval(async () => {21 try {22 const res = await api.getResult(id)23 const job = res.data24 25 setProgress(job.progress_pct || 0)26 setStatus(job.status)27 28 if (job.status === "completed") {29 setResult(job)30 stopPolling()31 } else if (job.status === "failed") {32 setError(job.error_message || "Analysis failed")33 stopPolling()34 }35 } catch (e) {36 setError("Could not reach server")37 stopPolling()38 }39 }, 2000)40 }, [])41 42 const analyze = useCallback(async (file) => {43 try {44 setStatus("uploading")45 setError(null)46 setResult(null)47 setProgress(0)48 stopPolling()49 50 const formData = new FormData()51 formData.append("file", file)52 53 const res = await api.analyze(formData)54 const { job_id } = res.data55 56 setJobId(job_id)57 setStatus("pending")58 pollForResult(job_id)59 60 } catch (e) {61 setError(e.response?.data?.detail || "Upload failed")62 setStatus("failed")63 }64 }, [pollForResult])65 66 const reset = useCallback(() => {67 stopPolling()68 setJobId(null)69 setStatus("idle")70 setProgress(0)71 setResult(null)72 setError(null)73 }, [])74 75 return { jobId, status, progress, result, error, analyze, reset }76}77 