Update AccountDetailPanel to use modal form

This commit is contained in:
Oliver Walters 2024-08-21 07:08:30 +00:00
parent c83feb1181
commit cae3c505ab

View File

@ -1,11 +1,26 @@
import { Trans, t } from '@lingui/macro'; import { Trans, t } from '@lingui/macro';
import { Button, Group, Stack, Text, TextInput, Title } from '@mantine/core'; import {
ActionIcon,
Button,
Group,
Stack,
Table,
Text,
TextInput,
Title,
Tooltip
} from '@mantine/core';
import { useForm } from '@mantine/form'; import { useForm } from '@mantine/form';
import { useToggle } from '@mantine/hooks'; import { useToggle } from '@mantine/hooks';
import { IconEdit } from '@tabler/icons-react';
import { useMemo } from 'react';
import { api } from '../../../../App'; import { api } from '../../../../App';
import { EditButton } from '../../../../components/buttons/EditButton'; import { EditButton } from '../../../../components/buttons/EditButton';
import { ApiFormFieldSet } from '../../../../components/forms/fields/ApiFormField';
import { StylishText } from '../../../../components/items/StylishText';
import { ApiEndpoints } from '../../../../enums/ApiEndpoints'; import { ApiEndpoints } from '../../../../enums/ApiEndpoints';
import { useEditApiFormModal } from '../../../../hooks/UseForm';
import { apiUrl } from '../../../../states/ApiState'; import { apiUrl } from '../../../../states/ApiState';
import { useUserState } from '../../../../states/UserState'; import { useUserState } from '../../../../states/UserState';
@ -14,66 +29,57 @@ export function AccountDetailPanel() {
state.user, state.user,
state.fetchUserState state.fetchUserState
]); ]);
const form = useForm({ initialValues: user });
const [editing, setEditing] = useToggle([false, true] as const); const userFields: ApiFormFieldSet = useMemo(() => {
function SaveData(values: any) { return {
// copy values over to break form rendering link first_name: {},
const urlVals = { ...values }; last_name: {}
urlVals.is_active = true; };
// send }, []);
api
.put(apiUrl(ApiEndpoints.user_me), urlVals) const editUser = useEditApiFormModal({
.then((res) => { title: t`Edit User Information`,
if (res.status === 200) { url: ApiEndpoints.user_me,
setEditing(); onFormSuccess: fetchUserState,
fetchUserState(); fields: userFields,
} successMessage: t`User details updated`
})
.catch(() => {
console.error('ERR: Error saving user data');
}); });
}
return ( return (
<form onSubmit={form.onSubmit((values) => SaveData(values))}> <>
<Group> {editUser.modal}
<Title order={3}>
<Trans>Account Details</Trans>
</Title>
<EditButton setEditing={setEditing} editing={editing} />
</Group>
<Group>
{editing ? (
<Stack gap="xs"> <Stack gap="xs">
<TextInput <Group justify="space-between">
label="first name" <StylishText size="xl">
placeholder={t`First name`} <Trans>User Details</Trans>
{...form.getInputProps('first_name')} </StylishText>
/> <Tooltip label={t`Edit User Information`}>
<TextInput <ActionIcon variant="default" onClick={editUser.open}>
label="Last name" <IconEdit />
placeholder={t`Last name`} </ActionIcon>
{...form.getInputProps('last_name')} </Tooltip>
/>
<Group justify="right" mt="md">
<Button type="submit">
<Trans>Submit</Trans>
</Button>
</Group> </Group>
<Table>
<Table.Tr>
<Table.Td>
<Trans>Username</Trans>
</Table.Td>
<Table.Td>{user?.username}</Table.Td>
</Table.Tr>
<Table.Tr>
<Table.Td>
<Trans>First Name</Trans>
</Table.Td>
<Table.Td>{user?.first_name}</Table.Td>
</Table.Tr>
<Table.Tr>
<Table.Td>
<Trans>Last Name</Trans>
</Table.Td>
<Table.Td>{user?.last_name}</Table.Td>
</Table.Tr>
</Table>
</Stack> </Stack>
) : ( </>
<Stack gap="0">
<Text>
<Trans>First name: </Trans>
{form.values.first_name}
</Text>
<Text>
<Trans>Last name: </Trans>
{form.values.last_name}
</Text>
</Stack>
)}
</Group>
</form>
); );
} }