diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index ed36cfbf..75277a42 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -2,7 +2,7 @@ import React, { createContext, useContext, useState, useMemo, useEffect, useCall import { useSearchParams } from 'react-router-dom'; import { Sparkles, Layout, FileText, Compass, Bell } from 'lucide-react'; import { ALL_COMPONENTS as COMPONENTS } from '../data/components'; - +import { useLocalStorage } from '../hooks/useLocalStorage'; export type TechFramework = 'html' | 'react' | 'nextjs' | 'vue' | 'angular'; export type ColorAccent = 'violet' | 'emerald' | 'rose' | 'blue' | 'amber'; type PreviewSize = 'desktop' | 'tablet' | 'mobile'; @@ -65,19 +65,28 @@ export function AppProvider({ children }: { children: ReactNode }) { return next; }, { replace: true }); }, [setSearchParams]); - const [activeTabs, setActiveTabs] = useState>({}); - const [accentColors, setAccentColors] = useState>({}); - const [previewSizes, setPreviewSizes] = useState>({}); + const [activeTabs, setActiveTabs] = useLocalStorage>( + "activeTabs", + {} + ); + const [accentColors, setAccentColors] = useLocalStorage>( + "accentColors", + {} + ); + const [previewSizes, setPreviewSizes] = useLocalStorage>( + "previewSizes", + {} + ); const [copiedId, setCopiedId] = useState(null); const [darkMode, setDarkMode] = useState(false); const [showPlayground, setShowPlayground] = useState(false); - const [playgroundCode, setPlaygroundCode] = useState(`
+ const [playgroundCode, setPlaygroundCode] = useLocalStorage( "playgroundCode",`

My Contributed UI

Paste your own Tailwind CSS markup here to live preview your open-source component PR!

`); - const [globalAccent, setGlobalAccent] = useState('violet'); - const [globalTab, setGlobalTab] = useState('react'); + const [globalAccent, setGlobalAccent] = useLocalStorage("globalAccent",'violet'); + const [globalTab, setGlobalTab] = useLocalStorage("globalTab",'react'); useEffect(() => { const root = window.document.documentElement; diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts new file mode 100644 index 00000000..b6a67312 --- /dev/null +++ b/src/hooks/useLocalStorage.ts @@ -0,0 +1,21 @@ +import { useState, useEffect } from "react"; + +export function useLocalStorage(key: string, initialValue: T) { + const [value, setValue] = useState(() => { + if (typeof window === "undefined") return initialValue; + + try { + const item = localStorage.getItem(key); + return item ? JSON.parse(item) : initialValue; + } catch { + + return initialValue; + } + }); + + useEffect(() => { + localStorage.setItem(key, JSON.stringify(value)); + }, [key, value]); + + return [value, setValue] as const; +} \ No newline at end of file