@@ -113,8 +113,21 @@ function matchesSecurity(pkg: NpmSearchResult, security: SecurityFilter): boolea
113113 *
114114 */
115115export function useStructuredFilters ( options : UseStructuredFiltersOptions ) {
116+ const route = useRoute ( )
117+ const router = useRouter ( )
116118 const { packages, initialFilters, initialSort } = options
117119
120+ const searchQuery = shallowRef ( normalizeSearchParam ( route . query . q ) )
121+ watch (
122+ ( ) => route . query . q ,
123+ urlQuery => {
124+ const value = normalizeSearchParam ( urlQuery )
125+ if ( searchQuery . value !== value ) {
126+ searchQuery . value = value
127+ }
128+ } ,
129+ )
130+
118131 // Filter state
119132 const filters = ref < StructuredFilters > ( {
120133 ...DEFAULT_FILTERS ,
@@ -366,11 +379,17 @@ export function useStructuredFilters(options: UseStructuredFiltersOptions) {
366379 function addKeyword ( keyword : string ) {
367380 if ( ! filters . value . keywords . includes ( keyword ) ) {
368381 filters . value . keywords = [ ...filters . value . keywords , keyword ]
382+ const newQ = searchQuery . value
383+ ? `${ searchQuery . value . trim ( ) } keyword:${ keyword } `
384+ : `keyword:${ keyword } `
385+ router . replace ( { query : { ...route . query , q : newQ } } )
369386 }
370387 }
371388
372389 function removeKeyword ( keyword : string ) {
373390 filters . value . keywords = filters . value . keywords . filter ( k => k !== keyword )
391+ const newQ = searchQuery . value . replace ( new RegExp ( `keyword:${ keyword } ($| )` , 'g' ) , '' ) . trim ( )
392+ router . replace ( { query : { ...route . query , q : newQ || undefined } } )
374393 }
375394
376395 function toggleKeyword ( keyword : string ) {
0 commit comments