1- import { create } from "@bufbuild/protobuf" ;
2- import { FieldMaskSchema } from "@bufbuild/protobuf/wkt" ;
31import { ArchiveIcon , CheckIcon , GlobeIcon , LogOutIcon , PaletteIcon , SettingsIcon , SquareUserIcon , User2Icon } from "lucide-react" ;
4- import { userServiceClient } from "@/connect" ;
52import { useAuth } from "@/contexts/AuthContext" ;
63import useCurrentUser from "@/hooks/useCurrentUser" ;
74import useNavigateTo from "@/hooks/useNavigateTo" ;
8- import i18n , { locales } from "@/i18n" ;
5+ import { useUpdateUserGeneralSetting } from "@/hooks/useUserQueries" ;
6+ import { locales } from "@/i18n" ;
97import { cn } from "@/lib/utils" ;
108import { Routes } from "@/router" ;
11- import { UserSetting_GeneralSettingSchema , UserSettingSchema } from "@/types/proto/api/v1/user_service_pb" ;
12- import { getLocaleDisplayName , useTranslate } from "@/utils/i18n" ;
13- import { loadTheme , THEME_OPTIONS } from "@/utils/theme" ;
9+ import { getLocaleDisplayName , getLocaleWithFallback , loadLocale , useTranslate } from "@/utils/i18n" ;
10+ import { getThemeWithFallback , loadTheme , THEME_OPTIONS } from "@/utils/theme" ;
1411import UserAvatar from "./UserAvatar" ;
1512import {
1613 DropdownMenu ,
@@ -32,55 +29,38 @@ const UserMenu = (props: Props) => {
3229 const navigateTo = useNavigateTo ( ) ;
3330 const currentUser = useCurrentUser ( ) ;
3431 const { userGeneralSetting, refetchSettings, logout } = useAuth ( ) ;
35- const currentLocale = userGeneralSetting ?. locale || "en" ;
36- const currentTheme = userGeneralSetting ?. theme || "default" ;
32+ const { mutate : updateUserGeneralSetting } = useUpdateUserGeneralSetting ( currentUser ?. name ) ;
33+ const currentLocale = getLocaleWithFallback ( userGeneralSetting ?. locale ) ;
34+ const currentTheme = getThemeWithFallback ( userGeneralSetting ?. theme ) ;
3735
3836 const handleLocaleChange = async ( locale : Locale ) => {
3937 if ( ! currentUser ) return ;
40- // Apply locale immediately for instant UI feedback
41- i18n . changeLanguage ( locale ) ;
38+ // Apply locale immediately for instant UI feedback and persist to localStorage
39+ loadLocale ( locale ) ;
4240 // Persist to user settings
43- const settingName = `${ currentUser . name } /setting` ;
44- const updatedGeneralSetting = create ( UserSetting_GeneralSettingSchema , {
45- locale,
46- theme : userGeneralSetting ?. theme ,
47- memoVisibility : userGeneralSetting ?. memoVisibility ,
48- } ) ;
49- await userServiceClient . updateUserSetting ( {
50- setting : create ( UserSettingSchema , {
51- name : settingName ,
52- value : {
53- case : "generalSetting" ,
54- value : updatedGeneralSetting ,
41+ updateUserGeneralSetting (
42+ { generalSetting : { locale } , updateMask : [ "locale" ] } ,
43+ {
44+ onSuccess : ( ) => {
45+ refetchSettings ( ) ;
5546 } ,
56- } ) ,
57- updateMask : create ( FieldMaskSchema , { paths : [ "general_setting.locale" ] } ) ,
58- } ) ;
59- await refetchSettings ( ) ;
47+ } ,
48+ ) ;
6049 } ;
6150
6251 const handleThemeChange = async ( theme : string ) => {
6352 if ( ! currentUser ) return ;
6453 // Apply theme immediately for instant UI feedback
6554 loadTheme ( theme ) ;
6655 // Persist to user settings
67- const settingName = `${ currentUser . name } /setting` ;
68- const updatedGeneralSetting = create ( UserSetting_GeneralSettingSchema , {
69- locale : userGeneralSetting ?. locale ,
70- theme,
71- memoVisibility : userGeneralSetting ?. memoVisibility ,
72- } ) ;
73- await userServiceClient . updateUserSetting ( {
74- setting : create ( UserSettingSchema , {
75- name : settingName ,
76- value : {
77- case : "generalSetting" ,
78- value : updatedGeneralSetting ,
56+ updateUserGeneralSetting (
57+ { generalSetting : { theme } , updateMask : [ "theme" ] } ,
58+ {
59+ onSuccess : ( ) => {
60+ refetchSettings ( ) ;
7961 } ,
80- } ) ,
81- updateMask : create ( FieldMaskSchema , { paths : [ "general_setting.theme" ] } ) ,
82- } ) ;
83- await refetchSettings ( ) ;
62+ } ,
63+ ) ;
8464 } ;
8565
8666 const handleSignOut = async ( ) => {
0 commit comments