diff --git a/TaxBaik.Web/Components/Admin/Pages/Login.razor b/TaxBaik.Web/Components/Admin/Pages/Login.razor index 3441ff2..2e00cc5 100644 --- a/TaxBaik.Web/Components/Admin/Pages/Login.razor +++ b/TaxBaik.Web/Components/Admin/Pages/Login.razor @@ -59,63 +59,6 @@ - - @code { private bool isLoading = false; private string errorMessage = ""; diff --git a/TaxBaik.Web/wwwroot/js/admin-session.js b/TaxBaik.Web/wwwroot/js/admin-session.js index 26e6659..e0dcfba 100644 --- a/TaxBaik.Web/wwwroot/js/admin-session.js +++ b/TaxBaik.Web/wwwroot/js/admin-session.js @@ -101,6 +101,61 @@ window.taxbaikAdminSession = { new MutationObserver(reloadOnRejectedCircuit) .observe(modal, { attributes: true, attributeFilter: ['class'] }); + }, + + bindLoginForm: function () { + const form = document.getElementById('admin-login-form'); + if (!form || form.dataset.bound === '1') return; + + form.dataset.bound = '1'; + form.addEventListener('submit', async function (event) { + event.preventDefault(); + + const username = form.querySelector('input[placeholder="사용자명"]')?.value?.trim() || ''; + const password = form.querySelector('input[placeholder="비밀번호"]')?.value || ''; + const rememberMe = form.querySelector('input[type="checkbox"]')?.checked || false; + const existing = form.parentElement.querySelector('.login-error-message'); + const submitButton = form.querySelector('button[type="submit"]'); + + if (existing) existing.remove(); + if (submitButton) submitButton.disabled = true; + + try { + const response = await fetch('/taxbaik/api/auth/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }) + }); + + if (!response.ok) { + throw new Error('login failed'); + } + + const data = await response.json(); + if (!data?.accessToken || !data?.refreshToken) { + throw new Error('invalid response'); + } + + localStorage.setItem('accessToken', data.accessToken); + localStorage.setItem('refreshToken', data.refreshToken); + localStorage.setItem('tokenExpiry', String(Date.now() + (data.expiresIn || 3600) * 1000)); + + if (rememberMe) { + localStorage.setItem('admin-remembered-username', username); + } else { + localStorage.removeItem('admin-remembered-username'); + } + + window.location.href = '/taxbaik/admin/dashboard'; + } catch { + const error = document.createElement('div'); + error.className = 'mud-alert mud-alert-filled-error login-error-message mb-4'; + error.textContent = '로그인 중 오류가 발생했습니다.'; + form.parentElement.insertBefore(error, form); + } finally { + if (submitButton) submitButton.disabled = false; + } + }); } };