@shopgate/engage 7.27.2-beta.2 → 7.27.2-beta.4
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.
|
@@ -1,5 +1,23 @@
|
|
|
1
|
-
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}import React,{useState}from'react';import PropTypes from'prop-types';import classNames from'classnames';import{useScrollDirectionChange}from'@shopgate/engage/core/hooks';import{root,scrolledIn,scrolledOut,transition}from"./style"
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* @
|
|
5
|
-
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}import React,{useState,forwardRef,useEffect}from'react';import PropTypes from'prop-types';import classNames from'classnames';import{useScrollDirectionChange}from'@shopgate/engage/core/hooks';import{root,scrolledIn,scrolledOut,transition}from"./style";/* eslint-disable react/prop-types */ /**
|
|
2
|
+
* A container component that hides its content on scroll down and shows it on scroll up.
|
|
3
|
+
*
|
|
4
|
+
* @param {Object} props The component props.
|
|
5
|
+
* @param {boolean} [props.hideOnScroll] Toggle hide-on-scroll (default: true).
|
|
6
|
+
* @param {number} [props.scrollOffset] Pixels to scroll before toggling (default: 100).
|
|
7
|
+
* @param {boolean} [props.onlyShowAtTop] When set to true, the component content will not be shown
|
|
8
|
+
* till the user scrolls to the top of the page again.
|
|
9
|
+
* @param {number} [props.onlyShowAtTopOffset] Pixel threshold from the top of the page at which the
|
|
10
|
+
* component content will reappear when `showOnScrollToTop` is enabled. The content shows again once
|
|
11
|
+
* the scroll position is less than or equal to this value.
|
|
12
|
+
* @param {Function} [props.onChange] Callback function that is called when the header changes
|
|
13
|
+
* @param {string} [props.className] Extra CSS classes on the root element.
|
|
14
|
+
* @param {Object} [props.classes] Override internal class names.
|
|
15
|
+
* @param {string} [props.classes.scrolledIn] Override class for the scrolled-in state
|
|
16
|
+
* (content is hidden).
|
|
17
|
+
* @param {string} [props.classes.scrolledOut] Override class for the scrolled-out state
|
|
18
|
+
* (content is visible).
|
|
19
|
+
* visibility. Contains a boolean indicating whether the header is visible.
|
|
20
|
+
* @param {React.ReactNode} props.children Content of the header.
|
|
21
|
+
* @param {React.Ref<HTMLDivElement>} ref Forwarded ref to the header `<div>`.
|
|
22
|
+
* @returns {JSX.Element}
|
|
23
|
+
*/function ScrollHeaderBase(_ref,ref){var className=_ref.className,children=_ref.children,_ref$hideOnScroll=_ref.hideOnScroll,hideOnScroll=_ref$hideOnScroll===void 0?true:_ref$hideOnScroll,_ref$scrollOffset=_ref.scrollOffset,scrollOffset=_ref$scrollOffset===void 0?100:_ref$scrollOffset,_ref$onlyShowAtTop=_ref.onlyShowAtTop,onlyShowAtTop=_ref$onlyShowAtTop===void 0?false:_ref$onlyShowAtTop,_ref$onlyShowAtTopOff=_ref.onlyShowAtTopOffset,onlyShowAtTopOffset=_ref$onlyShowAtTopOff===void 0?0:_ref$onlyShowAtTopOff,onChange=_ref.onChange,classes=_ref.classes;var _useState=useState(false),_useState2=_slicedToArray(_useState,2),shouldHideHeader=_useState2[0],setShouldHideHeader=_useState2[1];useScrollDirectionChange({enabled:hideOnScroll,offset:scrollOffset,onlyFireOnScrollUpAtTop:onlyShowAtTop,onlyFireOnScrollUpAtTopOffset:onlyShowAtTopOffset,onScrollDown:function onScrollDown(){setShouldHideHeader(true);},onScrollUp:function onScrollUp(){setShouldHideHeader(false);}});useEffect(function(){if(typeof onChange!=='function'){return;}onChange(!shouldHideHeader);},[onChange,shouldHideHeader]);return React.createElement("div",{ref:ref,className:classNames(root,transition,className,_defineProperty(_defineProperty({},classNames(scrolledIn,classes===null||classes===void 0?void 0:classes.scrolledIn),!shouldHideHeader),classNames(scrolledOut,classes===null||classes===void 0?void 0:classes.scrolledOut),shouldHideHeader))},children);}/* eslint-enable react/prop-types */var ScrollHeader=forwardRef(ScrollHeaderBase);ScrollHeader.displayName='ScrollHeader';ScrollHeader.propTypes={children:PropTypes.node.isRequired,classes:PropTypes.shape({scrolledIn:PropTypes.string,scrolledOut:PropTypes.string}),className:PropTypes.string,hideOnScroll:PropTypes.bool,onChange:PropTypes.func,onlyShowAtTop:PropTypes.bool,onlyShowAtTopOffset:PropTypes.number,scrollOffset:PropTypes.number};ScrollHeader.defaultProps={className:null,hideOnScroll:true,scrollOffset:100,classes:{},onChange:null,onlyShowAtTop:false,onlyShowAtTopOffset:0};export default ScrollHeader;
|
|
@@ -43,6 +43,20 @@ export interface UseScrollDirectionChangeParams {
|
|
|
43
43
|
*/
|
|
44
44
|
onlyFireOnDirectionChange?: boolean;
|
|
45
45
|
|
|
46
|
+
/**
|
|
47
|
+
* If true, onScrollUp fires only when scrollTop is below or equal to
|
|
48
|
+
* `onlyFireOnScrollUpAtTopOffset`.
|
|
49
|
+
* @default false
|
|
50
|
+
*/
|
|
51
|
+
onlyFireOnScrollUpAtTop?: boolean;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Maximum scrollTop at which `onScrollUp` may fire when
|
|
55
|
+
* `onlyFireOnScrollUpAtTop` is true.
|
|
56
|
+
* @default 0
|
|
57
|
+
*/
|
|
58
|
+
onlyFireOnScrollUpAtTopOffset?: number;
|
|
59
|
+
|
|
46
60
|
/** Callback triggered on scroll up */
|
|
47
61
|
onScrollUp?: ScrollCallback;
|
|
48
62
|
|
|
@@ -6,11 +6,13 @@ import{useEffect,useRef,useCallback}from'react';import{viewScroll$}from'@shopgat
|
|
|
6
6
|
* UI elements based on scroll behavior.
|
|
7
7
|
*
|
|
8
8
|
* @param {UseScrollDirectionChangeParams} params The hook parameters
|
|
9
|
-
*/export default function useScrollDirectionChange(_ref){var enabled=_ref.enabled,_ref$offset=_ref.offset,offset=_ref$offset===void 0?100:_ref$offset,_ref$onlyFireOnDirect=_ref.onlyFireOnDirectionChange,onlyFireOnDirectionChange=_ref$onlyFireOnDirect===void 0?true:_ref$onlyFireOnDirect,onScrollUp=_ref.onScrollUp,onScrollDown=_ref.onScrollDown;var lastDirectionRef=useRef(null);var downTriggeredRef=useRef(false);var upTriggeredRef=useRef(false);/**
|
|
9
|
+
*/export default function useScrollDirectionChange(_ref){var enabled=_ref.enabled,_ref$offset=_ref.offset,offset=_ref$offset===void 0?100:_ref$offset,_ref$onlyFireOnDirect=_ref.onlyFireOnDirectionChange,onlyFireOnDirectionChange=_ref$onlyFireOnDirect===void 0?true:_ref$onlyFireOnDirect,_ref$onlyFireOnScroll=_ref.onlyFireOnScrollUpAtTop,onlyFireOnScrollUpAtTop=_ref$onlyFireOnScroll===void 0?false:_ref$onlyFireOnScroll,_ref$onlyFireOnScroll2=_ref.onlyFireOnScrollUpAtTopOffset,onlyFireOnScrollUpAtTopOffset=_ref$onlyFireOnScroll2===void 0?0:_ref$onlyFireOnScroll2,onScrollUp=_ref.onScrollUp,onScrollDown=_ref.onScrollDown;var lastDirectionRef=useRef(null);var downTriggeredRef=useRef(false);var upTriggeredRef=useRef(false);/**
|
|
10
10
|
* Scroll event handler.
|
|
11
11
|
* Uses `event.direction` and triggers callbacks accordingly.
|
|
12
12
|
*/var handleScroll=useCallback(/** @param {ViewScrollEvent} event The event */function(event){if(!enabled||!event.scrolled||!event.direction)return;var scrollTop=event.scrollTop,direction=event.direction;var prevDirection=lastDirectionRef.current;var directionChanged=direction!==prevDirection;// Store current direction and reset flags if direction changed
|
|
13
|
-
if(directionChanged){
|
|
13
|
+
if(directionChanged){// @ts-expect-error
|
|
14
|
+
lastDirectionRef.current=direction;if(direction==='down')downTriggeredRef.current=false;if(direction==='up')upTriggeredRef.current=false;}// 🔽 Handle downward scroll
|
|
14
15
|
if(direction==='down'){var shouldFire=(!onlyFireOnDirectionChange||directionChanged||!downTriggeredRef.current)&&scrollTop>=offset;if(shouldFire&&typeof onScrollDown==='function'){downTriggeredRef.current=true;// Strip internal/legacy properties
|
|
15
16
|
var scrollIn=event.scrollIn,scrollOut=event.scrollOut,scrolled=event.scrolled,publicEvent=_objectWithoutProperties(event,_excluded);onScrollDown(publicEvent);}}// 🔼 Handle upward scroll
|
|
16
|
-
if(direction==='up'){
|
|
17
|
+
if(direction==='up'){// if user wants “only fire at the very top” and we’re not at 0, skip
|
|
18
|
+
if(onlyFireOnScrollUpAtTop&&scrollTop>onlyFireOnScrollUpAtTopOffset){return;}var _shouldFire=!onlyFireOnDirectionChange||directionChanged||!upTriggeredRef.current;if(_shouldFire&&typeof onScrollUp==='function'){upTriggeredRef.current=true;var _scrollIn=event.scrollIn,_scrollOut=event.scrollOut,_scrolled=event.scrolled,_publicEvent=_objectWithoutProperties(event,_excluded2);onScrollUp(_publicEvent);}}},[enabled,onlyFireOnDirectionChange,offset,onScrollDown,onlyFireOnScrollUpAtTop,onlyFireOnScrollUpAtTopOffset,onScrollUp]);useEffect(function(){if(!enabled)return undefined;var subscription=viewScroll$.subscribe(handleScroll);return function(){return subscription.unsubscribe();};},[enabled,handleScroll]);}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shopgate/engage",
|
|
3
|
-
"version": "7.27.2-beta.
|
|
3
|
+
"version": "7.27.2-beta.4",
|
|
4
4
|
"description": "Shopgate's ENGAGE library.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Shopgate <support@shopgate.com>",
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@shopgate/native-modules": "1.0.0-beta.25",
|
|
19
|
-
"@shopgate/pwa-common": "7.27.2-beta.
|
|
20
|
-
"@shopgate/pwa-common-commerce": "7.27.2-beta.
|
|
21
|
-
"@shopgate/pwa-core": "7.27.2-beta.
|
|
22
|
-
"@shopgate/pwa-ui-ios": "7.27.2-beta.
|
|
23
|
-
"@shopgate/pwa-ui-material": "7.27.2-beta.
|
|
24
|
-
"@shopgate/pwa-ui-shared": "7.27.2-beta.
|
|
19
|
+
"@shopgate/pwa-common": "7.27.2-beta.4",
|
|
20
|
+
"@shopgate/pwa-common-commerce": "7.27.2-beta.4",
|
|
21
|
+
"@shopgate/pwa-core": "7.27.2-beta.4",
|
|
22
|
+
"@shopgate/pwa-ui-ios": "7.27.2-beta.4",
|
|
23
|
+
"@shopgate/pwa-ui-material": "7.27.2-beta.4",
|
|
24
|
+
"@shopgate/pwa-ui-shared": "7.27.2-beta.4",
|
|
25
25
|
"@stripe/react-stripe-js": "^1.16.5",
|
|
26
26
|
"@stripe/stripe-js": "^1.3.1",
|
|
27
27
|
"@virtuous/conductor": "~2.5.0",
|