import { useState } from 'react'; import axios from 'axios'; import { Braces } from 'lucide-react'; import { motion } from 'framer-motion'; import { PageHeader, ResultBox, ErrorBox, SubmitButton, UploadZone, SectionLabel } from '../components/UI'; export default function DbscanLab() { const [file, setFile] = useState(null); const [eps, setEps] = useState(0.5); const [minSamples, setMinSamples] = useState(5); const [result, setResult] = useState(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const handleSubmit = async (e) => { e.preventDefault(); if (!file) return setError('Please upload a file'); setLoading(true); setError(''); setResult(null); const fd = new FormData(); fd.append('file', file); fd.append('eps', eps); fd.append('min_samples', minSamples); try { const res = await axios.post('/api/dbscan', fd); setResult(res.data); } catch (err) { setError(err.response?.data?.error || 'Request failed'); } finally { setLoading(false); } }; return (
setFile(e.target.files[0])} label="Upload Data Structure" sublabel=".CSV or .XLSX datasets" />
setEps(e.target.value)} step="0.01" min="0.01" className="quantum-input" />
setMinSamples(e.target.value)} min="1" className="quantum-input" />
Run DBSCAN {result && ( DBSCAN Visualization DBSCAN Plot {result.cluster_info && (
{Object.entries(result.cluster_info).map(([k, v], i) => ( {k === '-1' ? 'Noise Points' : `Cluster ${k}`}

{v}

Entities
))}
)}
)}
); }