diff --git a/apps/web/src/app/(dashboard)/settings/token/page.tsx b/apps/web/src/app/(dashboard)/settings/token/page.tsx index e868df47d..ab4992f14 100644 --- a/apps/web/src/app/(dashboard)/settings/token/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/token/page.tsx @@ -1,10 +1,6 @@ -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; - import { ApiTokenForm } from '~/components/forms/token'; -export default async function ApiToken() { - const { user } = await getRequiredServerComponentSession(); - +export default function ApiToken() { return (

API Token

@@ -15,7 +11,7 @@ export default async function ApiToken() {
- +
); } diff --git a/apps/web/src/components/forms/token.tsx b/apps/web/src/components/forms/token.tsx index 8e9d9d2b6..0daacf060 100644 --- a/apps/web/src/components/forms/token.tsx +++ b/apps/web/src/components/forms/token.tsx @@ -1,17 +1,27 @@ 'use client'; +import { useState } from 'react'; + import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import type { z } from 'zod'; -import type { User } from '@documenso/prisma/client'; +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 { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; import { Form, FormControl, @@ -24,19 +34,21 @@ import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type ApiTokenFormProps = { - user: User; className?: string; }; type TCreateTokenMutationSchema = z.infer; -export const ApiTokenForm = ({ user, className }: ApiTokenFormProps) => { +export const ApiTokenForm = ({ className }: ApiTokenFormProps) => { const router = useRouter(); - + const [, copy] = useCopyToClipboard(); const { toast } = useToast(); + const [isOpen, setIsOpen] = useState(false); + const [tokenIdToDelete, setTokenIdToDelete] = useState(0); const { data: tokens } = trpc.apiToken.getTokens.useQuery(); const { mutateAsync: createTokenMutation } = trpc.apiToken.createToken.useMutation(); + const { mutateAsync: deleteTokenMutation } = trpc.apiToken.deleteTokenById.useMutation(); const form = useForm({ resolver: zodResolver(ZCreateTokenMutationSchema), @@ -45,12 +57,32 @@ export const ApiTokenForm = ({ user, className }: ApiTokenFormProps) => { }, }); - const deleteToken = () => { - console.log('deleted'); + const deleteToken = async (id: number) => { + try { + await deleteTokenMutation({ + id, + }); + + toast({ + title: 'Token deleted', + description: 'The token was deleted successfully.', + duration: 5000, + }); + + setIsOpen(false); + router.refresh(); + } catch (error) { + console.error(error); + } }; - const copyToken = () => { - console.log('copied'); + 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) => { @@ -86,10 +118,42 @@ export const ApiTokenForm = ({ user, className }: ApiTokenFormProps) => { return (
+ + + + Are you sure you want to delete this token? + + + Please note that this action is irreversible. Once confirmed, your token will be + permanently deleted. + + + + +
+ + + +
+
+
+

Your existing tokens

    {tokens?.map((token) => ( -
  • +
  • {token.name} ({token.algorithm}) @@ -117,10 +181,17 @@ export const ApiTokenForm = ({ user, className }: ApiTokenFormProps) => { }) : 'N/A'}

    - -
    diff --git a/packages/trpc/server/api-token-router/router.ts b/packages/trpc/server/api-token-router/router.ts index 49dac8809..266c045d0 100644 --- a/packages/trpc/server/api-token-router/router.ts +++ b/packages/trpc/server/api-token-router/router.ts @@ -1,7 +1,7 @@ import { TRPCError } from '@trpc/server'; import { createApiToken } from '@documenso/lib/server-only/public-api/create-api-token'; -import { deleteApiTokenById } from '@documenso/lib/server-only/public-api/delete-api-token-by-id'; +import { deleteTokenById } from '@documenso/lib/server-only/public-api/delete-api-token-by-id'; import { getUserTokens } from '@documenso/lib/server-only/public-api/get-all-user-tokens'; import { getApiTokenById } from '@documenso/lib/server-only/public-api/get-api-token-by-id'; @@ -62,7 +62,7 @@ export const apiTokenRouter = router({ try { const { id } = input; - return await deleteApiTokenById({ + return await deleteTokenById({ id, userId: ctx.user.id, });