import React, { useEffect, useState, useCallback, forwardRef, useImperativeHandle, ForwardRefExoticComponent, RefAttributes } from 'react'; import { listThemes, deleteTheme, setTheme, disableTheme } from '../hooks/ThemeManagment'; import { ThemeCover } from './ThemeCover'; import Browser from 'webextension-polyfill'; import { CustomTheme } from '../types/CustomThemes'; import { useSettingsContext } from '../SettingsContext'; import { SettingsState } from '../types/AppProps'; interface ThemeSelectorProps { isEditMode: boolean; ref: React.Ref; } const ThemeSelector: ForwardRefExoticComponent & RefAttributes> = forwardRef(({ isEditMode = false }, ref) => { const [themes, setThemes] = useState[]>([]); const [isLoading, setIsLoading] = useState(true); const { settingsState, setSettingsState } = useSettingsContext(); const setSelectedTheme = (themeId: string) => { setSettingsState((prevState: SettingsState) => ({ ...prevState, selectedTheme: themeId, })); } useImperativeHandle(ref, () => ({ disableTheme: async () => { await disableTheme(); setSelectedTheme(''); } })); useEffect(() => { const handleThemeChange = async () => { await new Promise((resolve) => setTimeout(resolve, 500)); fetchThemes(); }; Browser.runtime.onMessage.addListener((message) => { if (message.info === 'themeChanged') { handleThemeChange(); } }); return () => { Browser.runtime.onMessage.removeListener((message) => { if (message.info === 'themeChanged') { handleThemeChange(); } }); }; }, []); const fetchThemes = async () => { try { const { themes, selectedTheme } = await listThemes(); setThemes(themes); setSelectedTheme(selectedTheme ? selectedTheme : ''); } catch (error) { console.error('Error fetching themes:', error); } finally { setIsLoading(false); } }; useEffect(() => { fetchThemes(); }, []); const handleThemeSelect = useCallback( async (themeId: string) => { if (themeId === settingsState.selectedTheme) { await disableTheme(); setSelectedTheme(''); } else { const selectedTheme = themes.find((theme) => theme.id === themeId); if (selectedTheme) { await setTheme(selectedTheme.id); setSelectedTheme(themeId); } } }, [settingsState.selectedTheme, themes] ); const handleThemeDelete = useCallback( async (themeId: string) => { try { await deleteTheme(themeId); setThemes((prevThemes) => prevThemes.filter((theme) => theme.id !== themeId)); if (themeId === settingsState.selectedTheme) { setSelectedTheme(''); } } catch (error) { console.error('Error deleting theme:', error); } }, [settingsState.selectedTheme] ); if (isLoading) { return
Loading themes...
; } return (

Themes

{themes.map((theme) => ( ))}
); }); export default ThemeSelector;