Skip to article
Documentation

src/app/demo-switch/page.tsx

Linked repository file from this build.

"use client";
import Link from "next/link";
import { useEffect, useRef, useState } from "react";
import { useSignIn, useUser } from "@clerk/nextjs";
export default function DemoSwitchPage() {
  const { signIn } = useSignIn();
  const { isLoaded, isSignedIn } = useUser();
  const started = useRef(false);
  const [error, setError] = useState("");
  useEffect(() => {
    if (!isLoaded || !signIn || started.current) return;
    started.current = true;
    void (async () => {
      if (isSignedIn) {
        setError("Sign out before switching demo accounts.");
        return;
      }
      const ticket = sessionStorage.getItem("qccrm.demo-ticket");
      sessionStorage.removeItem("qccrm.demo-ticket");
      if (!ticket) {
        setError("The demo switch expired. Sign in to try again.");
        return;
      }
      try {
        const result = await signIn.ticket({ ticket });
        if (result.error) throw result.error;
        const done = await signIn.finalize();
        if (done.error) throw done.error;
        window.location.assign("/dashboard");
      } catch {
        setError("Unable to complete the demo switch. Sign in to try again.");
      }
    })();
  }, [isLoaded, isSignedIn, signIn]);
  return (
    <main className="mx-auto max-w-md space-y-4 p-8">
      <h1 className="text-xl font-semibold">Switch demo account</h1>
      <p role={error ? "alert" : "status"}>{error || "Signing in…"}</p>
      {error && (
        <Link className="underline" href="/sign-in">
          Sign in
        </Link>
      )}
    </main>
  );
}