Skip to content

Commit 61e94e8

Browse files
committed
refactor: replace i18n language change with loadLocale
1 parent 0735c11 commit 61e94e8

File tree

2 files changed

+25
-45
lines changed

2 files changed

+25
-45
lines changed

web/src/components/AuthFooter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useTranslation } from "react-i18next";
2-
import i18n from "@/i18n";
32
import { cn } from "@/lib/utils";
43
import { getInitialTheme, loadTheme } from "@/utils/theme";
4+
import { loadLocale } from "@/utils/i18n";
55
import LocaleSelect from "./LocaleSelect";
66
import ThemeSelect from "./ThemeSelect";
77

@@ -15,7 +15,7 @@ const AuthFooter = ({ className }: Props) => {
1515
const currentTheme = getInitialTheme();
1616

1717
const handleLocaleChange = (locale: Locale) => {
18-
i18n.changeLanguage(locale);
18+
loadLocale(locale);
1919
};
2020

2121
const handleThemeChange = (theme: string) => {

web/src/components/UserMenu.tsx

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
import { create } from "@bufbuild/protobuf";
2-
import { FieldMaskSchema } from "@bufbuild/protobuf/wkt";
31
import { ArchiveIcon, CheckIcon, GlobeIcon, LogOutIcon, PaletteIcon, SettingsIcon, SquareUserIcon, User2Icon } from "lucide-react";
4-
import { userServiceClient } from "@/connect";
52
import { useAuth } from "@/contexts/AuthContext";
63
import useCurrentUser from "@/hooks/useCurrentUser";
74
import useNavigateTo from "@/hooks/useNavigateTo";
8-
import i18n, { locales } from "@/i18n";
5+
import { useUpdateUserGeneralSetting } from "@/hooks/useUserQueries";
6+
import { locales } from "@/i18n";
97
import { cn } from "@/lib/utils";
108
import { 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";
1411
import UserAvatar from "./UserAvatar";
1512
import {
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

Comments
 (0)