fix(ui): prevent infinite loop in GenreFilterButton
Use onMount instead of $effect to load genres once. Add initialized flag to prevent onFilterChange from firing during initial subscription setup, which was causing loadHome -> re-render -> loadGenres -> notify -> loadHome loop.
This commit is contained in:
1 parent
733a12d702
commit
d37b4ef7ff
1 file changed
+16
-11
@@ -1,4 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
import { SlidersHorizontal } from 'lucide-svelte';
|
||||
import GenreFilterPopup from './GenreFilterPopup.svelte';
|
||||
import {
|
||||
@@ -20,26 +21,30 @@
|
||||
let buttonEl: HTMLButtonElement | null = null;
|
||||
let hasFilter = $state(false);
|
||||
let selectedGenreName = $state<string | null>(null);
|
||||
let initialized = false;
|
||||
|
||||
// Subscribe to filter changes
|
||||
$effect(() => {
|
||||
onMount(() => {
|
||||
// Load genres once on mount
|
||||
loadGenres();
|
||||
|
||||
// Initialize state
|
||||
hasFilter = hasActiveFilter();
|
||||
updateSelectedName();
|
||||
initialized = true;
|
||||
|
||||
// Subscribe to filter changes
|
||||
const unsubscribe = subscribeGenre(() => {
|
||||
hasFilter = hasActiveFilter();
|
||||
updateSelectedName();
|
||||
onFilterChange?.();
|
||||
// Only notify parent after initialization to prevent infinite loops
|
||||
if (initialized) {
|
||||
onFilterChange?.();
|
||||
}
|
||||
});
|
||||
|
||||
hasFilter = hasActiveFilter();
|
||||
updateSelectedName();
|
||||
|
||||
return unsubscribe;
|
||||
});
|
||||
|
||||
// Load genres on mount
|
||||
$effect(() => {
|
||||
loadGenres();
|
||||
});
|
||||
|
||||
function updateSelectedName() {
|
||||
const selectedIds = getSelectedGenreIds();
|
||||
if (selectedIds.size === 1) {
|
||||
|
||||
Reference in new issue
Block a user