From 99377ee38d2bfebac445d9530aa5a8dae0b9fc85 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 2 Oct 2025 14:40:50 +0200 Subject: [PATCH] feat: enhance BackgroundImageSelector with custom image management - Removed preserved custom URL handling and replaced it with a custom images array for better management of user-added backgrounds. - Updated the component to allow adding, selecting, and removing custom images, improving user experience and flexibility. - Adjusted background cycling logic to include custom images, ensuring a seamless integration with existing backgrounds. --- .../settings/BackgroundImageSelector.tsx | 133 +++++++++++------- src/hooks/useBackgroundCycle.ts | 22 ++- src/lib/types.ts | 2 + 3 files changed, 93 insertions(+), 64 deletions(-) diff --git a/src/components/settings/BackgroundImageSelector.tsx b/src/components/settings/BackgroundImageSelector.tsx index ac54f9e..ef3aaa2 100644 --- a/src/components/settings/BackgroundImageSelector.tsx +++ b/src/components/settings/BackgroundImageSelector.tsx @@ -87,19 +87,11 @@ export function BackgroundImageSelector() { const [customUrl, setCustomUrl] = useState(''); const [showCustomInput, setShowCustomInput] = useState(false); const [showAdvancedOptions, setShowAdvancedOptions] = useState(false); - const [preservedCustomUrl, setPreservedCustomUrl] = useState(''); const currentBackground = preferences?.viewPreferences?.backgroundImage; const backgroundBlur = preferences?.viewPreferences?.backgroundBlur || 0; const backgroundOpacity = preferences?.viewPreferences?.backgroundOpacity || 100; - - // Préserver l'URL personnalisée si elle existe - useEffect(() => { - if (currentBackground && !PRESET_BACKGROUNDS.some(preset => preset.id === currentBackground)) { - setPreservedCustomUrl(currentBackground); - localStorage.setItem('preservedCustomBackground', currentBackground); - } - }, [currentBackground]); + const customImages = preferences?.viewPreferences?.customImages || []; const handlePresetSelect = (presetId: string) => { const backgroundImage = presetId === 'none' ? undefined : presetId; @@ -110,23 +102,33 @@ export function BackgroundImageSelector() { if (!customUrl.trim()) return; const url = customUrl.trim(); - updateViewPreferences({ backgroundImage: url }); - setPreservedCustomUrl(url); - localStorage.setItem('preservedCustomBackground', url); + + // Ajouter l'image aux images personnalisées si elle n'existe pas déjà + if (!customImages.includes(url)) { + const newCustomImages = [...customImages, url]; + updateViewPreferences({ + backgroundImage: url, + customImages: newCustomImages + }); + } else { + // Si elle existe déjà, juste la sélectionner + updateViewPreferences({ backgroundImage: url }); + } + setCustomUrl(''); setShowCustomInput(false); }; - const handleRemoveCustom = () => { - updateViewPreferences({ backgroundImage: undefined }); - setPreservedCustomUrl(''); - localStorage.removeItem('preservedCustomBackground'); + const handleRemoveCustomImage = (urlToRemove: string) => { + const newCustomImages = customImages.filter(url => url !== urlToRemove); + updateViewPreferences({ + customImages: newCustomImages, + backgroundImage: currentBackground === urlToRemove ? undefined : currentBackground + }); }; - const handleRestoreCustom = () => { - if (preservedCustomUrl) { - updateViewPreferences({ backgroundImage: preservedCustomUrl }); - } + const handleSelectCustomImage = (url: string) => { + updateViewPreferences({ backgroundImage: url }); }; const handleBlurChange = (blur: number) => { @@ -219,6 +221,60 @@ export function BackgroundImageSelector() { + {/* Images personnalisées */} + {customImages.length > 0 && ( + + +
Images personnalisées :
+
+ {customImages.map((url, index) => ( +
+ + + {/* Bouton supprimer - positionné absolument */} + +
+ ))} +
+
+
+ )} {/* URL personnalisée */} @@ -231,25 +287,13 @@ export function BackgroundImageSelector() { Ajoutez votre propre image de fond

-
- {preservedCustomUrl && ( - - )} - -
+ {showCustomInput && ( @@ -282,17 +326,6 @@ export function BackgroundImageSelector() { )} - - {/* Bouton pour supprimer l'image personnalisée */} - {currentBackground && !PRESET_BACKGROUNDS.find(p => p.id === currentBackground) && ( - - )}
diff --git a/src/hooks/useBackgroundCycle.ts b/src/hooks/useBackgroundCycle.ts index f1a0400..80af728 100644 --- a/src/hooks/useBackgroundCycle.ts +++ b/src/hooks/useBackgroundCycle.ts @@ -23,23 +23,17 @@ export function useBackgroundCycle() { const cycleBackground = () => { const currentBackground = preferences?.viewPreferences?.backgroundImage; + const customImages = preferences?.viewPreferences?.customImages || []; - // Construire la liste complète des backgrounds (prédéfinis + personnalisé) + // Construire la liste complète des backgrounds (prédéfinis + personnalisés) const allBackgrounds = [...BACKGROUND_CYCLE]; - // Ajouter l'image personnalisée préservée si elle existe - const preservedCustomUrl = localStorage.getItem('preservedCustomBackground'); - - if (preservedCustomUrl && !BACKGROUND_CYCLE.includes(preservedCustomUrl)) { - allBackgrounds.push(preservedCustomUrl); - } - - // Ajouter aussi l'image actuelle si elle est personnalisée ET différente de celle préservée - if (currentBackground && - !BACKGROUND_CYCLE.includes(currentBackground) && - currentBackground !== preservedCustomUrl) { - allBackgrounds.push(currentBackground); - } + // Ajouter toutes les images personnalisées + customImages.forEach(url => { + if (!allBackgrounds.includes(url)) { + allBackgrounds.push(url); + } + }); const currentIndex = allBackgrounds.findIndex(bg => bg === currentBackground); diff --git a/src/lib/types.ts b/src/lib/types.ts index 6e4acd2..7deefce 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -107,6 +107,7 @@ export interface ViewPreferences { backgroundImage?: string; backgroundBlur?: number; backgroundOpacity?: number; + customImages?: string[]; [key: string]: | boolean | 'tags' @@ -117,6 +118,7 @@ export interface ViewPreferences { | 'large' | string | number + | string[] | undefined; }