import { useState, useRef } from 'react' import { Button, Card, Label, Icon, Spinner } from '../components/primitives' import Heatmap from '../components/Heatmap' import { SuspiciousPair } from '../components/DetailSidebar' import Dropzone from '../components/Dropzone' import CodeEditor from '../components/CodeEditor' import { computeSimilarity } from '../api/client' export default function SimilarityScreen() { const [files, setFiles] = useState([]) const [result, setResult] = useState(null) const [submissions, setSubmissions] = useState([]) // čuvamo kod za usporedbu const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [threshold, setThreshold] = useState(0.70) const [selectedPair, setSelectedPair] = useState(null) // { i, j, idA, idB, similarity } const compareRef = useRef(null) const run = async () => { if (files.length < 2) { setError('Potrebne su najmanje 2 datoteke.'); return } setLoading(true); setError(null); setSelectedPair(null) const subs = await Promise.all(files.map(async f => ({ id: f.name.replace(/\.[^.]+$/, ''), file: f.name, code: await f.text(), }))) try { const data = await computeSimilarity(subs) setResult(data) setSubmissions(subs) // sačuvamo kod da ga možemo prikazati } catch (e) { setError(e.message) } finally { setLoading(false) } } // Kad korisnik klikne na ćeliju heatmape const handleSelectPair = (pair) => { setSelectedPair(pair) // Scroll do usporedbe if (pair) { setTimeout(() => compareRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }), 100) } } const suspiciousPairs = result?.suspicious_pairs?.filter(p => p.similarity >= threshold) || [] // Pronađi kod za odabrani par const codeA = selectedPair ? submissions.find(s => s.id === selectedPair.idA)?.code || '' : '' const codeB = selectedPair ? submissions.find(s => s.id === selectedPair.idB)?.code || '' : '' const fileA = selectedPair ? submissions.find(s => s.id === selectedPair.idA)?.file : '' const fileB = selectedPair ? submissions.find(s => s.id === selectedPair.idB)?.file : '' return (
Klikni na ćeliju heatmape za prikaz i usporedbu dvaju kodova. Visoka sličnost može upućivati na korištenje istog AI prompta.