storage listener uses switch

This commit is contained in:
SethBurkart123
2023-11-02 18:38:02 +11:00
parent 1c86fd3f9b
commit 7b0fc29461
4 changed files with 72 additions and 49 deletions
@@ -15,12 +15,16 @@ export interface Background {
isDownloaded?: boolean; isDownloaded?: boolean;
} }
export default function BackgroundSelector() { interface BackgroundSelectorProps {
selectedType: "background" | "theme";
isEditMode: boolean;
}
export default function BackgroundSelector({ selectedType, isEditMode }: BackgroundSelectorProps) {
const [backgrounds, setBackgrounds] = useState<Background[]>([]); const [backgrounds, setBackgrounds] = useState<Background[]>([]);
const [selectedBackground, setSelectedBackground] = useState<string | null>(localStorage.getItem('selectedBackground')); const [selectedBackground, setSelectedBackground] = useState<string | null>(localStorage.getItem('selectedBackground'));
const [downloadedPresetIds, setDownloadedPresetIds] = useState<string[]>([]); const [downloadedPresetIds, setDownloadedPresetIds] = useState<string[]>([]);
const [downloadProgress, setDownloadProgress] = useState<Record<string, number>>({}); const [downloadProgress, setDownloadProgress] = useState<Record<string, number>>({});
const [isEditMode, setIsEditMode] = useState<boolean>(false);
const handleFileChange = async (e: ChangeEvent<HTMLInputElement>): Promise<void> => { const handleFileChange = async (e: ChangeEvent<HTMLInputElement>): Promise<void> => {
const file = e.target.files?.[0]; const file = e.target.files?.[0];
@@ -89,6 +93,7 @@ export default function BackgroundSelector() {
}; };
const selectNoBackground = (): void => { const selectNoBackground = (): void => {
disableTheme();
setSelectedBackground(null); setSelectedBackground(null);
localStorage.removeItem('selectedBackground'); localStorage.removeItem('selectedBackground');
}; };
@@ -105,9 +110,6 @@ export default function BackgroundSelector() {
{selectedBackground == null ? 'No Background' : 'Remove Background'} {selectedBackground == null ? 'No Background' : 'Remove Background'}
</button> </button>
<div className="relative"> <div className="relative">
<button className="absolute top-0 right-0 p-2 text-[0.8rem] text-blue-500" onClick={() => setIsEditMode(!isEditMode)}>
{isEditMode ? 'Done' : 'Edit'}
</button>
<h2 className="pb-2 text-lg font-bold">Images</h2> <h2 className="pb-2 text-lg font-bold">Images</h2>
<div className="flex flex-wrap gap-4"> <div className="flex flex-wrap gap-4">
{/* Image uploader swatch */} {/* Image uploader swatch */}
@@ -121,7 +123,7 @@ export default function BackgroundSelector() {
{backgrounds.filter(bg => bg.type === 'image').map(bg => ( {backgrounds.filter(bg => bg.type === 'image').map(bg => (
<div key={bg.id} <div key={bg.id}
onClick={() => selectBackground(bg.id)} onClick={() => 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'}`}> 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'}`}>
{isEditMode && ( {isEditMode && (
<div className="absolute top-0 right-0 z-10 flex w-6 h-6 p-2 text-white translate-x-1/2 -translate-y-1/2 bg-red-600 rounded-full place-items-center" <div className="absolute top-0 right-0 z-10 flex w-6 h-6 p-2 text-white translate-x-1/2 -translate-y-1/2 bg-red-600 rounded-full place-items-center"
onClick={() => deleteBackground(bg.id)}> onClick={() => deleteBackground(bg.id)}>
@@ -167,7 +169,7 @@ export default function BackgroundSelector() {
<input type="file" accept='image/*, video/*' onChange={handleFileChange} className="absolute inset-0 w-full h-full opacity-0 cursor-pointer" /> <input type="file" accept='image/*, video/*' onChange={handleFileChange} className="absolute inset-0 w-full h-full opacity-0 cursor-pointer" />
</div> </div>
{backgrounds.filter(bg => bg.type === 'video').map(bg => ( {backgrounds.filter(bg => bg.type === 'video').map(bg => (
<div key={bg.id} onClick={() => 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'}`}> <div key={bg.id} onClick={() => 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'}`}>
{isEditMode && ( {isEditMode && (
<div className="absolute top-0 right-0 z-10 flex w-6 h-6 p-2 text-white translate-x-1/2 -translate-y-1/2 bg-red-600 rounded-full place-items-center" <div className="absolute top-0 right-0 z-10 flex w-6 h-6 p-2 text-white translate-x-1/2 -translate-y-1/2 bg-red-600 rounded-full place-items-center"
onClick={() => deleteBackground(bg.id)}> onClick={() => deleteBackground(bg.id)}>
+12 -3
View File
@@ -1,13 +1,22 @@
import { FC } from 'react'; import { FC, useEffect, useState } from 'react';
import BackgroundSelector from '../components/BackgroundSelector'; import BackgroundSelector from '../components/BackgroundSelector';
import ThemeSelector from '../components/ThemeSelector'; import ThemeSelector from '../components/ThemeSelector';
const Themes: FC = () => { const Themes: FC = () => {
const [isEditMode, setIsEditMode] = useState<boolean>(false);
const [selectedType, setSelectedType] = useState<'background' | 'theme'>('background');
useEffect(() => {
setSelectedType('background');
}, [])
return ( return (
<div> <div>
<BackgroundSelector /> <button className="absolute top-0 right-0 p-2 text-[0.8rem] text-blue-500" onClick={() => setIsEditMode(!isEditMode)}>
<ThemeSelector /> {isEditMode ? 'Done' : 'Edit'}
</button>
<BackgroundSelector selectedType={selectedType} isEditMode={isEditMode} />
<ThemeSelector selectedType={selectedType} isEditMode={isEditMode} />
</div> </div>
); );
}; };
+6 -6
View File
@@ -101,14 +101,14 @@ export const setTheme = async (themeName, themeUrl) => {
await downloadTheme(themeName, themeUrl); await downloadTheme(themeName, themeUrl);
} }
localStorage.setItem("selectedTheme", themeName); localforage.setItem("selectedTheme", themeName);
await applyTheme(themeName).catch((error) => { await applyTheme(themeName).catch((error) => {
console.error(`Failed to apply theme: ${error}`); console.error(`Failed to apply theme: ${error}`);
}); });
}; };
export const enableCurrentTheme = async () => { export const enableCurrentTheme = async () => {
const currentTheme = localStorage.getItem("selectedTheme"); const currentTheme = localforage.getItem("selectedTheme");
if (currentTheme) { if (currentTheme) {
console.log(`Enabling current theme: ${currentTheme}`); console.log(`Enabling current theme: ${currentTheme}`);
@@ -116,7 +116,7 @@ export const enableCurrentTheme = async () => {
console.error(`Failed to apply current theme: ${error}`); console.error(`Failed to apply current theme: ${error}`);
}); });
} else { } else {
console.log("No current theme set in localStorage."); console.log("No current theme set in localforage.");
} }
}; };
@@ -136,7 +136,7 @@ export const disableTheme = async () => {
} }
// Remove any applied image URLs from the root element // Remove any applied image URLs from the root element
const currentTheme = localStorage.getItem("selectedTheme"); const currentTheme = localforage.getItem("selectedTheme");
if (currentTheme) { if (currentTheme) {
const themeData = await localforage.getItem(`css_${currentTheme}`); const themeData = await localforage.getItem(`css_${currentTheme}`);
if (themeData && themeData.images) { if (themeData && themeData.images) {
@@ -147,7 +147,7 @@ export const disableTheme = async () => {
console.log("Current theme's images removed."); console.log("Current theme's images removed.");
} }
// Clear the selected theme from localStorage // Clear the selected theme from localforage
localStorage.removeItem("selectedTheme"); localforage.removeItem("selectedTheme");
console.log("Current theme disabled."); console.log("Current theme disabled.");
}; };
+44 -32
View File
@@ -19,45 +19,57 @@ export default class StorageListener {
} }
handleStorageChanges(changes) { handleStorageChanges(changes) {
if (changes.selectedColor) { Object.keys(changes).forEach((changeKey) => {
this.handleSelectedColorChange(changes.selectedColor.newValue); switch (changeKey) {
}
if (changes.shortcuts) { case "selectedColor":
this.handleShortcutsChange( this.handleSelectedColorChange(changes.selectedColor.newValue);
changes.shortcuts.oldValue, break;
changes.shortcuts.newValue
);
}
if (changes.DarkMode) { case "shortcuts":
this.darkMode = changes.DarkMode.newValue; this.handleShortcutsChange(
console.log(this.darkMode); changes.shortcuts.oldValue,
} changes.shortcuts.newValue
);
break;
if (changes?.customshortcuts?.newValue) { case "DarkMode":
this.handleCustomShortcutsChange( this.darkMode = changes.DarkMode.newValue;
changes.customshortcuts.oldValue, console.log(this.darkMode);
changes.customshortcuts.newValue break;
);
}
if (changes.notificationcollector) { case "customshortcuts":
this.handleNotificationCollectorChange(changes.notificationcollector); if (changes.customshortcuts.newValue) {
} this.handleCustomShortcutsChange(
changes.customshortcuts.oldValue,
changes.customshortcuts.newValue
);
}
break;
if (changes.bksliderinput) { case "notificationcollector":
updateBgDurations(changes.bksliderinput.newValue); this.handleNotificationCollectorChange(changes.notificationcollector);
} break;
if (changes.animatedbk !== undefined) { case "bksliderinput":
if (changes.animatedbk.newValue) { updateBgDurations(changes.bksliderinput.newValue);
CreateBackground(); break;
} else {
RemoveBackground(); case "animatedbk":
document.getElementById("container").style.background = "var(--background-secondary)"; if (changes.animatedbk.newValue) {
CreateBackground();
} else {
RemoveBackground();
document.getElementById("container").style.background = "var(--background-secondary)";
}
break;
// Add default case if you need to handle a case where changeKey does not match any case
default:
// Handle unknown changeKey if necessary
break;
} }
} });
} }
handleSelectedColorChange(newColor) { handleSelectedColorChange(newColor) {