import { useMemo } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Link, useParams, useSearchParams } from "@/lib/router"; import { accessApi } from "../api/access"; import { authApi } from "../api/auth"; import { describeError } from "../api/errors"; import { QueryErrorState, useQueryView } from "../components/QueryView"; import { queryKeys } from "../lib/queryKeys"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; export function BoardClaimPage() { const queryClient = useQueryClient(); const params = useParams(); const [searchParams] = useSearchParams(); const token = (params.token ?? "").trim(); const code = (searchParams.get("code") ?? "").trim(); const currentPath = useMemo( () => `/board-claim/${encodeURIComponent(token)}${code ? `?code=${encodeURIComponent(code)}` : ""}`, [token, code], ); const sessionQuery = useQuery({ queryKey: queryKeys.auth.session, queryFn: () => authApi.getSession(), }); const statusQuery = useQuery({ queryKey: ["board-claim", token, code], queryFn: () => accessApi.getBoardClaimStatus(token, code), enabled: token.length > 0 && code.length > 0, }); const statusView = useQueryView(statusQuery); const claimMutation = useMutation({ mutationFn: () => accessApi.claimBoard(token, code), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: queryKeys.auth.session }); await queryClient.invalidateQueries({ queryKey: queryKeys.health }); await queryClient.invalidateQueries({ queryKey: queryKeys.companies.all }); await queryClient.invalidateQueries({ queryKey: queryKeys.companies.stats }); await statusQuery.refetch(); }, }); if (!token || !code) { return
Invalid board claim URL.
; } if (statusQuery.isLoading || sessionQuery.isLoading) { return
Loading claim challenge...
; } if (statusView.kind === "error") { return (
); } const status = statusQuery.data; if (!status) { return
Claim challenge unavailable.
; } if (status.status === "claimed") { return (

Board ownership claimed

This instance is now linked to your authenticated user.

); } if (!sessionQuery.data) { return (

Sign in required

Sign in or create an account, then return to this page to claim Board ownership.

); } return (

Claim Board ownership

This will promote your user to instance admin and migrate organization ownership access from local trusted mode.

{claimMutation.isError && ( // query-error-ok: mutation result

{describeError(claimMutation.error).body}

)}
); }