- Add file-hash.ts: SHA-256 hash of uploaded files via Web Crypto API - Add datum-cache.ts: localStorage save/load/clear for datums by hash - Add settings-cache.ts: persist scalePxPerMm and includeScaleBar - Restore datums from cache on re-upload of same file - Discreet "Clear cache" button on upload page - Store fileHash and cacheRestoreMessage in Pinia store - Auto-save datums on every change via deep watcher - Track maxStepReached for clickable step navigation Co-Authored-By: Claude <noreply@anthropic.com>
49 lines
1.1 KiB
TypeScript
49 lines
1.1 KiB
TypeScript
import type { Datum } from "@/types"
|
|
|
|
const KEY_PREFIX = "skwik-datums-"
|
|
|
|
export function saveDatums(hash: string, datums: Datum[]): void {
|
|
try {
|
|
localStorage.setItem(
|
|
KEY_PREFIX + hash,
|
|
JSON.stringify(datums),
|
|
)
|
|
} catch {
|
|
// localStorage full or unavailable — silently ignore
|
|
}
|
|
}
|
|
|
|
export function loadDatums(hash: string): Datum[] | null {
|
|
try {
|
|
const raw = localStorage.getItem(KEY_PREFIX + hash)
|
|
if (!raw) return null
|
|
return JSON.parse(raw) as Datum[]
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
export function clearCache(): void {
|
|
const toRemove: string[] = []
|
|
for (let i = 0; i < localStorage.length; i++) {
|
|
const key = localStorage.key(i)
|
|
if (key?.startsWith(KEY_PREFIX)) {
|
|
toRemove.push(key)
|
|
}
|
|
}
|
|
for (const key of toRemove) {
|
|
localStorage.removeItem(key)
|
|
}
|
|
}
|
|
|
|
export function getCacheSize(): number {
|
|
let count = 0
|
|
for (let i = 0; i < localStorage.length; i++) {
|
|
const key = localStorage.key(i)
|
|
if (key?.startsWith(KEY_PREFIX)) {
|
|
count++
|
|
}
|
|
}
|
|
return count
|
|
}
|