93 lines
2.2 KiB
JavaScript
93 lines
2.2 KiB
JavaScript
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,
|
|
}),
|
|
)
|
|
}
|