feat: Implement dark mode support across the application

- Added ThemeContext to manage theme state and toggle functionality.
- Updated components to support dark mode styles, including header, dashboard, and home page.
- Enhanced CSS for smooth transitions between light and dark themes.
- Modified authentication context to handle async login operations.
- Improved user experience by preserving theme preference in local storage.
- Refactored login and register pages to handle OAuth tokens and errors more gracefully.
This commit is contained in:
2026-01-05 20:11:22 +03:00
parent 7a7d3151e8
commit 9bbf88a8f7
17 changed files with 366 additions and 318 deletions

View File

@@ -99,20 +99,24 @@ const RegisterPage = () => {
// Handle OAuth token from URL
useEffect(() => {
const params = new URLSearchParams(location.search);
const token = params.get('token');
const authError = params.get('error');
const handleOAuthLogin = async () => {
const params = new URLSearchParams(location.search);
const token = params.get('token');
const authError = params.get('error');
if (token) {
login(token);
navigate(localePath('/dashboard'), { replace: true });
}
if (token) {
await login(token);
navigate(localePath('/dashboard'), { replace: true });
}
if (authError) {
setError(locale === 'en'
? 'Social login error. Please try again.'
: 'Ошибка авторизации через социальную сеть. Попробуйте снова.');
}
if (authError) {
setError(locale === 'en'
? 'Social login error. Please try again.'
: 'Ошибка авторизации через социальную сеть. Попробуйте снова.');
}
};
handleOAuthLogin();
}, [location, login, navigate, localePath, locale]);
const handleRegister = async (e: React.FormEvent) => {
@@ -288,7 +292,7 @@ const RegisterPage = () => {
</div>
</div>
<div className="mt-6 grid grid-cols-4 gap-3">
<div className="mt-6 grid grid-cols-3 gap-3">
<button
type="button"
onClick={() => handleOAuthLogin('google')}
@@ -315,15 +319,6 @@ const RegisterPage = () => {
>
<img src="/yandex.png" alt="" className="h-6 w-6" />
</button>
<button
type="button"
onClick={() => handleOAuthLogin('vkontakte')}
className="flex items-center justify-center h-12 rounded-full border border-gray-300 bg-white shadow-sm hover:bg-gray-50 transition"
aria-label={locale === 'en' ? 'Sign up with VK' : 'Регистрация через VK'}
>
<img src="/vk.svg" alt="VK" className="h-6 w-6" />
</button>
</div>
</div>