import { useRouter } from "next/router"; import { useRef, useState } from "react"; import { useTeam } from "@/context/team-context"; import { addDays, format } from "date-fns"; import { BarChart3 } from "lucide-react"; import { toast } from "sonner"; import useSWR from "swr"; import { usePlan } from "@/lib/swr/use-billing"; import { fetcher } from "@/lib/utils"; import { AnalyticsCard } from "@/components/analytics/analytics-card"; import DashboardViewsChart from "@/components/analytics/dashboard-views-chart"; import DocumentsTable from "@/components/analytics/documents-table"; import LinksTable from "@/components/analytics/links-table"; import { TimeRange, TimeRangeSelect, } from "@/components/analytics/time-range-select"; import ViewsTable from "@/components/analytics/views-table"; import VisitorsTable from "@/components/analytics/visitors-table"; import AppLayout from "@/components/layouts/app"; import { TabMenu } from "@/components/tab-menu"; import { YearlyRecapBanner } from "@/components/yearly-recap/yearly-recap-banner"; interface OverviewData { counts: { links: number; documents: number; visitors: number; views: number; }; graph: { date: string; views: number; }[]; } export const defaultRange = { start: addDays(new Date(), -7), end: addDays(new Date(), 0), }; export default function DashboardPage() { const router = useRouter(); const teamInfo = useTeam(); const { plan, trial } = usePlan(); const slug = useRef(false); const [customRange, setCustomRange] = useState<{ start: Date; end: Date; }>(defaultRange); // Check if user has access to data beyond 30 days const isPremium = plan !== "free" || !!trial; const { interval = "7d", type = "links", start, end, } = router.query as { interval: TimeRange; type: string; start: string; end: string; }; const { data: overview, isLoading, error, } = useSWR( teamInfo?.currentTeam?.id ? `/api/analytics?type=overview&interval=${interval}&teamId=${teamInfo.currentTeam.id}${interval === "custom" ? `&startDate=${format(customRange.start, "MM-dd-yyyy")}&endDate=${format(customRange.end, "MM-dd-yyyy")}` : ""}` : null, fetcher, { keepPreviousData: true, revalidateOnFocus: false, }, ); if (error && !slug.current) { const errorObj = JSON.parse(error.message); const errorMessage = errorObj?.error; toast.info(errorMessage); setCustomRange(defaultRange); slug.current = true; } // Update the URL when time range changes const handleTimeRangeChange = (newTimeRange: TimeRange) => { const params = new URLSearchParams(window.location.search); params.set("interval", newTimeRange); if (type) { params.set("type", type); } // Only remove date params when switching to preset ranges if (newTimeRange !== "custom") { params.delete("start"); params.delete("end"); } router.push(`/dashboard?${params.toString()}`, undefined, { shallow: true, }); }; // Handle custom range URL updates const handleCustomRangeComplete = (range: { start: Date; end: Date }) => { const params = new URLSearchParams(window.location.search); params.set("interval", "custom"); params.set("start", range.start.toISOString()); params.set("end", range.end.toISOString()); if (type) { params.set("type", type); } router.push(`/dashboard?${params.toString()}`, undefined, { shallow: true, }); }; return (

Dashboard

} contentClassName="space-y-4" >
{type === "links" && ( )} {type === "documents" && ( )} {type === "visitors" && ( )} {type === "views" && ( )}
); }