Files
brandly/src/hooks/usePersistence.ts
T

115 lines
3.0 KiB
TypeScript

import { useEffect, useRef } from 'react';
import { CompanyProfile, ExpressTemplate } from '../types';
const STORAGE_KEY = 'remix-designmd-companies';
const TEMPLATES_STORAGE_KEY = 'remix-global-templates';
/**
* Load companies from localStorage. Returns null if nothing saved.
*/
export function loadCompanies(): CompanyProfile[] | null {
try {
const raw = localStorage.getItem(STORAGE_KEY);
if (!raw) return null;
return JSON.parse(raw) as CompanyProfile[];
} catch {
return null;
}
}
/**
* Save companies to localStorage.
*/
export function saveCompanies(companies: CompanyProfile[]): void {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(companies));
} catch (e) {
console.warn('Failed to save to localStorage:', e);
}
}
/**
* Hook that auto-saves companies to localStorage whenever they change.
* Uses debouncing (500ms) to avoid excessive writes.
*/
export function usePersistence(companies: CompanyProfile[]): void {
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const isInitialMount = useRef(true);
useEffect(() => {
// Skip the initial mount to avoid overwriting saved data with defaults
if (isInitialMount.current) {
isInitialMount.current = false;
return;
}
if (timerRef.current) clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
saveCompanies(companies);
}, 500);
return () => {
if (timerRef.current) clearTimeout(timerRef.current);
};
}, [companies]);
}
// ═══ Template Persistence ═══
/**
* Load custom templates from localStorage. Returns null if nothing saved.
*/
export function loadTemplates(): ExpressTemplate[] | null {
try {
const raw = localStorage.getItem(TEMPLATES_STORAGE_KEY);
if (!raw) return null;
return JSON.parse(raw) as ExpressTemplate[];
} catch {
return null;
}
}
/**
* Save custom templates to localStorage.
*/
export function saveTemplates(templates: ExpressTemplate[]): void {
try {
localStorage.setItem(TEMPLATES_STORAGE_KEY, JSON.stringify(templates));
} catch (e) {
console.warn('Failed to save templates to localStorage:', e);
}
}
/**
* Hook that auto-saves templates to localStorage whenever they change.
* Uses debouncing (500ms) to avoid excessive writes.
*/
export function useTemplatePersistence(templates: ExpressTemplate[]): void {
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const isInitialMount = useRef(true);
useEffect(() => {
if (isInitialMount.current) {
isInitialMount.current = false;
return;
}
if (timerRef.current) clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
saveTemplates(templates);
}, 500);
return () => {
if (timerRef.current) clearTimeout(timerRef.current);
};
}, [templates]);
}
/**
* Clear all persisted data.
*/
export function clearStorage(): void {
localStorage.removeItem(STORAGE_KEY);
localStorage.removeItem(TEMPLATES_STORAGE_KEY);
}