@shopify/shop-minis-react
Version:
React component library for Shopify Shop Minis with Tailwind CSS v4 support (source-only, requires TypeScript)
76 lines (65 loc) • 1.97 kB
text/typescript
import {useLocation, useNavigate, NavigateOptions} from 'react-router'
import {DATA_NAVIGATION_TYPE_ATTRIBUTE} from '../../types'
type UseNavigateWithTransitionReturns = (
to: string | number,
options?: NavigateOptions
) => void | Promise<void>
export function useNavigateWithTransition(): UseNavigateWithTransitionReturns {
const navigate = useNavigate()
const location = useLocation()
const transitionNavigate = (
to: string | number,
options?: NavigateOptions
) => {
if (typeof to === 'number') {
// Delta navigation - no options parameter
if (document.startViewTransition) {
const transition = document.startViewTransition(() => {
navigate(to)
})
transition.finished
.then(() => {
document.documentElement.removeAttribute(
DATA_NAVIGATION_TYPE_ATTRIBUTE
)
})
.catch(error => {
console.error('View transition error:', error)
})
} else {
return navigate(to)
}
return
}
const isSameRoute = to === location.pathname
const isNavigatingToHomeRoute = to === '/'
// Path navigation - with options
if (document.startViewTransition) {
const transition = document.startViewTransition(() => {
if (isNavigatingToHomeRoute) {
navigate(-window.history.state.idx)
} else {
navigate(to, {
replace: isSameRoute,
...options,
})
}
if (options?.preventScrollReset !== true) {
window.scrollTo(0, 0)
}
})
transition.finished
.then(() => {
document.documentElement.removeAttribute(
DATA_NAVIGATION_TYPE_ATTRIBUTE
)
})
.catch(error => {
console.error('View transition error:', error)
})
} else {
return navigate(to, options)
}
}
return transitionNavigate
}