File size: 3,924 Bytes
5a81b95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import { useState, useEffect, useCallback } from 'react';

const STORAGE_KEY_PREFIX = 'widget-settings-';

export interface WidgetConfig {
  refreshRate: number;
  accentColor: 'primary' | 'accent' | 'destructive' | 'orange';
  showHeader: boolean;
  expanded: boolean;
  opacity: number;
}

interface UseWidgetSettingsOptions<T> {
  widgetId: string;
  defaultConfig: WidgetConfig;
  defaultSettings: T;
}

interface StoredWidgetData<T> {
  config: WidgetConfig;
  settings: T;
  lastUpdated: number;
}

export function useWidgetSettings<T extends Record<string, any>>({
  widgetId,
  defaultConfig,
  defaultSettings,
}: UseWidgetSettingsOptions<T>) {
  const storageKey = `${STORAGE_KEY_PREFIX}${widgetId}`;

  // Load initial state from localStorage
  const loadFromStorage = useCallback((): StoredWidgetData<T> | null => {
    try {
      const stored = localStorage.getItem(storageKey);
      if (stored) {
        return JSON.parse(stored);
      }
    } catch (error) {
      console.warn(`[WidgetSettings] Failed to load settings for ${widgetId}:`, error);
    }
    return null;
  }, [storageKey, widgetId]);

  const [config, setConfigState] = useState<WidgetConfig>(() => {
    const stored = loadFromStorage();
    return stored?.config ?? defaultConfig;
  });

  const [settings, setSettingsState] = useState<T>(() => {
    const stored = loadFromStorage();
    return stored?.settings ?? defaultSettings;
  });

  // Save to localStorage whenever config or settings change
  useEffect(() => {
    const data: StoredWidgetData<T> = {
      config,
      settings,
      lastUpdated: Date.now(),
    };
    try {
      localStorage.setItem(storageKey, JSON.stringify(data));
    } catch (error) {
      console.warn(`[WidgetSettings] Failed to save settings for ${widgetId}:`, error);
    }
  }, [config, settings, storageKey, widgetId]);

  const setConfig = useCallback((updates: Partial<WidgetConfig>) => {
    setConfigState(prev => ({ ...prev, ...updates }));
  }, []);

  const setSettings = useCallback((updates: Partial<T>) => {
    setSettingsState(prev => ({ ...prev, ...updates }));
  }, []);

  const resetToDefaults = useCallback(() => {
    setConfigState(defaultConfig);
    setSettingsState(defaultSettings);
    try {
      localStorage.removeItem(storageKey);
    } catch (error) {
      console.warn(`[WidgetSettings] Failed to remove settings for ${widgetId}:`, error);
    }
  }, [defaultConfig, defaultSettings, storageKey, widgetId]);

  return {
    config,
    settings,
    setConfig,
    setSettings,
    resetToDefaults,
  };
}

// Utility to generate a stable widget ID
export function generateWidgetId(name: string, widgetType?: string): string {
  const sanitized = name.toLowerCase().replace(/[^a-z0-9]/g, '-');
  return widgetType ? `${widgetType}-${sanitized}` : sanitized;
}

// Utility to clear all widget settings
export function clearAllWidgetSettings(): void {
  const keysToRemove: string[] = [];
  for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i);
    if (key?.startsWith(STORAGE_KEY_PREFIX)) {
      keysToRemove.push(key);
    }
  }
  keysToRemove.forEach(key => localStorage.removeItem(key));
}

// Utility to export all widget settings
export function exportWidgetSettings(): Record<string, any> {
  const settings: Record<string, any> = {};
  for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i);
    if (key?.startsWith(STORAGE_KEY_PREFIX)) {
      try {
        settings[key] = JSON.parse(localStorage.getItem(key) || '{}');
      } catch {
        // Skip invalid entries
      }
    }
  }
  return settings;
}

// Utility to import widget settings
export function importWidgetSettings(settings: Record<string, any>): void {
  Object.entries(settings).forEach(([key, value]) => {
    if (key.startsWith(STORAGE_KEY_PREFIX)) {
      localStorage.setItem(key, JSON.stringify(value));
    }
  });
}