export type DashboardPlatformIconName = | 'ShoppingBagIcon' | 'LinkIcon' | 'UsersIcon' | 'UserCircleIcon' export type DashboardPlatformColorClass = | 'bg-blue-500' | 'bg-teal-500' | 'bg-amber-600' | 'bg-purple-500' export type DashboardPlatform = { id: string title: string description: string href: string icon: DashboardPlatformIconName color: DashboardPlatformColorClass isActive: boolean disabled?: boolean disabledText?: string } export const DASHBOARD_PLATFORMS_STORAGE_KEY = 'pp.dashboardPlatforms.v1' export const DASHBOARD_PLATFORMS_UPDATED_EVENT = 'pp:dashboard-platforms-updated' export const DASHBOARD_PLATFORMS_ICON_OPTIONS: Array<{ value: DashboardPlatformIconName; label: string }> = [ { value: 'ShoppingBagIcon', label: 'Shopping Bag' }, { value: 'LinkIcon', label: 'Link' }, { value: 'UsersIcon', label: 'Users' }, { value: 'UserCircleIcon', label: 'User Profile' } ] export const DASHBOARD_PLATFORMS_COLOR_OPTIONS: Array<{ value: DashboardPlatformColorClass; label: string }> = [ { value: 'bg-blue-500', label: 'Blue' }, { value: 'bg-teal-500', label: 'Teal' }, { value: 'bg-amber-600', label: 'Amber' }, { value: 'bg-purple-500', label: 'Purple' } ] export const DEFAULT_DASHBOARD_PLATFORMS: DashboardPlatform[] = [ { id: 'shop', title: 'Browse Shop', description: 'Explore sustainable products', icon: 'ShoppingBagIcon', href: '/shop', color: 'bg-blue-500', isActive: true, disabledText: 'This is currently disabled.' }, { id: 'affiliate-links', title: 'Browse Affiliate Links', description: 'Discover affiliate offers and links', icon: 'LinkIcon', href: '/affiliate-links', color: 'bg-teal-500', isActive: true }, { id: 'referral-management', title: 'Referral Management', description: 'Create and manage referral links', icon: 'UsersIcon', href: '/referral-management', color: 'bg-amber-600', isActive: true }, { id: 'profile', title: 'Edit Profile', description: 'Update your information', icon: 'UserCircleIcon', href: '/profile', color: 'bg-purple-500', isActive: true } ] function isRecord(value: unknown): value is Record { return !!value && typeof value === 'object' && !Array.isArray(value) } function createFallbackId(): string { return `platform_${Date.now()}_${Math.random().toString(16).slice(2)}` } function normalizePlatform(input: unknown): DashboardPlatform | null { if (!isRecord(input)) return null const id = typeof input.id === 'string' && input.id.trim() ? input.id.trim() : createFallbackId() const title = typeof input.title === 'string' ? input.title : '' const description = typeof input.description === 'string' ? input.description : '' const href = typeof input.href === 'string' ? input.href : '' const icon = input.icon as DashboardPlatformIconName const color = input.color as DashboardPlatformColorClass const isActive = typeof input.isActive === 'boolean' ? input.isActive : true const disabled = typeof input.disabled === 'boolean' ? input.disabled : false const disabledText = typeof input.disabledText === 'string' ? input.disabledText : undefined const iconOk = DASHBOARD_PLATFORMS_ICON_OPTIONS.some(o => o.value === icon) const colorOk = DASHBOARD_PLATFORMS_COLOR_OPTIONS.some(o => o.value === color) if (!title.trim() || !href.trim() || !iconOk || !colorOk) return null return { id, title, description, href, icon, color, isActive, disabled, disabledText } } export function loadDashboardPlatforms(): DashboardPlatform[] { if (typeof window === 'undefined') return DEFAULT_DASHBOARD_PLATFORMS try { const raw = window.localStorage.getItem(DASHBOARD_PLATFORMS_STORAGE_KEY) if (!raw) return DEFAULT_DASHBOARD_PLATFORMS const parsed = JSON.parse(raw) as unknown if (!Array.isArray(parsed)) return DEFAULT_DASHBOARD_PLATFORMS const normalized = parsed .map(normalizePlatform) .filter((x): x is DashboardPlatform => Boolean(x)) return normalized.length ? normalized : DEFAULT_DASHBOARD_PLATFORMS } catch { return DEFAULT_DASHBOARD_PLATFORMS } } export function saveDashboardPlatforms(platforms: DashboardPlatform[]): void { if (typeof window === 'undefined') return window.localStorage.setItem(DASHBOARD_PLATFORMS_STORAGE_KEY, JSON.stringify(platforms)) window.dispatchEvent(new Event(DASHBOARD_PLATFORMS_UPDATED_EVENT)) } export function subscribeDashboardPlatformsUpdated(callback: () => void): () => void { if (typeof window === 'undefined') return () => {} const handler = () => callback() window.addEventListener(DASHBOARD_PLATFORMS_UPDATED_EVENT, handler) window.addEventListener('storage', handler) return () => { window.removeEventListener(DASHBOARD_PLATFORMS_UPDATED_EVENT, handler) window.removeEventListener('storage', handler) } }