Skip to content

Commit d5a4f2e

Browse files
committed
fix for routes without using ...prev
1 parent f4bef0f commit d5a4f2e

File tree

1 file changed

+128
-35
lines changed

1 file changed

+128
-35
lines changed

src/components/DocsLayout.tsx

Lines changed: 128 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ const useLocalCurrentFramework = create<{
5757
*/
5858
function useCurrentFramework(frameworks: Framework[]) {
5959
const navigate = useNavigate()
60+
const matches = useMatches()
61+
const lastMatch = last(matches)
62+
const { libraryId, version } = useParams({
63+
from: '/$libraryId/$version/docs',
64+
})
6065

6166
const { framework: paramsFramework } = useParams({
6267
strict: false,
@@ -72,15 +77,29 @@ function useCurrentFramework(frameworks: Framework[]) {
7277

7378
const setFramework = React.useCallback(
7479
(framework: string) => {
80+
const currentPath = lastMatch.pathname
81+
const frameworkIndex = currentPath.indexOf('/framework/')
82+
83+
if (frameworkIndex === -1) {
84+
// If we're not on a framework path, just update the framework in localStorage
85+
localCurrentFramework.setCurrentFramework(framework)
86+
return
87+
}
88+
89+
const pathAfterFramework = currentPath.slice(frameworkIndex + '/framework/'.length).split('/').slice(1).join('/')
90+
7591
navigate({
76-
params: (prev) => ({
77-
...prev,
92+
to: '/$libraryId/$version/docs/framework/$framework/$',
93+
params: {
94+
libraryId,
95+
version: version || 'latest',
7896
framework,
79-
}),
97+
_splat: pathAfterFramework,
98+
},
8099
})
81100
localCurrentFramework.setCurrentFramework(framework)
82101
},
83-
[localCurrentFramework, navigate]
102+
[localCurrentFramework, navigate, libraryId, version, lastMatch.pathname]
84103
)
85104

86105
React.useEffect(() => {
@@ -128,6 +147,9 @@ const useLocalCurrentVersion = create<{
128147
*/
129148
function useCurrentVersion(versions: string[]) {
130149
const navigate = useNavigate()
150+
const { libraryId } = useParams({
151+
from: '/$libraryId/$version/docs',
152+
})
131153

132154
const { version: paramsVersion } = useParams({
133155
strict: false,
@@ -142,14 +164,15 @@ function useCurrentVersion(versions: string[]) {
142164
const setVersion = React.useCallback(
143165
(version: string) => {
144166
navigate({
145-
params: (prev: Record<string, string>) => ({
146-
...prev,
167+
to: '/$libraryId/$version/docs',
168+
params: {
169+
libraryId,
147170
version,
148-
}),
171+
},
149172
})
150173
localCurrentVersion.setCurrentVersion(version)
151174
},
152-
[localCurrentVersion, navigate]
175+
[localCurrentVersion, navigate, libraryId]
153176
)
154177

155178
React.useEffect(() => {
@@ -326,9 +349,12 @@ export function DocsLayout({
326349
children,
327350
}: DocsLayoutProps) {
328351
const params = useParams({ strict: false })
329-
const libraryId = params.libraryId || ''
330-
352+
const { libraryId } = useParams({
353+
from: '/$libraryId/$version/docs',
354+
})
331355
const { _splat } = params
356+
357+
const { framework: currentFramework } = useCurrentFramework(frameworks)
332358
const frameworkConfig = useFrameworkConfig({ frameworks })
333359
const versionConfig = useVersionConfig({ versions })
334360
const menuConfig = useMenuConfig({ config, frameworks, repo })
@@ -402,12 +428,21 @@ export function DocsLayout({
402428
to={
403429
child.to.startsWith('/')
404430
? child.to
431+
: child.to.includes('framework/')
432+
? '/$libraryId/$version/docs/framework/$framework/$'
405433
: '/$libraryId/$version/docs/$'
406434
}
407435
params={{
408436
libraryId,
409437
version: params.version || 'latest',
410-
_splat: child.to,
438+
...(child.to.includes('framework/')
439+
? {
440+
framework: currentFramework,
441+
_splat: child.to.split('/').slice(2).join('/'),
442+
}
443+
: {
444+
_splat: child.to,
445+
}),
411446
}}
412447
onClick={() => {
413448
detailsRef.current.removeAttribute('open')
@@ -580,34 +615,92 @@ export function DocsLayout({
580615
<div className="sticky flex items-center flex-wrap bottom-2 z-10 right-0 text-xs md:text-sm px-1 print:hidden">
581616
<div className="w-1/2 px-1 flex justify-end flex-wrap">
582617
{prevItem ? (
583-
<Link
584-
to={prevItem.to}
585-
params
586-
className="py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
587-
>
588-
<div className="flex gap-2 items-center font-bold">
589-
<FaArrowLeft />
590-
{prevItem.label}
591-
</div>
592-
</Link>
618+
prevItem.to.startsWith('http') ? (
619+
<a
620+
href={prevItem.to}
621+
className="py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
622+
>
623+
<div className="flex gap-2 items-center font-bold">
624+
<FaArrowLeft />
625+
{prevItem.label}
626+
</div>
627+
</a>
628+
) : (
629+
<Link
630+
to={prevItem.to.startsWith('/')
631+
? prevItem.to
632+
: prevItem.to.includes('framework/')
633+
? '/$libraryId/$version/docs/framework/$framework/$'
634+
: '/$libraryId/$version/docs/$'}
635+
params={{
636+
libraryId,
637+
version: params.version || 'latest',
638+
...(prevItem.to.includes('framework/')
639+
? {
640+
framework: currentFramework,
641+
_splat: prevItem.to.split('/').slice(2).join('/'),
642+
}
643+
: {
644+
_splat: prevItem.to,
645+
}),
646+
}}
647+
className="py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
648+
>
649+
<div className="flex gap-2 items-center font-bold">
650+
<FaArrowLeft />
651+
{prevItem.label}
652+
</div>
653+
</Link>
654+
)
593655
) : null}
594656
</div>
595657
<div className="w-1/2 px-1 flex justify-start flex-wrap">
596658
{nextItem ? (
597-
<Link
598-
to={nextItem.to}
599-
params
600-
className="py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
601-
>
602-
<div className="flex gap-2 items-center font-bold">
603-
<span
604-
className={`bg-gradient-to-r ${colorFrom} ${colorTo} bg-clip-text text-transparent`}
605-
>
606-
{nextItem.label}
607-
</span>{' '}
608-
<FaArrowRight className={textColor} />
609-
</div>
610-
</Link>
659+
nextItem.to.startsWith('http') ? (
660+
<a
661+
href={nextItem.to}
662+
className="py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
663+
>
664+
<div className="flex gap-2 items-center font-bold">
665+
<span
666+
className={`bg-gradient-to-r ${colorFrom} ${colorTo} bg-clip-text text-transparent`}
667+
>
668+
{nextItem.label}
669+
</span>{' '}
670+
<FaArrowRight className={textColor} />
671+
</div>
672+
</a>
673+
) : (
674+
<Link
675+
to={nextItem.to.startsWith('/')
676+
? nextItem.to
677+
: nextItem.to.includes('framework/')
678+
? '/$libraryId/$version/docs/framework/$framework/$'
679+
: '/$libraryId/$version/docs/$'}
680+
params={{
681+
libraryId,
682+
version: params.version || 'latest',
683+
...(nextItem.to.includes('framework/')
684+
? {
685+
framework: currentFramework,
686+
_splat: nextItem.to.split('/').slice(2).join('/'),
687+
}
688+
: {
689+
_splat: nextItem.to,
690+
}),
691+
}}
692+
className="py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
693+
>
694+
<div className="flex gap-2 items-center font-bold">
695+
<span
696+
className={`bg-gradient-to-r ${colorFrom} ${colorTo} bg-clip-text text-transparent`}
697+
>
698+
{nextItem.label}
699+
</span>{' '}
700+
<FaArrowRight className={textColor} />
701+
</div>
702+
</Link>
703+
)
611704
) : null}
612705
</div>
613706
</div>

0 commit comments

Comments
 (0)