From b7becbc30d6838ed4f4860f59ed2e1f761e4bb3d Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Sun, 19 Oct 2025 10:46:43 +0200 Subject: [PATCH] Add confirmation modal before deletion --- ui/src/pages/settings.tsx | 52 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/ui/src/pages/settings.tsx b/ui/src/pages/settings.tsx index 52ace62..4f2c404 100644 --- a/ui/src/pages/settings.tsx +++ b/ui/src/pages/settings.tsx @@ -4,12 +4,20 @@ import { Input } from "@ui/components/ui/input"; import { Label } from "@ui/components/ui/label"; import { Textarea } from "@ui/components/ui/textarea"; import { Avatar, AvatarFallback, AvatarImage } from "@ui/components/ui/avatar"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@ui/components/ui/dialog"; import { useUser } from "@ui/providers/UserStoreProvider"; import { useState, useRef } from "react"; import { TypographyH3, TypographyMuted, TypographySmall } from "@ui/components/ui/typography"; import { useIntroduction } from "src/hooks/intros"; import { useRemoveAvatar, useUpdateProfile, useUploadAvatar } from "@ui/hooks/profile"; -import { CameraIcon, Trash2Icon, UploadIcon } from "lucide-react"; +import { CameraIcon, Loader2Icon, Trash2Icon, UploadIcon } from "lucide-react"; import { toast } from "@ui/lib/toast"; import { ImageCropDialog } from "@ui/components/ImageCropDialog"; @@ -23,7 +31,7 @@ export default function SettingsPage() { } = useIntroduction(); const { mutate: updateProfile, isPending: updateProfilePending } = useUpdateProfile(); const { mutate: uploadAvatar } = useUploadAvatar(); - const { mutateAsync: removeAvatar } = useRemoveAvatar(); + const { mutateAsync: removeAvatar, isPending: removeAvatarPending } = useRemoveAvatar(); const [firstName, setFirstName] = useState(user?.first_name || ""); const [lastName, setLastName] = useState(user?.last_name || ""); @@ -31,6 +39,7 @@ export default function SettingsPage() { const [selectedFile, setSelectedFile] = useState(null); const [imageToCrop, setImageToCrop] = useState(null); const [isCropDialogOpen, setIsCropDialogOpen] = useState(false); + const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false); const fileInputRef = useRef(null); const handleAvatarChange = (e: React.ChangeEvent) => { @@ -68,13 +77,18 @@ export default function SettingsPage() { } }; - const handleRemoveAvatar = async () => { + const handleRemoveAvatarClick = () => { + setIsDeleteConfirmOpen(true); + }; + + const handleConfirmRemoveAvatar = async () => { await removeAvatar(); setAvatarPreview(null); setSelectedFile(null); if (fileInputRef.current) { fileInputRef.current.value = ""; } + setIsDeleteConfirmOpen(false); }; const handleUploadAvatar = () => { @@ -187,7 +201,7 @@ export default function SettingsPage() { + + + + ); }