Skip to content

Commit fe82494

Browse files
Merge pull request #31524 from yatishgoel/fix/storybook-nextjs-array-params
Core: Support array-based catch-all Next.js route segments in AppRouterProvider
2 parents 588b3b1 + 3ef9c74 commit fe82494

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

code/frameworks/nextjs-vite/src/routing/app-router-provider.tsx

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ function getSelectedParams(currentTree: FlightRouterState, params: Params = {}):
4848
const isCatchAll = isDynamicParameter && (segment[2] === 'c' || segment[2] === 'oc');
4949

5050
if (isCatchAll) {
51-
params[segment[0]] = segment[1].split('/');
51+
params[segment[0]] = Array.isArray(segment[1]) ? segment[1] : segment[1].split('/');
5252
} else if (isDynamicParameter) {
5353
params[segment[0]] = segment[1];
5454
}
@@ -77,8 +77,33 @@ export const AppRouterProvider: React.FC<React.PropsWithChildren<AppRouterProvid
7777

7878
const tree: FlightRouterState = [pathname, { children: getParallelRoutes([...segments]) }];
7979
const pathParams = useMemo(() => {
80-
return getSelectedParams(tree);
81-
}, [tree]);
80+
const params: Params = {};
81+
const currentSegments = routeParams.segments;
82+
83+
if (currentSegments) {
84+
if (Array.isArray(currentSegments)) {
85+
for (const segmentEntry of currentSegments) {
86+
if (
87+
Array.isArray(segmentEntry) &&
88+
segmentEntry.length === 2 &&
89+
typeof segmentEntry[0] === 'string'
90+
) {
91+
const key: string = segmentEntry[0];
92+
const value = segmentEntry[1] as string | string[] | undefined;
93+
params[key] = value;
94+
}
95+
}
96+
} else if (typeof currentSegments === 'object' && !Array.isArray(currentSegments)) {
97+
const segmentObject = currentSegments as Record<string, string | string[] | undefined>;
98+
for (const key in segmentObject) {
99+
if (Object.prototype.hasOwnProperty.call(segmentObject, key)) {
100+
params[key] = segmentObject[key];
101+
}
102+
}
103+
}
104+
}
105+
return params;
106+
}, [routeParams.segments]);
82107

83108
const newLazyCacheNode = {
84109
lazyData: null,

code/frameworks/nextjs/src/routing/app-router-provider.tsx

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ function getSelectedParams(currentTree: FlightRouterState, params: Params = {}):
4848
const isCatchAll = isDynamicParameter && (segment[2] === 'c' || segment[2] === 'oc');
4949

5050
if (isCatchAll) {
51-
params[segment[0]] = segment[1].split('/');
51+
params[segment[0]] = Array.isArray(segment[1]) ? segment[1] : segment[1].split('/');
5252
} else if (isDynamicParameter) {
5353
params[segment[0]] = segment[1];
5454
}
@@ -77,8 +77,33 @@ export const AppRouterProvider: React.FC<React.PropsWithChildren<AppRouterProvid
7777

7878
const tree: FlightRouterState = [pathname, { children: getParallelRoutes([...segments]) }];
7979
const pathParams = useMemo(() => {
80-
return getSelectedParams(tree);
81-
}, [tree]);
80+
const params: Params = {};
81+
const currentSegments = routeParams.segments;
82+
83+
if (currentSegments) {
84+
if (Array.isArray(currentSegments)) {
85+
for (const segmentEntry of currentSegments) {
86+
if (
87+
Array.isArray(segmentEntry) &&
88+
segmentEntry.length === 2 &&
89+
typeof segmentEntry[0] === 'string'
90+
) {
91+
const key: string = segmentEntry[0];
92+
const value = segmentEntry[1] as string | string[] | undefined;
93+
params[key] = value;
94+
}
95+
}
96+
} else if (typeof currentSegments === 'object' && !Array.isArray(currentSegments)) {
97+
const segmentObject = currentSegments as Record<string, string | string[] | undefined>;
98+
for (const key in segmentObject) {
99+
if (Object.prototype.hasOwnProperty.call(segmentObject, key)) {
100+
params[key] = segmentObject[key];
101+
}
102+
}
103+
}
104+
}
105+
return params;
106+
}, [routeParams.segments]);
82107

83108
const newLazyCacheNode = {
84109
lazyData: null,

0 commit comments

Comments
 (0)