ty-produktovyy-dizayner-i-se/storage.js

101 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Storage - работа с localStorage
* Пространство имён, обработка ошибок, версионирование схемы
*/
const STORAGE_KEY = 'hr_matcher_v1';
const SCHEMA_VERSION = 1;
const defaultState = {
schemaVersion: SCHEMA_VERSION,
vacancyText: '',
resumeText: '',
criteria: [],
matchResults: null,
questions: [],
lastUpdated: null
};
function loadState() {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (!stored) {
return { ...defaultState };
}
const parsed = JSON.parse(stored);
if (!parsed.schemaVersion || parsed.schemaVersion < SCHEMA_VERSION) {
console.warn('Устаревшая схема данных, миграция...');
return migrateState(parsed);
}
return { ...defaultState, ...parsed };
} catch (error) {
console.error('Ошибка чтения localStorage:', error);
return { ...defaultState };
}
}
function saveState(state) {
try {
const toSave = {
...state,
lastUpdated: new Date().toISOString()
};
localStorage.setItem(STORAGE_KEY, JSON.stringify(toSave));
return true;
} catch (error) {
if (error.name === 'QuotaExceededError') {
console.error('Превышена квота localStorage. Очистите данные или удалите старые записи.');
alert('Внимание: Превышен лимит хранилища. Данные не сохранены.');
} else {
console.error('Ошибка записи в localStorage:', error);
}
return false;
}
}
function clearState() {
try {
localStorage.removeItem(STORAGE_KEY);
return true;
} catch (error) {
console.error('Ошибка очистки localStorage:', error);
return false;
}
}
function migrateState(oldState) {
const migrated = { ...defaultState };
if (oldState.vacancyText) migrated.vacancyText = oldState.vacancyText;
if (oldState.resumeText) migrated.resumeText = oldState.resumeText;
if (oldState.criteria) migrated.criteria = oldState.criteria;
if (oldState.matchResults) migrated.matchResults = oldState.matchResults;
if (oldState.questions) migrated.questions = oldState.questions;
migrated.schemaVersion = SCHEMA_VERSION;
migrated.lastUpdated = new Date().toISOString();
saveState(migrated);
return migrated;
}
function isStorageAvailable() {
try {
const test = '__storage_test__';
localStorage.setItem(test, test);
localStorage.removeItem(test);
return true;
} catch (error) {
return false;
}
}
if (typeof module !== 'undefined' && module.exports) {
module.exports = { loadState, saveState, clearState, isStorageAvailable, defaultState };
}