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