56 lines
1.4 KiB
Plaintext
56 lines
1.4 KiB
Plaintext
import * as React from 'react'
|
|
import { useRouter } from './useRouter'
|
|
import type {
|
|
AnyRouter,
|
|
FromPathOption,
|
|
NavigateOptions,
|
|
RegisteredRouter,
|
|
UseNavigateResult,
|
|
} from '@tanstack/router-core'
|
|
|
|
export function useNavigate<
|
|
TRouter extends AnyRouter = RegisteredRouter,
|
|
TDefaultFrom extends string = string,
|
|
>(_defaultOpts?: {
|
|
from?: FromPathOption<TRouter, TDefaultFrom>
|
|
}): UseNavigateResult<TDefaultFrom> {
|
|
const { navigate } = useRouter()
|
|
|
|
return React.useCallback(
|
|
(options: NavigateOptions) => {
|
|
return navigate({
|
|
from: _defaultOpts?.from,
|
|
...options,
|
|
})
|
|
},
|
|
[_defaultOpts?.from, navigate],
|
|
) as UseNavigateResult<TDefaultFrom>
|
|
}
|
|
|
|
export function Navigate<
|
|
TRouter extends AnyRouter = RegisteredRouter,
|
|
const TFrom extends string = string,
|
|
const TTo extends string | undefined = undefined,
|
|
const TMaskFrom extends string = TFrom,
|
|
const TMaskTo extends string = '',
|
|
>(props: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): null {
|
|
const router = useRouter()
|
|
|
|
const previousPropsRef = React.useRef<NavigateOptions<
|
|
TRouter,
|
|
TFrom,
|
|
TTo,
|
|
TMaskFrom,
|
|
TMaskTo
|
|
> | null>(null)
|
|
React.useEffect(() => {
|
|
if (previousPropsRef.current !== props) {
|
|
router.navigate({
|
|
...props,
|
|
})
|
|
previousPropsRef.current = props
|
|
}
|
|
}, [router, props])
|
|
return null
|
|
}
|