Files
immich-folio/app/admin/components/AdminLogin.tsx
Ralksta a3a6319c29 release: v0.16.0
See CHANGELOG.md for the full v0.16.0 entry.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ralksta <ralksta@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Ralf <rohlenbo79@gmail.com>
Co-authored-by: Paul Thies <110185070+ImScheinox@users.noreply.github.com>
Co-authored-by: lancetm714 <108419425+lancetm714@users.noreply.github.com>
2026-09-22 14:12:13 +02:00

73 lines
1.9 KiB
TypeScript

'use client';
import { useState } from 'react';
interface Props {
onSuccess: () => void;
/** Shown above the form, e.g. "Your session expired. Sign in again." (#596) */
notice?: string;
}
export default function AdminLogin({ onSuccess, notice }: Props) {
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setError('');
setLoading(true);
try {
const res = await fetch('/api/admin/auth', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ password }),
});
if (res.ok) {
onSuccess();
} else {
const data = await res.json();
setError(data.error || 'Login failed');
}
} catch {
setError('Connection error');
} finally {
setLoading(false);
}
}
return (
<div className="admin-login">
<form className="admin-login-card" onSubmit={handleSubmit}>
<div className="admin-login-header">
<h1>Immich Folio</h1>
<p>Admin Panel</p>
</div>
{notice && <div className="admin-notice">{notice}</div>}
<div className="admin-field">
<label htmlFor="admin-password">Password</label>
<input
id="admin-password"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Enter admin password"
autoFocus
disabled={loading}
/>
</div>
{error && <div className="admin-error">{error}</div>}
<button type="submit" className="admin-btn admin-btn-primary" disabled={loading}>
{loading ? 'Signing in...' : 'Sign In'}
</button>
</form>
</div>
);
}