ragflow/web/src/hooks/login-hooks.ts
balibabu 9aa8cfb73a
Feat: Use sonner to replace the requested prompt message component #3221 (#9951)
### 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)
2025-09-05 18:43:33 +08:00

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 };
};