async function refreshConflicts(): Promise { const token = localStorage.getItem("token"); if (!token) return; try { const response = await fetch("/api/conflicts", { headers: { Authorization: `Bearer ${token}` }, }); if (response.ok) { const data: ConflictListResponse = await response.json(); renderConflicts(data.conflicts); updateConflictStats(data); } } catch (error) { console.error("Failed to refresh conflicts:", error); } } async function resolveConflict( conflictId: string, winner: string, manualData?: Record, ): Promise { const token = localStorage.getItem("token"); if (!token) return; try { const response = await fetch(`/api/conflicts/${conflictId}/resolve`, { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ winner, manual_data: manualData }), }); if (response.ok) { if ((window as any).showToast?.success) { (window as any).showToast.success("Conflict resolved"); } refreshConflicts(); } else { const error = await response.json(); if ((window as any).showToast?.error) { (window as any).showToast.error( error.error || "Failed to resolve conflict", ); } } } catch (error) { console.error("Failed to resolve conflict:", error); if ((window as any).showToast?.error) { (window as any).showToast.error("Failed to resolve conflict"); } } } async function bulkResolve( strategy: "most_recent" | "highest_progress", conflictIds: string[], ): Promise { const token = localStorage.getItem("token"); if (!token) return; try { const response = await fetch("/api/conflicts/bulk-resolve", { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ conflict_ids: conflictIds, strategy }), }); if (response.ok) { const data: BulkResolveResponse = await response.json(); if ((window as any).showToast?.success) { (window as any).showToast.success(`Resolved ${data.success} conflicts`); } refreshConflicts(); } } catch (error) { console.error("Failed to bulk resolve:", error); if ((window as any).showToast?.error) { (window as any).showToast.error("Failed to bulk resolve conflicts"); } } } async function bulkDismiss(conflictIds: string[]): Promise { const token = localStorage.getItem("token"); if (!token) return; try { const response = await fetch("/api/conflicts/bulk-dismiss", { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ conflict_ids: conflictIds }), }); if (response.ok) { if ((window as any).showToast?.success) { (window as any).showToast.success("Conflicts dismissed"); } refreshConflicts(); } } catch (error) { console.error("Failed to dismiss conflicts:", error); if ((window as any).showToast?.error) { (window as any).showToast.error("Failed to dismiss conflicts"); } } } async function dismissAllResolved(): Promise { const token = localStorage.getItem("token"); if (!token) return; try { const response = await fetch("/api/conflicts/dismiss-resolved", { method: "POST", headers: { Authorization: `Bearer ${token}` }, }); if (response.ok) { if ((window as any).showToast?.success) { (window as any).showToast.success("Resolved conflicts dismissed"); } refreshConflicts(); } } catch (error) { console.error("Failed to dismiss resolved:", error); if ((window as any).showToast?.error) { (window as any).showToast.error("Failed to dismiss resolved conflicts"); } } } function renderConflicts(conflicts: ConflictDetailResponse[]): void { const container = document.getElementById("conflicts-list"); if (!container) return; if (conflicts.length === 0) { container.innerHTML = '

No conflicts found

'; return; } container.innerHTML = conflicts .map( (conflict) => `

${conflict.media_item_title}

${conflict.conflict_type} - ${conflict.resolution_status}

${ conflict.resolution_status === "unresolved" ? `
` : "" }
`, ) .join(""); } function updateConflictStats(data: ConflictListResponse): void { const totalEl = document.getElementById("conflicts-total"); const unresolvedEl = document.getElementById("conflicts-unresolved"); if (totalEl) totalEl.textContent = String(data.total); if (unresolvedEl) unresolvedEl.textContent = String(data.unresolved); } function showResolveModal(conflictId: string): void { const modal = document.getElementById("resolve-modal"); const conflictIdInput = document.getElementById( "resolve-conflict-id", ) as HTMLInputElement; if (modal && conflictIdInput) { conflictIdInput.value = conflictId; modal.classList.remove("hidden"); } } function hideResolveModal(): void { const modal = document.getElementById("resolve-modal"); if (modal) { modal.classList.add("hidden"); } } function handleResolveSubmit(event: Event): void { event.preventDefault(); const form = event.target as HTMLFormElement; const conflictId = ( form.querySelector("#resolve-conflict-id") as HTMLInputElement )?.value; const winner = ( form.querySelector('input[name="winner"]:checked') as HTMLInputElement )?.value; if (!conflictId || !winner) { if ((window as any).showToast?.error) { (window as any).showToast.error("Please select a winner"); } return; } resolveConflict(conflictId, winner); hideResolveModal(); } (window as any).refreshConflicts = refreshConflicts; (window as any).resolveConflict = resolveConflict; (window as any).bulkResolve = bulkResolve; (window as any).bulkDismiss = bulkDismiss; (window as any).dismissAllResolved = dismissAllResolved; (window as any).showResolveModal = showResolveModal; (window as any).hideResolveModal = hideResolveModal; (window as any).handleResolveSubmit = handleResolveSubmit;