'use client' import * as React from 'react' import { cn } from '@/lib/utils' import { buttonVariants } from '@/components/ui/button' import { IconGitHub, IconNotice } from '@/components/ui/icons' import Link from 'next/link' import { useHealth } from '@/lib/hooks/use-health' import { ReleaseInfo, useLatestRelease } from '@/lib/hooks/use-latest-release' import { compare } from 'compare-versions' import { useWorkers } from '@/lib/hooks/use-workers' import { WorkerKind } from '@/lib/gql/generates/graphql' import { has } from 'lodash-es' import { ThemeToggle } from './theme-toggle' import { useSession } from '@/lib/tabby/auth' import { useRouter } from 'next/navigation' import { graphql } from '@/lib/gql/generates' import { useGraphQLQuery } from '@/lib/tabby/gql' export function Header() { useRequireAuth() const { data } = useHealth() const workers = useWorkers(data) const isChatEnabled = has(workers, WorkerKind.Chat) const version = data?.version?.git_describe const { data: latestRelease } = useLatestRelease() const newVersionAvailable = isNewVersionAvailable(version, latestRelease) return (
Dashboard {isChatEnabled && ( Playground )}
{newVersionAvailable && ( New version ({latestRelease?.name}) available )} GitHub
) } function isNewVersionAvailable(version?: string, latestRelease?: ReleaseInfo) { try { return version && latestRelease && compare(latestRelease.name, version, '>') } catch (err) { // Handle invalid semver console.warn(err) return true } } export const getIsAdminInitialized = graphql(/* GraphQL */ ` query GetIsAdminInitialized { isAdminInitialized } `) function useRequireAuth() { const { data, isLoading } = useGraphQLQuery( getIsAdminInitialized, undefined, {} ) const router = useRouter() const { status } = useSession() React.useEffect(() => { if (isLoading) return if (status !== 'unauthenticated') return if (data!.isAdminInitialized) { router.replace('/auth/signin') } else { router.replace('/auth/signup?isAdmin=true') } }, [data, isLoading, status]) }