### What problem does this PR solve? Feat: Use sonner to replace the requested prompt message component #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
152 lines
3.8 KiB
TypeScript
152 lines
3.8 KiB
TypeScript
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<boolean>(false);
|
|
|
|
// Watch all values
|
|
const values = Form.useWatch([], form);
|
|
|
|
useEffect(() => {
|
|
form
|
|
.validateFields({ validateOnly: true })
|
|
.then(() => setSubmittable(true))
|
|
.catch(() => setSubmittable(false));
|
|
}, [form, values]);
|
|
|
|
return { submittable };
|
|
};
|