UNPKG

@shopify/shop-minis-react

Version:

React component library for Shopify Shop Minis with Tailwind CSS v4 support (source-only, requires TypeScript)

80 lines (66 loc) 2.27 kB
import {useEffect} from 'react' import {useNavigationType, useLocation} from 'react-router' import {DATA_NAVIGATION_TYPE_ATTRIBUTE, NAVIGATION_TYPES} from '../../types' export function useViewTransitions() { const location = useLocation() const navType = useNavigationType() useEffect(() => { let isAndroidBackPress = false const handleAndroidBackPress = () => { isAndroidBackPress = true if (document.startViewTransition) { const transition = document.startViewTransition(() => { document.documentElement.setAttribute( DATA_NAVIGATION_TYPE_ATTRIBUTE, NAVIGATION_TYPES.backward ) }) transition.finished .then(() => { document.documentElement.removeAttribute( DATA_NAVIGATION_TYPE_ATTRIBUTE ) }) .catch(error => { console.error('View transition error:', error) }) } } const handlePopstate = (event: PopStateEvent) => { // If the ios back gesture is used, we don't want to trigger view transition if (event.hasUAVisualTransition && !isAndroidBackPress) { document.documentElement.setAttribute( DATA_NAVIGATION_TYPE_ATTRIBUTE, NAVIGATION_TYPES.none ) } } window.addEventListener('androidbackpressed', handleAndroidBackPress) window.addEventListener('popstate', handlePopstate) return () => { window.removeEventListener('popstate', handlePopstate) window.removeEventListener('androidbackpressed', handleAndroidBackPress) } }, [location]) useEffect(() => { const currentNavType = document.documentElement.getAttribute( DATA_NAVIGATION_TYPE_ATTRIBUTE ) if (!currentNavType) { if (navType === 'PUSH') { document.documentElement.setAttribute( DATA_NAVIGATION_TYPE_ATTRIBUTE, NAVIGATION_TYPES.forward ) } else if (navType === 'POP') { document.documentElement.setAttribute( DATA_NAVIGATION_TYPE_ATTRIBUTE, NAVIGATION_TYPES.backward ) } } return () => { document.documentElement.removeAttribute(DATA_NAVIGATION_TYPE_ATTRIBUTE) } }, [navType, location]) }