11import { createMemo , createRenderEffect , onCleanup , type JSX } from 'solid-js'
22import { createElement , insert , setProp } from '@nativescript-community/solid-js'
3+ import type { AnyRouter , LinkOptions , RoutePaths } from '@tanstack/solid-router'
34import { useRouter , useMatchRoute } from '@tanstack/solid-router'
5+ import type { RegisteredRouter } from './register'
46import { resolveLinkTapAction , type LinkTapResult } from './link-action'
57import { MODAL_SEARCH_PARAM_KEY , withSingleModalPath } from './modal-state'
68import { closeModalFromRouterContext } from './modal-controller'
79
8- interface LinkProps {
9- to ?: string
10- params ?: Record < string , string >
11- search ?: Record < string , unknown > | ( ( prev : unknown ) => unknown )
12- state ?: true | Record < string , unknown > | ( ( prev : unknown ) => unknown )
13- hash ?: string
14- replace ?: boolean
10+ type LinkProps <
11+ TRouter extends AnyRouter = RegisteredRouter ,
12+ TFrom extends RoutePaths < TRouter [ 'routeTree' ] > | string = string ,
13+ TTo extends string | undefined = '.' ,
14+ TMaskFrom extends RoutePaths < TRouter [ 'routeTree' ] > | string = TFrom ,
15+ TMaskTo extends string = '.' ,
16+ > = Omit < LinkOptions < TRouter , TFrom , TTo , TMaskFrom , TMaskTo > , 'to' | 'state' > & {
17+ to ?: LinkOptions < TRouter , TFrom , TTo , TMaskFrom , TMaskTo > [ 'to' ]
18+ state ?: true | object | ( ( prev : unknown ) => unknown )
1519 back ?: boolean
1620 closeModal ?: boolean
1721 modalTo ?: string
18- fallbackTo ?: string
22+ fallbackTo ?: LinkOptions < TRouter , TFrom , TTo , TMaskFrom , TMaskTo > [ 'to' ]
1923 onTap ?: ( ) => LinkTapResult
2024 children : JSX . Element
2125 class ?: string
@@ -24,9 +28,11 @@ interface LinkProps {
2428 style ?: string
2529}
2630
31+ type AnyLinkProps = LinkProps < AnyRouter , string , string | undefined , string , string >
32+
2733function resolveNextState (
2834 prev : unknown ,
29- stateInput : LinkProps [ 'state' ] ,
35+ stateInput : AnyLinkProps [ 'state' ] ,
3036) : unknown {
3137 if ( stateInput === undefined || stateInput === true ) {
3238 return prev
@@ -51,7 +57,7 @@ function resolveNextState(
5157 }
5258}
5359
54- function resolveNavigateState ( stateInput : LinkProps [ 'state' ] ) : true | ( ( prev : any ) => any ) | undefined {
60+ function resolveNavigateState ( stateInput : AnyLinkProps [ 'state' ] ) : true | ( ( prev : any ) => any ) | undefined {
5561 if ( stateInput === undefined ) {
5662 return undefined
5763 }
@@ -63,7 +69,13 @@ function resolveNavigateState(stateInput: LinkProps['state']): true | ((prev: an
6369 return ( prev : any ) => resolveNextState ( prev , stateInput )
6470}
6571
66- export function Link ( props : LinkProps ) {
72+ export function Link <
73+ TRouter extends AnyRouter = RegisteredRouter ,
74+ const TFrom extends RoutePaths < TRouter [ 'routeTree' ] > | string = string ,
75+ const TTo extends string | undefined = '.' ,
76+ const TMaskFrom extends RoutePaths < TRouter [ 'routeTree' ] > | string = TFrom ,
77+ const TMaskTo extends string = '.' ,
78+ > ( props : LinkProps < TRouter , TFrom , TTo , TMaskFrom , TMaskTo > ) {
6779 const router = useRouter ( )
6880 const matchRoute = useMatchRoute ( )
6981
@@ -76,7 +88,7 @@ export function Link(props: LinkProps) {
7688 to : props . to as any ,
7789 params : props . params as any ,
7890 fuzzy : false ,
79- } )
91+ } ) ( )
8092 } )
8193
8294 const handleTap = ( ) => {
@@ -114,7 +126,7 @@ export function Link(props: LinkProps) {
114126 if ( props . modalTo ) {
115127 const modalTo = props . modalTo
116128 router . navigate ( {
117- to : props . to || '.' ,
129+ to : ( props . to || '.' ) as TTo ,
118130 params : props . params as any ,
119131 state : resolveNavigateState ( props . state ) ,
120132 hash : props . hash as any ,
@@ -134,6 +146,10 @@ export function Link(props: LinkProps) {
134146 return
135147 }
136148
149+ if ( typeof action . to !== 'string' ) {
150+ return
151+ }
152+
137153 router . navigate ( {
138154 to : action . to ,
139155 params : props . params as any ,
0 commit comments