one
Version:
One is a React framework for web, iOS, and Android apps.
240 lines (237 loc) • 7.82 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var ScrollBehavior_exports = {};
__export(ScrollBehavior_exports, {
ScrollBehavior: () => ScrollBehavior,
ScrollBehaviorRouteCommit: () => ScrollBehaviorRouteCommit,
registerScrollGroup: () => registerScrollGroup
});
module.exports = __toCommonJS(ScrollBehavior_exports);
var import_core = require("@react-navigation/core");
var import_react = require("react");
var import_RouteInfoContext = require("../router/RouteInfoContext.native.js");
var import_lastAction = require("../router/lastAction.native.js");
var import_router = require("../router/router.native.js");
var KEY = "one-sr";
var GROUP_KEY = "one-sr-groups";
var getState = function getState2() {
return JSON.parse(sessionStorage.getItem(KEY) || "{}");
};
var getGroupState = function getGroupState2() {
return JSON.parse(sessionStorage.getItem(GROUP_KEY) || "{}");
};
var activeGroups = /* @__PURE__ */ new Set();
function registerScrollGroup(groupId) {
activeGroups.add(groupId);
return function() {
activeGroups.delete(groupId);
};
}
function getGroupKey(pathname) {
var longestMatch = null;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = activeGroups[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var group = _step.value;
if ((pathname === group || pathname.startsWith(`${group}/`)) && (!longestMatch || group.length > longestMatch.length)) {
longestMatch = group;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return longestMatch;
}
function restorePosition(pathname) {
try {
var positions = getState();
var saved = positions[pathname];
if (typeof saved === "number") {
setTimeout(function() {
window.scrollTo(0, saved);
});
}
} catch (error) {
console.error(`Error restoring scroll position`, error);
sessionStorage.removeItem(KEY);
}
}
function restoreGroupPosition(groupId) {
try {
var positions = getGroupState();
var saved = positions[groupId];
if (typeof saved === "number") {
setTimeout(function() {
window.scrollTo(0, saved);
});
}
} catch (error) {
console.error(`Error restoring scroll position for group ${groupId}`, error);
sessionStorage.removeItem(GROUP_KEY);
}
}
var didPop = false;
var previousPathname = null;
function rememberScrollPosition() {
didPop = false;
var pathname = window.location.pathname;
var state = getState();
state[pathname] = window.scrollY;
sessionStorage.setItem(KEY, JSON.stringify(state));
var groupKey = getGroupKey(pathname);
if (groupKey) {
var groupState = getGroupState();
groupState[groupKey] = window.scrollY;
sessionStorage.setItem(GROUP_KEY, JSON.stringify(groupState));
}
previousPathname = pathname;
}
var disable = null;
var pendingScroll = null;
var committedHref;
function ScrollBehaviorRouteCommit() {
var info = (0, import_react.useContext)(import_RouteInfoContext.RouteInfoContext);
var href = info === null || info === void 0 ? void 0 : info.unstable_globalHref;
var focused = (0, import_core.useIsFocused)();
(0, import_react.useLayoutEffect)(function() {
if (!focused) return;
committedHref = href;
if (pendingScroll && pendingScroll.href === href) {
var { apply } = pendingScroll;
pendingScroll = null;
apply();
}
});
return null;
}
function configure(props) {
if (typeof window === "undefined" || !window.addEventListener) {
return;
}
disable === null || disable === void 0 ? void 0 : disable();
var initialLocation = `${window.location.pathname}${window.location.search}`;
var isFirstStateChange = true;
var handledLocation = initialLocation;
previousPathname = window.location.pathname;
var popStateController = new AbortController();
window.addEventListener("popstate", function() {
didPop = true;
(0, import_lastAction.setLastAction)();
}, { signal: popStateController.signal });
var disposeOnLoadState = (0, import_router.subscribeToLoadingState)(function(state) {
if (state === "loading") {
rememberScrollPosition();
}
});
var disposeOnRootState = (0, import_router.subscribeToRootState)(function(state) {
var _ref, _ref1;
var _state_linkOptions, _state_linkOptions1;
var currentHref = (_ref = import_router.routeInfo === null || import_router.routeInfo === void 0 ? void 0 : import_router.routeInfo.unstable_globalHref) !== null && _ref !== void 0 ? _ref : "";
var currentPathname = (_ref1 = import_router.routeInfo === null || import_router.routeInfo === void 0 ? void 0 : import_router.routeInfo.pathname) !== null && _ref1 !== void 0 ? _ref1 : "";
if (isFirstStateChange) {
isFirstStateChange = false;
if (currentHref === initialLocation) {
return;
}
}
var { hash } = state;
var location = `${currentHref}${hash || ""}`;
if (location === handledLocation) {
pendingScroll = null;
return;
}
pendingScroll = null;
if (((_state_linkOptions = state.linkOptions) === null || _state_linkOptions === void 0 ? void 0 : _state_linkOptions.scroll) === false) {
handledLocation = location;
previousPathname = currentPathname;
return;
}
var restoring = didPop;
var prevGroup = previousPathname ? getGroupKey(previousPathname) : null;
var currentGroup = getGroupKey(currentPathname);
var scrollGroup = (_state_linkOptions1 = state.linkOptions) === null || _state_linkOptions1 === void 0 ? void 0 : _state_linkOptions1.scrollGroup;
pendingScroll = {
href: currentHref,
apply: function apply2() {
handledLocation = location;
previousPathname = currentPathname;
if (hash) {
scrollToHash(hash);
} else if (restoring) {
if (props.disable !== "restore") {
restorePosition(currentPathname);
}
} else if (prevGroup && currentGroup && prevGroup === currentGroup) {
restoreGroupPosition(currentGroup);
} else if (scrollGroup) {
restoreGroupPosition(scrollGroup);
} else {
window.scrollTo(0, 0);
}
}
};
if (committedHref === currentHref) {
var { apply } = pendingScroll;
pendingScroll = null;
apply();
}
});
disable = function disable2() {
pendingScroll = null;
popStateController.abort();
disposeOnLoadState();
disposeOnRootState();
};
return disable;
}
function scrollToHash(hash) {
if (!hash || !hash.startsWith("#")) return;
var id = hash.slice(1);
var el = document.getElementById(id);
if (!el) return;
el.scrollIntoView({ behavior: "instant" });
}
function ScrollBehavior(props) {
if (process.env.VITE_ENVIRONMENT === "client") {
(0, import_react.useEffect)(function() {
if (window.location.hash) {
scrollToHash(window.location.hash);
}
}, []);
(0, import_react.useEffect)(function() {
return configure(props);
}, [props.disable]);
}
return null;
}
//# sourceMappingURL=ScrollBehavior.native.js.map