"use client"; import { Check, Copy } from "@openstatus/icons"; import { AlertDialog, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@openstatus/ui/components/ui/alert-dialog"; import { Button } from "@openstatus/ui/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@openstatus/ui/components/ui/dialog"; import { useCopyToClipboard } from "@openstatus/ui/hooks/use-copy-to-clipboard"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useState } from "react"; import { useTRPC } from "@/lib/trpc/client"; import { ApiKeyForm, type FormValues } from "./form"; export function CreateApiKeyDialog({ children, defaultScope = "read", }: { children: React.ReactNode; defaultScope?: FormValues["scope"]; }) { const trpc = useTRPC(); const queryClient = useQueryClient(); const { copy, isCopied } = useCopyToClipboard(); const [result, setResult] = useState<{ token: string; key: string; } | null>(null); const [open, setOpen] = useState(false); const { data: workspace } = useQuery(trpc.workspace.get.queryOptions()); const createApiKeyMutation = useMutation( trpc.apiKey.create.mutationOptions(), ); return ( <> {children} { event.preventDefault(); document.body.style.pointerEvents = ""; }} > Create API Key Create a new API key to access your workspace data. setOpen(false)} onSubmit={async (values) => { const data = await createApiKeyMutation.mutateAsync({ name: values.name.trim(), description: values.description?.trim() || undefined, expiresAt: values.expiresAt ? new Date(values.expiresAt) : undefined, scopes: [values.scope], }); if (!data) { throw new Error("Failed to create API key"); } queryClient.invalidateQueries({ queryKey: trpc.apiKey.list.queryKey(), }); setResult({ token: data.token, key: data.key.name }); setOpen(false); }} /> setResult(null)}> { event.preventDefault(); document.body.style.pointerEvents = ""; }} > API Key Created Ensure you copy your API key before closing this dialog. You will not see it again. { copy(result?.token || "", { successMessage: "Copied API key to clipboard", }); }} > {result?.token} {isCopied ? ( ) : ( )} setResult(null)}>Done > ); }
{result?.token}