@shopgate/pwa-common 7.26.0 → 7.27.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/Portals.js +2 -2
- package/helpers/legacy/index.js +4 -2
- package/package.json +3 -3
- package/selectors/client.js +4 -3
- package/streams/view.js +27 -5
package/constants/Portals.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// FEATURES
|
|
2
2
|
var APP='app';var APP_BAR='app-bar';var VIEW='view';var PAGE='page';var NAV_MENU='nav-menu';var NO_RESULTS='no-results';var USER_MENU='user-menu';var FORM='form';// CONTENTS
|
|
3
|
-
var GLOBALS='globals';var ROUTES='routes';var
|
|
4
|
-
export var BEFORE='before';export var AFTER='after';export var LEFT='left';export var CENTER='center';export var RIGHT='right';export var BELOW='below';export var APP_GLOBALS="".concat(APP,".").concat(GLOBALS);export var APP_ROUTES="".concat(APP,".").concat(ROUTES);export var
|
|
3
|
+
var GLOBALS='globals';var ROUTES='routes';var CONTENT='content';var QUICK_LINKS='quick-links';var HOME='home';var LOGIN='login';var SCANNER='scanner';var REGISTER_LINK='register-link';var TERMS='terms';var PRIVACY='privacy';var PRIVACY_SETTINGS='privacy-settings';var IMPRINT='imprint';var STORE_INFORMATION='store-information';var STORE_INFORMATION_MORE='store-information-more';var STORE_INFORMATION_ABOUT='store-information-about';var MY_ACCOUNT='my-account';var LOGOUT='logout';var CONTAINER='container';var DEFAULT='default';var BACK='back';var CLOSE='close';var SIMPLE='simple';var CART_BUTTON='cart-button';var ITEMS='items';// POSITIONS
|
|
4
|
+
export var BEFORE='before';export var AFTER='after';export var LEFT='left';export var CENTER='center';export var RIGHT='right';export var BELOW='below';export var APP_GLOBALS="".concat(APP,".").concat(GLOBALS);export var APP_ROUTES="".concat(APP,".").concat(ROUTES);export var VIEW_CONTENT_BEFORE="".concat(VIEW,".").concat(CONTENT,".").concat(BEFORE);export var VIEW_CONTENT="".concat(VIEW,".").concat(CONTENT);export var VIEW_CONTENT_AFTER="".concat(VIEW,".").concat(CONTENT,".").concat(AFTER);export var PAGE_CONTENT_BEFORE="".concat(PAGE,".").concat(CONTENT,".").concat(BEFORE);export var PAGE_CONTENT="".concat(PAGE,".").concat(CONTENT);export var PAGE_CONTENT_AFTER="".concat(PAGE,".").concat(CONTENT,".").concat(AFTER);export var PAGE_LOGIN_BEFORE="".concat(PAGE,".").concat(LOGIN,".").concat(BEFORE);export var PAGE_LOGIN="".concat(PAGE,".").concat(LOGIN);export var PAGE_LOGIN_AFTER="".concat(PAGE,".").concat(LOGIN,".").concat(AFTER);export var PAGE_LOGIN_FORM_BEFORE="".concat(PAGE,".").concat(LOGIN,".").concat(FORM,".").concat(BEFORE);export var PAGE_LOGIN_FORM="".concat(PAGE,".").concat(LOGIN,".").concat(FORM);export var PAGE_LOGIN_FORM_AFTER="".concat(PAGE,".").concat(LOGIN,".").concat(FORM,".").concat(AFTER);export var PAGE_LOGIN_REGISTER_LINK_BEFORE="".concat(PAGE,".").concat(LOGIN,".").concat(REGISTER_LINK,".").concat(BEFORE);export var PAGE_LOGIN_REGISTER_LINK="".concat(PAGE,".").concat(LOGIN,".").concat(REGISTER_LINK);export var PAGE_LOGIN_REGISTER_LINK_AFTER="".concat(PAGE,".").concat(LOGIN,".").concat(REGISTER_LINK,".").concat(AFTER);export var NAV_MENU_CONTENT_BEFORE="".concat(NAV_MENU,".").concat(CONTENT,".").concat(BEFORE);export var NAV_MENU_CONTENT_AFTER="".concat(NAV_MENU,".").concat(CONTENT,".").concat(AFTER);export var NAV_MENU_QUICK_LINKS="".concat(NAV_MENU,".").concat(QUICK_LINKS);export var NAV_MENU_QUICK_LINKS_BEFORE="".concat(NAV_MENU,".").concat(QUICK_LINKS,".").concat(BEFORE);export var NAV_MENU_QUICK_LINKS_AFTER="".concat(NAV_MENU,".").concat(QUICK_LINKS,".").concat(AFTER);export var NAV_MENU_QUICK_LINKS_ITEMS="".concat(NAV_MENU,".").concat(QUICK_LINKS,".").concat(ITEMS);export var NAV_MENU_QUICK_LINKS_ITEMS_BEFORE="".concat(NAV_MENU,".").concat(QUICK_LINKS,".").concat(ITEMS,".").concat(BEFORE);export var NAV_MENU_QUICK_LINKS_ITEMS_AFTER="".concat(NAV_MENU,".").concat(QUICK_LINKS,".").concat(ITEMS,".").concat(AFTER);export var NAV_MENU_HOME_BEFORE="".concat(NAV_MENU,".").concat(HOME,".").concat(BEFORE);export var NAV_MENU_HOME="".concat(NAV_MENU,".").concat(HOME);export var NAV_MENU_HOME_AFTER="".concat(NAV_MENU,".").concat(HOME,".").concat(AFTER);export var NAV_MENU_SCANNER_BEFORE="".concat(NAV_MENU,".").concat(SCANNER,".").concat(BEFORE);export var NAV_MENU_SCANNER="".concat(NAV_MENU,".").concat(SCANNER);export var NAV_MENU_SCANNER_AFTER="".concat(NAV_MENU,".").concat(SCANNER,".").concat(AFTER);export var NAV_MENU_TERMS_BEFORE="".concat(NAV_MENU,".").concat(TERMS,".").concat(BEFORE);export var NAV_MENU_TERMS="".concat(NAV_MENU,".").concat(TERMS);export var NAV_MENU_TERMS_AFTER="".concat(NAV_MENU,".").concat(TERMS,".").concat(AFTER);export var NAV_MENU_PRIVACY_BEFORE="".concat(NAV_MENU,".").concat(PRIVACY,".").concat(BEFORE);export var NAV_MENU_PRIVACY="".concat(NAV_MENU,".").concat(PRIVACY);export var NAV_MENU_PRIVACY_AFTER="".concat(NAV_MENU,".").concat(PRIVACY,".").concat(AFTER);export var NAV_MENU_PRIVACY_SETTINGS_BEFORE="".concat(NAV_MENU,".").concat(PRIVACY_SETTINGS,".").concat(BEFORE);export var NAV_MENU_PRIVACY_SETTINGS="".concat(NAV_MENU,".").concat(PRIVACY_SETTINGS);export var NAV_MENU_PRIVACY_SETTINGS_AFTER="".concat(NAV_MENU,".").concat(PRIVACY_SETTINGS,".").concat(AFTER);export var NAV_MENU_IMPRINT_BEFORE="".concat(NAV_MENU,".").concat(IMPRINT,".").concat(BEFORE);export var NAV_MENU_IMPRINT="".concat(NAV_MENU,".").concat(IMPRINT);export var NAV_MENU_IMPRINT_AFTER="".concat(NAV_MENU,".").concat(IMPRINT,".").concat(AFTER);export var NAV_MENU_STORE_INFORMATION_BEFORE="".concat(NAV_MENU,".").concat(STORE_INFORMATION,".").concat(BEFORE);export var NAV_MENU_STORE_INFORMATION="".concat(NAV_MENU,".").concat(STORE_INFORMATION);export var NAV_MENU_STORE_INFORMATION_AFTER="".concat(NAV_MENU,".").concat(STORE_INFORMATION,".").concat(AFTER);export var NAV_MENU_STORE_INFORMATION_MORE_BEFORE="".concat(NAV_MENU,".").concat(STORE_INFORMATION_MORE,".").concat(BEFORE);export var NAV_MENU_STORE_INFORMATION_MORE="".concat(NAV_MENU,".").concat(STORE_INFORMATION_MORE);export var NAV_MENU_STORE_INFORMATION_MORE_AFTER="".concat(NAV_MENU,".").concat(STORE_INFORMATION_MORE,".").concat(AFTER);export var NAV_MENU_STORE_INFORMATION_ABOUT_BEFORE="".concat(NAV_MENU,".").concat(STORE_INFORMATION_ABOUT,".").concat(BEFORE);export var NAV_MENU_STORE_INFORMATION_ABOUT="".concat(NAV_MENU,".").concat(STORE_INFORMATION_ABOUT);export var NAV_MENU_STORE_INFORMATION_ABOUT_AFTER="".concat(NAV_MENU,".").concat(STORE_INFORMATION_ABOUT,".").concat(AFTER);export var NAV_MENU_MY_ACCOUNT_BEFORE="".concat(NAV_MENU,".").concat(MY_ACCOUNT,".").concat(BEFORE);export var NAV_MENU_MY_ACCOUNT="".concat(NAV_MENU,".").concat(MY_ACCOUNT);export var NAV_MENU_MY_ACCOUNT_AFTER="".concat(NAV_MENU,".").concat(MY_ACCOUNT,".").concat(AFTER);export var NAV_MENU_LOGOUT_BEFORE="".concat(NAV_MENU,".").concat(LOGOUT,".").concat(BEFORE);export var NAV_MENU_LOGOUT="".concat(NAV_MENU,".").concat(LOGOUT);export var NAV_MENU_LOGOUT_AFTER="".concat(NAV_MENU,".").concat(LOGOUT,".").concat(AFTER);export var NO_RESULTS_CONTENT_BEFORE="".concat(NO_RESULTS,".").concat(CONTENT,".").concat(BEFORE);export var NO_RESULTS_CONTENT="".concat(NO_RESULTS,".").concat(CONTENT);export var NO_RESULTS_CONTENT_AFTER="".concat(NO_RESULTS,".").concat(CONTENT,".").concat(AFTER);export var USER_MENU_CONTAINER_BEFORE="".concat(USER_MENU,".").concat(CONTAINER,".").concat(BEFORE);export var USER_MENU_CONTAINER="".concat(USER_MENU,".").concat(CONTAINER);export var USER_MENU_CONTAINER_AFTER="".concat(USER_MENU,".").concat(CONTAINER,".").concat(AFTER);export var APP_BAR_DEFAULT_BEFORE="".concat(APP_BAR,".").concat(DEFAULT,".").concat(BEFORE);export var APP_BAR_DEFAULT="".concat(APP_BAR,".").concat(DEFAULT);export var APP_BAR_DEFAULT_AFTER="".concat(APP_BAR,".").concat(DEFAULT,".").concat(AFTER);export var APP_BAR_BACK_BEFORE="".concat(APP_BAR,".").concat(BACK,".").concat(BEFORE);export var APP_BAR_BACK="".concat(APP_BAR,".").concat(BACK);export var APP_BAR_BACK_AFTER="".concat(APP_BAR,".").concat(BACK,".").concat(AFTER);export var APP_BAR_CLOSE_BEFORE="".concat(APP_BAR,".").concat(CLOSE,".").concat(BEFORE);export var APP_BAR_CLOSE="".concat(APP_BAR,".").concat(CLOSE);export var APP_BAR_CLOSE_AFTER="".concat(APP_BAR,".").concat(CLOSE,".").concat(AFTER);export var APP_BAR_SIMPLE_BEFORE="".concat(APP_BAR,".").concat(SIMPLE,".").concat(BEFORE);export var APP_BAR_SIMPLE="".concat(APP_BAR,".").concat(SIMPLE);export var APP_BAR_SIMPLE_AFTER="".concat(APP_BAR,".").concat(SIMPLE,".").concat(AFTER);export var APP_BAR_LEFT="".concat(APP_BAR,".").concat(LEFT);export var APP_BAR_LEFT_BEFORE="".concat(APP_BAR,".").concat(LEFT,".").concat(BEFORE);export var APP_BAR_LEFT_AFTER="".concat(APP_BAR,".").concat(LEFT,".").concat(AFTER);export var APP_BAR_CENTER="".concat(APP_BAR,".").concat(CENTER);export var APP_BAR_CENTER_BEFORE="".concat(APP_BAR,".").concat(CENTER,".").concat(BEFORE);export var APP_BAR_CENTER_AFTER="".concat(APP_BAR,".").concat(CENTER,".").concat(AFTER);export var APP_BAR_RIGHT="".concat(APP_BAR,".").concat(RIGHT);export var APP_BAR_RIGHT_BEFORE="".concat(APP_BAR,".").concat(RIGHT,".").concat(BEFORE);export var APP_BAR_RIGHT_AFTER="".concat(APP_BAR,".").concat(RIGHT,".").concat(AFTER);export var APP_BAR_BELOW="".concat(APP_BAR,".").concat(BELOW);export var APP_BAR_BELOW_BEFORE="".concat(APP_BAR,".").concat(BELOW,".").concat(BEFORE);export var APP_BAR_BELOW_AFTER="".concat(APP_BAR,".").concat(BELOW,".").concat(AFTER);export var APP_BAR_CART_BUTTON="".concat(APP_BAR,".").concat(CART_BUTTON);export var APP_BAR_CART_BUTTON_BEFORE="".concat(APP_BAR,".").concat(CART_BUTTON,".").concat(BEFORE);export var APP_BAR_CART_BUTTON_AFTER="".concat(APP_BAR,".").concat(CART_BUTTON,".").concat(AFTER);export var APP_BAR_CONTENT="".concat(APP_BAR,".").concat(CONTENT);export var APP_BAR_CONTENT_BEFORE="".concat(APP_BAR_CONTENT,".").concat(BEFORE);export var APP_BAR_CONTENT_AFTER="".concat(APP_BAR_CONTENT,".").concat(AFTER);
|
package/helpers/legacy/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import hideMenuBar from'@shopgate/pwa-core/commands/hideMenuBar';import broadcastEvent from'@shopgate/pwa-core/commands/broadcastEvent';import showTab from'@shopgate/pwa-core/commands/showTab';/**
|
|
1
|
+
import hideMenuBar from'@shopgate/pwa-core/commands/hideMenuBar';import broadcastEvent from'@shopgate/pwa-core/commands/broadcastEvent';import showTab from'@shopgate/pwa-core/commands/showTab';import{appSupportsAndroidEdgeToEdge}from'@shopgate/engage/core/helpers';/**
|
|
2
2
|
* Page context that comes from the app.
|
|
3
3
|
* @type {Object}
|
|
4
4
|
*/var currentPageContext={};/**
|
|
@@ -6,7 +6,9 @@ import hideMenuBar from'@shopgate/pwa-core/commands/hideMenuBar';import broadcas
|
|
|
6
6
|
* @returns {Object}
|
|
7
7
|
*/export var getPageContext=function getPageContext(){return currentPageContext;};/**
|
|
8
8
|
* Prepares the NavigationBar and the MenuBar of the app legacy part for the PWA.
|
|
9
|
-
*/export var prepareLegacyNavigation=function prepareLegacyNavigation(){
|
|
9
|
+
*/export var prepareLegacyNavigation=function prepareLegacyNavigation(){// Logic below causes issues on Android app with edge-to-edge screens. For compatibility reasons
|
|
10
|
+
// logic is skipped for now on those devices. Function could potentially be removed in the future.
|
|
11
|
+
if(appSupportsAndroidEdgeToEdge()){return;}/**
|
|
10
12
|
* Broadcasts an event to the pwa_navigation_bar webview and updates the navigation bar with
|
|
11
13
|
* type "none". Event parameters are defined accordingly to the specification of the native
|
|
12
14
|
* updateNavigationBar event.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shopgate/pwa-common",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.27.0-beta.2",
|
|
4
4
|
"description": "Common library for the Shopgate Connect PWA.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Shopgate <support@shopgate.com>",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@redux-devtools/extension": "^3.3.0",
|
|
19
19
|
"@sentry/browser": "6.0.1",
|
|
20
|
-
"@shopgate/pwa-benchmark": "7.
|
|
20
|
+
"@shopgate/pwa-benchmark": "7.27.0-beta.2",
|
|
21
21
|
"@virtuous/conductor": "~2.5.0",
|
|
22
22
|
"@virtuous/react-conductor": "~2.5.0",
|
|
23
23
|
"@virtuous/redux-persister": "1.1.0-beta.7",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"url-search-params": "^0.10.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@shopgate/pwa-core": "7.
|
|
46
|
+
"@shopgate/pwa-core": "7.27.0-beta.2",
|
|
47
47
|
"@types/react-portal": "^3.0.9",
|
|
48
48
|
"lodash": "^4.17.4",
|
|
49
49
|
"prop-types": "~15.8.1",
|
package/selectors/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createSelector}from'reselect';import MobileDetect from'mobile-detect';import{hasSGJavaScriptBridge}from'@shopgate/pwa-core/helpers';import{isVersionAtLeast}from'@shopgate/pwa-core/helpers/version';import{SCANNER_MIN_APP_LIB_VERSION}from'@shopgate/pwa-core/constants/Scanner';import{hasWebBridge}from'@shopgate/engage/core/helpers/bridge';import{OS_ANDROID,OS_IOS,MODEL_NAMES_IPHONE_X,PAGE_INSETS_ANDROID,PAGE_INSETS_IOS,PAGE_INSETS_IPHONE_X,TYPE_TABLET}from"../constants/Device";var md=new MobileDetect(navigator.userAgent);/**
|
|
1
|
+
import{createSelector}from'reselect';import MobileDetect from'mobile-detect';import{hasSGJavaScriptBridge}from'@shopgate/pwa-core/helpers';import{isVersionAtLeast}from'@shopgate/pwa-core/helpers/version';import{SCANNER_MIN_APP_LIB_VERSION}from'@shopgate/pwa-core/constants/Scanner';import{hasWebBridge}from'@shopgate/engage/core/helpers/bridge';import{getAreSimulatedInsetsInjected}from'@shopgate/engage/development/selectors';import{OS_ANDROID,OS_IOS,MODEL_NAMES_IPHONE_X,PAGE_INSETS_ANDROID,PAGE_INSETS_IOS,PAGE_INSETS_IPHONE_X,TYPE_TABLET}from"../constants/Device";var md=new MobileDetect(navigator.userAgent);/**
|
|
2
2
|
* Returns the client state (state.client)
|
|
3
3
|
* @param {Object} state The application state.
|
|
4
4
|
* @returns {Object}
|
|
@@ -47,10 +47,11 @@ import{createSelector}from'reselect';import MobileDetect from'mobile-detect';imp
|
|
|
47
47
|
*/export var hasScannerSupport=createSelector(getClientInformation,getDeviceInformation,isIos,function(clientInformation,deviceInformation,deviceIsIos){var _ref4=deviceInformation||{},type=_ref4.type;var isIpad=type===TYPE_TABLET&&deviceIsIos;if(isVersionAtLeast('11.0.0',clientInformation.appVersion)){// scanner is supported on all apps based on the react-native based apps
|
|
48
48
|
return true;}// scanner is not supported on iPads with the not react-native based app
|
|
49
49
|
return isVersionAtLeast(SCANNER_MIN_APP_LIB_VERSION,clientInformation.libVersion)&&!isIpad;});/**
|
|
50
|
-
* Determines page insets for the current device
|
|
50
|
+
* Determines page insets for the current device. Used as a fallback for the native insets.
|
|
51
51
|
* @param {Object} state The application state.
|
|
52
52
|
* @returns {Object}
|
|
53
|
-
*/export var getPageInsets=createSelector(
|
|
53
|
+
*/export var getPageInsets=createSelector(getDeviceModel,isIos,getAreSimulatedInsetsInjected,function(model,iOS,injectSimulatedInsets){if(injectSimulatedInsets){// Simulate safe area insets in development when user agent is set to iOS device
|
|
54
|
+
return PAGE_INSETS_IPHONE_X;}if(iOS){if(!hasSGJavaScriptBridge()){return PAGE_INSETS_ANDROID;}if(MODEL_NAMES_IPHONE_X.includes(model)){return PAGE_INSETS_IPHONE_X;}return PAGE_INSETS_IOS;}return PAGE_INSETS_ANDROID;});/**
|
|
54
55
|
* Determines what os version handles the insets differently compared to other os versions.
|
|
55
56
|
* @returns {boolean}
|
|
56
57
|
*/export var considerNativeInset=createSelector(isIos,getOSVersion,function(ios,ver){return ios&&ver&&ver.indexOf('10.')===0;});/**
|
package/streams/view.js
CHANGED
|
@@ -1,12 +1,34 @@
|
|
|
1
1
|
import{Observable}from'rxjs/Observable';import{Subject}from'rxjs/Subject';import{async as asyncScheduler}from'rxjs/scheduler/async';import'rxjs/add/observable/from';import'rxjs/add/observable/fromEvent';import'rxjs/add/operator/do';import'rxjs/add/operator/throttleTime';export var eventsSubject=new Subject();/**
|
|
2
2
|
* Cold observable for View scroll events
|
|
3
|
+
* Use this to listen for scroll-related changes in any part of the app.
|
|
3
4
|
* @type {Observable}
|
|
4
5
|
*/export var viewScroll$=Observable.from(eventsSubject);/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* Sets up throttled scroll event stream for a given element or window.
|
|
7
|
+
* Emits enriched scroll info such as direction and distance.
|
|
8
|
+
*
|
|
9
|
+
* @param {HTMLElement|Window} element - DOM node or window to observe
|
|
10
|
+
* @param {number} throttleTime - Time in ms to throttle scroll events
|
|
11
|
+
* @returns {Observable} - Observable emitting scroll-related data
|
|
8
12
|
*/export var emitScrollEvents=function emitScrollEvents(element){var throttleTime=arguments.length>1&&arguments[1]!==undefined?arguments[1]:250;// In rare situation during unmounting a react dom ref might
|
|
9
13
|
// be null due to the execution order of events in fiber nodes.
|
|
10
|
-
if(!element){return undefined;}var previousScrollTop=0
|
|
11
|
-
|
|
14
|
+
if(!element){return undefined;}var previousScrollTop=0;// Tracks scroll direction ('up' or 'down')
|
|
15
|
+
var lastDirection=null;// Minimum distance to consider a real scroll
|
|
16
|
+
var minDelta=10;// Pixels from bottom to consider "at bottom"
|
|
17
|
+
var bottomThreshold=20;// Prevent scrollUp triggering in this zone
|
|
18
|
+
var deadZoneThreshold=30;var scroll$=Observable.fromEvent(element,'scroll').throttleTime(throttleTime,asyncScheduler,{leading:false,trailing:true}).map(function(event){// Determine if element is the window/document or a scrollable container
|
|
19
|
+
var isWindow=element===window||element===document.body||element===document.documentElement;// Get current scroll position
|
|
20
|
+
var rawScrollTop=isWindow?window.scrollY||window.pageYOffset||0:element.scrollTop;// Compute max scroll value
|
|
21
|
+
var maxScrollTop=isWindow?Math.max(document.documentElement.scrollHeight,document.body.scrollHeight)-window.innerHeight:element.scrollHeight-element.clientHeight;// Clamp scrollTop to prevent overshoot from iOS bounce
|
|
22
|
+
var scrollTop=Math.min(rawScrollTop,maxScrollTop);var delta=scrollTop-previousScrollTop;var isScrollingDown=delta>0;var isScrollingUp=delta<0;// Determine direction
|
|
23
|
+
var direction=lastDirection;if(isScrollingDown)direction='down';else if(isScrollingUp)direction='up';// Are we near the bottom of the scrollable area?
|
|
24
|
+
var nearBottom=scrollTop>=maxScrollTop-bottomThreshold;var inDeadZone=scrollTop>=maxScrollTop-deadZoneThreshold;// Detect downward scroll beyond threshold and not near bottom
|
|
25
|
+
var scrollDown=isScrollingDown&&delta>minDelta&&!nearBottom;// Detect upward scroll beyond threshold
|
|
26
|
+
var scrollUp=isScrollingUp&&Math.abs(delta)>minDelta;// Suppress scrollUp events in dead zone to avoid iOS bounce
|
|
27
|
+
if(scrollUp&&inDeadZone&&direction==='up'){scrollUp=false;}// Detect a bounce-back: scrollDown followed by a quick scrollUp at the bottom
|
|
28
|
+
var bounced=lastDirection==='down'&&direction==='up'&&nearBottom;// Final scrolled flag — only emit if meaningful and not a bounce
|
|
29
|
+
var scrolled=(scrollDown||scrollUp)&&!bounced;// Update direction and scrollTop memory
|
|
30
|
+
lastDirection=direction;return{event:event,scrollTop:scrollTop,previousScrollTop:previousScrollTop,scrolled:scrolled,scrollUp:scrollUp,scrollDown:scrollDown&&!bounced,direction:direction,scrollOut:scrollDown&&!bounced,// legacy compatibility
|
|
31
|
+
scrollIn:scrollUp// legacy compatibility
|
|
32
|
+
};})["do"](function(event){// Store current scrollTop for next event comparison
|
|
33
|
+
previousScrollTop=event.scrollTop;});// Pipe scroll data into the shared stream for global consumers
|
|
12
34
|
scroll$.subscribe(viewScroll$);return scroll$;};
|