From b00b5eaaa1b5a5843523b11d56c78ced4827a5bc Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Sun, 4 Jan 2026 22:42:58 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20T=C3=ADch=20h=E1=BB=A3p=20b=E1=BB=99=20?= =?UTF-8?q?chuy=E1=BB=83n=20=C4=91=E1=BB=95i=20ch=E1=BB=A7=20=C4=91?= =?UTF-8?q?=E1=BB=81=20v=C3=A0=20ng=C3=B4n=20ng=E1=BB=AF=20v=C3=A0o=20than?= =?UTF-8?q?h=20=C4=91i=E1=BB=81u=20h=C6=B0=E1=BB=9Bng,=20c=E1=BA=ADp=20nh?= =?UTF-8?q?=E1=BA=ADt=20hook=20i18n,=20v=C3=A0=20=C4=91=E1=BA=B7t=20ch?= =?UTF-8?q?=E1=BB=A7=20=C4=91=E1=BB=81=20t=E1=BB=91i=20l=C3=A0m=20m?= =?UTF-8?q?=E1=BA=B7c=20=C4=91=E1=BB=8Bnh.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layout/header/navigation-header.tsx | 10 +++++++++- .../features/shared/middleware/auth-guard.tsx | 4 ++-- .../theme/components/language-switcher.tsx | 4 ++-- .../src/features/theme/theme-context.tsx | 17 ++++++++--------- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/apps/web-client/src/features/shared/components/layout/header/navigation-header.tsx b/apps/web-client/src/features/shared/components/layout/header/navigation-header.tsx index 6e340fad..44903f27 100644 --- a/apps/web-client/src/features/shared/components/layout/header/navigation-header.tsx +++ b/apps/web-client/src/features/shared/components/layout/header/navigation-header.tsx @@ -78,7 +78,9 @@ export function NavigationHeader({ className }: { className?: string }) { {/* EN: CTA Button / VI: Button CTA */} -
+
+ + + + {/* EN: Theme and Language Controls / VI: Controls theme và ngôn ngữ */} +
+ + +
)}
diff --git a/apps/web-client/src/features/shared/middleware/auth-guard.tsx b/apps/web-client/src/features/shared/middleware/auth-guard.tsx index b9238723..5cfd5ab6 100644 --- a/apps/web-client/src/features/shared/middleware/auth-guard.tsx +++ b/apps/web-client/src/features/shared/middleware/auth-guard.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/navigation'; import { useAuthStore } from '../../../stores/auth-store'; import { Role } from '@goodgo/types'; import { Card } from '../components/ui/card'; -import { Button } from '../ui/button'; +import { Button } from '../components/ui/button'; /** * EN: Auth Guard Props @@ -121,7 +121,7 @@ export function AuthGuard({ - diff --git a/apps/web-client/src/features/theme/components/language-switcher.tsx b/apps/web-client/src/features/theme/components/language-switcher.tsx index e8cf191c..fb2a8067 100644 --- a/apps/web-client/src/features/theme/components/language-switcher.tsx +++ b/apps/web-client/src/features/theme/components/language-switcher.tsx @@ -37,7 +37,7 @@ export type LanguageCode = typeof languages[number]['code']; * ``` */ export function LanguageSwitcher() { - const { locale: currentLocale, setLocale } = useTranslation(); + const { locale: currentLocale, setLocale } = useI18n(); const currentLanguage = languages.find(lang => lang.code === currentLocale) || languages[0]; @@ -104,7 +104,7 @@ export function LanguageSwitcher() { * ``` */ export function LanguageSwitcherCompact() { - const { locale: currentLocale, setLocale } = useTranslation(); + const { locale: currentLocale, setLocale } = useI18n(); const currentLanguage = languages.find(lang => lang.code === currentLocale) || languages[0]; const toggleLanguage = () => { diff --git a/apps/web-client/src/features/theme/theme-context.tsx b/apps/web-client/src/features/theme/theme-context.tsx index 8407ee9c..1bf76645 100644 --- a/apps/web-client/src/features/theme/theme-context.tsx +++ b/apps/web-client/src/features/theme/theme-context.tsx @@ -58,17 +58,17 @@ const applyTheme = (theme: 'light' | 'dark') => { * @param children - Child components / Components con */ export function ThemeProvider({ children }: { children: React.ReactNode }) { - const [theme, setThemeState] = useState('system'); + const [theme, setThemeState] = useState('dark'); const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>(() => { if (typeof window === 'undefined') return 'dark'; - // EN: Load from localStorage or default to system - // VI: Load từ localStorage hoặc mặc định là system + // EN: Load from localStorage or default to dark + // VI: Load từ localStorage hoặc mặc định là dark const stored = localStorage.getItem('theme') as ThemeMode | null; if (stored && (stored === 'light' || stored === 'dark' || stored === 'system')) { return stored === 'system' ? getSystemTheme() : stored; } - return getSystemTheme(); + return 'dark'; }); // EN: Initialize theme from localStorage @@ -83,11 +83,10 @@ export function ThemeProvider({ children }: { children: React.ReactNode }) { setResolvedTheme(resolved); applyTheme(resolved); } else { - // EN: Default to system preference - // VI: Mặc định theo preference hệ thống - const systemTheme = getSystemTheme(); - setResolvedTheme(systemTheme); - applyTheme(systemTheme); + // EN: Default to dark theme + // VI: Mặc định là dark theme + setResolvedTheme('dark'); + applyTheme('dark'); } }, []);