import { ShareEnterPassword } from '@/components/auth/share-enter-password'; import { FullPageEmptyState } from '@/components/full-page-empty-state'; import FullPageLoadingState from '@/components/full-page-loading-state'; import { LoginNavbar } from '@/components/login-navbar'; import { OverviewInterval } from '@/components/overview/overview-interval'; import { OverviewRange } from '@/components/overview/overview-range'; import { useOverviewOptions } from '@/components/overview/useOverviewOptions'; import { ReportChart } from '@/components/report-chart'; import { useTRPC } from '@/integrations/trpc/react'; import { useSuspenseQuery } from '@tanstack/react-query'; import { createFileRoute, notFound, useSearch } from '@tanstack/react-router'; import { z } from 'zod'; const shareSearchSchema = z.object({ header: z.optional(z.number().or(z.string().or(z.boolean()))), }); export const Route = createFileRoute('/share/report/$shareId')({ component: RouteComponent, validateSearch: shareSearchSchema, loader: async ({ context, params }) => { const share = await context.queryClient.ensureQueryData( context.trpc.share.report.queryOptions({ shareId: params.shareId, }), ); if (!share) { return { share: null }; } return { share }; }, head: ({ loaderData }) => { if (!loaderData || !loaderData.share) { return { meta: [ { title: 'Share not found - OpenPanel.dev', }, ], }; } return { meta: [ { title: `${loaderData.share.report.name || 'Report'} - ${loaderData.share.organization?.name} - OpenPanel.dev`, }, ], }; }, pendingComponent: FullPageLoadingState, errorComponent: () => ( ), }); function RouteComponent() { const { shareId } = Route.useParams(); const { header } = useSearch({ from: '/share/report/$shareId' }); const trpc = useTRPC(); const { range, startDate, endDate, interval } = useOverviewOptions(); const shareQuery = useSuspenseQuery( trpc.share.report.queryOptions({ shareId, }), ); const hasAccess = shareQuery.data?.hasAccess; if (!shareQuery.data) { throw notFound(); } if (!shareQuery.data.public) { throw notFound(); } const share = shareQuery.data; // Handle password protection if (share.password && !hasAccess) { return ; } const isHeaderVisible = header !== '0' && header !== 0 && header !== 'false' && header !== false; return (
{isHeaderVisible && (
)}
{share.report.name}
); }