- 📱 PWA 지원: 홈화면 추가 가능한 Progressive Web App - 🎨 M-Project 색상 스키마: 하늘색, 주황색, 회색, 흰색 일관된 디자인 - 📊 대시보드: 데스크톱 캘린더 뷰 + 모바일 일일 뷰 반응형 디자인 - 📥 분류 센터: Gmail 스타일 받은편지함으로 스마트 분류 시스템 - 🤖 AI 분류 제안: 키워드 기반 자동 분류 제안 및 일괄 처리 - 📷 업로드 모달: 데스크톱(파일 선택) + 모바일(카메라/갤러리) 최적화 - 🏷️ 3가지 분류: Todo(시작일), 캘린더(마감일), 체크리스트(무기한) - 📋 체크리스트: 진행률 표시 및 완료 토글 기능 - 🔄 시놀로지 연동 준비: 메일플러스 연동을 위한 구조 설계 - 📱 반응형 UI: 모든 페이지 모바일 최적화 완료
140 lines
3.8 KiB
JavaScript
140 lines
3.8 KiB
JavaScript
/**
|
|
* 인증 관리
|
|
*/
|
|
|
|
let currentUser = null;
|
|
|
|
// 페이지 로드 시 인증 상태 확인
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
checkAuthStatus();
|
|
setupLoginForm();
|
|
});
|
|
|
|
// 인증 상태 확인
|
|
function checkAuthStatus() {
|
|
const token = localStorage.getItem('authToken');
|
|
const userData = localStorage.getItem('currentUser');
|
|
|
|
if (token && userData) {
|
|
try {
|
|
currentUser = JSON.parse(userData);
|
|
showMainApp();
|
|
} catch (error) {
|
|
console.error('사용자 데이터 파싱 실패:', error);
|
|
logout();
|
|
}
|
|
} else {
|
|
showLoginScreen();
|
|
}
|
|
}
|
|
|
|
// 로그인 폼 설정
|
|
function setupLoginForm() {
|
|
const loginForm = document.getElementById('loginForm');
|
|
if (loginForm) {
|
|
loginForm.addEventListener('submit', handleLogin);
|
|
}
|
|
}
|
|
|
|
// 로그인 처리
|
|
async function handleLogin(event) {
|
|
event.preventDefault();
|
|
|
|
const username = document.getElementById('username').value;
|
|
const password = document.getElementById('password').value;
|
|
|
|
if (!username || !password) {
|
|
alert('사용자명과 비밀번호를 입력해주세요.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
showLoading(true);
|
|
|
|
// 임시 로그인 (백엔드 구현 전까지)
|
|
if (username === 'user1' && password === 'password123') {
|
|
const mockUser = {
|
|
id: 1,
|
|
username: 'user1',
|
|
email: 'user1@todo-project.local',
|
|
full_name: '사용자1'
|
|
};
|
|
|
|
currentUser = mockUser;
|
|
localStorage.setItem('authToken', 'mock-token-' + Date.now());
|
|
localStorage.setItem('currentUser', JSON.stringify(mockUser));
|
|
|
|
showMainApp();
|
|
} else {
|
|
throw new Error('잘못된 사용자명 또는 비밀번호입니다.');
|
|
}
|
|
|
|
// 실제 API 호출 (백엔드 구현 후 사용)
|
|
/*
|
|
const response = await AuthAPI.login(username, password);
|
|
currentUser = response.user;
|
|
showMainApp();
|
|
*/
|
|
|
|
} catch (error) {
|
|
console.error('로그인 실패:', error);
|
|
alert(error.message || '로그인에 실패했습니다.');
|
|
} finally {
|
|
showLoading(false);
|
|
}
|
|
}
|
|
|
|
// 로그아웃
|
|
function logout() {
|
|
currentUser = null;
|
|
localStorage.removeItem('authToken');
|
|
localStorage.removeItem('currentUser');
|
|
showLoginScreen();
|
|
}
|
|
|
|
// 로그인 화면 표시
|
|
function showLoginScreen() {
|
|
document.getElementById('loginScreen').classList.remove('hidden');
|
|
document.getElementById('mainApp').classList.add('hidden');
|
|
|
|
// 폼 초기화
|
|
const loginForm = document.getElementById('loginForm');
|
|
if (loginForm) {
|
|
loginForm.reset();
|
|
}
|
|
}
|
|
|
|
// 메인 앱 표시
|
|
function showMainApp() {
|
|
document.getElementById('loginScreen').classList.add('hidden');
|
|
document.getElementById('mainApp').classList.remove('hidden');
|
|
|
|
// 사용자 정보 표시
|
|
const currentUserElement = document.getElementById('currentUser');
|
|
if (currentUserElement && currentUser) {
|
|
currentUserElement.textContent = currentUser.full_name || currentUser.username;
|
|
}
|
|
|
|
// Todo 목록 로드
|
|
if (typeof loadTodos === 'function') {
|
|
loadTodos();
|
|
}
|
|
}
|
|
|
|
// 로딩 상태 표시
|
|
function showLoading(show) {
|
|
const loadingOverlay = document.getElementById('loadingOverlay');
|
|
if (loadingOverlay) {
|
|
if (show) {
|
|
loadingOverlay.classList.remove('hidden');
|
|
} else {
|
|
loadingOverlay.classList.add('hidden');
|
|
}
|
|
}
|
|
}
|
|
|
|
// 전역으로 사용 가능하도록 export
|
|
window.currentUser = currentUser;
|
|
window.logout = logout;
|
|
window.showLoading = showLoading;
|