// login.jsx — 로그인 화면(실제 인증). 이메일+비밀번호 → 서버 세션 쿠키 발급 → 앱 진입. // ※ 데모 계정 목록은 없다. 신원은 서버 세션에서만 도출된다. const Login = ({ onLogin }) => { const [email, setEmail] = React.useState(''); const [pw, setPw] = React.useState(''); const [err, setErr] = React.useState(''); const [busy, setBusy] = React.useState(false); const onSubmit = (e) => { e.preventDefault(); if (busy) return; setErr(''); if (!email.trim() || !pw) { setErr('이메일과 비밀번호를 입력하세요.'); return; } setBusy(true); window.RAlly.login(email.trim(), pw).then(({ status, data }) => { setBusy(false); if (status === 200 && data && data.ok && data.user) { setPw(''); window.RAlly.setUser(data.user); onLogin(data.user); } else { setErr((data && data.error) || '로그인에 실패했습니다.'); } }).catch(() => { setBusy(false); setErr('서버에 연결할 수 없습니다. 잠시 후 다시 시도하세요.'); }); }; return (
{/* 브랜드 — 로고만 */}
RAlly
{/* 카드 */}
로그인
의료기기 GMP 문서 작업을 시작하세요.
setEmail(e.target.value)} type="email" autoComplete="username" autoFocus style={inp} placeholder="name@company.co.kr" /> setPw(e.target.value)} type="password" autoComplete="current-password" style={inp} placeholder="비밀번호" /> {err && (
{err}
)}
계정은 관리자가 발급합니다. 비밀번호를 잊었다면 관리자에게 재설정을 요청하세요.
); }; const inp = { width: '100%', marginTop: 5, padding: '11px 12px', borderRadius: 9, border: '1px solid var(--line)', fontSize: 14, fontFamily: 'inherit', boxSizing: 'border-box', outline: 'none', }; window.RAlly.Login = Login;