mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-14 01:15:47 +01:00
121 lines
3.5 KiB
TypeScript
121 lines
3.5 KiB
TypeScript
import { Alert, Button, Card, Group, Table, Text, Title } from '@mantine/core';
|
|
import {
|
|
IconAlertTriangle,
|
|
IconAlertTriangleFilled,
|
|
IconArrowLeft,
|
|
IconCheck,
|
|
IconInfoCircle,
|
|
IconKey,
|
|
IconMail,
|
|
IconUser,
|
|
} from '@tabler/icons-react';
|
|
import { useTranslation } from 'next-i18next';
|
|
import { CreateAccountSchema } from '~/pages/manage/users/create';
|
|
import { api } from '~/utils/api';
|
|
|
|
type ReviewInputStepProps = {
|
|
values: CreateAccountSchema;
|
|
prevStep: () => void;
|
|
nextStep: () => void;
|
|
};
|
|
|
|
export const ReviewInputStep = ({ values, prevStep, nextStep }: ReviewInputStepProps) => {
|
|
const { t } = useTranslation('manage/users/create');
|
|
|
|
const utils = api.useContext();
|
|
const { mutateAsync: createAsync, isLoading, isError, error } = api.user.create.useMutation({
|
|
onSettled: () => {
|
|
void utils.user.all.invalidate();
|
|
},
|
|
onSuccess: () => {
|
|
nextStep();
|
|
},
|
|
});
|
|
|
|
return (
|
|
<Card mih={400}>
|
|
<Title order={5}>{t('steps.finish.card.title')}</Title>
|
|
<Text mb="xl">{t('steps.finish.card.text')}</Text>
|
|
|
|
<Table mb="lg" withBorder highlightOnHover>
|
|
<thead>
|
|
<tr>
|
|
<th>{t('steps.finish.table.header.property')}</th>
|
|
<th>{t('steps.finish.table.header.value')}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>
|
|
<Group spacing="xs">
|
|
<IconUser size="1rem" />
|
|
<Text>{t('steps.finish.table.header.username')}</Text>
|
|
</Group>
|
|
</td>
|
|
<td>{values.account.username}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<Group spacing="xs">
|
|
<IconMail size="1rem" />
|
|
<Text>{t('steps.finish.table.header.email')}</Text>
|
|
</Group>
|
|
</td>
|
|
<td>
|
|
{values.account.eMail ? (
|
|
<Text>{values.account.eMail}</Text>
|
|
) : (
|
|
<Group spacing="xs">
|
|
<IconInfoCircle size="1rem" color="orange" />
|
|
<Text color="orange">{t('steps.finish.table.notSet')}</Text>
|
|
</Group>
|
|
)}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<Group spacing="xs">
|
|
<IconKey size="1rem" />
|
|
<Text>{t('steps.finish.table.header.password')}</Text>
|
|
</Group>
|
|
</td>
|
|
<td>
|
|
<Group spacing="xs">
|
|
<IconCheck size="1rem" color="green" />
|
|
<Text color="green">{t('steps.finish.table.valid')}</Text>
|
|
</Group>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</Table>
|
|
|
|
{isError && (
|
|
<Alert color="red" icon={<IconAlertTriangleFilled size="0.9rem" />} mb="lg">
|
|
<Text color="red">{t('steps.finish.failed', { error: error.message })}</Text>
|
|
</Alert>
|
|
)}
|
|
|
|
<Group position="apart" noWrap>
|
|
<Button leftIcon={<IconArrowLeft size="1rem" />} onClick={prevStep} variant="light" px="xl">
|
|
{t('common:previous')}
|
|
</Button>
|
|
<Button
|
|
onClick={async () => {
|
|
await createAsync({
|
|
username: values.account.username,
|
|
password: values.security.password,
|
|
email: values.account.eMail === '' ? undefined : values.account.eMail,
|
|
});
|
|
}}
|
|
loading={isLoading}
|
|
rightIcon={<IconCheck size="1rem" />}
|
|
variant="light"
|
|
px="xl"
|
|
>
|
|
{t('common:confirm')}
|
|
</Button>
|
|
</Group>
|
|
</Card>
|
|
);
|
|
};
|