import message from '@/components/ui/message'; import { Authorization } from '@/constants/authorization'; import userService, { getLoginChannels, loginWithChannel, } from '@/services/user-service'; import authorizationUtil, { redirectToLogin } from '@/utils/authorization-util'; import { useMutation, useQuery } from '@tanstack/react-query'; import { Form } from 'antd'; import { FormInstance } from 'antd/lib'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; export interface ILoginRequestBody { email: string; password: string; } export interface IRegisterRequestBody extends ILoginRequestBody { nickname: string; } export interface ILoginChannel { channel: string; display_name: string; icon: string; } export const useLoginChannels = () => { const { data, isLoading } = useQuery({ queryKey: ['loginChannels'], queryFn: async () => { const { data: res = {} } = await getLoginChannels(); return res.data || []; }, }); return { channels: data as ILoginChannel[], loading: isLoading }; }; export const useLoginWithChannel = () => { const { isPending: loading, mutateAsync } = useMutation({ mutationKey: ['loginWithChannel'], mutationFn: async (channel: string) => { loginWithChannel(channel); return Promise.resolve(); }, }); return { loading, login: mutateAsync }; }; export const useLogin = () => { const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['login'], mutationFn: async (params: { email: string; password: string }) => { const { data: res = {}, response } = await userService.login(params); if (res.code === 0) { const { data } = res; const authorization = response.headers.get(Authorization); const token = data.access_token; const userInfo = { avatar: data.avatar, name: data.nickname, email: data.email, }; authorizationUtil.setItems({ Authorization: authorization, userInfo: JSON.stringify(userInfo), Token: token, }); } return res.code; }, }); return { data, loading, login: mutateAsync }; }; export const useRegister = () => { const { t } = useTranslation(); const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['register'], mutationFn: async (params: { email: string; password: string; nickname: string; }) => { const { data = {} } = await userService.register(params); if (data.code === 0) { message.success(t('message.registered')); } else if ( data.message && data.message.includes('registration is disabled') ) { message.error( t('message.registerDisabled') || 'User registration is disabled', ); } return data.code; }, }); return { data, loading, register: mutateAsync }; }; export const useLogout = () => { const { t } = useTranslation(); const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['logout'], mutationFn: async () => { const { data = {} } = await userService.logout(); if (data.code === 0) { message.success(t('message.logout')); authorizationUtil.removeAll(); redirectToLogin(); } return data.code; }, }); return { data, loading, logout: mutateAsync }; }; export const useHandleSubmittable = (form: FormInstance) => { const [submittable, setSubmittable] = useState(false); // Watch all values const values = Form.useWatch([], form); useEffect(() => { form .validateFields({ validateOnly: true }) .then(() => setSubmittable(true)) .catch(() => setSubmittable(false)); }, [form, values]); return { submittable }; };