2025-02-03 10:53:04 -05:00
|
|
|
import { useResetRecoilState, useSetRecoilState } from 'recoil';
|
2025-01-12 12:57:10 -05:00
|
|
|
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
2025-02-18 01:09:36 +01:00
|
|
|
import { MutationKeys, QueryKeys, dataService, request } from 'librechat-data-provider';
|
2025-01-12 12:57:10 -05:00
|
|
|
import type { UseMutationResult } from '@tanstack/react-query';
|
|
|
|
|
import type * as t from 'librechat-data-provider';
|
|
|
|
|
import useClearStates from '~/hooks/Config/useClearStates';
|
|
|
|
|
import store from '~/store';
|
|
|
|
|
|
|
|
|
|
/* login/logout */
|
|
|
|
|
export const useLogoutUserMutation = (
|
|
|
|
|
options?: t.LogoutOptions,
|
2025-02-03 10:53:04 -05:00
|
|
|
): UseMutationResult<t.TLogoutResponse, unknown, undefined, unknown> => {
|
2025-01-12 12:57:10 -05:00
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
const clearStates = useClearStates();
|
|
|
|
|
const resetDefaultPreset = useResetRecoilState(store.defaultPreset);
|
2025-02-03 10:53:04 -05:00
|
|
|
const setQueriesEnabled = useSetRecoilState<boolean>(store.queriesEnabled);
|
2025-01-12 12:57:10 -05:00
|
|
|
|
|
|
|
|
return useMutation([MutationKeys.logoutUser], {
|
|
|
|
|
mutationFn: () => dataService.logout(),
|
|
|
|
|
...(options || {}),
|
|
|
|
|
onSuccess: (...args) => {
|
2025-02-03 10:53:04 -05:00
|
|
|
setQueriesEnabled(false);
|
2025-01-12 12:57:10 -05:00
|
|
|
resetDefaultPreset();
|
|
|
|
|
clearStates();
|
|
|
|
|
queryClient.removeQueries();
|
|
|
|
|
options?.onSuccess?.(...args);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2025-02-03 10:53:04 -05:00
|
|
|
export const useLoginUserMutation = (
|
|
|
|
|
options?: t.MutationOptions<t.TLoginResponse, t.TLoginUser, unknown, unknown>,
|
|
|
|
|
): UseMutationResult<t.TLoginResponse, unknown, t.TLoginUser, unknown> => {
|
2025-01-12 12:57:10 -05:00
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
const clearStates = useClearStates();
|
|
|
|
|
const resetDefaultPreset = useResetRecoilState(store.defaultPreset);
|
2025-02-03 10:53:04 -05:00
|
|
|
const setQueriesEnabled = useSetRecoilState<boolean>(store.queriesEnabled);
|
|
|
|
|
return useMutation([MutationKeys.loginUser], {
|
|
|
|
|
mutationFn: (payload: t.TLoginUser) => dataService.login(payload),
|
|
|
|
|
...(options || {}),
|
|
|
|
|
onMutate: (vars) => {
|
2025-01-12 12:57:10 -05:00
|
|
|
resetDefaultPreset();
|
|
|
|
|
clearStates();
|
|
|
|
|
queryClient.removeQueries();
|
2025-02-03 10:53:04 -05:00
|
|
|
options?.onMutate?.(vars);
|
|
|
|
|
},
|
|
|
|
|
onSuccess: (...args) => {
|
|
|
|
|
setQueriesEnabled(true);
|
|
|
|
|
options?.onSuccess?.(...args);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useRefreshTokenMutation = (
|
|
|
|
|
options?: t.MutationOptions<t.TRefreshTokenResponse | undefined, undefined, unknown, unknown>,
|
|
|
|
|
): UseMutationResult<t.TRefreshTokenResponse | undefined, unknown, undefined, unknown> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation([MutationKeys.refreshToken], {
|
|
|
|
|
mutationFn: () => request.refreshToken(),
|
|
|
|
|
...(options || {}),
|
|
|
|
|
onMutate: (vars) => {
|
|
|
|
|
queryClient.removeQueries();
|
|
|
|
|
options?.onMutate?.(vars);
|
2025-01-12 12:57:10 -05:00
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* User */
|
|
|
|
|
export const useDeleteUserMutation = (
|
|
|
|
|
options?: t.MutationOptions<unknown, undefined>,
|
|
|
|
|
): UseMutationResult<unknown, unknown, undefined, unknown> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
const clearStates = useClearStates();
|
|
|
|
|
const resetDefaultPreset = useResetRecoilState(store.defaultPreset);
|
|
|
|
|
|
|
|
|
|
return useMutation([MutationKeys.deleteUser], {
|
|
|
|
|
mutationFn: () => dataService.deleteUser(),
|
|
|
|
|
...(options || {}),
|
|
|
|
|
onSuccess: (...args) => {
|
|
|
|
|
resetDefaultPreset();
|
|
|
|
|
clearStates();
|
|
|
|
|
queryClient.removeQueries();
|
|
|
|
|
options?.onSuccess?.(...args);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
2025-02-18 01:09:36 +01:00
|
|
|
|
|
|
|
|
// Array.isArray(user?.backupCodes) && user?.backupCodes.length > 0
|
|
|
|
|
|
|
|
|
|
export const useEnableTwoFactorMutation = (): UseMutationResult<
|
|
|
|
|
t.TEnable2FAResponse,
|
|
|
|
|
unknown,
|
|
|
|
|
void,
|
|
|
|
|
unknown
|
|
|
|
|
> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation(() => dataService.enableTwoFactor(), {
|
|
|
|
|
onSuccess: (data) => {
|
|
|
|
|
queryClient.setQueryData([QueryKeys.user, '2fa'], data);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useVerifyTwoFactorMutation = (): UseMutationResult<
|
|
|
|
|
t.TVerify2FAResponse,
|
|
|
|
|
unknown,
|
|
|
|
|
t.TVerify2FARequest,
|
|
|
|
|
unknown
|
|
|
|
|
> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation((payload: t.TVerify2FARequest) => dataService.verifyTwoFactor(payload), {
|
|
|
|
|
onSuccess: (data) => {
|
|
|
|
|
queryClient.setQueryData([QueryKeys.user, '2fa'], data);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useConfirmTwoFactorMutation = (): UseMutationResult<
|
|
|
|
|
t.TVerify2FAResponse,
|
|
|
|
|
unknown,
|
|
|
|
|
t.TVerify2FARequest,
|
|
|
|
|
unknown
|
|
|
|
|
> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation((payload: t.TVerify2FARequest) => dataService.confirmTwoFactor(payload), {
|
|
|
|
|
onSuccess: (data) => {
|
|
|
|
|
queryClient.setQueryData([QueryKeys.user, '2fa'], data);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useDisableTwoFactorMutation = (): UseMutationResult<
|
|
|
|
|
t.TDisable2FAResponse,
|
|
|
|
|
unknown,
|
|
|
|
|
void,
|
|
|
|
|
unknown
|
|
|
|
|
> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation(() => dataService.disableTwoFactor(), {
|
|
|
|
|
onSuccess: (data) => {
|
|
|
|
|
queryClient.setQueryData([QueryKeys.user, '2fa'], null);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useRegenerateBackupCodesMutation = (): UseMutationResult<
|
|
|
|
|
t.TRegenerateBackupCodesResponse,
|
|
|
|
|
unknown,
|
|
|
|
|
void,
|
|
|
|
|
unknown
|
|
|
|
|
> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation(() => dataService.regenerateBackupCodes(), {
|
|
|
|
|
onSuccess: (data) => {
|
|
|
|
|
queryClient.setQueryData([QueryKeys.user, '2fa', 'backup'], data);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useVerifyTwoFactorTempMutation = (
|
|
|
|
|
options?: t.MutationOptions<t.TVerify2FATempResponse, t.TVerify2FATempRequest, unknown, unknown>,
|
|
|
|
|
): UseMutationResult<t.TVerify2FATempResponse, unknown, t.TVerify2FATempRequest, unknown> => {
|
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
(payload: t.TVerify2FATempRequest) => dataService.verifyTwoFactorTemp(payload),
|
|
|
|
|
{
|
|
|
|
|
...(options || {}),
|
|
|
|
|
onSuccess: (data, ...args) => {
|
|
|
|
|
queryClient.setQueryData([QueryKeys.user, '2fa'], data);
|
|
|
|
|
options?.onSuccess?.(data, ...args);
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
};
|