mirror of
https://github.com/umami-software/umami.git
synced 2026-02-14 01:25:37 +01:00
67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import {
|
|
Form,
|
|
FormField,
|
|
FormButtons,
|
|
PasswordField,
|
|
Button,
|
|
FormSubmitButton,
|
|
} from '@umami/react-zen';
|
|
import { useMessages, useUpdateQuery } from '@/components/hooks';
|
|
|
|
export function PasswordEditForm({ onSave, onClose }) {
|
|
const { formatMessage, labels, messages } = useMessages();
|
|
const { mutate, error, isPending } = useUpdateQuery('/me/password');
|
|
|
|
const handleSubmit = async (data: any) => {
|
|
mutate(data, {
|
|
onSuccess: async () => {
|
|
onSave();
|
|
onClose();
|
|
},
|
|
});
|
|
};
|
|
|
|
const samePassword = (value: string, values: Record<string, any>) => {
|
|
if (value !== values.newPassword) {
|
|
return formatMessage(messages.noMatchPassword);
|
|
}
|
|
return true;
|
|
};
|
|
|
|
return (
|
|
<Form onSubmit={handleSubmit} error={error}>
|
|
<FormField
|
|
label={formatMessage(labels.currentPassword)}
|
|
name="currentPassword"
|
|
rules={{ required: 'Required' }}
|
|
>
|
|
<PasswordField autoComplete="current-password" />
|
|
</FormField>
|
|
<FormField
|
|
name="newPassword"
|
|
label={formatMessage(labels.newPassword)}
|
|
rules={{
|
|
required: 'Required',
|
|
minLength: { value: 8, message: formatMessage(messages.minPasswordLength, { n: 8 }) },
|
|
}}
|
|
>
|
|
<PasswordField autoComplete="new-password" />
|
|
</FormField>
|
|
<FormField
|
|
name="confirmPassword"
|
|
label={formatMessage(labels.confirmPassword)}
|
|
rules={{
|
|
required: formatMessage(labels.required),
|
|
minLength: { value: 8, message: formatMessage(messages.minPasswordLength, { n: 8 }) },
|
|
validate: samePassword,
|
|
}}
|
|
>
|
|
<PasswordField autoComplete="confirm-password" />
|
|
</FormField>
|
|
<FormButtons>
|
|
<Button onPress={onClose}>{formatMessage(labels.cancel)}</Button>
|
|
<FormSubmitButton isDisabled={isPending}>{formatMessage(labels.save)}</FormSubmitButton>
|
|
</FormButtons>
|
|
</Form>
|
|
);
|
|
}
|