87 lines
2.5 KiB
TypeScript
87 lines
2.5 KiB
TypeScript
import { SaveAdapter } from '../useAutoSave'
|
|
|
|
interface SavedLocalStorageData {
|
|
templateId: string
|
|
formulaData: Record<string, Record<string, any>>
|
|
timestamp: string
|
|
version: number
|
|
}
|
|
|
|
// Ключ для localStorage
|
|
const getStorageKey = (templateId: string) => {
|
|
return `formula_data_${templateId}`
|
|
}
|
|
|
|
/**
|
|
* Адаптер для сохранения в localStorage
|
|
*/
|
|
export function createLocalStorageSaveAdapter(templateId: string): SaveAdapter {
|
|
let versionCounter = 1
|
|
|
|
// Инициализируем версию из существующих данных
|
|
try {
|
|
const storageKey = getStorageKey(templateId)
|
|
const savedDataStr = localStorage.getItem(storageKey)
|
|
if (savedDataStr) {
|
|
const parsedData: SavedLocalStorageData = JSON.parse(savedDataStr)
|
|
versionCounter = parsedData.version + 1
|
|
}
|
|
} catch (error) {
|
|
console.warn('⚠️ Ошибка при загрузке данных из localStorage:', error)
|
|
}
|
|
|
|
return {
|
|
async save(data: Record<string, Record<string, any>>) {
|
|
// Имитируем задержку API для реалистичности
|
|
await new Promise(resolve =>
|
|
setTimeout(resolve, 200 + Math.random() * 300)
|
|
)
|
|
|
|
// Иногда имитируем ошибку (2% вероятность)
|
|
if (Math.random() < 0.02) {
|
|
throw new Error('Ошибка записи в хранилище')
|
|
}
|
|
|
|
const savedData: SavedLocalStorageData = {
|
|
templateId,
|
|
formulaData: data,
|
|
timestamp: new Date().toISOString(),
|
|
version: versionCounter++,
|
|
}
|
|
|
|
const storageKey = getStorageKey(templateId)
|
|
localStorage.setItem(storageKey, JSON.stringify(savedData))
|
|
},
|
|
|
|
async load() {
|
|
try {
|
|
const storageKey = getStorageKey(templateId)
|
|
const savedDataStr = localStorage.getItem(storageKey)
|
|
|
|
if (savedDataStr) {
|
|
const parsedData: SavedLocalStorageData = JSON.parse(savedDataStr)
|
|
return parsedData.formulaData
|
|
}
|
|
|
|
return {}
|
|
} catch (error) {
|
|
console.error(
|
|
'❌ Ошибка при загрузке сохраненных данных из localStorage:',
|
|
error
|
|
)
|
|
return {}
|
|
}
|
|
},
|
|
|
|
async clear() {
|
|
try {
|
|
const storageKey = getStorageKey(templateId)
|
|
localStorage.removeItem(storageKey)
|
|
versionCounter = 1
|
|
} catch (error) {
|
|
console.error('❌ Ошибка при очистке сохраненных данных:', error)
|
|
}
|
|
},
|
|
}
|
|
}
|