Commit 61e94e8b authored by Johnny's avatar Johnny

refactor: replace i18n language change with loadLocale

parent 0735c11d
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import i18n from "@/i18n";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { getInitialTheme, loadTheme } from "@/utils/theme"; import { getInitialTheme, loadTheme } from "@/utils/theme";
import { loadLocale } from "@/utils/i18n";
import LocaleSelect from "./LocaleSelect"; import LocaleSelect from "./LocaleSelect";
import ThemeSelect from "./ThemeSelect"; import ThemeSelect from "./ThemeSelect";
...@@ -15,7 +15,7 @@ const AuthFooter = ({ className }: Props) => { ...@@ -15,7 +15,7 @@ const AuthFooter = ({ className }: Props) => {
const currentTheme = getInitialTheme(); const currentTheme = getInitialTheme();
const handleLocaleChange = (locale: Locale) => { const handleLocaleChange = (locale: Locale) => {
i18n.changeLanguage(locale); loadLocale(locale);
}; };
const handleThemeChange = (theme: string) => { const handleThemeChange = (theme: string) => {
......
import { create } from "@bufbuild/protobuf";
import { FieldMaskSchema } from "@bufbuild/protobuf/wkt";
import { ArchiveIcon, CheckIcon, GlobeIcon, LogOutIcon, PaletteIcon, SettingsIcon, SquareUserIcon, User2Icon } from "lucide-react"; import { ArchiveIcon, CheckIcon, GlobeIcon, LogOutIcon, PaletteIcon, SettingsIcon, SquareUserIcon, User2Icon } from "lucide-react";
import { userServiceClient } from "@/connect";
import { useAuth } from "@/contexts/AuthContext"; import { useAuth } from "@/contexts/AuthContext";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import useNavigateTo from "@/hooks/useNavigateTo"; import useNavigateTo from "@/hooks/useNavigateTo";
import i18n, { locales } from "@/i18n"; import { useUpdateUserGeneralSetting } from "@/hooks/useUserQueries";
import { locales } from "@/i18n";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { Routes } from "@/router"; import { Routes } from "@/router";
import { UserSetting_GeneralSettingSchema, UserSettingSchema } from "@/types/proto/api/v1/user_service_pb"; import { getLocaleDisplayName, getLocaleWithFallback, loadLocale, useTranslate } from "@/utils/i18n";
import { getLocaleDisplayName, useTranslate } from "@/utils/i18n"; import { getThemeWithFallback, loadTheme, THEME_OPTIONS } from "@/utils/theme";
import { loadTheme, THEME_OPTIONS } from "@/utils/theme";
import UserAvatar from "./UserAvatar"; import UserAvatar from "./UserAvatar";
import { import {
DropdownMenu, DropdownMenu,
...@@ -32,31 +29,23 @@ const UserMenu = (props: Props) => { ...@@ -32,31 +29,23 @@ const UserMenu = (props: Props) => {
const navigateTo = useNavigateTo(); const navigateTo = useNavigateTo();
const currentUser = useCurrentUser(); const currentUser = useCurrentUser();
const { userGeneralSetting, refetchSettings, logout } = useAuth(); const { userGeneralSetting, refetchSettings, logout } = useAuth();
const currentLocale = userGeneralSetting?.locale || "en"; const { mutate: updateUserGeneralSetting } = useUpdateUserGeneralSetting(currentUser?.name);
const currentTheme = userGeneralSetting?.theme || "default"; const currentLocale = getLocaleWithFallback(userGeneralSetting?.locale);
const currentTheme = getThemeWithFallback(userGeneralSetting?.theme);
const handleLocaleChange = async (locale: Locale) => { const handleLocaleChange = async (locale: Locale) => {
if (!currentUser) return; if (!currentUser) return;
// Apply locale immediately for instant UI feedback // Apply locale immediately for instant UI feedback and persist to localStorage
i18n.changeLanguage(locale); loadLocale(locale);
// Persist to user settings // Persist to user settings
const settingName = `${currentUser.name}/setting`; updateUserGeneralSetting(
const updatedGeneralSetting = create(UserSetting_GeneralSettingSchema, { { generalSetting: { locale }, updateMask: ["locale"] },
locale, {
theme: userGeneralSetting?.theme, onSuccess: () => {
memoVisibility: userGeneralSetting?.memoVisibility, refetchSettings();
});
await userServiceClient.updateUserSetting({
setting: create(UserSettingSchema, {
name: settingName,
value: {
case: "generalSetting",
value: updatedGeneralSetting,
}, },
}), },
updateMask: create(FieldMaskSchema, { paths: ["general_setting.locale"] }), );
});
await refetchSettings();
}; };
const handleThemeChange = async (theme: string) => { const handleThemeChange = async (theme: string) => {
...@@ -64,23 +53,14 @@ const UserMenu = (props: Props) => { ...@@ -64,23 +53,14 @@ const UserMenu = (props: Props) => {
// Apply theme immediately for instant UI feedback // Apply theme immediately for instant UI feedback
loadTheme(theme); loadTheme(theme);
// Persist to user settings // Persist to user settings
const settingName = `${currentUser.name}/setting`; updateUserGeneralSetting(
const updatedGeneralSetting = create(UserSetting_GeneralSettingSchema, { { generalSetting: { theme }, updateMask: ["theme"] },
locale: userGeneralSetting?.locale, {
theme, onSuccess: () => {
memoVisibility: userGeneralSetting?.memoVisibility, refetchSettings();
});
await userServiceClient.updateUserSetting({
setting: create(UserSettingSchema, {
name: settingName,
value: {
case: "generalSetting",
value: updatedGeneralSetting,
}, },
}), },
updateMask: create(FieldMaskSchema, { paths: ["general_setting.theme"] }), );
});
await refetchSettings();
}; };
const handleSignOut = async () => { const handleSignOut = async () => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment