UAIDE / src /hooks /useAnalysis.js
ATS-27's picture
Upload folder using huggingface_hub
af980d7 verified
Raw
History Blame Contribute Delete
3.07 kB
import { useState, useCallback } from 'react';
import { analyzeMedia } from '../utils/api';
const ANALYSIS_STAGES = [
{ id: 'upload', label: 'Uploading media...', progress: 10 },
{ id: 'preprocess', label: 'Pre-processing media...', progress: 24 },
{ id: 'inference', label: 'Running model inference...', progress: 48 },
{ id: 'gradcam', label: 'Generating explainability layer...', progress: 68 },
{ id: 'fft', label: 'Analysing frequency spectrum (FFT)...', progress: 84 },
{ id: 'temporal', label: 'Temporal sequence analysis...', progress: 90 },
{ id: 'verdict', label: 'Compiling forensic verdict...', progress: 96 },
];
export function useAnalysis() {
const [phase, setPhase] = useState('idle');
const [currentStage, setCurrentStage] = useState(null);
const [progress, setProgress] = useState(0);
const [result, setResult] = useState(null);
const [file, setFile] = useState(null);
const [previewUrl, setPreviewUrl] = useState(null);
const [error, setError] = useState(null);
const reset = useCallback(() => {
setPhase('idle');
setCurrentStage(null);
setProgress(0);
setResult(null);
setFile(null);
if (previewUrl) URL.revokeObjectURL(previewUrl);
setPreviewUrl(null);
setError(null);
}, [previewUrl]);
const analyze = useCallback(async (selectedFile) => {
if (!selectedFile) return;
setFile(selectedFile);
setPreviewUrl(URL.createObjectURL(selectedFile));
setPhase('uploading');
setError(null);
setProgress(0);
let ticker = null;
try {
const isVideo = selectedFile.type.startsWith('video/');
const relevantStages = isVideo ? ANALYSIS_STAGES : ANALYSIS_STAGES.filter((stage) => stage.id !== 'temporal');
for (let index = 0; index < relevantStages.length; index += 1) {
const stage = relevantStages[index];
setCurrentStage(stage);
setPhase(index === 0 ? 'uploading' : 'analyzing');
setProgress(stage.progress);
await new Promise((resolve) => setTimeout(resolve, index === 0 ? 200 : 320));
}
ticker = window.setInterval(() => {
setProgress((value) => (value < 97 ? value + 1 : value));
}, 260);
const apiResult = await analyzeMedia(selectedFile);
window.clearInterval(ticker);
setProgress(100);
setResult({
...apiResult,
filename: apiResult.filename || selectedFile.name,
filesize: apiResult.filesize || formatFileSize(selectedFile.size),
});
setPhase('complete');
} catch (analysisError) {
if (ticker) window.clearInterval(ticker);
setPhase('idle');
setCurrentStage(null);
setProgress(0);
setResult(null);
setError(analysisError.message || 'Analysis failed');
}
}, []);
return { phase, currentStage, progress, result, file, previewUrl, error, analyze, reset };
}
function formatFileSize(bytes) {
if (bytes < 1024) return `${bytes} B`;
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
}