File size: 2,899 Bytes
9853396 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import { useEffect } from 'react';
import { useMutation, useQuery } from '@tanstack/react-query';
import { useRouter } from '@tanstack/react-router';
import { graphqlRequest } from '@/gql/graphql';
import { ME_QUERY } from '@/gql/users';
import { toast } from 'sonner';
import { useAuthStore, setTokenToStorage, removeTokenFromStorage } from '@/stores/authStore';
import { AuthUser } from '@/stores/authStore';
import { authApi } from '@/lib/api-client';
import i18n from '@/lib/i18n';
export interface SignInInput {
email: string;
password: string;
}
interface MeResponse {
me: AuthUser;
}
export function useMe() {
const { setUser } = useAuthStore((state) => state.auth);
const query = useQuery({
queryKey: ['me'],
queryFn: async () => {
const data = await graphqlRequest<MeResponse>(ME_QUERY);
return data.me;
},
enabled: !!useAuthStore.getState().auth.accessToken,
retry: false,
});
// Update auth store when data changes
useEffect(() => {
if (query.data) {
const userLanguage = query.data.preferLanguage || 'en';
setUser(query.data);
// Initialize i18n with user's preferred language
if (userLanguage !== i18n.language) {
i18n.changeLanguage(userLanguage);
}
}
}, [query.data, setUser]);
return query;
}
export function useSignIn() {
const { setUser, setAccessToken } = useAuthStore((state) => state.auth);
const router = useRouter();
return useMutation({
mutationFn: async (input: SignInInput) => {
return await authApi.signIn(input);
},
onSuccess: (data) => {
// Store token in localStorage
setTokenToStorage(data.token);
const userLanguage = data.user.preferLanguage || 'en';
// Update auth store
setAccessToken(data.token);
setUser(data.user);
// Initialize i18n with user's preferred language
if (userLanguage !== i18n.language) {
i18n.changeLanguage(userLanguage);
}
toast.success(i18n.t('common.success.signedIn'));
// Redirect based on user role
// Owner users go to dashboard, non-owner users go to requests page
const redirectPath = data.user.isOwner ? '/' : '/project/playground';
router.navigate({ to: redirectPath });
},
onError: (error: any) => {
const errorMessage = error.message || 'Failed to sign in';
toast.error(errorMessage);
},
});
}
export function useSignOut() {
const { reset } = useAuthStore((state) => state.auth);
const router = useRouter();
return () => {
// Clear token from localStorage
removeTokenFromStorage();
// Clear auth store
reset();
toast.success(i18n.t('common.success.signedOut'));
// Redirect to sign in page
router.navigate({ to: '/sign-in' });
};
}
|