turash/bugulma/frontend/pages/LoginPage.tsx
Damir Mukimov 6347f42e20
Consolidate repositories: Remove nested frontend .git and merge into main repository
- Remove nested git repository from bugulma/frontend/.git
- Add all frontend files to main repository tracking
- Convert from separate frontend/backend repos to unified monorepo
- Preserve all frontend code and development history as tracked files
- Eliminate nested repository complexity for simpler development workflow

This creates a proper monorepo structure with frontend and backend
coexisting in the same repository for easier development and deployment.
2025-11-25 06:02:57 +01:00

91 lines
3.1 KiB
TypeScript

import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { MainLayout } from '@/components/layout/MainLayout';
import PageHeader from '@/components/layout/PageHeader';
import Button from '@/components/ui/Button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card';
import Input from '@/components/ui/Input';
import { useAuth } from '@/contexts/AuthContext';
import { useTranslation } from '@/hooks/useI18n';
import { useNavigation } from '@/hooks/useNavigation';
const LoginPage = () => {
const { t } = useTranslation();
const { login, isLoading } = useAuth();
const { handleFooterNavigate } = useNavigation();
const navigate = useNavigate();
const [email, setEmail] = useState('admin@tuganyak.dev');
const [password, setPassword] = useState('password');
const [error, setError] = useState('');
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError('');
try {
await login(email, password);
navigate('/admin');
} catch (err) {
setError(err instanceof Error ? err.message : 'Login failed');
}
};
return (
<MainLayout onNavigate={handleFooterNavigate}>
<div className="mx-auto max-w-md px-4 py-8 sm:py-12">
<PageHeader title={t('loginPage.title')} />
<Card>
<CardHeader>
<CardTitle>{t('loginPage.subtitle')}</CardTitle>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label htmlFor="email" className="block text-sm font-medium text-foreground mb-1">
{t('loginPage.email')}
</label>
<Input
id="email"
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
placeholder="admin@tuganyak.dev"
/>
</div>
<div>
<label
htmlFor="password"
className="block text-sm font-medium text-foreground mb-1"
>
{t('loginPage.password')}
</label>
<Input
id="password"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
placeholder="password"
/>
</div>
{error && (
<div className="text-sm text-destructive bg-destructive/10 border border-destructive/20 rounded px-3 py-2">
{error}
</div>
)}
<Button type="submit" className="w-full" disabled={isLoading}>
{isLoading ? t('loginPage.loading') : t('loginPage.login')}
</Button>
</form>
<div className="mt-4 text-sm text-muted-foreground text-center">
{t('loginPage.demoNote')}
</div>
</CardContent>
</Card>
</div>
</MainLayout>
);
};
export default LoginPage;