one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 9.42 kB
Source Map (JSON)
{"version":3,"file":"ScrollBehavior.js","names":[],"sources":["esm/views/ScrollBehavior.js"],"sourcesContent":["import { useIsFocused } from \"@react-navigation/core\";\nimport { useContext, useEffect, useLayoutEffect } from \"react\";\nimport { RouteInfoContext } from \"../router/RouteInfoContext\";\nimport { setLastAction } from \"../router/lastAction\";\nimport {\n routeInfo,\n subscribeToLoadingState,\n subscribeToRootState\n} from \"../router/router\";\nconst KEY = \"one-sr\";\nconst GROUP_KEY = \"one-sr-groups\";\nconst getState = () => JSON.parse(sessionStorage.getItem(KEY) || \"{}\");\nconst getGroupState = () => JSON.parse(sessionStorage.getItem(GROUP_KEY) || \"{}\");\nlet activeGroups = /* @__PURE__ */ new Set();\nfunction registerScrollGroup(groupId) {\n activeGroups.add(groupId);\n return () => {\n activeGroups.delete(groupId);\n };\n}\nfunction getGroupKey(pathname) {\n let longestMatch = null;\n for (const group of activeGroups) {\n if ((pathname === group || pathname.startsWith(`${group}/`)) && (!longestMatch || group.length > longestMatch.length)) {\n longestMatch = group;\n }\n }\n return longestMatch;\n}\nfunction restorePosition(pathname) {\n try {\n const positions = getState();\n const saved = positions[pathname];\n if (typeof saved === \"number\") {\n setTimeout(() => {\n window.scrollTo(0, saved);\n });\n }\n } catch (error) {\n console.error(`Error restoring scroll position`, error);\n sessionStorage.removeItem(KEY);\n }\n}\nfunction restoreGroupPosition(groupId) {\n try {\n const positions = getGroupState();\n const saved = positions[groupId];\n if (typeof saved === \"number\") {\n setTimeout(() => {\n window.scrollTo(0, saved);\n });\n }\n } catch (error) {\n console.error(`Error restoring scroll position for group ${groupId}`, error);\n sessionStorage.removeItem(GROUP_KEY);\n }\n}\nlet didPop = false;\nlet previousPathname = null;\nfunction rememberScrollPosition() {\n didPop = false;\n const pathname = window.location.pathname;\n const state = getState();\n state[pathname] = window.scrollY;\n sessionStorage.setItem(KEY, JSON.stringify(state));\n const groupKey = getGroupKey(pathname);\n if (groupKey) {\n const groupState = getGroupState();\n groupState[groupKey] = window.scrollY;\n sessionStorage.setItem(GROUP_KEY, JSON.stringify(groupState));\n }\n previousPathname = pathname;\n}\nlet disable = null;\nlet pendingScroll = null;\nlet committedHref;\nfunction ScrollBehaviorRouteCommit() {\n const info = useContext(RouteInfoContext);\n const href = info?.unstable_globalHref;\n const focused = useIsFocused();\n useLayoutEffect(() => {\n if (!focused) return;\n committedHref = href;\n if (pendingScroll && pendingScroll.href === href) {\n const { apply } = pendingScroll;\n pendingScroll = null;\n apply();\n }\n });\n return null;\n}\nfunction configure(props) {\n if (typeof window === \"undefined\" || !window.addEventListener) {\n return;\n }\n disable?.();\n const initialLocation = `${window.location.pathname}${window.location.search}`;\n let isFirstStateChange = true;\n let handledLocation = initialLocation;\n previousPathname = window.location.pathname;\n const popStateController = new AbortController();\n window.addEventListener(\n \"popstate\",\n () => {\n didPop = true;\n setLastAction();\n },\n {\n signal: popStateController.signal\n }\n );\n const disposeOnLoadState = subscribeToLoadingState((state) => {\n if (state === \"loading\") {\n rememberScrollPosition();\n }\n });\n const disposeOnRootState = subscribeToRootState((state) => {\n const currentHref = routeInfo?.unstable_globalHref ?? \"\";\n const currentPathname = routeInfo?.pathname ?? \"\";\n if (isFirstStateChange) {\n isFirstStateChange = false;\n if (currentHref === initialLocation) {\n return;\n }\n }\n const { hash } = state;\n const location = `${currentHref}${hash || \"\"}`;\n if (location === handledLocation) {\n pendingScroll = null;\n return;\n }\n pendingScroll = null;\n if (state.linkOptions?.scroll === false) {\n handledLocation = location;\n previousPathname = currentPathname;\n return;\n }\n const restoring = didPop;\n const prevGroup = previousPathname ? getGroupKey(previousPathname) : null;\n const currentGroup = getGroupKey(currentPathname);\n const scrollGroup = state.linkOptions?.scrollGroup;\n pendingScroll = {\n href: currentHref,\n apply: () => {\n handledLocation = location;\n previousPathname = currentPathname;\n if (hash) {\n scrollToHash(hash);\n } else if (restoring) {\n if (props.disable !== \"restore\") {\n restorePosition(currentPathname);\n }\n } else if (prevGroup && currentGroup && prevGroup === currentGroup) {\n restoreGroupPosition(currentGroup);\n } else if (scrollGroup) {\n restoreGroupPosition(scrollGroup);\n } else {\n window.scrollTo(0, 0);\n }\n }\n };\n if (committedHref === currentHref) {\n const { apply } = pendingScroll;\n pendingScroll = null;\n apply();\n }\n });\n disable = () => {\n pendingScroll = null;\n popStateController.abort();\n disposeOnLoadState();\n disposeOnRootState();\n };\n return disable;\n}\nfunction scrollToHash(hash) {\n if (!hash || !hash.startsWith(\"#\")) return;\n const id = hash.slice(1);\n const el = document.getElementById(id);\n if (!el) return;\n el.scrollIntoView({ behavior: \"instant\" });\n}\nfunction ScrollBehavior(props) {\n if (process.env.VITE_ENVIRONMENT === \"client\") {\n useEffect(() => {\n if (window.location.hash) {\n scrollToHash(window.location.hash);\n }\n }, []);\n useEffect(() => {\n return configure(props);\n }, [props.disable]);\n }\n return null;\n}\nexport {\n ScrollBehavior,\n ScrollBehaviorRouteCommit,\n registerScrollGroup\n};\n//# sourceMappingURL=ScrollBehavior.js.map\n"],"mappings":"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"}