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:
vicrodh committed 2026-02-02 09:11:18 -06:00
1 parent 733a12d702
commit d37b4ef7ff
1 file changed
+16 -11
+16 -11
View File
@@ -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) {