Spaces:
Paused
Paused
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,
};
}
|