@@ -17,6 +17,11 @@ import { useSearchContext } from '~/contexts/SearchContext'
1717import { libraries } from '~/libraries'
1818import { frameworkOptions } from '~/libraries/frameworks'
1919import { capitalize } from '~/utils/utils'
20+ import { useCurrentUserQuery } from '~/hooks/useCurrentUser'
21+ import {
22+ getStoredFrameworkPreference ,
23+ usePersistFrameworkPreference ,
24+ } from './FrameworkSelect'
2025
2126function decodeHtmlEntities ( str : string ) : string {
2227 const textarea = document . createElement ( 'textarea' )
@@ -87,8 +92,20 @@ function useSearchFilters() {
8792}
8893
8994function SearchFiltersProvider ( { children } : { children : React . ReactNode } ) {
95+ const userQuery = useCurrentUserQuery ( )
9096 const [ selectedLibrary , setSelectedLibrary ] = React . useState ( '' )
91- const [ selectedFramework , setSelectedFramework ] = React . useState ( '' )
97+
98+ // Get initial framework from user preference (DB if logged in, localStorage otherwise)
99+ const getInitialFramework = React . useCallback ( ( ) => {
100+ if ( userQuery . data ?. lastUsedFramework ) {
101+ return userQuery . data . lastUsedFramework
102+ }
103+ return getStoredFrameworkPreference ( ) || ''
104+ } , [ userQuery . data ?. lastUsedFramework ] )
105+
106+ const [ selectedFramework , setSelectedFramework ] = React . useState (
107+ getInitialFramework ,
108+ )
92109
93110 const { items : rawLibraryItems , refine : refineLibrary } = useMenu ( {
94111 attribute : 'library' ,
@@ -100,6 +117,27 @@ function SearchFiltersProvider({ children }: { children: React.ReactNode }) {
100117 limit : 50 ,
101118 } )
102119
120+ // Pre-filter by stored framework preference on mount (only if no URL framework)
121+ const hasPrefiltered = React . useRef ( false )
122+ const pathname = useRouterState ( {
123+ select : ( state ) => state . location . pathname ,
124+ } )
125+ const hasUrlFramework = pathname . includes ( '/framework/' )
126+
127+ React . useEffect ( ( ) => {
128+ // Don't pre-filter if URL already specifies a framework (let FrameworkRefinement handle it)
129+ if ( hasPrefiltered . current || hasUrlFramework ) return
130+ const storedFramework = getInitialFramework ( )
131+ if ( storedFramework && rawFrameworkItems . length > 0 ) {
132+ const item = rawFrameworkItems . find ( ( i ) => i . value === storedFramework )
133+ if ( item && ! item . isRefined ) {
134+ refineFramework ( storedFramework )
135+ setSelectedFramework ( storedFramework )
136+ hasPrefiltered . current = true
137+ }
138+ }
139+ } , [ rawFrameworkItems , refineFramework , getInitialFramework , hasUrlFramework ] )
140+
103141 // Sort items by their defined order
104142 const libraryItems = [ ...rawLibraryItems ] . sort ( ( a , b ) => {
105143 const aIndex = libraries . findIndex ( ( l ) => l . id === a . value )
@@ -456,6 +494,7 @@ function FrameworkRefinement() {
456494 frameworkItems : items ,
457495 } = useSearchFilters ( )
458496
497+ const persistFramework = usePersistFrameworkPreference ( )
459498 const hasAutoRefined = React . useRef ( false )
460499
461500 // Auto-refine based on current page
@@ -476,6 +515,10 @@ function FrameworkRefinement() {
476515 const handleChange = ( value : string ) => {
477516 setSelectedFramework ( value )
478517 refineFramework ( value )
518+ // Persist the framework preference (localStorage + DB if logged in)
519+ if ( value ) {
520+ persistFramework ( value )
521+ }
479522 }
480523
481524 const currentFramework = frameworkOptions . find (
@@ -777,6 +820,8 @@ function SearchResults({ focusedIndex }: { focusedIndex: number }) {
777820 frameworkItems,
778821 } = useSearchFilters ( )
779822
823+ const persistFramework = usePersistFrameworkPreference ( )
824+
780825 const algoliaRefinedLibrary =
781826 libraryItems . find ( ( item ) => item . isRefined ) ?. value || null
782827 const algoliaRefinedFramework =
@@ -879,6 +924,7 @@ function SearchResults({ focusedIndex }: { focusedIndex: number }) {
879924 onClick = { ( ) => {
880925 setSelectedFramework ( fw . value )
881926 refineFramework ( fw . value )
927+ persistFramework ( fw . value )
882928 } }
883929 className = "flex items-center gap-1.5 px-2 py-1 text-xs font-bold rounded bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"
884930 >
0 commit comments