Initial commit — Bradly branding editor platform

This commit is contained in:
2026-06-02 03:27:03 -05:00
commit b135a70cc7
180 changed files with 43160 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
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);
}