MCPcopy Create free account
hub / github.com/apisyouwonthate/openapi.tools / useLanguageFilter

Function useLanguageFilter

src/hooks/useLanguageFilter.ts:5–56  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

3const QUERY_PARAM = 'languages';
4
5export function useLanguageFilter() {
6 const [selectedLanguages, setSelectedLanguages] = useState<string[]>([]);
7 const [isInitialized, setIsInitialized] = useState(false);
8
9 // Read from URL on mount (client-side only)
10 useEffect(() => {
11 if (typeof window === 'undefined') return;
12
13 const params = new URLSearchParams(window.location.search);
14 const languages = params.get(QUERY_PARAM);
15
16 if (languages) {
17 setSelectedLanguages(languages.split(',').filter(Boolean));
18 }
19 setIsInitialized(true);
20 }, []);
21
22 // Update URL when selection changes
23 useEffect(() => {
24 if (!isInitialized || typeof window === 'undefined') return;
25
26 const url = new URL(window.location.href);
27
28 if (selectedLanguages.length > 0) {
29 url.searchParams.set(QUERY_PARAM, selectedLanguages.join(','));
30 } else {
31 url.searchParams.delete(QUERY_PARAM);
32 }
33
34 window.history.replaceState({}, '', url.toString());
35 }, [selectedLanguages, isInitialized]);
36
37 const clearFilters = useCallback(() => {
38 setSelectedLanguages([]);
39 }, []);
40
41 const toggleLanguage = useCallback((language: string) => {
42 setSelectedLanguages((prev) =>
43 prev.includes(language)
44 ? prev.filter((l) => l !== language)
45 : [...prev, language]
46 );
47 }, []);
48
49 return {
50 selectedLanguages,
51 setSelectedLanguages,
52 toggleLanguage,
53 clearFilters,
54 isInitialized,
55 };
56}

Callers 2

FilterableToolsListFunction · 0.90
FilterableCollectionViewFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected