File size: 2,515 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
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { graphqlRequest } from '@/gql/graphql';
import { UPDATE_ME_MUTATION } from '@/gql/users';
import { useTranslation } from 'react-i18next';
import { toast } from 'sonner';
import { useAuthStore } from '@/stores/authStore';

export function useLanguage() {
  const { i18n, t } = useTranslation();
  const auth = useAuthStore((state) => state.auth);
  const queryClient = useQueryClient();

  // Mutation for updating user language preference
  const updateLanguageMutation = useMutation({
    mutationFn: async (language: string) => {
      if (!auth.user) {
        throw new Error('User not authenticated');
      }

      const response = (await graphqlRequest(UPDATE_ME_MUTATION, {
        input: {
          preferLanguage: language,
        },
      })) as { updateMe: any };
      return response.updateMe;
    },
    onSuccess: (updatedUser, language) => {
      // Update the auth store with new language preference
      if (auth.user) {
        auth.setUser({
          ...auth.user,
          preferLanguage: updatedUser.preferLanguage,
        });
      }

      // Invalidate and refetch user data
      queryClient.invalidateQueries({ queryKey: ['me'] });

      const languageName = updatedUser.preferLanguage === 'en' ? 'English' : '中文';
      toast.success(t('language.changeSuccess', { language: languageName }));
    },
    onError: (error: any) => {
      toast.error(t('language.changeError', { error: error.message }));
      // Revert i18n language on error
      if (auth.user?.preferLanguage) {
        i18n.changeLanguage(auth.user.preferLanguage);
      }
    },
  });

  const changeLanguage = async (language: string) => {
    try {
      // Immediately change the UI language for better UX
      await i18n.changeLanguage(language);

      // Update user preference in the backend if user is authenticated
      if (auth.user && auth.accessToken) {
        updateLanguageMutation.mutate(language);
      }
    } catch (error) {
      toast.error(t('language.changeError', { error: String(error) }));
    }
  };

  const initializeLanguage = (userLanguage?: string) => {
    if (userLanguage && userLanguage !== i18n.language) {
      i18n.changeLanguage(userLanguage);
    }
  };

  return {
    currentLanguage: i18n.language,
    changeLanguage,
    initializeLanguage,
    isUpdating: updateLanguageMutation.isPending,
  };
}