fix presets delete (#1497)

This commit is contained in:
jeffvli
2026-01-04 14:42:44 -08:00
parent 03c1fb0ff2
commit 211f09fe19
3 changed files with 66 additions and 16 deletions
@@ -1,5 +1,8 @@
import { nanoid } from 'nanoid';
export const audiomotionanalyzerPresets = [ export const audiomotionanalyzerPresets = [
{ {
id: nanoid(),
name: 'Preset 1', name: 'Preset 1',
value: { value: {
alphaBars: false, alphaBars: false,
@@ -52,6 +55,7 @@ export const audiomotionanalyzerPresets = [
}, },
}, },
{ {
id: nanoid(),
name: 'Preset 2', name: 'Preset 2',
value: { value: {
alphaBars: false, alphaBars: false,
@@ -104,6 +108,7 @@ export const audiomotionanalyzerPresets = [
}, },
}, },
{ {
id: nanoid(),
name: 'Preset 3', name: 'Preset 3',
value: { value: {
alphaBars: false, alphaBars: false,
@@ -158,6 +163,7 @@ export const audiomotionanalyzerPresets = [
}, },
}, },
{ {
id: nanoid(),
name: 'Preset 4', name: 'Preset 4',
value: { value: {
alphaBars: false, alphaBars: false,
@@ -1,4 +1,5 @@
import butterchurnPresets from 'butterchurn-presets'; import butterchurnPresets from 'butterchurn-presets';
import { nanoid } from 'nanoid';
import { useEffect, useMemo, useRef, useState } from 'react'; import { useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@@ -390,10 +391,10 @@ const PresetSettings = () => {
const [isPasting, setIsPasting] = useState(false); const [isPasting, setIsPasting] = useState(false);
const [pasteValue, setPasteValue] = useState(''); const [pasteValue, setPasteValue] = useState('');
const applyPreset = (presetName: null | string) => { const applyPreset = (presetId: null | string) => {
if (!presetName) return; if (!presetId) return;
const preset = visualizer.audiomotionanalyzer.presets.find((p) => p.name === presetName); const preset = visualizer.audiomotionanalyzer.presets.find((p) => p.id === presetId);
if (!preset) return; if (!preset) return;
@@ -484,7 +485,7 @@ const PresetSettings = () => {
if (existingPreset) { if (existingPreset) {
// Update existing preset // Update existing preset
const updatedPresets = visualizer.audiomotionanalyzer.presets.map((p) => const updatedPresets = visualizer.audiomotionanalyzer.presets.map((p) =>
p.name === newPresetName.trim() p.id === existingPreset.id
? { ? {
...p, ...p,
value: getCurrentSettingsAsPresetValue(), value: getCurrentSettingsAsPresetValue(),
@@ -499,9 +500,12 @@ const PresetSettings = () => {
}, },
}, },
}); });
setSelectedPreset(existingPreset.id);
} else { } else {
// Add new preset // Add new preset
const newPreset = { const newPreset = {
id: nanoid(),
name: newPresetName.trim(), name: newPresetName.trim(),
value: getCurrentSettingsAsPresetValue(), value: getCurrentSettingsAsPresetValue(),
}; };
@@ -513,11 +517,12 @@ const PresetSettings = () => {
}, },
}, },
}); });
setSelectedPreset(newPreset.id);
} }
setNewPresetName(''); setNewPresetName('');
setIsSaving(false); setIsSaving(false);
setSelectedPreset(newPresetName.trim());
}; };
const getCurrentSettingsAsPresetValue = () => { const getCurrentSettingsAsPresetValue = () => {
@@ -579,12 +584,17 @@ const PresetSettings = () => {
const handleUpdatePreset = () => { const handleUpdatePreset = () => {
if (!selectedPreset || !newPresetName.trim()) return; if (!selectedPreset || !newPresetName.trim()) return;
const selectedPresetObj = visualizer.audiomotionanalyzer.presets.find(
(p) => p.id === selectedPreset,
);
if (!selectedPresetObj) return;
let trimmedName = newPresetName.trim(); let trimmedName = newPresetName.trim();
const isRenaming = trimmedName !== selectedPreset; const isRenaming = trimmedName !== selectedPresetObj.name;
if (isRenaming) { if (isRenaming) {
const existingNames = visualizer.audiomotionanalyzer.presets const existingNames = visualizer.audiomotionanalyzer.presets
.filter((p) => p.name !== selectedPreset) .filter((p) => p.id !== selectedPreset)
.map((p) => p.name); .map((p) => p.name);
if (existingNames.includes(trimmedName)) { if (existingNames.includes(trimmedName)) {
@@ -600,7 +610,7 @@ const PresetSettings = () => {
} }
const updatedPresets = visualizer.audiomotionanalyzer.presets.map((p) => const updatedPresets = visualizer.audiomotionanalyzer.presets.map((p) =>
p.name === selectedPreset p.id === selectedPreset
? { ? {
...p, ...p,
name: trimmedName, name: trimmedName,
@@ -621,14 +631,13 @@ const PresetSettings = () => {
setNewPresetName(''); setNewPresetName('');
setIsRenaming(false); setIsRenaming(false);
setSelectedPreset(trimmedName);
}; };
const handleDeletePreset = () => { const handleDeletePreset = () => {
if (!selectedPreset) return; if (!selectedPreset) return;
const updatedPresets = visualizer.audiomotionanalyzer.presets.filter( const updatedPresets = visualizer.audiomotionanalyzer.presets.filter(
(p) => p.name !== selectedPreset, (p) => p.id !== selectedPreset,
); );
setSettings({ setSettings({
@@ -797,7 +806,7 @@ const PresetSettings = () => {
const presetOptions = useMemo(() => { const presetOptions = useMemo(() => {
return visualizer.audiomotionanalyzer.presets.map((preset) => ({ return visualizer.audiomotionanalyzer.presets.map((preset) => ({
label: preset.name, label: preset.name,
value: preset.name, value: preset.id,
})); }));
}, [visualizer.audiomotionanalyzer.presets]); }, [visualizer.audiomotionanalyzer.presets]);
@@ -907,8 +916,13 @@ const PresetSettings = () => {
<> <>
<Button <Button
onClick={() => { onClick={() => {
setNewPresetName(selectedPreset); const preset = visualizer.audiomotionanalyzer.presets.find(
setIsRenaming(true); (p) => p.id === selectedPreset,
);
if (preset) {
setNewPresetName(preset.name);
setIsRenaming(true);
}
}} }}
variant="default" variant="default"
> >
+33 -3
View File
@@ -1,5 +1,6 @@
import isElectron from 'is-electron'; import isElectron from 'is-electron';
import merge from 'lodash/merge'; import mergeWith from 'lodash/mergeWith';
import { nanoid } from 'nanoid';
import { generatePath } from 'react-router'; import { generatePath } from 'react-router';
import { z } from 'zod'; import { z } from 'zod';
import { devtools, persist } from 'zustand/middleware'; import { devtools, persist } from 'zustand/middleware';
@@ -51,7 +52,16 @@ const deepMergeIntoState = <T extends Record<string, any>>(
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const { actions, ...updatesWithoutActions } = updates as any; const { actions, ...updatesWithoutActions } = updates as any;
merge(state, updatesWithoutActions); // Use mergeWith to replace arrays instead of merging them by index
mergeWith(state, updatesWithoutActions, (_objValue, srcValue) => {
// If source value is an array, replace the entire array instead of merging
if (Array.isArray(srcValue)) {
return srcValue;
}
// Default merge behavior
return undefined;
});
}; };
const HomeItemSchema = z.enum([ const HomeItemSchema = z.enum([
@@ -331,6 +341,7 @@ const AudioMotionAnalyzerSettingsSchema = z.object({
peakLine: z.boolean(), peakLine: z.boolean(),
presets: z.array( presets: z.array(
z.object({ z.object({
id: z.string(),
name: z.string(), name: z.string(),
value: z.any(), value: z.any(),
}), }),
@@ -1928,10 +1939,29 @@ export const useSettingsStore = createWithEqualityFn<SettingsSlice>()(
} }
} }
if (version <= 19) {
// Add IDs to presets that don't have them
if (
state.visualizer?.audiomotionanalyzer?.presets &&
Array.isArray(state.visualizer.audiomotionanalyzer.presets)
) {
state.visualizer.audiomotionanalyzer.presets =
state.visualizer.audiomotionanalyzer.presets.map((preset) => {
if (!preset.id) {
return {
...preset,
id: nanoid(),
};
}
return preset;
});
}
}
return persistedState; return persistedState;
}, },
name: 'store_settings', name: 'store_settings',
version: 19, version: 20,
}, },
), ),
); );