'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader } from 'lucide-react'; import { useForm } from 'react-hook-form'; import type { z } from 'zod'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { ZCreateTokenMutationSchema } from '@documenso/trpc/server/api-token-router/schema'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; import DeleteTokenDialog from '~/components/(dashboard)/settings/token/delete-token-dialog'; export type ApiTokenFormProps = { className?: string; }; type TCreateTokenMutationSchema = z.infer; export const ApiTokenForm = ({ className }: ApiTokenFormProps) => { const router = useRouter(); const [, copy] = useCopyToClipboard(); const { toast } = useToast(); const [newlyCreatedToken, setNewlyCreatedToken] = useState(''); const { data: tokens, isLoading: isTokensLoading } = trpc.apiToken.getTokens.useQuery(); const { mutateAsync: createTokenMutation } = trpc.apiToken.createToken.useMutation({ onSuccess(data) { setNewlyCreatedToken(data.token); }, }); const form = useForm({ resolver: zodResolver(ZCreateTokenMutationSchema), values: { tokenName: '', }, }); const copyToken = (token: string) => { void copy(token).then(() => { toast({ title: 'Token copied to clipboard', description: 'The token was copied to your clipboard.', }); }); }; const onSubmit = async ({ tokenName }: TCreateTokenMutationSchema) => { try { await createTokenMutation({ tokenName, }); toast({ title: 'Token created', description: 'A new token was created successfully.', duration: 5000, }); form.reset(); router.refresh(); } catch (error) { if (error instanceof TRPCClientError && error.data?.code === 'BAD_REQUEST') { toast({ title: 'An error occurred', description: error.message, variant: 'destructive', }); } else { toast({ title: 'An unknown error occurred', variant: 'destructive', duration: 5000, description: 'We encountered an unknown error while attempting create the new token. Please try again later.', }); } } }; return (

Your existing tokens

{!tokens && isTokensLoading ? (
) : (
    {tokens?.map((token) => (
  • {token.name} ({token.algorithm})

    {/*

    {token.token}

    */}

    Created:{' '} {token.createdAt ? new Date(token.createdAt).toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', }) : 'N/A'}

    Expires:{' '} {token.expires ? new Date(token.expires).toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', }) : 'N/A'}

  • ))}
)} {newlyCreatedToken && (

Your token was created successfully! Make sure to copy it because you won't be able to see it again!

{newlyCreatedToken}

)}

Create a new token

Enter a representative name for your new token.

( Token Name )} />
); };