export function defaultOnDefaultTransitionIndicator(): void | (() => void) {
if (typeof navigation !== 'object') {
return;
}
let isCancelled = false;
let pendingResolve: null | (() => void) = null;
function handleNavigate(event: NavigateEvent) {
if (event.canIntercept && event.info === 'react-transition') {
event.intercept({
handler() {
return new Promise(resolve => (pendingResolve = resolve));
},
focusReset: 'manual',
scroll: 'manual',
});
}
}
function handleNavigateComplete() {
if (pendingResolve !== null) {
pendingResolve();
pendingResolve = null;
}
if (!isCancelled) {
setTimeout(startFakeNavigation, 20);
}
}
navigation.addEventListener('navigate', handleNavigate);
navigation.addEventListener('navigatesuccess', handleNavigateComplete);
navigation.addEventListener('navigateerror', handleNavigateComplete);
function startFakeNavigation() {
if (isCancelled) {
return;
}
if (navigation.transition) {
return;
}
const currentEntry = navigation.currentEntry;
if (currentEntry && currentEntry.url != null) {
navigation.navigate(currentEntry.url, {
state: currentEntry.getState(),
info: 'react-transition',
history: 'replace',
});
}
}
setTimeout(startFakeNavigation, 100);
return function () {
isCancelled = true;
navigation.removeEventListener('navigate', handleNavigate);
navigation.removeEventListener('navigatesuccess', handleNavigateComplete);
navigation.removeEventListener('navigateerror', handleNavigateComplete);
if (pendingResolve !== null) {
pendingResolve();
pendingResolve = null;
}
};
}