import type { IRecoveryPasswordForm, IProfileData, IChangePasswordForm, ILoginForm, IPasswordForm, IRegistrateForm, IChangeEmail } from '../types'; function omit(obj: T, keys: K[]): Omit { const result = {} as Omit; for (const key in obj) { if (!keys.includes(key as unknown as K)) { result[key] = obj[key]; } } return result; } /** * Управляет авторизацией и профилем пользователя: регистрация, вход, выход, смена пароля/email, обновление профиля. * @param apiService - сервис для API-запросов */ export const useUser = (apiService) => { const { show, showError } = useSnackbar(); const register = async (form: IRegistrateForm) => { const response = await apiService.register(form); if (response) { useCookie('jwtoken', { path: '/', secure: true, httpOnly: false }).value = response.token; await getProfile(); } }; const getProfile = async (update = false) => { const profileData = useState('profileData', () => null); if (!profileData.value || update) { try { profileData.value = await apiService.getProfile(); } catch (error) { console.error('Error get profile:', error); } } }; const updateProfile = async (form: IProfileData) => { try { const formData = new FormData(); const config = JSON.stringify(omit(form, ['avatar'])); formData.append('config', config); if (form.avatar && (form.avatar as unknown) instanceof Blob) { formData.append('avatar', form.avatar as unknown as Blob, 'avatar.jpg'); } await apiService.postProfile(formData); } catch (error) { console.error('Error edit profile:', error); } }; const login = async (form: ILoginForm) => { const response = await apiService.login(form); if (response) { useCookie('jwtoken', { path: '/', secure: true, httpOnly: false }).value = response.token; await getProfile(); } }; const changePassword = async (form: IChangePasswordForm) => { try { await apiService.changePassword(form); show('Password changed'); } catch (err) { showError('Error while changing password'); console.log(err, 'error change password'); } }; const changeEmail = async (form: IChangeEmail) => { try { await apiService.changeEmail(form); show('email_changed'); } catch (err) { showError('Error while changing email'); console.log(err, 'error change email'); } }; const recoveryPassword = async (form: IRecoveryPasswordForm) => { try { const { generateLink } = useGenerateLink(); await apiService.recoveryPassword(form); show('Password recovered'); await useRouter().push(generateLink('/profile')); } catch (err) { showError('Error while recovery password'); console.log(err, 'error change password'); } }; const password = async (form: IPasswordForm) => { await apiService.password(form); }; const deleteAvatar = async () => { await apiService.deleteAvatar(); }; const signOut = () => { const { generateLink } = useGenerateLink(); const cookie = useCookie('jwtoken', { path: '/', secure: true, httpOnly: false }); cookie.value = undefined; // или null const domain = useRuntimeConfig().public.xDomain; document.cookie = `jwtoken=; path=/; domain=${domain}; expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure`; const profile = useState('profileData'); profile.value = null; const router = useRouter(); router.push(generateLink('/')); }; return { isAuthorized: computed(() => !!useCookie('jwtoken').value), register, login, password, signOut, getProfile, updateProfile, changePassword, recoveryPassword, deleteAvatar, changeEmail, }; };