From 33d3429060601dd3cdbaf006ca3f40d32f7ed504 Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Sun, 24 May 2026 15:08:54 +0300 Subject: [PATCH] refactor(GetFonts): consolidate filtersStore wiring into bindings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the filtersStore → filterManager.setGroups $effect.root out of manager.svelte.ts into bindings.svelte.ts so all cross-store reactive wiring for the feature lives in one place. manager.svelte.ts now only constructs and exports the singleton. --- .../GetFonts/model/state/bindings.svelte.ts | 25 ++++++++++++++ .../GetFonts/model/state/manager.svelte.ts | 33 +++---------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/features/GetFonts/model/state/bindings.svelte.ts b/src/features/GetFonts/model/state/bindings.svelte.ts index c5f4905..ab17a10 100644 --- a/src/features/GetFonts/model/state/bindings.svelte.ts +++ b/src/features/GetFonts/model/state/bindings.svelte.ts @@ -13,9 +13,34 @@ import { fontStore } from '$entities/Font'; import { untrack } from 'svelte'; import { mapManagerToParams } from '../../lib/mapper/mapManagerToParams'; import { sortStore } from '../store/sortStore.svelte'; +import { filtersStore } from './filters.svelte'; import { filterManager } from './manager.svelte'; $effect.root(() => { + /** + * Populate filterManager groups when backend filter metadata resolves. + * filtersStore is async; until it loads, filterManager has empty groups + * and the UI renders nothing for them. + */ + $effect(() => { + const dynamicFilters = filtersStore.filters; + + if (dynamicFilters.length > 0) { + filterManager.setGroups( + dynamicFilters.map(filter => ({ + id: filter.id, + label: filter.name, + properties: filter.options.sort((a, b) => b.count - a.count).map(opt => ({ + id: opt.id, + name: opt.name, + value: opt.value, + selected: false, + })), + })), + ); + } + }); + /** * Mirror filter selections + debounced search query into fontStore params. * untrack the write so fontStore's internal $state reads don't feed back diff --git a/src/features/GetFonts/model/state/manager.svelte.ts b/src/features/GetFonts/model/state/manager.svelte.ts index 143e045..ed495dc 100644 --- a/src/features/GetFonts/model/state/manager.svelte.ts +++ b/src/features/GetFonts/model/state/manager.svelte.ts @@ -1,39 +1,14 @@ /** - * Filter manager singleton + * Filter manager singleton. * - * Creates filterManager with empty groups initially, then reactively - * populates groups when filtersStore loads data from backend. + * Constructed with empty groups; the filtersStore → filterManager wiring + * lives in `./bindings.svelte` and populates groups once the backend + * filter metadata arrives. */ import { createFilterManager } from '../../lib/filterManager/filterManager.svelte'; -import { filtersStore } from './filters.svelte'; export const filterManager = createFilterManager({ queryValue: '', groups: [], }); - -/** - * Reactively sync backend filter metadata into filterManager groups. - * When filtersStore.filters resolves, setGroups replaces the empty groups. - */ -$effect.root(() => { - $effect(() => { - const dynamicFilters = filtersStore.filters; - - if (dynamicFilters.length > 0) { - filterManager.setGroups( - dynamicFilters.map(filter => ({ - id: filter.id, - label: filter.name, - properties: filter.options.sort((a, b) => b.count - a.count).map(opt => ({ - id: opt.id, - name: opt.name, - value: opt.value, - selected: false, - })), - })), - ); - } - }); -});