From 98667dac15235a937d9effbce218aa2a50466108 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Mon, 22 Jan 2024 12:03:14 +0530 Subject: [PATCH 1/6] chore: code tidy --- .../src/components/(dashboard)/layout/verify-email-banner.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx b/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx index 24e47c186..43eab21c5 100644 --- a/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx +++ b/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from 'react'; import { AlertTriangle } from 'lucide-react'; -import { ONE_SECOND } from '@documenso/lib/constants/time'; +import { ONE_DAY, ONE_SECOND } from '@documenso/lib/constants/time'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { @@ -65,7 +65,7 @@ export const VerifyEmailBanner = ({ email }: VerifyEmailBannerProps) => { if (emailVerificationDialogLastShown) { const lastShownTimestamp = parseInt(emailVerificationDialogLastShown); - if (Date.now() - lastShownTimestamp < 24 * 60 * 60 * 1000) { + if (Date.now() - lastShownTimestamp < ONE_DAY) { return; } } From 6e22eff5a14905a337fdf5b51aa2a0fe88708fb8 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Tue, 23 Jan 2024 00:02:04 +0530 Subject: [PATCH 2/6] feat: command grp border --- packages/ui/primitives/command.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index cbc306c66..5f1ebe2e4 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -96,7 +96,10 @@ const CommandGroup = React.forwardRef< className, )} {...props} - /> + > +
+ {props.children} + )); CommandGroup.displayName = CommandPrimitive.Group.displayName; From ad92b1ac238a7e970a7d1adfceab84d57b25c8ba Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Fri, 8 Mar 2024 21:56:17 +0530 Subject: [PATCH 3/6] feat: typeIn confirmation --- .../profile/delete-account-dialog.tsx | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index e9cc885e9..2cb60f4a7 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -1,5 +1,7 @@ 'use client'; +import { useState } from 'react'; + import { signOut } from 'next-auth/react'; import type { User } from '@documenso/prisma/client'; @@ -16,6 +18,7 @@ import { DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; +import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DeleteAccountDialogProps = { @@ -27,6 +30,9 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp const { toast } = useToast(); const hasTwoFactorAuthentication = user.twoFactorEnabled; + const username = user.name!; + + const [enteredUsername, setEnteredUsername] = useState(''); const { mutateAsync: deleteAccount, isLoading: isDeletingAccount } = trpc.profile.deleteAccount.useMutation(); @@ -76,7 +82,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
- + setEnteredUsername('')}> @@ -103,17 +109,44 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp , along with all of your completed documents, signatures, and all other resources belonging to your Account. + {!hasTwoFactorAuthentication && ( + + Please type {username} to confirm. + + )} + {!hasTwoFactorAuthentication && ( +
+ setEnteredUsername(e.target.value)} + onPaste={(e) => e.preventDefault()} + /> +
+ )} - + {!hasTwoFactorAuthentication && ( + + )}
From b4332257627b442929d43bc41d1975ee1784d370 Mon Sep 17 00:00:00 2001 From: Gautam Hegde <85569489+Gautam-Hegde@users.noreply.github.com> Date: Fri, 8 Mar 2024 22:12:05 +0530 Subject: [PATCH 4/6] Update command.tsx --- packages/ui/primitives/command.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index a36ae8fdc..89777d417 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -96,10 +96,7 @@ const CommandGroup = React.forwardRef< className, )} {...props} - > -
- {props.children} - + /> )); CommandGroup.displayName = CommandPrimitive.Group.displayName; From efb90ca5fb6748c6aa409516c2e6a669b495f220 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Mon, 11 Mar 2024 23:17:11 +0530 Subject: [PATCH 5/6] chore: use email confirmation --- .../settings/profile/delete-account-dialog.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 2cb60f4a7..72a61d5ed 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -30,9 +30,9 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp const { toast } = useToast(); const hasTwoFactorAuthentication = user.twoFactorEnabled; - const username = user.name!; + const userEmail = user.email; - const [enteredUsername, setEnteredUsername] = useState(''); + const [enteredEmail, setEnteredEmail] = useState(''); const { mutateAsync: deleteAccount, isLoading: isDeletingAccount } = trpc.profile.deleteAccount.useMutation(); @@ -82,7 +82,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
- setEnteredUsername('')}> + setEnteredEmail('')}> @@ -111,7 +111,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp {!hasTwoFactorAuthentication && ( - Please type {username} to confirm. + Please type {userEmail} to confirm. )} @@ -120,9 +120,8 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
setEnteredUsername(e.target.value)} - onPaste={(e) => e.preventDefault()} + value={enteredEmail} + onChange={(e) => setEnteredEmail(e.target.value)} />
)} @@ -133,7 +132,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp onClick={onDeleteAccount} loading={isDeletingAccount} variant="outline" - disabled={hasTwoFactorAuthentication || enteredUsername !== username} + disabled={hasTwoFactorAuthentication || enteredEmail !== userEmail} > {isDeletingAccount ? ( 'Deleting account...' From d3f4e20f1cb76da91a68590e6de3880cd923fb2a Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Tue, 12 Mar 2024 02:57:22 +0000 Subject: [PATCH 6/6] fix: update styling and e2e test --- .../profile/delete-account-dialog.tsx | 44 ++++++++----------- .../app-tests/e2e/test-delete-user.spec.ts | 2 + 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 72a61d5ed..2e1087380 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -19,6 +19,7 @@ import { DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Input } from '@documenso/ui/primitives/input'; +import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DeleteAccountDialogProps = { @@ -30,7 +31,6 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp const { toast } = useToast(); const hasTwoFactorAuthentication = user.twoFactorEnabled; - const userEmail = user.email; const [enteredEmail, setEnteredEmail] = useState(''); @@ -86,6 +86,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp + Delete Account @@ -109,43 +110,34 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp , along with all of your completed documents, signatures, and all other resources belonging to your Account. - {!hasTwoFactorAuthentication && ( - - Please type {userEmail} to confirm. - - )} {!hasTwoFactorAuthentication && (
+ + setEnteredEmail(e.target.value)} />
)} - {!hasTwoFactorAuthentication && ( - - )} +
diff --git a/packages/app-tests/e2e/test-delete-user.spec.ts b/packages/app-tests/e2e/test-delete-user.spec.ts index beae6eb09..6eb72bad9 100644 --- a/packages/app-tests/e2e/test-delete-user.spec.ts +++ b/packages/app-tests/e2e/test-delete-user.spec.ts @@ -16,6 +16,8 @@ test('delete user', async ({ page }) => { }); await page.getByRole('button', { name: 'Delete Account' }).click(); + await page.getByLabel('Confirm Email').fill(user.email); + await expect(page.getByRole('button', { name: 'Confirm Deletion' })).not.toBeDisabled(); await page.getByRole('button', { name: 'Confirm Deletion' }).click(); await page.waitForURL(`${WEBAPP_BASE_URL}/signin`);