import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, Grid, TextField, useMediaQuery, useTheme, } from '@mui/material'; import { useForm } from '@tanstack/react-form'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { t } from 'i18next'; import { FC, FormEvent, useEffect, useState } from 'react'; import { useApi } from '../../../api/Api'; import { User, UserUpdate } from '../../../types/User'; import ErrorComponent from '../../Error/ErrorComponent'; interface Props { user: User; open: boolean; onClose: () => void; } const UserPasswordDialog: FC = ({ user, open, onClose }) => { //eslint-disable-next-line @typescript-eslint/no-explicit-any const [error, setError] = useState(); const theme = useTheme(); const fullScreen = useMediaQuery(theme.breakpoints.only('xs'), { noSsr: true }); const queryClient = useQueryClient(); const Api = useApi(); const updateMutation = useMutation({ mutationFn: ({ data, id }: { data: UserUpdate; id?: number }) => { return Api.updateUser(data, id); }, }); const form = useForm({ defaultValues: { password: '', passwordConfirm: '', }, onSubmit: async ({ value }) => { try { updateMutation.mutate( { data: { password: value.password }, id: Api.authenticatedUser?.id === user.id ? undefined : user.id }, { onSuccess: () => { handleClose(); const queryKey = Api.authenticatedUser?.id === user.id ? ['profile'] : ['profile', { id: user.id }]; queryClient.invalidateQueries({ queryKey }); }, onError: setError, } ); //eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (_error: any) { setError(_error); } }, }); const handleClose = () => { form.reset(); setError(undefined); onClose(); }; useEffect(() => { if (!Api.hasAuth) handleClose(); }, [Api.hasAuth]); //eslint-disable-line react-hooks/exhaustive-deps return ( ) => { e.preventDefault(); e.stopPropagation(); form.handleSubmit(); }, onKeyDown: (event: React.KeyboardEvent) => { if (event.key === 'Tab') { event.stopPropagation(); } }, noValidate: true, }} > {t('Edit data')} (!value ? t('Password required') : undefined), onChangeAsyncDebounceMs: 250, onChangeAsync: async ({ value }) => { return !value && t('Password required'); }, }} children={(field) => { return ( <> field.handleChange(e.target.value)} size="small" label={t('Password')} required error={field.state.meta.isTouched && field.state.meta.errors.length > 0} helperText={field.state.meta.isTouched ? field.state.meta.errors.join(',') : ''} type="password" autoComplete="new-password" fullWidth /> ); }} /> !value ? t('Password required') : value !== fieldApi.form.getFieldValue('password') ? t('Password match') : undefined, onChangeAsyncDebounceMs: 250, onChangeAsync: async ({ value, fieldApi }) => !value ? t('Password required') : value !== fieldApi.form.getFieldValue('password') ? t('Password match') : undefined, }} children={(field) => { return ( <> field.handleChange(e.target.value)} size="small" label={t('Password confirm')} required error={field.state.meta.isTouched && field.state.meta.errors.length > 0} helperText={field.state.meta.isTouched ? field.state.meta.errors.join(',') : ''} type="password" autoComplete="new-password" fullWidth /> ); }} /> [state.canSubmit, state.isSubmitting]} children={([canSubmit]) => ( <> )} /> {error && ( )} ); }; export default UserPasswordDialog;