diff --git a/src/interface/components/BackgroundSelector.tsx b/src/interface/components/BackgroundSelector.tsx index 308a25a1..fcf7f9c8 100644 --- a/src/interface/components/BackgroundSelector.tsx +++ b/src/interface/components/BackgroundSelector.tsx @@ -2,7 +2,6 @@ import { ChangeEvent, memo, useEffect, useState } from "react"; import { downloadPresetBackground, openDB, readAllData, writeData } from "../hooks/BackgroundDataLoader"; import presetBackgrounds from "../assets/presetBackgrounds"; import "./BackgroundSelector.css"; -import { disableTheme } from "../hooks/ThemeManagment"; import browser from "webextension-polyfill"; // Custom Types and Interfaces @@ -17,9 +16,8 @@ export interface Background { } interface BackgroundSelectorProps { - selectedType: "background" | "theme"; - setSelectedType: (type: "background" | "theme") => void; isEditMode: boolean; + disableTheme: () => void; } async function GetTheme() { @@ -31,7 +29,7 @@ async function SetTheme(theme: string) { await browser.storage.local.set({ theme }); } -function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: BackgroundSelectorProps) { +function BackgroundSelector({ isEditMode, disableTheme }: BackgroundSelectorProps) { const [backgrounds, setBackgrounds] = useState([]); const [selectedBackground, setSelectedBackground] = useState(); const [downloadedPresetIds, setDownloadedPresetIds] = useState([]); @@ -106,13 +104,11 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg }; const selectBackground = (fileId: string): void => { - if (selectedType == 'background' && selectedBackground == fileId) { + if (selectedBackground == fileId) { selectNoBackground(); return; } - disableTheme(); - setSelectedType('background'); setSelectedBackground(fileId); SetTheme(fileId); }; @@ -131,8 +127,6 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg }; const selectNoBackground = (): void => { - setSelectedType('background'); - disableTheme(); setSelectedBackground(null); SetTheme(''); }; @@ -146,9 +140,10 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg return ( <> {BackgroundsBlocked && ( @@ -173,7 +168,7 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg {backgrounds.filter(bg => bg.type === 'image').map(bg => (
selectBackground(bg.id)} - className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${selectedBackground === bg.id && selectedType === "background" ? 'dark:ring-2 ring-4' : 'ring-0'}`}> + className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${selectedBackground === bg.id ? 'dark:ring-2 ring-4' : 'ring-0'}`}> {isEditMode && (
deleteBackground(bg.id)}> @@ -202,7 +197,7 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg
swatch ))} @@ -219,7 +214,7 @@ function BackgroundSelector({ selectedType, setSelectedType, isEditMode }: Backg
{backgrounds.filter(bg => bg.type === 'video').map(bg => ( -
selectBackground(bg.id)} className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${selectedBackground === bg.id && selectedType === "background" ? 'dark:ring-2 ring-4' : 'ring-0'}`}> +
selectBackground(bg.id)} className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${selectedBackground === bg.id ? 'dark:ring-2 ring-4' : 'ring-0'}`}> {isEditMode && (
deleteBackground(bg.id)}> diff --git a/src/interface/components/ThemeSelector.tsx b/src/interface/components/ThemeSelector.tsx index f4251d76..7f873b19 100644 --- a/src/interface/components/ThemeSelector.tsx +++ b/src/interface/components/ThemeSelector.tsx @@ -1,29 +1,25 @@ -import React, { useEffect, useState, useCallback } from 'react'; +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'; interface ThemeSelectorProps { - setSelectedType: React.Dispatch>; - selectedType: 'background' | 'theme'; isEditMode: boolean; + ref: React.Ref; } -const ThemeSelector: React.FC = ({ - setSelectedType, - selectedType, - isEditMode, -}) => { +const ThemeSelector: ForwardRefExoticComponent & RefAttributes> = forwardRef(({ isEditMode = false }, ref) => { const [themes, setThemes] = useState[]>([]); const [isLoading, setIsLoading] = useState(true); const [selectedThemeId, setSelectedThemeId] = useState(null); - useEffect(() => { - if (selectedType === 'background') { + useImperativeHandle(ref, () => ({ + disableTheme: async () => { + await disableTheme(); setSelectedThemeId(null); } - }, [selectedType]); + })); useEffect(() => { const fetchThemes = async () => { @@ -49,17 +45,15 @@ const ThemeSelector: React.FC = ({ if (themeId === selectedThemeId) { await disableTheme(); setSelectedThemeId(null); - setSelectedType('background'); } else { const selectedTheme = themes.find((theme) => theme.id === themeId); if (selectedTheme) { await setTheme(selectedTheme.id); setSelectedThemeId(themeId); - setSelectedType('theme'); } } }, - [selectedThemeId, themes, setSelectedType] + [selectedThemeId, themes] ); const handleThemeDelete = useCallback( @@ -69,13 +63,12 @@ const ThemeSelector: React.FC = ({ setThemes((prevThemes) => prevThemes.filter((theme) => theme.id !== themeId)); if (themeId === selectedThemeId) { setSelectedThemeId(null); - setSelectedType('background'); } } catch (error) { console.error('Error deleting theme:', error); } }, - [selectedThemeId, setSelectedType] + [selectedThemeId] ); if (isLoading) { @@ -83,9 +76,9 @@ const ThemeSelector: React.FC = ({ } return ( -
+

Themes

-
+
{themes.map((theme) => ( = ({
); -}; +}); export default ThemeSelector; \ No newline at end of file diff --git a/src/interface/pages/SettingsPage/Themes.tsx b/src/interface/pages/SettingsPage/Themes.tsx index c83a283c..a507ec3c 100644 --- a/src/interface/pages/SettingsPage/Themes.tsx +++ b/src/interface/pages/SettingsPage/Themes.tsx @@ -1,29 +1,23 @@ -import { FC, useEffect, useState } from 'react'; +import { FC, createRef, useState } from 'react'; import BackgroundSelector from '../../components/BackgroundSelector'; import ThemeSelector from '../../components/ThemeSelector'; -import { listThemes } from '../../hooks/ThemeManagment'; const Themes: FC = () => { const [isEditMode, setIsEditMode] = useState(false); - const [selectedType, setSelectedType] = useState<'background' | 'theme'>('background'); + const themeSelectorRef = createRef(); + + const disableTheme = async () => { + themeSelectorRef?.current?.disableTheme(); + } - useEffect(() => { - listThemes().then(themes => { - if (themes?.selectedTheme) { - setSelectedType('theme'); - } else { - setSelectedType('background'); - } - }); - }, []) return (
- - + +
); };