97 lines · 3.7 KB
/// <reference types="vite/client" />
import type { QueryClient } from "@tanstack/react-query";
import { HeadContent, Scripts, createRootRouteWithContext, useRouter, useRouterState } from "@tanstack/react-router";
import * as React from "react";
import { DefaultCatchBoundary } from "~/components/DefaultCatchBoundary";
import { NotFound } from "~/components/NotFound";
import { SiteHeader } from "~/components/SiteHeader";
import { SiteFooter } from "~/components/SiteFooter";
import { HovercardLayer } from "~/components/HovercardLayer";
import { AccountNotices } from "~/components/AccountNotices";
import { UpsellDialog } from "~/components/billing/UpsellDialog";
import { DisabledAccountNotice } from "~/components/DisabledAccountNotice";
import { reachableWhileDisabled } from "~/lib/account-disable";
import { getSession } from "~/fns/auth";
import appCss from "~/styles/app.css?url";
import { seo } from "~/utils/seo";
import { SITE_DESCRIPTION } from "~/lib/og";
import { capturePageview, identifyViewer, initAnalytics, onNavigate } from "~/lib/analytics";

export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()({
  beforeLoad: async () => {
    const session = await getSession();
    return {
      viewer: session.viewer,
      supporter: session.supporter,
      unreadNotifications: session.unreadNotifications,
      analytics: session.analytics,
      disabled: session.disabled,
      publicUrl: session.publicUrl,
    };
  },
  head: ({ match }) => ({
    meta: [
      { charSet: "utf-8" },
      { name: "viewport", content: "width=device-width, initial-scale=1" },
      { name: "theme-color", content: "#0a0a0a" },
      ...seo({
        origin: match.context?.publicUrl,
        title: "gitfor · Open-source Git hosting, code review and CI",
        description: SITE_DESCRIPTION,