Skip to content

Commit 0dee0f5

Browse files
enkoclaude
andcommitted
refactor(frontend): Split friends.ts store into focused modules
Splits the 806-line friends.ts into three focused files: - friends.ts (194 lines) — core friend CRUD, derived stores, re-exports - friendSubresources.ts (542 lines) — all subresource CRUD operations - friendListFilter.ts (94 lines) — filter/search state persistence All existing imports from '$lib/stores/friends' continue to work unchanged via re-exports. No consumer changes needed. Closes #113 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent abd7d2a commit 0dee0f5

File tree

3 files changed

+649
-621
lines changed

3 files changed

+649
-621
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { derived, writable } from 'svelte/store';
2+
import type { FacetFilters } from '$shared';
3+
4+
interface FriendListFilterState {
5+
query: string;
6+
filters: FacetFilters;
7+
}
8+
9+
const initialFilterState: FriendListFilterState = {
10+
query: '',
11+
filters: {},
12+
};
13+
14+
function createFriendListFilterStore() {
15+
const { subscribe, set, update } = writable<FriendListFilterState>(initialFilterState);
16+
17+
return {
18+
subscribe,
19+
20+
setQuery: (query: string) => {
21+
update((state) => ({ ...state, query }));
22+
},
23+
24+
setFilters: (filters: FacetFilters) => {
25+
update((state) => ({ ...state, filters }));
26+
},
27+
28+
setState: (query: string, filters: FacetFilters) => {
29+
set({ query, filters });
30+
},
31+
32+
clear: () => {
33+
set(initialFilterState);
34+
},
35+
36+
buildSearchParams: (state: FriendListFilterState): URLSearchParams => {
37+
const params = new URLSearchParams();
38+
39+
if (state.query.trim()) {
40+
params.set('q', state.query.trim());
41+
}
42+
43+
for (const [key, values] of Object.entries(state.filters)) {
44+
if (values && values.length > 0) {
45+
params.set(key, values.join(','));
46+
}
47+
}
48+
49+
return params;
50+
},
51+
52+
parseSearchParams: (params: URLSearchParams): FriendListFilterState => {
53+
const query = params.get('q') ?? '';
54+
const filters: FacetFilters = {};
55+
56+
const stringArrayKeys = [
57+
'country',
58+
'city',
59+
'organization',
60+
'job_title',
61+
'department',
62+
'circles',
63+
] as const;
64+
for (const key of stringArrayKeys) {
65+
const value = params.get(key);
66+
if (value) {
67+
filters[key] = value.split(',');
68+
}
69+
}
70+
71+
const relationshipCategory = params.get('relationship_category');
72+
if (relationshipCategory) {
73+
filters.relationship_category = relationshipCategory.split(',') as (
74+
| 'family'
75+
| 'professional'
76+
| 'social'
77+
)[];
78+
}
79+
80+
return { query, filters };
81+
},
82+
};
83+
}
84+
85+
export const friendListFilter = createFriendListFilterStore();
86+
87+
export const friendListQuery = derived(friendListFilter, ($filter) => $filter.query);
88+
89+
export const hasFriendListFilters = derived(
90+
friendListFilter,
91+
($filter) =>
92+
$filter.query.trim().length > 0 ||
93+
Object.values($filter.filters).some((arr) => arr && arr.length > 0),
94+
);

0 commit comments

Comments
 (0)