Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
61e94e8b
Commit
61e94e8b
authored
Dec 30, 2025
by
Johnny
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: replace i18n language change with loadLocale
parent
0735c11d
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
25 additions
and
45 deletions
+25
-45
AuthFooter.tsx
web/src/components/AuthFooter.tsx
+2
-2
UserMenu.tsx
web/src/components/UserMenu.tsx
+23
-43
No files found.
web/src/components/AuthFooter.tsx
View file @
61e94e8b
import
{
useTranslation
}
from
"react-i18next"
;
import
i18n
from
"@/i18n"
;
import
{
cn
}
from
"@/lib/utils"
;
import
{
getInitialTheme
,
loadTheme
}
from
"@/utils/theme"
;
import
{
loadLocale
}
from
"@/utils/i18n"
;
import
LocaleSelect
from
"./LocaleSelect"
;
import
ThemeSelect
from
"./ThemeSelect"
;
...
...
@@ -15,7 +15,7 @@ const AuthFooter = ({ className }: Props) => {
const
currentTheme
=
getInitialTheme
();
const
handleLocaleChange
=
(
locale
:
Locale
)
=>
{
i18n
.
changeLanguag
e
(
locale
);
loadLocal
e
(
locale
);
};
const
handleThemeChange
=
(
theme
:
string
)
=>
{
...
...
web/src/components/UserMenu.tsx
View file @
61e94e8b
import
{
create
}
from
"@bufbuild/protobuf"
;
import
{
FieldMaskSchema
}
from
"@bufbuild/protobuf/wkt"
;
import
{
ArchiveIcon
,
CheckIcon
,
GlobeIcon
,
LogOutIcon
,
PaletteIcon
,
SettingsIcon
,
SquareUserIcon
,
User2Icon
}
from
"lucide-react"
;
import
{
userServiceClient
}
from
"@/connect"
;
import
{
useAuth
}
from
"@/contexts/AuthContext"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
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
{
Routes
}
from
"@/router"
;
import
{
UserSetting_GeneralSettingSchema
,
UserSettingSchema
}
from
"@/types/proto/api/v1/user_service_pb"
;
import
{
getLocaleDisplayName
,
useTranslate
}
from
"@/utils/i18n"
;
import
{
loadTheme
,
THEME_OPTIONS
}
from
"@/utils/theme"
;
import
{
getLocaleDisplayName
,
getLocaleWithFallback
,
loadLocale
,
useTranslate
}
from
"@/utils/i18n"
;
import
{
getThemeWithFallback
,
loadTheme
,
THEME_OPTIONS
}
from
"@/utils/theme"
;
import
UserAvatar
from
"./UserAvatar"
;
import
{
DropdownMenu
,
...
...
@@ -32,31 +29,23 @@ const UserMenu = (props: Props) => {
const
navigateTo
=
useNavigateTo
();
const
currentUser
=
useCurrentUser
();
const
{
userGeneralSetting
,
refetchSettings
,
logout
}
=
useAuth
();
const
currentLocale
=
userGeneralSetting
?.
locale
||
"en"
;
const
currentTheme
=
userGeneralSetting
?.
theme
||
"default"
;
const
{
mutate
:
updateUserGeneralSetting
}
=
useUpdateUserGeneralSetting
(
currentUser
?.
name
);
const
currentLocale
=
getLocaleWithFallback
(
userGeneralSetting
?.
locale
);
const
currentTheme
=
getThemeWithFallback
(
userGeneralSetting
?.
theme
);
const
handleLocaleChange
=
async
(
locale
:
Locale
)
=>
{
if
(
!
currentUser
)
return
;
// Apply locale immediately for instant UI feedback
i18n
.
changeLanguag
e
(
locale
);
// Apply locale immediately for instant UI feedback
and persist to localStorage
loadLocal
e
(
locale
);
// Persist to user settings
const
settingName
=
`
${
currentUser
.
name
}
/setting`
;
const
updatedGeneralSetting
=
create
(
UserSetting_GeneralSettingSchema
,
{
locale
,
theme
:
userGeneralSetting
?.
theme
,
memoVisibility
:
userGeneralSetting
?.
memoVisibility
,
});
await
userServiceClient
.
updateUserSetting
({
setting
:
create
(
UserSettingSchema
,
{
name
:
settingName
,
value
:
{
case
:
"generalSetting"
,
value
:
updatedGeneralSetting
,
updateUserGeneralSetting
(
{
generalSetting
:
{
locale
},
updateMask
:
[
"locale"
]
},
{
onSuccess
:
()
=>
{
refetchSettings
();
},
}),
updateMask
:
create
(
FieldMaskSchema
,
{
paths
:
[
"general_setting.locale"
]
}),
});
await
refetchSettings
();
},
);
};
const
handleThemeChange
=
async
(
theme
:
string
)
=>
{
...
...
@@ -64,23 +53,14 @@ const UserMenu = (props: Props) => {
// Apply theme immediately for instant UI feedback
loadTheme
(
theme
);
// Persist to user settings
const
settingName
=
`
${
currentUser
.
name
}
/setting`
;
const
updatedGeneralSetting
=
create
(
UserSetting_GeneralSettingSchema
,
{
locale
:
userGeneralSetting
?.
locale
,
theme
,
memoVisibility
:
userGeneralSetting
?.
memoVisibility
,
});
await
userServiceClient
.
updateUserSetting
({
setting
:
create
(
UserSettingSchema
,
{
name
:
settingName
,
value
:
{
case
:
"generalSetting"
,
value
:
updatedGeneralSetting
,
updateUserGeneralSetting
(
{
generalSetting
:
{
theme
},
updateMask
:
[
"theme"
]
},
{
onSuccess
:
()
=>
{
refetchSettings
();
},
}),
updateMask
:
create
(
FieldMaskSchema
,
{
paths
:
[
"general_setting.theme"
]
}),
});
await
refetchSettings
();
},
);
};
const
handleSignOut
=
async
()
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment