diff --git a/apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx b/apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx index d73a3a786..9a60bd60b 100644 --- a/apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx +++ b/apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx @@ -125,8 +125,8 @@ export default function DeleteTokenDialog({ trigger, tokenId, tokenName }: Delet render={({ field }) => ( - Confirm by typing - + Confirm by typing:{' '} + {deleteMessage} diff --git a/apps/web/src/components/forms/token.tsx b/apps/web/src/components/forms/token.tsx index 131e90a7d..a92321e6b 100644 --- a/apps/web/src/components/forms/token.tsx +++ b/apps/web/src/components/forms/token.tsx @@ -1,8 +1,11 @@ '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'; @@ -35,9 +38,14 @@ export const ApiTokenForm = ({ className }: ApiTokenFormProps) => { const router = useRouter(); const [, copy] = useCopyToClipboard(); const { toast } = useToast(); + const [newlyCreatedToken, setNewlyCreatedToken] = useState(''); - const { data: tokens } = trpc.apiToken.getTokens.useQuery(); - const { mutateAsync: createTokenMutation } = trpc.apiToken.createToken.useMutation(); + 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), @@ -91,48 +99,66 @@ export const ApiTokenForm = ({ className }: ApiTokenFormProps) => { return (

Your existing tokens

-
    - {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'} -

    - - -
    -
  • - ))} -
+ {!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. +

diff --git a/packages/lib/server-only/public-api/get-all-user-tokens.ts b/packages/lib/server-only/public-api/get-all-user-tokens.ts index c6c7a7d94..d64562b83 100644 --- a/packages/lib/server-only/public-api/get-all-user-tokens.ts +++ b/packages/lib/server-only/public-api/get-all-user-tokens.ts @@ -9,5 +9,12 @@ export const getUserTokens = async ({ userId }: GetUserTokensOptions) => { where: { userId, }, + select: { + id: true, + name: true, + algorithm: true, + createdAt: true, + expires: true, + }, }); };