@selfcommunity/react-ui 0.7.0-alpha.327 → 0.7.0-alpha.329
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/lib/cjs/components/CommentsObject/CommentsObject.js +1 -2
- package/lib/cjs/components/Feed/Feed.d.ts +7 -0
- package/lib/cjs/components/Feed/Feed.js +10 -10
- package/lib/cjs/shared/InfiniteScroll/index.d.ts +6 -6
- package/lib/cjs/shared/InfiniteScroll/stories/ScrollableTargetFixedInfScroll.d.ts +1 -0
- package/lib/cjs/shared/InfiniteScroll/stories/ScrollableTargetFixedInfScroll.js +39 -0
- package/lib/cjs/shared/VirtualizedScroller/VirtualizedScroller.d.ts +2 -0
- package/lib/esm/components/CommentsObject/CommentsObject.js +1 -2
- package/lib/esm/components/Feed/Feed.d.ts +7 -0
- package/lib/esm/components/Feed/Feed.js +10 -10
- package/lib/esm/shared/InfiniteScroll/index.d.ts +6 -6
- package/lib/esm/shared/InfiniteScroll/index.js +2 -1
- package/lib/esm/shared/InfiniteScroll/stories/ScrollableTargetFixedInfScroll.d.ts +1 -0
- package/lib/esm/shared/InfiniteScroll/stories/ScrollableTargetFixedInfScroll.js +35 -0
- package/lib/esm/shared/VirtualizedScroller/VirtualizedScroller.d.ts +2 -0
- package/lib/umd/{518.js → 533.js} +2 -2
- package/lib/umd/533.js.LICENSE.txt +22 -0
- package/lib/umd/react-ui.js +1 -1
- package/package.json +2 -3
- package/lib/umd/518.js.LICENSE.txt +0 -7
|
@@ -15,7 +15,6 @@ const react_intersection_observer_1 = require("react-intersection-observer");
|
|
|
15
15
|
const contribution_1 = require("../../utils/contribution");
|
|
16
16
|
const types_1 = require("@selfcommunity/types");
|
|
17
17
|
const utils_1 = require("@selfcommunity/utils");
|
|
18
|
-
const seamless_scroll_polyfill_1 = require("seamless-scroll-polyfill");
|
|
19
18
|
const Pagination_1 = require("../../constants/Pagination");
|
|
20
19
|
const react_core_1 = require("@selfcommunity/react-core");
|
|
21
20
|
const PREFIX = 'SCCommentsObject';
|
|
@@ -125,7 +124,7 @@ function CommentsObject(inProps) {
|
|
|
125
124
|
setTimeout(() => {
|
|
126
125
|
const element = document.getElementById(`reply-${comment.id}`);
|
|
127
126
|
if (element) {
|
|
128
|
-
|
|
127
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
|
|
129
128
|
}
|
|
130
129
|
}, 200);
|
|
131
130
|
}
|
|
@@ -130,6 +130,13 @@ export interface FeedProps {
|
|
|
130
130
|
* Use this to init the component (in particular useSCFetchFeed)
|
|
131
131
|
*/
|
|
132
132
|
prefetchedData?: SCPaginatedResponse<SCFeedUnitType>;
|
|
133
|
+
/**
|
|
134
|
+
* If the feed is being rendered in a "scrollable container"
|
|
135
|
+
* (for example, if one of the parent elements of the list is
|
|
136
|
+
* styled with max-height and overflow: auto),
|
|
137
|
+
* then passing the "scrollableTargetId"
|
|
138
|
+
*/
|
|
139
|
+
scrollableTargetId?: string;
|
|
133
140
|
/**
|
|
134
141
|
* Props to spread to VirtualizedScroller object.
|
|
135
142
|
* @default {}
|
|
@@ -78,7 +78,7 @@ const Feed = (inProps, ref) => {
|
|
|
78
78
|
props: inProps,
|
|
79
79
|
name: PREFIX
|
|
80
80
|
});
|
|
81
|
-
const { id = 'feed', className, endpoint, endpointQueryParams = { limit: Pagination_1.DEFAULT_PAGINATION_LIMIT, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, endMessage = react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.feed.noOtherFeedObject", defaultMessage: "ui.feed.noOtherFeedObject" }), refreshMessage = react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.feed.refreshRelease", defaultMessage: "ui.feed.refreshRelease" }), HeaderComponent, FooterComponent = Footer_1.default, FooterComponentProps = {}, widgets = [], ItemComponent, itemPropsGenerator, itemIdGenerator, ItemProps = {}, ItemSkeleton, ItemSkeletonProps = {}, onNextData, onPreviousData, FeedSidebarProps = {}, CustomAdvProps = {}, enabledCustomAdvPositions = [types_1.SCCustomAdvPosition.POSITION_FEED_SIDEBAR, types_1.SCCustomAdvPosition.POSITION_FEED], requireAuthentication = false, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, prefetchedData, VirtualizedScrollerProps = {}, disablePaginationLinks = false, hidePaginationLinks = true, paginationLinksPageQueryParam = Pagination_1.DEFAULT_PAGINATION_QUERY_PARAM_NAME, PaginationLinkProps = {}, hideAdvs = false } = props;
|
|
81
|
+
const { id = 'feed', className, endpoint, endpointQueryParams = { limit: Pagination_1.DEFAULT_PAGINATION_LIMIT, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, endMessage = react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.feed.noOtherFeedObject", defaultMessage: "ui.feed.noOtherFeedObject" }), refreshMessage = react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.feed.refreshRelease", defaultMessage: "ui.feed.refreshRelease" }), HeaderComponent, FooterComponent = Footer_1.default, FooterComponentProps = {}, widgets = [], ItemComponent, itemPropsGenerator, itemIdGenerator, ItemProps = {}, ItemSkeleton, ItemSkeletonProps = {}, onNextData, onPreviousData, FeedSidebarProps = {}, CustomAdvProps = {}, enabledCustomAdvPositions = [types_1.SCCustomAdvPosition.POSITION_FEED_SIDEBAR, types_1.SCCustomAdvPosition.POSITION_FEED], requireAuthentication = false, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, prefetchedData, scrollableTargetId, VirtualizedScrollerProps = {}, disablePaginationLinks = false, hidePaginationLinks = true, paginationLinksPageQueryParam = Pagination_1.DEFAULT_PAGINATION_QUERY_PARAM_NAME, PaginationLinkProps = {}, hideAdvs = false } = props;
|
|
82
82
|
// CONTEXT
|
|
83
83
|
const scPreferences = (0, react_1.useContext)(react_core_1.SCPreferencesContext);
|
|
84
84
|
const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
|
|
@@ -94,6 +94,7 @@ const Feed = (inProps, ref) => {
|
|
|
94
94
|
}, [endpointQueryParams, prefetchedData]);
|
|
95
95
|
// REF
|
|
96
96
|
const isMountRef = (0, react_core_1.useIsComponentMountedRef)();
|
|
97
|
+
const containerRef = (0, react_1.useRef)(null);
|
|
97
98
|
/**
|
|
98
99
|
* Compute preferences
|
|
99
100
|
*/
|
|
@@ -414,15 +415,14 @@ const Feed = (inProps, ref) => {
|
|
|
414
415
|
advEnabled && !hideAdvs && enabledCustomAdvPositions.includes(types_1.SCCustomAdvPosition.POSITION_BELOW_TOPBAR) ? (react_1.default.createElement(material_1.Grid, { item: true, xs: 12 },
|
|
415
416
|
react_1.default.createElement(CustomAdv_1.default, Object.assign({ position: types_1.SCCustomAdvPosition.POSITION_BELOW_TOPBAR }, CustomAdvProps)))) : null,
|
|
416
417
|
react_1.default.createElement(material_1.Grid, { item: true, xs: 12, md: 7 },
|
|
417
|
-
react_1.default.createElement(
|
|
418
|
-
|
|
419
|
-
react_1.default.createElement(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
react_1.default.createElement(VirtualizedScroller_1.default, Object.assign({ className: classes.leftItems, items: feedDataLeft, itemComponent: InnerItem, onMount: onScrollerMount, onScrollerStateChange: onScrollerStateChange, getItemId: getScrollItemId, preserveScrollPosition: true, preserveScrollPositionOnPrependItems: true, cacheScrollStateKey: react_core_1.SCCache.getVirtualizedScrollStateCacheKey(id), cacheScrollerPositionKey: react_core_1.SCCache.getFeedSPCacheKey(id), cacheStrategy: cacheStrategy }, VirtualizedScrollerProps))))),
|
|
418
|
+
react_1.default.createElement(InfiniteScroll_1.default, Object.assign({ ref: containerRef, className: classes.left, dataLength: feedDataLeft.length, next: getNextPage, previous: getPreviousPage, hasMoreNext: Boolean(feedDataObject.next), hasMorePrevious: Boolean(feedDataObject.previous), header: PreviousPageLink, footer: NextPageLink, loaderNext: react_1.default.createElement(ItemSkeleton, Object.assign({}, ItemSkeletonProps)), loaderPrevious: react_1.default.createElement(ItemSkeleton, Object.assign({}, ItemSkeletonProps)), scrollThreshold: '90%', endMessage: react_1.default.createElement(material_1.Box, { className: classes.end },
|
|
419
|
+
react_1.default.createElement(Widget_1.default, { className: classes.endMessage },
|
|
420
|
+
react_1.default.createElement(material_1.CardContent, null, endMessage)),
|
|
421
|
+
advEnabled && !hideAdvs && enabledCustomAdvPositions.includes(types_1.SCCustomAdvPosition.POSITION_ABOVE_FOOTER_BAR) ? (react_1.default.createElement(CustomAdv_1.default, Object.assign({ position: types_1.SCCustomAdvPosition.POSITION_ABOVE_FOOTER_BAR }, CustomAdvProps))) : null,
|
|
422
|
+
FooterComponent ? react_1.default.createElement(FooterComponent, Object.assign({}, FooterComponentProps)) : null), refreshFunction: refresh, pullDownToRefresh: true, pullDownToRefreshThreshold: 1000, pullDownToRefreshContent: null, releaseToRefreshContent: react_1.default.createElement(Widget_1.default, { variant: "outlined", className: classes.refresh },
|
|
423
|
+
react_1.default.createElement(material_1.CardContent, null, refreshMessage)), style: { overflow: 'visible' } }, (scrollableTargetId && { scrollableTarget: scrollableTargetId })),
|
|
424
|
+
renderHeaderComponent(),
|
|
425
|
+
react_1.default.createElement(VirtualizedScroller_1.default, Object.assign({ className: classes.leftItems, items: feedDataLeft, itemComponent: InnerItem, onMount: onScrollerMount, onScrollerStateChange: onScrollerStateChange, getItemId: getScrollItemId, preserveScrollPosition: true, preserveScrollPositionOnPrependItems: true, cacheScrollStateKey: react_core_1.SCCache.getVirtualizedScrollStateCacheKey(id), cacheScrollerPositionKey: react_core_1.SCCache.getFeedSPCacheKey(id), cacheStrategy: cacheStrategy }, (scrollableTargetId && { getScrollableContainer: () => document.getElementById(scrollableTargetId) }), VirtualizedScrollerProps)))),
|
|
426
426
|
feedDataRight.length > 0 && !hideAdvs && (react_1.default.createElement(material_1.Hidden, { smDown: true },
|
|
427
427
|
react_1.default.createElement(material_1.Grid, { item: true, xs: 12, md: 5 },
|
|
428
428
|
react_1.default.createElement(StickyBox_1.default, Object.assign({ className: classes.right }, FeedSidebarProps),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, ReactNode, CSSProperties } from 'react';
|
|
2
2
|
declare type Fn = () => any;
|
|
3
|
-
export interface
|
|
3
|
+
export interface InfiniteScrollProps {
|
|
4
4
|
next?: Fn;
|
|
5
5
|
hasMoreNext?: boolean;
|
|
6
6
|
previous?: Fn;
|
|
@@ -33,8 +33,8 @@ interface State {
|
|
|
33
33
|
pullToRefreshThresholdBreached: boolean;
|
|
34
34
|
prevDataLength: number | undefined;
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
constructor(props:
|
|
36
|
+
declare class InfiniteScroll extends Component<InfiniteScrollProps, State> {
|
|
37
|
+
constructor(props: InfiniteScrollProps);
|
|
38
38
|
private throttledOnScrollListener;
|
|
39
39
|
private _scrollableNode;
|
|
40
40
|
private el;
|
|
@@ -48,8 +48,8 @@ export default class InfiniteScroll extends Component<Props, State> {
|
|
|
48
48
|
private maxPullDownDistance;
|
|
49
49
|
componentDidMount(): void;
|
|
50
50
|
componentWillUnmount(): void;
|
|
51
|
-
componentDidUpdate(prevProps:
|
|
52
|
-
static getDerivedStateFromProps(nextProps:
|
|
51
|
+
componentDidUpdate(prevProps: InfiniteScrollProps): void;
|
|
52
|
+
static getDerivedStateFromProps(nextProps: InfiniteScrollProps, prevState: State): {
|
|
53
53
|
prevDataLength: number;
|
|
54
54
|
showLoaderNext: boolean;
|
|
55
55
|
showLoaderPrevious: boolean;
|
|
@@ -64,4 +64,4 @@ export default class InfiniteScroll extends Component<Props, State> {
|
|
|
64
64
|
onScrollListener: (event: MouseEvent) => void;
|
|
65
65
|
render(): JSX.Element;
|
|
66
66
|
}
|
|
67
|
-
export
|
|
67
|
+
export default InfiniteScroll;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function ScrollableTargetFixedInfScroll(): JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
const index_1 = tslib_1.__importDefault(require("../index"));
|
|
6
|
+
const style = {
|
|
7
|
+
height: 30,
|
|
8
|
+
border: '1px solid green',
|
|
9
|
+
margin: 6,
|
|
10
|
+
padding: 8
|
|
11
|
+
};
|
|
12
|
+
function ScrollableTargetFixedInfScroll() {
|
|
13
|
+
const [items, setItems] = (0, react_1.useState)(Array.from({ length: 20 }));
|
|
14
|
+
const fetchMoreData = () => {
|
|
15
|
+
// a fake async api call like which sends
|
|
16
|
+
// 20 more records in 1.5 secs
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
setItems(items.concat(Array.from({ length: 20 })));
|
|
19
|
+
}, 1500);
|
|
20
|
+
};
|
|
21
|
+
return (react_1.default.createElement("div", null,
|
|
22
|
+
react_1.default.createElement("h1", null, "demo: Infinite Scroll with scrollable target FIXED"),
|
|
23
|
+
react_1.default.createElement("hr", null),
|
|
24
|
+
react_1.default.createElement("div", { id: "scrollableDiv", style: {
|
|
25
|
+
position: 'fixed',
|
|
26
|
+
bottom: 0,
|
|
27
|
+
left: 0,
|
|
28
|
+
right: 0,
|
|
29
|
+
top: 170,
|
|
30
|
+
zIndex: 1000,
|
|
31
|
+
maxWidth: '100% !important',
|
|
32
|
+
height: '50vh',
|
|
33
|
+
overflowY: 'scroll'
|
|
34
|
+
} },
|
|
35
|
+
react_1.default.createElement(index_1.default, { dataLength: items.length, hasMoreNext: true, next: fetchMoreData, loaderNext: react_1.default.createElement("h4", null, "Loading..."), scrollableTarget: "scrollableDiv" }, items.map((_, index) => (react_1.default.createElement("div", { style: style, key: index },
|
|
36
|
+
"div - #",
|
|
37
|
+
index)))))));
|
|
38
|
+
}
|
|
39
|
+
exports.default = ScrollableTargetFixedInfScroll;
|
|
@@ -5,6 +5,8 @@ import { VirtualScrollerCommonOptions } from 'virtual-scroller';
|
|
|
5
5
|
* VirtualizedScrollerCommonProps Interface
|
|
6
6
|
*/
|
|
7
7
|
export interface VirtualizedScrollerCommonProps extends VirtualScrollerCommonOptions<HTMLElement, any>, React.HTMLAttributes<HTMLElement> {
|
|
8
|
+
scrollableContainer?: any;
|
|
9
|
+
getScrollableContainer?: () => Element;
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
12
|
* VirtualizedScrollerProps Interface
|
|
@@ -13,7 +13,6 @@ import { InView } from 'react-intersection-observer';
|
|
|
13
13
|
import { getContributionRouteName, getRouteData } from '../../utils/contribution';
|
|
14
14
|
import { SCContributionType, SCCustomAdvPosition } from '@selfcommunity/types';
|
|
15
15
|
import { appendURLSearchParams, CacheStrategies } from '@selfcommunity/utils';
|
|
16
|
-
import { scrollIntoView } from 'seamless-scroll-polyfill';
|
|
17
16
|
import { DEFAULT_PAGINATION_QUERY_PARAM_NAME } from '../../constants/Pagination';
|
|
18
17
|
import { Link, SCPreferences, useSCFetchFeedObject, useSCPreferences, useSCRouting, useSCUser } from '@selfcommunity/react-core';
|
|
19
18
|
const PREFIX = 'SCCommentsObject';
|
|
@@ -123,7 +122,7 @@ export default function CommentsObject(inProps) {
|
|
|
123
122
|
setTimeout(() => {
|
|
124
123
|
const element = document.getElementById(`reply-${comment.id}`);
|
|
125
124
|
if (element) {
|
|
126
|
-
scrollIntoView(
|
|
125
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
|
|
127
126
|
}
|
|
128
127
|
}, 200);
|
|
129
128
|
}
|
|
@@ -130,6 +130,13 @@ export interface FeedProps {
|
|
|
130
130
|
* Use this to init the component (in particular useSCFetchFeed)
|
|
131
131
|
*/
|
|
132
132
|
prefetchedData?: SCPaginatedResponse<SCFeedUnitType>;
|
|
133
|
+
/**
|
|
134
|
+
* If the feed is being rendered in a "scrollable container"
|
|
135
|
+
* (for example, if one of the parent elements of the list is
|
|
136
|
+
* styled with max-height and overflow: auto),
|
|
137
|
+
* then passing the "scrollableTargetId"
|
|
138
|
+
*/
|
|
139
|
+
scrollableTargetId?: string;
|
|
133
140
|
/**
|
|
134
141
|
* Props to spread to VirtualizedScroller object.
|
|
135
142
|
* @default {}
|
|
@@ -75,7 +75,7 @@ const Feed = (inProps, ref) => {
|
|
|
75
75
|
props: inProps,
|
|
76
76
|
name: PREFIX
|
|
77
77
|
});
|
|
78
|
-
const { id = 'feed', className, endpoint, endpointQueryParams = { limit: DEFAULT_PAGINATION_LIMIT, offset: DEFAULT_PAGINATION_OFFSET }, endMessage = React.createElement(FormattedMessage, { id: "ui.feed.noOtherFeedObject", defaultMessage: "ui.feed.noOtherFeedObject" }), refreshMessage = React.createElement(FormattedMessage, { id: "ui.feed.refreshRelease", defaultMessage: "ui.feed.refreshRelease" }), HeaderComponent, FooterComponent = Footer, FooterComponentProps = {}, widgets = [], ItemComponent, itemPropsGenerator, itemIdGenerator, ItemProps = {}, ItemSkeleton, ItemSkeletonProps = {}, onNextData, onPreviousData, FeedSidebarProps = {}, CustomAdvProps = {}, enabledCustomAdvPositions = [SCCustomAdvPosition.POSITION_FEED_SIDEBAR, SCCustomAdvPosition.POSITION_FEED], requireAuthentication = false, cacheStrategy = CacheStrategies.NETWORK_ONLY, prefetchedData, VirtualizedScrollerProps = {}, disablePaginationLinks = false, hidePaginationLinks = true, paginationLinksPageQueryParam = DEFAULT_PAGINATION_QUERY_PARAM_NAME, PaginationLinkProps = {}, hideAdvs = false } = props;
|
|
78
|
+
const { id = 'feed', className, endpoint, endpointQueryParams = { limit: DEFAULT_PAGINATION_LIMIT, offset: DEFAULT_PAGINATION_OFFSET }, endMessage = React.createElement(FormattedMessage, { id: "ui.feed.noOtherFeedObject", defaultMessage: "ui.feed.noOtherFeedObject" }), refreshMessage = React.createElement(FormattedMessage, { id: "ui.feed.refreshRelease", defaultMessage: "ui.feed.refreshRelease" }), HeaderComponent, FooterComponent = Footer, FooterComponentProps = {}, widgets = [], ItemComponent, itemPropsGenerator, itemIdGenerator, ItemProps = {}, ItemSkeleton, ItemSkeletonProps = {}, onNextData, onPreviousData, FeedSidebarProps = {}, CustomAdvProps = {}, enabledCustomAdvPositions = [SCCustomAdvPosition.POSITION_FEED_SIDEBAR, SCCustomAdvPosition.POSITION_FEED], requireAuthentication = false, cacheStrategy = CacheStrategies.NETWORK_ONLY, prefetchedData, scrollableTargetId, VirtualizedScrollerProps = {}, disablePaginationLinks = false, hidePaginationLinks = true, paginationLinksPageQueryParam = DEFAULT_PAGINATION_QUERY_PARAM_NAME, PaginationLinkProps = {}, hideAdvs = false } = props;
|
|
79
79
|
// CONTEXT
|
|
80
80
|
const scPreferences = useContext(SCPreferencesContext);
|
|
81
81
|
const scUserContext = useContext(SCUserContext);
|
|
@@ -91,6 +91,7 @@ const Feed = (inProps, ref) => {
|
|
|
91
91
|
}, [endpointQueryParams, prefetchedData]);
|
|
92
92
|
// REF
|
|
93
93
|
const isMountRef = useIsComponentMountedRef();
|
|
94
|
+
const containerRef = useRef(null);
|
|
94
95
|
/**
|
|
95
96
|
* Compute preferences
|
|
96
97
|
*/
|
|
@@ -411,15 +412,14 @@ const Feed = (inProps, ref) => {
|
|
|
411
412
|
advEnabled && !hideAdvs && enabledCustomAdvPositions.includes(SCCustomAdvPosition.POSITION_BELOW_TOPBAR) ? (React.createElement(Grid, { item: true, xs: 12 },
|
|
412
413
|
React.createElement(CustomAdv, Object.assign({ position: SCCustomAdvPosition.POSITION_BELOW_TOPBAR }, CustomAdvProps)))) : null,
|
|
413
414
|
React.createElement(Grid, { item: true, xs: 12, md: 7 },
|
|
414
|
-
React.createElement(
|
|
415
|
-
|
|
416
|
-
React.createElement(
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
React.createElement(VirtualizedScroller, Object.assign({ className: classes.leftItems, items: feedDataLeft, itemComponent: InnerItem, onMount: onScrollerMount, onScrollerStateChange: onScrollerStateChange, getItemId: getScrollItemId, preserveScrollPosition: true, preserveScrollPositionOnPrependItems: true, cacheScrollStateKey: SCCache.getVirtualizedScrollStateCacheKey(id), cacheScrollerPositionKey: SCCache.getFeedSPCacheKey(id), cacheStrategy: cacheStrategy }, VirtualizedScrollerProps))))),
|
|
415
|
+
React.createElement(InfiniteScroll, Object.assign({ ref: containerRef, className: classes.left, dataLength: feedDataLeft.length, next: getNextPage, previous: getPreviousPage, hasMoreNext: Boolean(feedDataObject.next), hasMorePrevious: Boolean(feedDataObject.previous), header: PreviousPageLink, footer: NextPageLink, loaderNext: React.createElement(ItemSkeleton, Object.assign({}, ItemSkeletonProps)), loaderPrevious: React.createElement(ItemSkeleton, Object.assign({}, ItemSkeletonProps)), scrollThreshold: '90%', endMessage: React.createElement(Box, { className: classes.end },
|
|
416
|
+
React.createElement(Widget, { className: classes.endMessage },
|
|
417
|
+
React.createElement(CardContent, null, endMessage)),
|
|
418
|
+
advEnabled && !hideAdvs && enabledCustomAdvPositions.includes(SCCustomAdvPosition.POSITION_ABOVE_FOOTER_BAR) ? (React.createElement(CustomAdv, Object.assign({ position: SCCustomAdvPosition.POSITION_ABOVE_FOOTER_BAR }, CustomAdvProps))) : null,
|
|
419
|
+
FooterComponent ? React.createElement(FooterComponent, Object.assign({}, FooterComponentProps)) : null), refreshFunction: refresh, pullDownToRefresh: true, pullDownToRefreshThreshold: 1000, pullDownToRefreshContent: null, releaseToRefreshContent: React.createElement(Widget, { variant: "outlined", className: classes.refresh },
|
|
420
|
+
React.createElement(CardContent, null, refreshMessage)), style: { overflow: 'visible' } }, (scrollableTargetId && { scrollableTarget: scrollableTargetId })),
|
|
421
|
+
renderHeaderComponent(),
|
|
422
|
+
React.createElement(VirtualizedScroller, Object.assign({ className: classes.leftItems, items: feedDataLeft, itemComponent: InnerItem, onMount: onScrollerMount, onScrollerStateChange: onScrollerStateChange, getItemId: getScrollItemId, preserveScrollPosition: true, preserveScrollPositionOnPrependItems: true, cacheScrollStateKey: SCCache.getVirtualizedScrollStateCacheKey(id), cacheScrollerPositionKey: SCCache.getFeedSPCacheKey(id), cacheStrategy: cacheStrategy }, (scrollableTargetId && { getScrollableContainer: () => document.getElementById(scrollableTargetId) }), VirtualizedScrollerProps)))),
|
|
423
423
|
feedDataRight.length > 0 && !hideAdvs && (React.createElement(Hidden, { smDown: true },
|
|
424
424
|
React.createElement(Grid, { item: true, xs: 12, md: 5 },
|
|
425
425
|
React.createElement(StickyBoxComp, Object.assign({ className: classes.right }, FeedSidebarProps),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, ReactNode, CSSProperties } from 'react';
|
|
2
2
|
declare type Fn = () => any;
|
|
3
|
-
export interface
|
|
3
|
+
export interface InfiniteScrollProps {
|
|
4
4
|
next?: Fn;
|
|
5
5
|
hasMoreNext?: boolean;
|
|
6
6
|
previous?: Fn;
|
|
@@ -33,8 +33,8 @@ interface State {
|
|
|
33
33
|
pullToRefreshThresholdBreached: boolean;
|
|
34
34
|
prevDataLength: number | undefined;
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
constructor(props:
|
|
36
|
+
declare class InfiniteScroll extends Component<InfiniteScrollProps, State> {
|
|
37
|
+
constructor(props: InfiniteScrollProps);
|
|
38
38
|
private throttledOnScrollListener;
|
|
39
39
|
private _scrollableNode;
|
|
40
40
|
private el;
|
|
@@ -48,8 +48,8 @@ export default class InfiniteScroll extends Component<Props, State> {
|
|
|
48
48
|
private maxPullDownDistance;
|
|
49
49
|
componentDidMount(): void;
|
|
50
50
|
componentWillUnmount(): void;
|
|
51
|
-
componentDidUpdate(prevProps:
|
|
52
|
-
static getDerivedStateFromProps(nextProps:
|
|
51
|
+
componentDidUpdate(prevProps: InfiniteScrollProps): void;
|
|
52
|
+
static getDerivedStateFromProps(nextProps: InfiniteScrollProps, prevState: State): {
|
|
53
53
|
prevDataLength: number;
|
|
54
54
|
showLoaderNext: boolean;
|
|
55
55
|
showLoaderPrevious: boolean;
|
|
@@ -64,4 +64,4 @@ export default class InfiniteScroll extends Component<Props, State> {
|
|
|
64
64
|
onScrollListener: (event: MouseEvent) => void;
|
|
65
65
|
render(): JSX.Element;
|
|
66
66
|
}
|
|
67
|
-
export
|
|
67
|
+
export default InfiniteScroll;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { Component } from 'react';
|
|
2
2
|
import { throttle } from 'throttle-debounce';
|
|
3
3
|
import { ThresholdUnits, parseThreshold } from '../../utils/threshold';
|
|
4
|
-
|
|
4
|
+
class InfiniteScroll extends Component {
|
|
5
5
|
constructor(props) {
|
|
6
6
|
super(props);
|
|
7
7
|
this.lastScrollTop = 0;
|
|
@@ -241,3 +241,4 @@ export default class InfiniteScroll extends Component {
|
|
|
241
241
|
this.props.footer)));
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
|
+
export default InfiniteScroll;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function ScrollableTargetFixedInfScroll(): JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import InfiniteScroll from '../index';
|
|
3
|
+
const style = {
|
|
4
|
+
height: 30,
|
|
5
|
+
border: '1px solid green',
|
|
6
|
+
margin: 6,
|
|
7
|
+
padding: 8
|
|
8
|
+
};
|
|
9
|
+
export default function ScrollableTargetFixedInfScroll() {
|
|
10
|
+
const [items, setItems] = useState(Array.from({ length: 20 }));
|
|
11
|
+
const fetchMoreData = () => {
|
|
12
|
+
// a fake async api call like which sends
|
|
13
|
+
// 20 more records in 1.5 secs
|
|
14
|
+
setTimeout(() => {
|
|
15
|
+
setItems(items.concat(Array.from({ length: 20 })));
|
|
16
|
+
}, 1500);
|
|
17
|
+
};
|
|
18
|
+
return (React.createElement("div", null,
|
|
19
|
+
React.createElement("h1", null, "demo: Infinite Scroll with scrollable target FIXED"),
|
|
20
|
+
React.createElement("hr", null),
|
|
21
|
+
React.createElement("div", { id: "scrollableDiv", style: {
|
|
22
|
+
position: 'fixed',
|
|
23
|
+
bottom: 0,
|
|
24
|
+
left: 0,
|
|
25
|
+
right: 0,
|
|
26
|
+
top: 170,
|
|
27
|
+
zIndex: 1000,
|
|
28
|
+
maxWidth: '100% !important',
|
|
29
|
+
height: '50vh',
|
|
30
|
+
overflowY: 'scroll'
|
|
31
|
+
} },
|
|
32
|
+
React.createElement(InfiniteScroll, { dataLength: items.length, hasMoreNext: true, next: fetchMoreData, loaderNext: React.createElement("h4", null, "Loading..."), scrollableTarget: "scrollableDiv" }, items.map((_, index) => (React.createElement("div", { style: style, key: index },
|
|
33
|
+
"div - #",
|
|
34
|
+
index)))))));
|
|
35
|
+
}
|
|
@@ -5,6 +5,8 @@ import { VirtualScrollerCommonOptions } from 'virtual-scroller';
|
|
|
5
5
|
* VirtualizedScrollerCommonProps Interface
|
|
6
6
|
*/
|
|
7
7
|
export interface VirtualizedScrollerCommonProps extends VirtualScrollerCommonOptions<HTMLElement, any>, React.HTMLAttributes<HTMLElement> {
|
|
8
|
+
scrollableContainer?: any;
|
|
9
|
+
getScrollableContainer?: () => Element;
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
12
|
* VirtualizedScrollerProps Interface
|