@@ -9,6 +9,7 @@ import styles2 from '#/widgets/business-persons/ui/persons-list/persons-list.mod import { InviteRoles, inviteRoles } from '../../invite-person-in-business/lib/constants' import { updateLimit } from '../api/set-limit' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' interface LimitModalProps { person: ResponseGetPersons | null @@ -20,28 +21,35 @@ interface LimitModalProps { addList: (newUser: ResponseGetPersons, list: 'personal' | 'security') => void } -export const LimitModal: React.FC = ({ - person, - onClose, - updateLimitProp, - list, - setList, - addList, - listType, -}) => { +export const LimitModal: React.FC = ({ person, onClose, updateLimitProp, list, setList, addList, listType }) => { const [limit, setLimit] = useState(person?.token_limit ? Math.floor(+person.token_limit).toString() : '0') const [role, setRole] = useState('Сотрудник') + const [originalRole, setOriginalRole] = useState('Сотрудник') const { data } = useSession() + const { showMessage } = useShowDataStore() + + const getRoleFromAccountType = (accountType: string | undefined): InviteRoles => { + switch (accountType) { + case 'business_account': + return 'Сотрудник' + case 'business_admin': + return 'Администратор' + case 'business_security': + return 'Сотрудник безопасности' + default: + return 'Сотрудник' + } + } const handleChangeBalance = () => { + const originalRoleValue = getRoleFromAccountType(person?.account_type) + updateLimit(person?.email, limit, data?.access, role).then((res) => { if (res === null) { return } else if (list && res.account_type !== person?.account_type) { if ( - (res.account_type === 'business_host' || - res.account_type === 'business_account' || - res.account_type === 'business_admin') && + (res.account_type === 'business_host' || res.account_type === 'business_account' || res.account_type === 'business_admin') && listType === 'security' ) { setList(list.filter((el) => el.email !== res.email)) @@ -52,19 +60,19 @@ export const LimitModal: React.FC = ({ } } - updateLimitProp(res.token_limit, person?.email) + if (role !== originalRoleValue) { + showMessage(`Роль пользователя ${person?.email} успешно изменена на "${role}"!`, 'success') + } else { + updateLimitProp(res.token_limit, person?.email) + } }) } useEffect(() => { - if (person?.account_type === 'business_account') { - setRole('Сотрудник') - } - if (person?.account_type === 'business_admin') { - setRole('Администратор') - } - if (person?.account_type === 'business_security') { - setRole('Сотрудник безопасности') + if (person) { + const roleFromAccount = getRoleFromAccountType(person.account_type) + setRole(roleFromAccount) + setOriginalRole(roleFromAccount) } }, [person]) @@ -84,13 +92,7 @@ export const LimitModal: React.FC = ({ Изменение лимита токенов - setLimit(e.target.value)} - fullWidth - sx={{ ...InputStyleDark }} - /> + setLimit(e.target.value)} fullWidth sx={{ ...InputStyleDark }} /> @@ -20,22 +20,57 @@ const ChangePassword: NextPageWithLayout = () => { const { query, push } = useRouter() + const [error, setError] = useState('') + + const [loading, setLoading] = useState(false) + const changePassword = async () => { - let formData: any = new FormData() - - formData.append('password_1', password1) - formData.append('password_2', password2) - - if (password1.trim() && password2.trim()) { - try { - await axios.post(API_URL + `/auth/change-pass?token=${query.token}`, formData, { - headers: { - 'content-type': 'multipart/form-data ', - }, - }) - setIsChange(true) + setError('') + + if (!password1.trim() || !password2.trim()) { + setError('Пожалуйста, заполните оба поля') + return + } + + if (password1.length < 6) { + setError('Пароль должен содержать не менее 6 символов') + return + } + + if (password1 !== password2) { + setError('Пароли не совпадают') + return + } + + setLoading(true) + + try { + let formData: any = new FormData() + formData.append('password_1', password1) + formData.append('password_2', password2) + + const response = await axios.post(API_URL + `/auth/change-pass?token=${query.token}`, formData, { + headers: { + 'content-type': 'multipart/form-data', + }, + }) + if (response.status != 200) { + setError(response.data.detail) setTimeout(() => push('/login'), 5000) - } catch (err) {} + return + } + setIsChange(true) + setTimeout(() => push('/login'), 5000) + } catch (err: any) { + if (err.response?.data?.detail) { + setError(err.response.data.detail) + } else if (err.response?.data?.message) { + setError(err.response.data.message) + } else { + setError('Произошла ошибка при смене пароля') + } + } finally { + setLoading(false) } } @@ -52,7 +87,7 @@ const ChangePassword: NextPageWithLayout = () => { sx={{ padding: 0, margin: desktop ? 0 : '60px auto', - backgroundColor: '#373737', + backgroundColor: '#373737', }} > { {desktop && ( - + { > Восстановление пароля + {error && ( + + {error} + + )} { - const response = await resendInvation(email, session?.access) - - if (response.status == 200) { - showMessage('Приглашение переотправлено!', 'success') - setPersons((prev) => - prev?.map((el) => { - if (el.email === email) { - return { ...el, acceptance_status: 'pending' as const } - } - return el - }) ?? null - ) - } else { - showMessage(response.data) + try { + const response = await resendInvation(email, session?.access) + + if (response.status == 200) { + showMessage('Приглашение переотправлено!', 'success') + setPersons((prev) => + prev?.map((el) => { + if (el.email === email) { + return { ...el, acceptance_status: 'pending' as const } + } + return el + }) ?? null + ) + } else { + // Проверяем тип response.data и преобразуем в строку + const errorMessage = typeof response.data === 'string' + ? response.data + : response.data?.detail || 'Ошибка при отправке приглашения' + showMessage(errorMessage, 'error') + } + } catch (error) { + showMessage('Произошла ошибка при отправке приглашения', 'error') } } @@ -250,4 +258,4 @@ export const PersonsList = ({ )} ) -} +} \ No newline at end of file @@ -10900,17 +10900,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",