// js/change-password.js — 비밀번호 변경 (일반 스크립트, tkfb-core.js 전역 함수 사용) (function() { var form = document.getElementById('changePasswordForm'); var messageArea = document.getElementById('message-area'); var submitBtn = document.getElementById('submitBtn'); var resetBtn = document.getElementById('resetBtn'); if (!form) return; // 비밀번호 토글 document.querySelectorAll('.password-toggle').forEach(function(button) { button.addEventListener('click', function() { var input = document.getElementById(this.getAttribute('data-target')); if (input) { var isPassword = input.type === 'password'; input.type = isPassword ? 'text' : 'password'; this.textContent = isPassword ? '숨기기' : '보기'; } }); }); // 초기화 if (resetBtn) resetBtn.addEventListener('click', function() { form.reset(); messageArea.innerHTML = ''; var s = document.getElementById('passwordStrength'); if (s) s.innerHTML = ''; }); function showMessage(type, msg) { messageArea.innerHTML = '
' + (type === 'error' ? '❌ ' : '✅ ') + msg + '
'; if (type === 'error') setTimeout(function() { messageArea.innerHTML = ''; }, 5000); } // 비밀번호 강도 체크 var strengthTimer; var newPwInput = document.getElementById('newPassword'); if (newPwInput) newPwInput.addEventListener('input', function() { clearTimeout(strengthTimer); var pw = this.value; strengthTimer = setTimeout(function() { if (!pw) { document.getElementById('passwordStrength').innerHTML = ''; return; } var token = (window.getSSOToken && window.getSSOToken()) || localStorage.getItem('sso_token') || ''; fetch('/api/auth/check-password-strength', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ password: pw }) }).then(function(r) { return r.json(); }).then(function(result) { if (!result.success) return; var d = result.data; var colors = { weak: '#f44336', medium: '#ffc107', strong: '#4caf50' }; var labels = { weak: '약함', medium: '보통', strong: '강함' }; var pct = (d.score / 5) * 100; document.getElementById('passwordStrength').innerHTML = '
' + '' + (labels[d.level]||'') + '' + '' + d.score + '/5
' + '
' + '
'; }).catch(function() {}); }, 300); }); // 폼 제출 form.addEventListener('submit', function(e) { e.preventDefault(); messageArea.innerHTML = ''; var currentPassword = document.getElementById('currentPassword').value; var newPassword = document.getElementById('newPassword').value; var confirmPassword = document.getElementById('confirmPassword').value; if (!currentPassword || !newPassword || !confirmPassword) { showMessage('error', '모든 필드를 입력해주세요.'); return; } if (newPassword !== confirmPassword) { showMessage('error', '새 비밀번호가 일치하지 않습니다.'); return; } if (newPassword.length < 6) { showMessage('error', '비밀번호는 최소 6자 이상이어야 합니다.'); return; } if (currentPassword === newPassword) { showMessage('error', '새 비밀번호는 현재 비밀번호와 달라야 합니다.'); return; } var originalText = submitBtn.innerHTML; submitBtn.disabled = true; submitBtn.innerHTML = '처리 중...'; var token = (window.getSSOToken && window.getSSOToken()) || localStorage.getItem('sso_token') || ''; fetch('/api/auth/change-password', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ currentPassword: currentPassword, newPassword: newPassword }) }).then(function(res) { return res.json().then(function(data) { return { ok: res.ok, data: data }; }); }).then(function(result) { if (result.ok && result.data.success) { showMessage('success', '비밀번호가 변경되었습니다.'); form.reset(); var s = document.getElementById('passwordStrength'); if (s) s.innerHTML = ''; var countdown = 3; var interval = setInterval(function() { showMessage('success', '비밀번호가 변경되었습니다. ' + countdown + '초 후 로그인 페이지로 이동합니다.'); countdown--; if (countdown < 0) { clearInterval(interval); // 쿠키 + localStorage 전부 삭제 (doLogout 로직 재사용) _cookieRemove('sso_token'); _cookieRemove('sso_user'); _cookieRemove('sso_refresh_token'); ['sso_token','sso_user','sso_refresh_token','token','user','access_token','currentUser','current_user','userInfo','userPageAccess'].forEach(function(k) { localStorage.removeItem(k); }); window.location.href = (window.getLoginUrl ? window.getLoginUrl() : '/login') + '&logout=1'; } }, 1000); } else { showMessage('error', result.data.message || result.data.error || '비밀번호 변경에 실패했습니다.'); } }).catch(function() { showMessage('error', '서버와의 연결에 실패했습니다. 잠시 후 다시 시도해주세요.'); }).finally(function() { submitBtn.disabled = false; submitBtn.innerHTML = originalText; }); }); })();