import { useCallback, useEffect, useState } from "react";
import { useParams, Navigate } from "react-router-dom";
import { toast } from "sonner";
import { AppHeader } from "../components/layout/AppHeader";
import { ResearcherCard } from "../components/dashboard/ResearcherCard";
import { StatsRow } from "../components/dashboard/StatsRow";
import { PublicationsTable } from "../components/dashboard/PublicationsTable";
import { ExportDropdown } from "../components/dashboard/ExportDropdown";
import { SyncButton } from "../components/dashboard/SyncButton";
import {
downloadExport,
getExportUrl,
getPublications,
syncResearcher,
validateOrcid,
} from "../services/api";
import { isValidOrcid } from "../utils/orcid";
const SUCCESS_FLASH_MS = 3000;
/**
* Researcher detail page. Owns:
* - Initial researcher lookup (validate + publications fetch on mount).
* - Sync workflow (POST + refresh + success toast).
* - Export workflow (download blob + success/error toast).
*/
export function DashboardPage() {
const { orcid } = useParams();
const [researcher, setResearcher] = useState(null);
const [publications, setPublications] = useState([]);
const [pubsLoading, setPubsLoading] = useState(true);
const [pubsError, setPubsError] = useState(null);
const [syncStatus, setSyncStatus] = useState("idle"); // idle | loading | success
const [exportingFormat, setExportingFormat] = useState(null);
const loadResearcher = useCallback(
async (signal) => {
try {
const data = await validateOrcid(orcid, { signal });
if (!signal?.aborted) setResearcher(data);
} catch (err) {
if (signal?.aborted) return;
toast.error("No se pudo cargar el investigador", {
description: err?.message ?? "Error desconocido.",
});
}
},
[orcid],
);
const loadPublications = useCallback(
async (signal) => {
setPubsLoading(true);
setPubsError(null);
try {
const data = await getPublications(orcid, { signal });
if (!signal?.aborted) setPublications(data);
} catch (err) {
if (signal?.aborted) return;
setPubsError(err);
} finally {
if (!signal?.aborted) setPubsLoading(false);
}
},
[orcid],
);
useEffect(() => {
if (!isValidOrcid(orcid)) return;
const ctrl = new AbortController();
loadResearcher(ctrl.signal);
loadPublications(ctrl.signal);
return () => ctrl.abort();
}, [orcid, loadResearcher, loadPublications]);
if (!isValidOrcid(orcid)) {
return