Skip to content

Commit 91aaf01

Browse files
Adebesin-Cellclaude
andcommitted
fix: persist allPackageNames in Nuxt payload for client hydration
shallowRef state doesn't transfer from SSR to client, so loadMore() had no package names to work with after hydration. Fix by including allPackageNames in the async data response (transferred via Nuxt payload) and reading from it instead of a separate shallowRef. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 68fe83b commit 91aaf01

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

app/composables/npm/useOrgPackages.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ const ALGOLIA_BATCH_SIZE = 1000
1111
export interface OrgPackagesResponse extends NpmSearchResponse {
1212
/** Total number of packages in the org (may exceed objects.length before loadAll) */
1313
totalPackages: number
14+
/** All package names in the org (used by loadMore to know what to fetch next) */
15+
allPackageNames: string[]
1416
}
1517

1618
function emptyOrgResponse(): OrgPackagesResponse {
1719
return {
1820
...emptySearchResponse(),
1921
totalPackages: 0,
22+
allPackageNames: [],
2023
}
2124
}
2225

@@ -37,8 +40,6 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
3740
})
3841
const { getPackagesByNameSlice } = useAlgoliaSearch()
3942

40-
// Tracks all package names so loadAll() knows what to fetch
41-
const allNames = shallowRef<string[]>([])
4243
const loadedObjects = shallowRef<NpmSearchResult[]>([])
4344

4445
// Promise lock — scoped inside the composable to avoid cross-instance sharing
@@ -76,12 +77,10 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
7677
}
7778

7879
if (packageNames.length === 0) {
79-
allNames.value = []
8080
loadedObjects.value = []
8181
return emptyOrgResponse()
8282
}
8383

84-
allNames.value = packageNames
8584
const initialNames = packageNames.slice(0, INITIAL_BATCH_SIZE)
8685

8786
// Fetch metadata for first batch
@@ -129,16 +128,22 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
129128
objects: initialObjects,
130129
total: initialObjects.length,
131130
totalPackages: packageNames.length,
131+
allPackageNames: packageNames,
132132
time: new Date().toISOString(),
133133
} satisfies OrgPackagesResponse
134134
},
135135
{ default: emptyOrgResponse },
136136
)
137137

138+
/** Read allPackageNames from async data (survives SSR→client hydration via Nuxt payload). */
139+
function allPackageNames(): string[] {
140+
return asyncData.data.value?.allPackageNames ?? []
141+
}
142+
138143
/** Load the next batch of packages (default: 1 Algolia batch of 1000). */
139144
async function loadMore(count: number = ALGOLIA_BATCH_SIZE): Promise<void> {
140145
const loadedSet = new Set(loadedObjects.value.map(o => o.package.name))
141-
if (loadedSet.size >= allNames.value.length) return
146+
if (loadedSet.size >= allPackageNames().length) return
142147

143148
// Reuse in-flight promise to prevent duplicate fetches
144149
if (loadAllPromise) {
@@ -156,13 +161,13 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
156161

157162
/** Load ALL remaining packages (used when filters need the full dataset). */
158163
async function loadAll(): Promise<void> {
159-
const remaining = allNames.value.length - loadedObjects.value.length
164+
const remaining = allPackageNames().length - loadedObjects.value.length
160165
if (remaining <= 0) return
161166
await loadMore(remaining)
162167
}
163168

164169
async function _doLoadMore(count: number): Promise<void> {
165-
const names = allNames.value
170+
const names = allPackageNames()
166171
const current = loadedObjects.value
167172
const loadedSet = new Set(current.map(o => o.package.name))
168173
const remainingNames = names.filter(n => !loadedSet.has(n)).slice(0, count)
@@ -219,6 +224,7 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
219224
objects: all,
220225
total: all.length,
221226
totalPackages: names.length,
227+
allPackageNames: names,
222228
time: new Date().toISOString(),
223229
}
224230
}

0 commit comments

Comments
 (0)