mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-06-05 19:24:39 +00:00
storage listener uses switch
This commit is contained in:
@@ -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)}>
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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.");
|
||||||
};
|
};
|
||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user