const STORAGE_KEY = 'ten-minute-planner-state' function readStorageState() { if (typeof window === 'undefined') { return {} } try { return JSON.parse(window.localStorage.getItem(STORAGE_KEY) ?? '{}') } catch (error) { console.warn('저장된 플래너 상태를 불러오지 못했습니다.', error) return {} } } export function createInitialPlannerRecords(seedRecords, normalizeRecord) { const baseRecords = Object.fromEntries( Object.entries(seedRecords).map(([key, record]) => [key, normalizeRecord(record)]), ) const savedState = readStorageState() const savedRecords = savedState.records ?? {} Object.entries(savedRecords).forEach(([key, record]) => { baseRecords[key] = normalizeRecord(record) }) return baseRecords } export function restorePlannerUiState({ selectedDate, calendarViewDate, statsRangeStart, statsRangeEnd, toDateValue, }) { const savedState = readStorageState() if (savedState.selectedDate) { selectedDate.value = toDateValue(savedState.selectedDate, selectedDate.value) } if (savedState.calendarViewDate) { calendarViewDate.value = toDateValue(savedState.calendarViewDate, selectedDate.value) } else { calendarViewDate.value = new Date(selectedDate.value) } if (savedState.statsRangeStart) { statsRangeStart.value = savedState.statsRangeStart } if (savedState.statsRangeEnd) { statsRangeEnd.value = savedState.statsRangeEnd } } export function persistPlannerState({ plannerRecords, selectedDate, calendarViewDate, statsRangeStart, statsRangeEnd, }) { if (typeof window === 'undefined') { return } const serializableRecords = Object.fromEntries( Object.entries(plannerRecords).map(([key, record]) => [ key, { ...record, tasks: record.tasks.map((task) => ({ ...task })), memo: record.memo.map((item) => ({ ...item })), timetable: [...record.timetable], }, ]), ) window.localStorage.setItem( STORAGE_KEY, JSON.stringify({ selectedDate: selectedDate.toISOString(), calendarViewDate: calendarViewDate.toISOString(), statsRangeStart, statsRangeEnd, records: serializableRecords, }), ) }