/
sc_coder
/
MentalCheckList
Обзор
Документация
Войти
/
sc_coder
/
MentalCheckList
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
storage.js
127 строк
4 KB
ScCoder
Initial commit: Ментальный Чек-Лист PWA
14 июл 2026, 08:35
14 июл 2026, 08:35
482499e
Код
Авторство
О чём код?
/** * Обёртка над localStorage для приложения "Ментальный Чек-Лист". * Изолирует все обращения к localStorage, чтобы их можно было мокать в тестах. */ (function (root, factory) { if (typeof module !== 'undefined' && module.exports) { module.exports = factory(typeof require === 'function' ? require('./logic') : root.MCLLogic); } else { root.MCLStorage = factory(root.MCLLogic); } })(typeof self !== 'undefined' ? self : this, function (Logic) { 'use strict'; var KEYS = { QUESTIONS: 'mcl_questions', THRESHOLD: 'mcl_threshold', HISTORY: 'mcl_history', REMINDER: 'mcl_reminder', LAST_NOTIFIED: 'mcl_last_notified' }; function getLS() { if (typeof localStorage !== 'undefined') return localStorage; throw new Error('localStorage недоступен в этом окружении'); } function safeParse(raw, fallback) { if (raw === null || raw === undefined) return fallback; try { return JSON.parse(raw); } catch (e) { return fallback; } } function getQuestions() { var raw = getLS().getItem(KEYS.QUESTIONS); var parsed = safeParse(raw, null); if (parsed && Array.isArray(parsed) && parsed.length > 0) { return parsed; } var defaults = Logic.DEFAULT_QUESTIONS.map(function (q) { return { id: q.id, negativeText: q.negativeText, positiveText: q.positiveText, custom: false }; }); saveQuestions(defaults); return defaults; } function saveQuestions(list) { getLS().setItem(KEYS.QUESTIONS, JSON.stringify(list)); return list; } function getThreshold() { var raw = getLS().getItem(KEYS.THRESHOLD); if (raw === null || raw === undefined) return Logic.DEFAULT_THRESHOLD; var num = Number(raw); return isNaN(num) ? Logic.DEFAULT_THRESHOLD : Logic.clampThreshold(num); } function saveThreshold(value) { var clamped = Logic.clampThreshold(value); getLS().setItem(KEYS.THRESHOLD, String(clamped)); return clamped; } function getHistory() { var raw = getLS().getItem(KEYS.HISTORY); return safeParse(raw, {}); } function getHistoryEntry(dateISO) { var history = getHistory(); return history[dateISO] || null; } function saveHistoryEntry(entry) { var history = getHistory(); history[entry.date] = entry; getLS().setItem(KEYS.HISTORY, JSON.stringify(history)); return entry; } var DEFAULT_REMINDER = { enabled: false, time: '20:00' }; function getReminderSettings() { var raw = getLS().getItem(KEYS.REMINDER); var parsed = safeParse(raw, null); if (!parsed || typeof parsed.enabled !== 'boolean' || !Logic.isValidTimeString(parsed.time)) { return Object.assign({}, DEFAULT_REMINDER); } return parsed; } function saveReminderSettings(settings) { var toSave = { enabled: !!settings.enabled, time: Logic.isValidTimeString(settings.time) ? settings.time : DEFAULT_REMINDER.time }; getLS().setItem(KEYS.REMINDER, JSON.stringify(toSave)); return toSave; } function getLastNotifiedDate() { return getLS().getItem(KEYS.LAST_NOTIFIED); } function setLastNotifiedDate(dateISO) { getLS().setItem(KEYS.LAST_NOTIFIED, dateISO); return dateISO; } return { KEYS: KEYS, getQuestions: getQuestions, saveQuestions: saveQuestions, getThreshold: getThreshold, saveThreshold: saveThreshold, getHistory: getHistory, getHistoryEntry: getHistoryEntry, saveHistoryEntry: saveHistoryEntry, getReminderSettings: getReminderSettings, saveReminderSettings: saveReminderSettings, getLastNotifiedDate: getLastNotifiedDate, setLastNotifiedDate: setLastNotifiedDate }; });