fix settings reset

- force reset by deleting local storage state and reloading the window
- the default reset functionality does not seem to work due to the persistence
This commit is contained in:
jeffvli
2026-01-17 01:53:08 -08:00
parent 18d56f32cf
commit 85a7df29db
3 changed files with 9 additions and 65 deletions
@@ -17,7 +17,9 @@ import { LibraryItem, RelatedAlbumArtist, Song } from '/@/shared/types/domain-ty
const AlbumArtistsColumn = (props: ItemTableListInnerColumn) => {
const rowItem = props.getRowItem?.(props.rowIndex) ?? (props.data as any[])[props.rowIndex];
const row: RelatedAlbumArtist[] | undefined = (rowItem as any)?.[props.columns[props.columnIndex].id];
const row: RelatedAlbumArtist[] | undefined = (rowItem as any)?.[
props.columns[props.columnIndex].id
];
const artists = useMemo(() => {
if (!row) return [];
@@ -66,8 +68,8 @@ const AlbumArtistsColumn = (props: ItemTableListInnerColumn) => {
};
const SongArtistsColumn = (props: ItemTableListInnerColumn) => {
const row: Song | undefined =
(props.getRowItem?.(props.rowIndex) ?? (props.data as any[])[props.rowIndex]) as Song | undefined;
const row: Song | undefined = (props.getRowItem?.(props.rowIndex) ??
(props.data as any[])[props.rowIndex]) as Song | undefined;
if (row) {
return (
@@ -61,7 +61,8 @@ const DefaultRowIndexColumn = (props: ItemTableListInnerColumn) => {
icon="arrowDownS"
iconProps={{ color: 'muted', size: 'md' }}
onClick={(e) => {
const item = (props.getRowItem?.(rowIndex) ?? data[rowIndex]) as ItemListItem;
const item = (props.getRowItem?.(rowIndex) ??
data[rowIndex]) as ItemListItem;
const rowId = internalState.extractRowId(item);
const index = rowId ? internalState.findItemIndex(rowId) : -1;
controls.onExpand?.({
+2 -61
View File
@@ -1628,73 +1628,14 @@ const initialState: SettingsState = {
},
};
// Helper function to create a deep clone of initialState
const getInitialState = (): SettingsState => {
const freshHomeItems = Object.values(HomeItem).map((item) => ({
disabled: false,
id: item,
}));
const freshArtistItems = Object.values(ArtistItem).map((item) => ({
disabled: false,
id: item,
}));
const freshArtistReleaseTypeItems = Object.values(ArtistReleaseTypeItem).map((item) => ({
disabled: false,
id: item,
}));
// Deep clone using JSON to ensure all nested objects/arrays are fresh copies
const clonedState = JSON.parse(JSON.stringify(initialState)) as SettingsState;
// Replace arrays that need fresh references
clonedState.general.homeItems = freshHomeItems;
clonedState.general.artistItems = freshArtistItems;
clonedState.general.artistReleaseTypeItems = freshArtistReleaseTypeItems;
clonedState.general.sidebarItems = JSON.parse(
JSON.stringify(sidebarItems),
) as SidebarItemType[];
// Regenerate random password for remote settings
clonedState.remote.password = randomString(8);
return clonedState;
};
export const useSettingsStore = createWithEqualityFn<SettingsSlice>()(
persist(
devtools(
immer((set) => ({
actions: {
reset: () => {
const freshState = getInitialState();
set((state) => {
// Deep clone the fresh state to ensure all nested objects/arrays are new references
const resetState = JSON.parse(
JSON.stringify(freshState),
) as SettingsState;
// Override playback type for web if not electron
if (!isElectron()) {
resetState.playback.type = PlayerType.WEB;
}
// Replace all state properties (except actions) with the reset state
state.css = resetState.css;
state.discord = resetState.discord;
state.font = resetState.font;
state.general = resetState.general;
state.hotkeys = resetState.hotkeys;
state.lists = resetState.lists;
state.lyrics = resetState.lyrics;
state.playback = resetState.playback;
state.queryBuilder = resetState.queryBuilder;
state.remote = resetState.remote;
state.tab = resetState.tab;
state.visualizer = resetState.visualizer;
state.window = resetState.window;
});
localStorage.removeItem('store_settings');
window.location.reload();
},
resetSampleRate: () => {
set((state) => {