/** * BaseState - 상태 관리 베이스 클래스 * TbmState / DailyWorkReportState 공통 패턴 */ class BaseState { constructor() { this.listeners = new Map(); } /** * 상태 업데이트 + 리스너 알림 */ update(key, value) { const prevValue = this[key]; this[key] = value; this.notifyListeners(key, value, prevValue); } /** * 리스너 등록 */ subscribe(key, callback) { if (!this.listeners.has(key)) { this.listeners.set(key, []); } this.listeners.get(key).push(callback); } /** * 리스너 알림 */ notifyListeners(key, newValue, prevValue) { const keyListeners = this.listeners.get(key) || []; keyListeners.forEach(callback => { try { callback(newValue, prevValue); } catch (error) { console.error(`[${this.constructor.name}] 리스너 오류 (${key}):`, error); } }); } /** * 현재 사용자 정보 (localStorage) */ getUser() { const userInfo = localStorage.getItem('sso_user'); return userInfo ? JSON.parse(userInfo) : null; } } // 전역 노출 window.BaseState = BaseState; console.log('[Module] common/base-state.js 로드 완료');