외부 계정 수동 등록 허용
This commit is contained in:
parent
bd389a97cc
commit
8ed185ce6c
9 changed files with 3450 additions and 1484 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -44,7 +44,7 @@ function oauthMessage(reason: string | null): string | null {
|
|||
return OAUTH_IDENTITY_FAILED_MESSAGE;
|
||||
}
|
||||
if (reason === "domain_not_allowed") {
|
||||
return "승인된 이메일 도메인의 Google 계정만 사용할 수 있습니다.";
|
||||
return "승인된 이메일 도메인 또는 관리자 등록 계정만 사용할 수 있습니다.";
|
||||
}
|
||||
if (reason === "inactive_user") {
|
||||
return "비활성화된 계정입니다. 관리자에게 계정 상태 확인을 요청하세요.";
|
||||
|
|
@ -165,7 +165,14 @@ export default function Login() {
|
|||
setLoginErrorReason(null);
|
||||
try {
|
||||
const signedIn = await login(role);
|
||||
navigate(roleHomePath(signedIn.role), { replace: true });
|
||||
navigate(
|
||||
signedIn.accountStatus !== "approved"
|
||||
? "/pending"
|
||||
: signedIn.onboardingCompletedAt == null
|
||||
? "/onboarding"
|
||||
: roleHomePath(signedIn.role),
|
||||
{ replace: true },
|
||||
);
|
||||
} catch (err) {
|
||||
setLoginError(err instanceof Error ? err.message : "로그인에 실패했습니다.");
|
||||
} finally {
|
||||
|
|
@ -199,7 +206,7 @@ export default function Login() {
|
|||
<span className="d" aria-hidden="true" />
|
||||
상담 시뮬레이션 학습
|
||||
</span>
|
||||
<h1>실제 계정으로 들어가고, 실제 회기만 남깁니다.</h1>
|
||||
<h1><span className="lg-highlight">실제 계정으로 들어가고</span>, <br/>실제 회기만 남깁니다.</h1>
|
||||
<p>
|
||||
Vignette는 상담 연습, 교수자 피드백, 운영 관리 권한을 안전한 로그인 세션으로 분리합니다.
|
||||
브라우저에는 인증 토큰을 저장하지 않습니다.
|
||||
|
|
@ -340,20 +347,19 @@ const LOGIN_CSS = `
|
|||
min-height:100dvh;
|
||||
position:relative;
|
||||
display:grid;
|
||||
grid-template-columns:minmax(0,1fr) minmax(360px,480px);
|
||||
background:var(--bg-app);
|
||||
color:var(--text-strong);
|
||||
overflow:hidden;
|
||||
grid-template-columns:minmax(0,1fr) minmax(360px,500px);
|
||||
background:
|
||||
linear-gradient(90deg,rgba(7,16,14,.84) 0%,rgba(10,21,19,.72) 48%,rgba(10,21,19,.55) 74%,rgba(10,21,19,.62) 100%),
|
||||
var(--asset-login-room) center / cover no-repeat;
|
||||
color:#edf4f2;
|
||||
overflow-x:hidden;
|
||||
overflow-y:auto;
|
||||
}
|
||||
.lg-root::before{
|
||||
content:"";
|
||||
position:absolute;
|
||||
inset:auto -12vw -22vw 38vw;
|
||||
height:42vw;
|
||||
min-height:360px;
|
||||
background:var(--asset-warm-elements) center / cover no-repeat;
|
||||
opacity:.08;
|
||||
filter:saturate(.82);
|
||||
inset:0;
|
||||
background:linear-gradient(180deg,rgba(3,9,8,.18),rgba(3,9,8,.42));
|
||||
pointer-events:none;
|
||||
}
|
||||
.lg-brand,
|
||||
|
|
@ -363,29 +369,19 @@ const LOGIN_CSS = `
|
|||
}
|
||||
.lg-brand{
|
||||
min-width:0;
|
||||
width:100%;
|
||||
position:relative;
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
justify-content:space-between;
|
||||
gap:var(--sp-7);
|
||||
padding:var(--sp-7);
|
||||
background:
|
||||
linear-gradient(115deg,rgba(14,22,20,.86),rgba(30,39,36,.7) 48%,rgba(30,39,36,.48)),
|
||||
var(--asset-login-room) center / cover no-repeat;
|
||||
background:transparent;
|
||||
color:#edf4f2;
|
||||
overflow:hidden;
|
||||
}
|
||||
.lg-brand::after{
|
||||
content:"";
|
||||
position:absolute;
|
||||
left:var(--sp-7);
|
||||
bottom:var(--sp-7);
|
||||
width:min(360px,42vw);
|
||||
height:120px;
|
||||
border:1px solid rgba(255,255,255,.12);
|
||||
border-radius:var(--radius-lg);
|
||||
background:rgba(251,250,248,.06);
|
||||
pointer-events:none;
|
||||
display:none;
|
||||
}
|
||||
.lg-wordmark{
|
||||
position:relative;
|
||||
|
|
@ -412,11 +408,22 @@ const LOGIN_CSS = `
|
|||
font-family:var(--font-num);
|
||||
font-size:12px;
|
||||
font-weight:700;
|
||||
letter-spacing:.08em;
|
||||
letter-spacing:0;
|
||||
text-transform:uppercase;
|
||||
color:var(--accent-bright);
|
||||
}
|
||||
.lg-kicker .d{width:6px;height:6px;border-radius:50%;background:currentColor;}
|
||||
.lg-highlight{
|
||||
display:inline-block;
|
||||
position:relative;
|
||||
z-index:0;
|
||||
padding:0 4px;
|
||||
background:linear-gradient(90deg,#59b5a6,#8ee4d6);
|
||||
-webkit-background-clip:text;
|
||||
background-clip:text;
|
||||
-webkit-text-fill-color:transparent;
|
||||
color:transparent;
|
||||
}
|
||||
.lg-copy h1{
|
||||
margin:var(--sp-4) 0 0;
|
||||
max-width:640px;
|
||||
|
|
@ -437,6 +444,14 @@ const LOGIN_CSS = `
|
|||
align-items:center;
|
||||
flex-wrap:wrap;
|
||||
gap:10px;
|
||||
width:max-content;
|
||||
max-width:min(430px,100%);
|
||||
padding:14px 16px;
|
||||
border:1px solid rgba(255,255,255,.14);
|
||||
border-radius:var(--radius-lg);
|
||||
background:rgba(237,244,242,.08);
|
||||
backdrop-filter:blur(18px) saturate(1.08);
|
||||
-webkit-backdrop-filter:blur(18px) saturate(1.08);
|
||||
color:rgba(237,244,242,.66);
|
||||
font-size:13px;
|
||||
}
|
||||
|
|
@ -459,27 +474,30 @@ const LOGIN_CSS = `
|
|||
align-items:center;
|
||||
justify-content:center;
|
||||
padding:var(--sp-6);
|
||||
background:
|
||||
linear-gradient(180deg,rgba(251,250,248,.9),rgba(244,242,238,.76));
|
||||
background:transparent;
|
||||
}
|
||||
.lg-panel{
|
||||
width:100%;
|
||||
max-width:400px;
|
||||
background:var(--bg-surface);
|
||||
border:1px solid var(--border-subtle);
|
||||
max-width:430px;
|
||||
background:rgba(11,25,22,.64);
|
||||
border:1px solid rgba(255,255,255,.16);
|
||||
border-radius:var(--radius-lg);
|
||||
box-shadow:var(--shadow-sm);
|
||||
box-shadow:0 24px 70px rgba(0,0,0,.34), inset 0 1px 0 rgba(255,255,255,.08);
|
||||
backdrop-filter:blur(24px) saturate(1.14);
|
||||
-webkit-backdrop-filter:blur(24px) saturate(1.14);
|
||||
padding:var(--sp-6);
|
||||
color:#edf4f2;
|
||||
}
|
||||
.lg-panel h2{
|
||||
margin:var(--sp-3) 0 0;
|
||||
font-size:28px;
|
||||
line-height:1.25;
|
||||
letter-spacing:0;
|
||||
color:#f7fbf9;
|
||||
}
|
||||
.lg-lead{
|
||||
margin:10px 0 0;
|
||||
color:var(--text-body);
|
||||
color:rgba(237,244,242,.76);
|
||||
font-size:14px;
|
||||
line-height:1.65;
|
||||
}
|
||||
|
|
@ -499,27 +517,35 @@ const LOGIN_CSS = `
|
|||
text-align:left;
|
||||
cursor:pointer;
|
||||
}
|
||||
.lg-obtn.primary{background:var(--accent);border:1px solid var(--accent);color:var(--text-on-accent);}
|
||||
.lg-obtn.primary:hover{background:var(--accent-deep);border-color:var(--accent-deep);}
|
||||
.lg-obtn.secondary{background:var(--bg-surface);border:1px solid var(--border-strong);color:var(--text-strong);}
|
||||
.lg-obtn.secondary:hover{border-color:var(--accent);}
|
||||
.lg-obtn.primary{
|
||||
background:rgba(89,181,166,.2);
|
||||
border:1px solid rgba(114,211,197,.44);
|
||||
color:#f7fbf9;
|
||||
}
|
||||
.lg-obtn.primary:hover{background:rgba(89,181,166,.28);border-color:rgba(114,211,197,.62);}
|
||||
.lg-obtn.secondary{
|
||||
background:rgba(255,255,255,.08);
|
||||
border:1px solid rgba(255,255,255,.13);
|
||||
color:#edf4f2;
|
||||
}
|
||||
.lg-obtn.secondary:hover{border-color:rgba(114,211,197,.42);background:rgba(255,255,255,.11);}
|
||||
.lg-obtn:disabled{
|
||||
cursor:not-allowed;
|
||||
opacity:1;
|
||||
background:var(--bg-surface-2);
|
||||
border-color:var(--border-subtle);
|
||||
color:var(--text-muted);
|
||||
background:rgba(255,255,255,.07);
|
||||
border-color:rgba(255,255,255,.1);
|
||||
color:rgba(237,244,242,.58);
|
||||
}
|
||||
.lg-obtn:disabled:hover{
|
||||
background:var(--bg-surface-2);
|
||||
border-color:var(--border-subtle);
|
||||
background:rgba(255,255,255,.07);
|
||||
border-color:rgba(255,255,255,.1);
|
||||
}
|
||||
.lg-obtn:disabled .ic{
|
||||
background:var(--bg-surface);
|
||||
color:var(--text-muted);
|
||||
background:rgba(255,255,255,.08);
|
||||
color:rgba(237,244,242,.58);
|
||||
}
|
||||
.lg-obtn:disabled .sub{
|
||||
color:var(--text-muted);
|
||||
color:rgba(237,244,242,.45);
|
||||
}
|
||||
.lg-obtn .ic{
|
||||
width:36px;
|
||||
|
|
@ -529,9 +555,9 @@ const LOGIN_CSS = `
|
|||
border-radius:8px;
|
||||
background:rgba(255,255,255,.16);
|
||||
}
|
||||
.lg-obtn.secondary .ic{background:var(--bg-surface-2);}
|
||||
.lg-obtn.secondary .ic{background:rgba(7,17,15,.34);}
|
||||
.lg-obtn .txt{min-width:0;display:flex;flex-direction:column;gap:1px;}
|
||||
.lg-obtn .sub{font-size:12px;font-weight:550;color:var(--text-muted);}
|
||||
.lg-obtn .sub{font-size:12px;font-weight:550;color:rgba(237,244,242,.58);}
|
||||
.lg-obtn.primary .sub{color:rgba(251,250,248,.74);}
|
||||
.lg-config{
|
||||
display:flex;
|
||||
|
|
@ -540,26 +566,27 @@ const LOGIN_CSS = `
|
|||
margin-top:var(--sp-3);
|
||||
padding:10px 12px;
|
||||
border-radius:var(--radius);
|
||||
background:var(--warn-tint);
|
||||
color:var(--warn-text);
|
||||
background:rgba(154,94,20,.28);
|
||||
border:1px solid rgba(236,180,91,.16);
|
||||
color:#f2b75f;
|
||||
font-size:12.5px;
|
||||
line-height:1.5;
|
||||
}
|
||||
.lg-dev{
|
||||
margin-top:var(--sp-6);
|
||||
padding-top:var(--sp-5);
|
||||
border-top:1px solid var(--hair);
|
||||
border-top:1px solid rgba(255,255,255,.1);
|
||||
}
|
||||
.lg-devhead{
|
||||
display:flex;
|
||||
align-items:baseline;
|
||||
justify-content:space-between;
|
||||
gap:var(--sp-3);
|
||||
color:var(--text-strong);
|
||||
color:#edf4f2;
|
||||
font-size:13px;
|
||||
font-weight:700;
|
||||
}
|
||||
.lg-devhead small{color:var(--text-muted);font-weight:600;}
|
||||
.lg-devhead small{color:rgba(237,244,242,.58);font-weight:600;}
|
||||
.lg-rolepick{display:grid;grid-template-columns:1fr;gap:var(--sp-2);margin-top:var(--sp-3);}
|
||||
.lg-roleopt{
|
||||
min-height:50px;
|
||||
|
|
@ -568,28 +595,28 @@ const LOGIN_CSS = `
|
|||
align-items:center;
|
||||
gap:10px;
|
||||
padding:9px 11px;
|
||||
border:1px solid var(--border-subtle);
|
||||
border:1px solid rgba(255,255,255,.11);
|
||||
border-radius:var(--radius);
|
||||
background:var(--bg-surface);
|
||||
color:var(--text-strong);
|
||||
background:rgba(255,255,255,.045);
|
||||
color:#edf4f2;
|
||||
text-align:left;
|
||||
cursor:pointer;
|
||||
}
|
||||
.lg-roleopt.is-sel{border-color:var(--accent);background:var(--accent-tint);}
|
||||
.lg-roleopt.is-sel{border-color:rgba(114,211,197,.58);background:rgba(89,181,166,.15);}
|
||||
.lg-roleopt .d{width:8px;height:8px;border-radius:50%;}
|
||||
.lg-roleopt .d.learner{background:var(--accent-bright);}
|
||||
.lg-roleopt .d.teacher{background:#5478c4;}
|
||||
.lg-roleopt .d.admin{background:#7d818e;}
|
||||
.lg-roleopt b{display:block;font-size:13px;}
|
||||
.lg-roleopt small{display:block;margin-top:1px;color:var(--text-muted);font-size:12px;}
|
||||
.lg-roleopt small{display:block;margin-top:1px;color:rgba(237,244,242,.58);font-size:12px;}
|
||||
.lg-devbtn{
|
||||
width:100%;
|
||||
min-height:46px;
|
||||
margin-top:var(--sp-3);
|
||||
border:1px solid var(--accent);
|
||||
border:1px solid rgba(114,211,197,.58);
|
||||
border-radius:var(--radius);
|
||||
background:var(--accent-tint);
|
||||
color:var(--accent-deep);
|
||||
background:rgba(89,181,166,.15);
|
||||
color:#8fe7d9;
|
||||
font-family:var(--font-sans);
|
||||
font-size:14px;
|
||||
font-weight:750;
|
||||
|
|
@ -599,7 +626,8 @@ const LOGIN_CSS = `
|
|||
.lg-error{
|
||||
margin:var(--sp-3) 0 0;
|
||||
color:var(--crit-text);
|
||||
background:var(--crit-tint);
|
||||
background:rgba(122,38,38,.28);
|
||||
border:1px solid rgba(255,145,145,.18);
|
||||
border-radius:var(--radius);
|
||||
padding:10px 12px;
|
||||
font-size:13px;
|
||||
|
|
@ -608,14 +636,14 @@ const LOGIN_CSS = `
|
|||
.lg-error small{
|
||||
display:block;
|
||||
margin-top:4px;
|
||||
color:var(--text-muted);
|
||||
color:rgba(237,244,242,.56);
|
||||
font-family:var(--font-num);
|
||||
font-size:11.5px;
|
||||
overflow-wrap:anywhere;
|
||||
}
|
||||
.lg-note{
|
||||
margin:var(--sp-5) 0 0;
|
||||
color:var(--text-muted);
|
||||
color:rgba(237,244,242,.52);
|
||||
font-size:12.5px;
|
||||
line-height:1.6;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue