From 372fc7c1f6d37feed3a6b26ff0c15f9854ce736a Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sun, 13 Nov 2022 01:54:02 -0800 Subject: [PATCH] Add edit profile form --- .../features/titlebar/components/app-menu.tsx | 30 ++++++++++++- .../users/components/edit-user-form.tsx | 43 ++++++++++++++----- .../features/users/mutations/update-user.ts | 5 ++- 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/renderer/features/titlebar/components/app-menu.tsx b/src/renderer/features/titlebar/components/app-menu.tsx index 71d018392..f65ffe84e 100644 --- a/src/renderer/features/titlebar/components/app-menu.tsx +++ b/src/renderer/features/titlebar/components/app-menu.tsx @@ -1,5 +1,5 @@ import { Group } from '@mantine/core'; -import { openModal } from '@mantine/modals'; +import { closeAllModals, openModal } from '@mantine/modals'; import { useQueryClient } from '@tanstack/react-query'; import { RiLock2Line, @@ -14,11 +14,13 @@ import { } from 'react-icons/ri'; import { useNavigate } from 'react-router'; import { queryKeys } from '@/renderer/api/query-keys'; +import { UserDetailResponse } from '@/renderer/api/users.api'; import { Button, DropdownMenu, Text } from '@/renderer/components'; import { ServerList, useServerList } from '@/renderer/features/servers'; import { Settings } from '@/renderer/features/settings'; import { usePermissions } from '@/renderer/features/shared'; import { UserList } from '@/renderer/features/users'; +import { EditUserForm } from '@/renderer/features/users/components/edit-user-form'; import { useAuthStore } from '@/renderer/store'; export const AppMenu = () => { @@ -30,6 +32,10 @@ export const AppMenu = () => { const serverCredentials = useAuthStore((state) => state.serverCredentials); const permissions = usePermissions(); const { data: servers } = useServerList(); + const userId = useAuthStore((state) => state.permissions.id); + const user = queryClient.getQueryData( + queryKeys.users.detail(userId) + ); const serverList = servers?.data?.map((s) => ({ @@ -54,6 +60,23 @@ export const AppMenu = () => { }); }; + const handleEditProfileModal = () => { + openModal({ + centered: true, + children: ( + + ), + exitTransitionDuration: 300, + overflow: 'inside', + title: 'Edit Profile', + transition: 'slide-down', + }); + }; + const handleManageUsersModal = () => { openModal({ centered: true, @@ -130,7 +153,10 @@ export const AppMenu = () => { Settings - }> + } + onClick={handleEditProfileModal} + > Edit profile {permissions.isAdmin && ( diff --git a/src/renderer/features/users/components/edit-user-form.tsx b/src/renderer/features/users/components/edit-user-form.tsx index 8e14bad02..19758022a 100644 --- a/src/renderer/features/users/components/edit-user-form.tsx +++ b/src/renderer/features/users/components/edit-user-form.tsx @@ -13,12 +13,17 @@ import { usePermissions } from '@/renderer/features/shared'; import { useUpdateUser } from '@/renderer/features/users/mutations/update-user'; import { randomString } from '@/renderer/utils'; -interface AddUserFormProps { +interface EditUserFormProps { onCancel: () => void; + repeatPassword?: boolean; user?: User; } -export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { +export const EditUserForm = ({ + user, + onCancel, + repeatPassword, +}: EditUserFormProps) => { const permissions = usePermissions(); const focusTrapRef = useFocusTrap(true); const clipboard = useClipboard({ timeout: 1000 }); @@ -28,6 +33,7 @@ export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { displayName: user?.displayName || '', isAdmin: user?.isAdmin || false, password: '', + repeatPassword: '', username: user?.username || '', }, }); @@ -39,6 +45,11 @@ export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { toast.info({ message: 'Password copied to clipboard' }); }; + const isSubmitValid = () => { + if (!repeatPassword) return true; + return form.values.password === form.values.repeatPassword; + }; + const updateUserMutation = useUpdateUser(); const handleUpdateUser = form.onSubmit((values) => { @@ -48,6 +59,7 @@ export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { ...values, displayName: values.displayName || undefined, password: values.password || undefined, + repeatPassword: values.repeatPassword || undefined, }; updateUserMutation.mutate( @@ -82,6 +94,13 @@ export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { {...form.getInputProps('displayName')} /> + {repeatPassword && ( + + )} + {permissions.isAdmin && !user?.isSuperAdmin ? ( @@ -93,14 +112,16 @@ export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { ) : ( )} - + {!repeatPassword && ( + + )} @@ -108,6 +129,7 @@ export const EditUserForm = ({ user, onCancel }: AddUserFormProps) => { Cancel