// Atlas · Home const { useState: useStateHome, useCallback: useCallbackHome } = React; const PAGE_SIZE = 5; const TYPE_LABELS = { tech: { label: "Technology Landscape" }, company: { label: "Company Landscape" }, lit: { label: "Literature Review" }, position: { label: "Competitive Position" }, }; const STATUS_PILL = { complete: { label: "Complete", bg: "var(--success-tint)", color: "var(--success)" }, "draft-ready": { label: "Draft ready", bg: "rgba(99,102,241,0.08)", color: "#6366f1" }, researching: { label: "Researching…", bg: "rgba(251,191,36,0.12)", color: "#d97706" }, "in-progress": { label: "In progress", bg: "var(--warm-tint)", color: "var(--warm)" }, }; function ReportTypeBadge({ type }) { const t = TYPE_LABELS[type] || { label: type || "Report" }; return ( {t.label} ); } function StatusPill({ r }) { const key = r.hasApproved ? "complete" : r.hasDraft ? "draft-ready" : r.isResearching ? "researching" : "in-progress"; const s = STATUS_PILL[key]; return ( {s.label} ); } function StepHome({ goNew, goView, reports, setReports, user, onUpgrade }) { const [query, setQuery] = useStateHome(""); const [page, setPage] = useStateHome(0); const [deletingId, setDeletingId] = useStateHome(null); const [refreshingId, setRefreshingId] = useStateHome(null); const [refreshError, setRefreshError] = useStateHome(null); const firstName = user ? user.name.split(" ")[0] : "there"; const isUnlimited = user?.email?.endsWith("@notedsource.com") || ["ramyayoub13@gmail.com", "michael.reksulak.work@gmail.com"].includes(user?.email); const atLimit = !isUnlimited && (user?.profile?.reports_started || 0) >= 2; // Sort newest first by id (which starts with YYYY-MM-DD) const sorted = [...(reports || [])].sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)); const filtered = sorted.filter((r) => { if (!query.trim()) return true; const q = query.toLowerCase(); return (r.title || r.id || "").toLowerCase().includes(q); }); const totalPages = Math.ceil(filtered.length / PAGE_SIZE); const pageReports = filtered.slice(page * PAGE_SIZE, (page + 1) * PAGE_SIZE); const hasReports = reports && reports.length > 0; const handleRefresh = async (r) => { setRefreshingId(r.id); setRefreshError(null); try { const res = await fetch(`/api/report/${r.id}/refresh`, { method: "POST" }); if (!res.ok) throw new Error("Refresh failed"); const data = await res.json(); const newReport = { id: data.newId, title: data.title, type: r.type, created: data.created, hasDraft: false, hasExport: false, refreshedFrom: r.id, }; setReports && setReports((prev) => [newReport, ...(prev || [])]); setPage(0); goView && goView(newReport); } catch (e) { setRefreshError(`Could not refresh "${r.title || r.id}"`); setTimeout(() => setRefreshError(null), 4000); } finally { setRefreshingId(null); } }; const handleDelete = async (r) => { if (!confirm(`Delete "${r.title || r.id}"? This cannot be undone.`)) return; setDeletingId(r.id); try { const res = await fetch(`/api/report/${r.id}`, { method: "DELETE" }); if (!res.ok) throw new Error("Delete failed"); setReports && setReports((prev) => prev.filter((x) => x.id !== r.id)); // adjust page if needed const newFiltered = (reports || []).filter((x) => x.id !== r.id && (query.trim() ? (x.title || x.id || "").toLowerCase().includes(query.toLowerCase()) : true)); const newPages = Math.ceil(newFiltered.length / PAGE_SIZE); if (page >= newPages && page > 0) setPage(page - 1); } catch (e) { alert("Could not delete report: " + e.message); } finally { setDeletingId(null); } }; return (
{hasReports ? `You have ${reports.length} report${reports.length > 1 ? "s" : ""}.` : "Ready when you are. Start your first report below."}