import { ArrowUp10, BadgeCheck, Github, HardDriveDownload, Info, Map, Newspaper, } from "lucide-react"; import { VERSION } from "@/src/constants"; import Link from "next/link"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, } from "@/src/components/ui/dropdown-menu"; import { ArrowUp } from "lucide-react"; import { api } from "@/src/utils/api"; import { Button } from "@/src/components/ui/button"; import { cn } from "@/src/utils/tailwind"; import { usePlan } from "@/src/features/entitlements/hooks"; import { isSelfHostedPlan, planLabels } from "@langfuse/shared"; import { StatusBadge } from "@/src/components/layouts/status-badge"; import { useLangfuseCloudRegion } from "@/src/features/organizations/hooks"; export const VersionLabel = ({ className }: { className?: string }) => { const { isLangfuseCloud } = useLangfuseCloudRegion(); const backgroundMigrationStatus = api.backgroundMigrations.status.useQuery( undefined, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, enabled: !isLangfuseCloud, // do not check for updates on Langfuse Cloud throwOnError: false, // do not render default error message }, ); const checkUpdate = api.public.checkUpdate.useQuery(undefined, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, enabled: !isLangfuseCloud, // do not check for updates on Langfuse Cloud throwOnError: false, // do not render default error message }); const plan = usePlan(); const selfHostedPlanLabel = !isLangfuseCloud ? plan && isSelfHostedPlan(plan) ? // self-host plan // TODO: clean up to use planLabels in packages/shared/src/features/entitlements/plans.ts { short: plan === "self-hosted:pro" ? "Pro" : "EE", long: planLabels[plan], } : // no plan, oss { short: "OSS", long: "Open Source", } : // null on cloud null; const showBackgroundMigrationStatus = !isLangfuseCloud && backgroundMigrationStatus.data && backgroundMigrationStatus.data.status !== "FINISHED"; const hasUpdate = !isLangfuseCloud && checkUpdate.data && checkUpdate.data.updateType; const color = checkUpdate.data?.updateType === "major" ? "text-dark-red" : checkUpdate.data?.updateType === "minor" ? "text-dark-yellow" : undefined; return ( e.stopPropagation()}> {hasUpdate ? ( <> New {checkUpdate.data?.updateType} version:{" "} {checkUpdate.data?.latestRelease} ) : !isLangfuseCloud ? ( <> This is the latest release ) : null} {selfHostedPlanLabel && ( <> {selfHostedPlanLabel.long} )} Releases {!isLangfuseCloud && ( Background Migrations {showBackgroundMigrationStatus && ( )} )} Changelog Roadmap {!isLangfuseCloud && ( Compare Versions )} {hasUpdate && ( <> Update )} ); };