Skip to content

Commit cc69daf

Browse files
feat: update url on success
1 parent ce7e64b commit cc69daf

File tree

4 files changed

+40
-16
lines changed

4 files changed

+40
-16
lines changed

app/components/AppHeader.vue

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,17 @@ const isMobile = useIsMobile()
2222
const isSearchExpandedManually = shallowRef(false)
2323
const searchBoxRef = useTemplateRef('searchBoxRef')
2424
25-
const searchQuery = shallowRef('')
26-
watch(
27-
() => route.query.q,
28-
queryValue => {
29-
searchQuery.value = normalizeSearchParam(queryValue)
30-
},
31-
{ immediate: true },
32-
)
25+
const { searchQuery, updateSearchQuery } = usePackageSearchQuery()
3326
34-
async function handleSearchSubmit() {
35-
if (!searchQuery.value) {
27+
const router = useRouter()
28+
function handleSubmitSearch() {
29+
if (searchQuery.value === '') {
3630
return
3731
}
3832
39-
await navigateTo({
33+
router.replace({
4034
name: 'search',
41-
query: { q: searchQuery.value },
35+
query: { ...route.query, q: searchQuery.value },
4236
})
4337
}
4438
@@ -148,8 +142,9 @@ onKeyStroke(
148142
ref="searchBoxRef"
149143
class="max-w-sm"
150144
compact
151-
v-model="searchQuery"
152-
@submit="handleSearchSubmit"
145+
:model-value="searchQuery"
146+
@update:model-value="updateSearchQuery"
147+
@submit="handleSubmitSearch"
153148
@focus="handleSearchFocus"
154149
@blur="handleSearchBlur"
155150
/>

app/composables/npm/useNpmSearch.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export function packumentToSearchResult(
4141
export interface NpmSearchOptions {
4242
/** Number of results to fetch */
4343
size?: number
44+
onSuccess?: (result: { query: string }) => void
4445
}
4546

4647
export const emptySearchResponse = {
@@ -151,6 +152,8 @@ export function useNpmSearch(
151152
// Success - clear rate limit flag
152153
isRateLimited.value = false
153154

155+
opts.onSuccess?.({ query: q })
156+
154157
return { ...response, isStale }
155158
} catch (error: unknown) {
156159
// Detect rate limit errors. npm's 429 response doesn't include CORS headers,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { debounce } from 'perfect-debounce'
2+
3+
export function usePackageSearchQuery() {
4+
const searchQuery = useState<string>('package_search_query', () => '')
5+
6+
const route = useRoute()
7+
onMounted(() => {
8+
if (route.query.q) {
9+
searchQuery.value = normalizeSearchParam(route.query.q)
10+
}
11+
})
12+
13+
const updateSearchQuery = debounce((newSearchQuery: string) => {
14+
searchQuery.value = newSearchQuery
15+
}, 400)
16+
17+
return {
18+
searchQuery,
19+
updateSearchQuery,
20+
}
21+
}

app/pages/search.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ const updateUrlPage = debounce((page: number) => {
2929
})
3030
}, 500)
3131
32-
// The actual search query (from URL, used for API calls)
33-
const query = computed(() => normalizeSearchParam(route.query.q))
32+
const { searchQuery: query } = usePackageSearchQuery()
3433
3534
// Track if page just loaded (for hiding "Searching..." during view transition)
3635
const hasInteracted = shallowRef(false)
@@ -76,6 +75,12 @@ const {
7675
} = useNpmSearch(query, () => ({
7776
size: requestedSize.value,
7877
incremental: true,
78+
onSuccess: data => {
79+
router.replace({
80+
name: 'search',
81+
query: { ...route.query, q: data.query },
82+
})
83+
},
7984
}))
8085
8186
// Results to display (directly from incremental search)

0 commit comments

Comments
 (0)