1- import { useMemo } from 'react' ;
1+ import { useCallback , useMemo } from 'react' ;
22import { X } from 'lucide-react' ;
3+ import posthog from 'posthog-js' ;
34
45import type { ToolRowData } from '@/components/table/Columns' ;
56import { DataTable } from '@/components/table/DataTable' ;
@@ -27,6 +28,51 @@ export function FilterableToolsList({ tools }: FilterableToolsListProps) {
2728 const availableLanguages = useMemo ( ( ) => extractLanguages ( tools ) , [ tools ] ) ;
2829 const availablePlatforms = useMemo ( ( ) => extractPlatforms ( tools ) , [ tools ] ) ;
2930
31+ // Determine filter type (language vs platform)
32+ const getFilterType = useCallback (
33+ ( value : string ) : 'language' | 'platform' => {
34+ return availablePlatforms . some ( ( p ) => p . value === value )
35+ ? 'platform'
36+ : 'language' ;
37+ } ,
38+ [ availablePlatforms ]
39+ ) ;
40+
41+ // Track filter changes
42+ const handleToggleLanguage = useCallback (
43+ ( value : string ) => {
44+ const isRemoving = selectedLanguages . includes ( value ) ;
45+
46+ // Calculate what the filtered count will be after this change
47+ const newSelected = isRemoving
48+ ? selectedLanguages . filter ( ( l ) => l !== value )
49+ : [ ...selectedLanguages , value ] ;
50+ const newFilteredTools = filterToolsByLanguages ( tools , newSelected ) ;
51+
52+ posthog . capture ( 'filter_applied' , {
53+ filter_type : getFilterType ( value ) ,
54+ filter_value : value ,
55+ action : isRemoving ? 'removed' : 'added' ,
56+ total_results : newFilteredTools . length ,
57+ } ) ;
58+
59+ toggleLanguage ( value ) ;
60+ } ,
61+ [ selectedLanguages , toggleLanguage , tools , getFilterType ]
62+ ) ;
63+
64+ const handleClearFilters = useCallback ( ( ) => {
65+ if ( selectedLanguages . length > 0 ) {
66+ posthog . capture ( 'filter_applied' , {
67+ filter_type : 'language' ,
68+ filter_value : 'all' ,
69+ action : 'cleared' ,
70+ total_results : tools . length ,
71+ } ) ;
72+ }
73+ clearFilters ( ) ;
74+ } , [ selectedLanguages . length , clearFilters , tools . length ] ) ;
75+
3076 // Filter tools based on selected languages (includes both languages and platforms)
3177 const filteredTools = useMemo (
3278 ( ) => filterToolsByLanguages ( tools , selectedLanguages ) ,
@@ -58,13 +104,13 @@ export function FilterableToolsList({ tools }: FilterableToolsListProps) {
58104 title = "Languages"
59105 options = { availableLanguages }
60106 selectedValues = { selectedLanguages }
61- onToggle = { toggleLanguage }
107+ onToggle = { handleToggleLanguage }
62108 />
63109 < FilterPopover
64110 title = "Platforms"
65111 options = { availablePlatforms }
66112 selectedValues = { selectedLanguages }
67- onToggle = { toggleLanguage }
113+ onToggle = { handleToggleLanguage }
68114 />
69115
70116 { hasFilters && (
@@ -77,7 +123,7 @@ export function FilterableToolsList({ tools }: FilterableToolsListProps) {
77123 key = { value }
78124 variant = "secondary"
79125 className = "cursor-pointer bg-slate-200 text-slate-700 hover:bg-slate-300 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-slate-600"
80- onClick = { ( ) => toggleLanguage ( value ) }
126+ onClick = { ( ) => handleToggleLanguage ( value ) }
81127 >
82128 { option ?. label || value }
83129 < X className = "ml-1 h-3 w-3" />
@@ -88,7 +134,7 @@ export function FilterableToolsList({ tools }: FilterableToolsListProps) {
88134 < Button
89135 variant = "ghost"
90136 size = "sm"
91- onClick = { clearFilters }
137+ onClick = { handleClearFilters }
92138 className = "h-8 px-2 text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-200"
93139 >
94140 Clear all
0 commit comments