const STORAGE_KEY = 'pichost.upload-preferences' export type CopyFormat = 'url' | 'markdown' | 'html' export interface UploadPreferences { defaultFolder: string compressEnabled: boolean autoCopyMarkdown: boolean copyFormat: CopyFormat clientWebpQuality: number } const DEFAULTS: UploadPreferences = { defaultFolder: 'images', compressEnabled: false, autoCopyMarkdown: false, copyFormat: 'markdown', clientWebpQuality: 80 } function clampQuality(value: unknown): number { const num = Number(value) if (!Number.isFinite(num)) return DEFAULTS.clientWebpQuality return Math.min(100, Math.max(1, Math.round(num))) } function isCopyFormat(value: unknown): value is CopyFormat { return value === 'url' || value === 'markdown' || value === 'html' } function readStored(): UploadPreferences { if (import.meta.server) return { ...DEFAULTS } try { const raw = localStorage.getItem(STORAGE_KEY) if (!raw) return { ...DEFAULTS } const parsed = JSON.parse(raw) as Partial return { defaultFolder: typeof parsed.defaultFolder === 'string' && parsed.defaultFolder.trim() ? parsed.defaultFolder.trim() : DEFAULTS.defaultFolder, compressEnabled: parsed.compressEnabled === true, autoCopyMarkdown: parsed.autoCopyMarkdown === true, copyFormat: isCopyFormat(parsed.copyFormat) ? parsed.copyFormat : DEFAULTS.copyFormat, clientWebpQuality: clampQuality(parsed.clientWebpQuality) } } catch { return { ...DEFAULTS } } } function writeStored(prefs: UploadPreferences) { if (import.meta.server) return localStorage.setItem(STORAGE_KEY, JSON.stringify(prefs)) } export function useUploadPreferences() { const defaultFolder = useState('upload-pref-folder', () => DEFAULTS.defaultFolder) const compressEnabled = useState('upload-pref-compress', () => DEFAULTS.compressEnabled) const autoCopyMarkdown = useState('upload-pref-auto-md', () => DEFAULTS.autoCopyMarkdown) const copyFormat = useState('upload-pref-copy-format', () => DEFAULTS.copyFormat) const clientWebpQuality = useState('upload-pref-webp-quality', () => DEFAULTS.clientWebpQuality) const loaded = useState('upload-pref-loaded', () => false) function loadPreferences() { const stored = readStored() defaultFolder.value = stored.defaultFolder compressEnabled.value = stored.compressEnabled autoCopyMarkdown.value = stored.autoCopyMarkdown copyFormat.value = stored.copyFormat clientWebpQuality.value = stored.clientWebpQuality loaded.value = true } function savePreferences() { writeStored({ defaultFolder: defaultFolder.value.trim() || DEFAULTS.defaultFolder, compressEnabled: compressEnabled.value, autoCopyMarkdown: autoCopyMarkdown.value, copyFormat: copyFormat.value, clientWebpQuality: clampQuality(clientWebpQuality.value) }) } watch([defaultFolder, compressEnabled, autoCopyMarkdown, copyFormat, clientWebpQuality], () => { if (loaded.value) { savePreferences() } }) return { defaultFolder, compressEnabled, autoCopyMarkdown, copyFormat, clientWebpQuality, loaded, loadPreferences, savePreferences } }