import type { AuthSessionState } from "@t3tools/contracts";
import React, { startTransition, useEffect, useRef, useState, useCallback } from "react";
import { APP_DISPLAY_NAME } from "../../branding";
import { addSavedEnvironment } from "../../environments/runtime";
import {
peekPairingTokenFromUrl,
stripPairingTokenFromUrl,
submitServerAuthCredential,
} from "../../environments/primary";
import { readHostedPairingRequest } from "../../hostedPairing";
import { Button } from "../ui/button";
import { Input } from "../ui/input";
export function PairingPendingSurface() {
return (
{APP_DISPLAY_NAME}
Pairing with this environment
Validating the pairing link and preparing your session.
);
}
export function PairingRouteSurface({
auth,
initialErrorMessage,
onAuthenticated,
}: {
auth: AuthSessionState["auth"];
initialErrorMessage?: string;
onAuthenticated: () => void;
}) {
const autoPairTokenRef = useRef(peekPairingTokenFromUrl());
const [credential, setCredential] = useState(() => autoPairTokenRef.current ?? "");
const [errorMessage, setErrorMessage] = useState(initialErrorMessage ?? "");
const [isSubmitting, setIsSubmitting] = useState(false);
const autoSubmitAttemptedRef = useRef(false);
const submitCredential = useCallback(
async (nextCredential: string) => {
setIsSubmitting(true);
setErrorMessage("");
const submitError = await submitServerAuthCredential(nextCredential).then(
() => null,
(error) => errorMessageFromUnknown(error),
);
setIsSubmitting(false);
if (submitError) {
setErrorMessage(submitError);
return;
}
startTransition(() => {
onAuthenticated();
});
},
[onAuthenticated],
);
const handleSubmit = useCallback(
async (event?: React.SubmitEvent) => {
event?.preventDefault();
await submitCredential(credential);
},
[submitCredential, credential],
);
useEffect(() => {
const token = autoPairTokenRef.current;
if (!token || autoSubmitAttemptedRef.current) {
return;
}
autoSubmitAttemptedRef.current = true;
stripPairingTokenFromUrl();
void submitCredential(token);
}, [submitCredential]);
return (
{APP_DISPLAY_NAME}
Pair with this environment
{describeAuthGate(auth.bootstrapMethods)}
{describeSupportedMethods(auth.bootstrapMethods)}
);
}
export function HostedPairingRouteSurface() {
const hostedPairingRequestRef = useRef(readHostedPairingRequest());
const [status, setStatus] = useState<"pairing" | "paired" | "error">(() =>
hostedPairingRequestRef.current ? "pairing" : "error",
);
const [message, setMessage] = useState(() =>
hostedPairingRequestRef.current
? "Connecting to this backend."
: "This pairing link is missing its backend host or token.",
);
const [canRetry, setCanRetry] = useState(false);
const submitAttemptedRef = useRef(false);
const tokenSubmittedRef = useRef(false);
const submitHostedPairingRequest = useCallback(async () => {
const request = hostedPairingRequestRef.current;
if (!request) {
setStatus("error");
setMessage("This pairing link is missing its backend host or token.");
setCanRetry(false);
return;
}
if (tokenSubmittedRef.current) {
setStatus("error");
setMessage("This one-time pairing token was already submitted. Request a new pairing link.");
setCanRetry(false);
return;
}
setStatus("pairing");
setMessage("Connecting to this backend.");
setCanRetry(false);
tokenSubmittedRef.current = true;
try {
const record = await addSavedEnvironment({
label: request.label,
host: request.host,
pairingCode: request.token,
});
setStatus("paired");
setMessage(`${record.label} is saved in this browser.`);
} catch (error) {
tokenSubmittedRef.current = false;
setStatus("error");
setCanRetry(true);
setMessage(
`${errorMessageFromUnknown(error)} If the backend accepted this one-time token, request a new pairing link before retrying.`,
);
}
}, []);
useEffect(() => {
if (submitAttemptedRef.current) {
return;
}
submitAttemptedRef.current = true;
stripPairingTokenFromUrl();
void submitHostedPairingRequest();
}, [submitHostedPairingRequest]);
const request = hostedPairingRequestRef.current;
return (
{APP_DISPLAY_NAME}
{status === "paired"
? "Backend paired"
: status === "error"
? "Pairing failed"
: "Pairing backend"}
{message}
{request ? (
Host: {request.host}
) : null}
{status === "error" ? (
Verify the backend is reachable from this browser, supports CORS for hosted clients, and
is served over HTTPS when opening this page from HTTPS.
) : null}
{status === "pairing" ? (
Pairing...
) : canRetry ? (
void submitHostedPairingRequest()}>
Try again
) : null}
{status === "paired" ? (
(window.location.href = "/")}>
Open app
) : null}
);
}
function errorMessageFromUnknown(error: unknown): string {
if (error instanceof Error && error.message.trim().length > 0) {
return error.message;
}
if (typeof error === "string" && error.trim().length > 0) {
return error;
}
return "Authentication failed.";
}
function describeAuthGate(bootstrapMethods: ReadonlyArray): string {
if (bootstrapMethods.includes("desktop-bootstrap")) {
return "This environment expects a trusted pairing credential before the app can connect.";
}
return "Enter a pairing token to start a session with this environment.";
}
function describeSupportedMethods(bootstrapMethods: ReadonlyArray): string {
if (
bootstrapMethods.includes("desktop-bootstrap") &&
bootstrapMethods.includes("one-time-token")
) {
return "Desktop-managed pairing and one-time pairing tokens are both accepted for this environment.";
}
if (bootstrapMethods.includes("desktop-bootstrap")) {
return "This environment is desktop-managed. Open it from the desktop app or paste a bootstrap credential if one was issued explicitly.";
}
return "This environment accepts one-time pairing tokens. Pairing links can open this page directly, or you can paste the token here.";
}