@pinnacle0/web-ui 0.4.10 → 0.4.11

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.
Files changed (74) hide show
  1. package/core/FlatList/Content/Footer/index.d.ts +10 -0
  2. package/core/FlatList/Content/Footer/index.js +11 -0
  3. package/core/FlatList/Content/Footer/index.js.map +1 -0
  4. package/core/FlatList/{shared → Content}/Footer/index.less +2 -3
  5. package/core/FlatList/Content/index.d.ts +9 -0
  6. package/core/FlatList/Content/index.js +71 -0
  7. package/core/FlatList/Content/index.js.map +1 -0
  8. package/core/FlatList/Loader/index.d.ts +3 -0
  9. package/core/FlatList/Loader/index.js +9 -0
  10. package/core/FlatList/Loader/index.js.map +1 -0
  11. package/core/FlatList/Loader/index.less +39 -0
  12. package/core/FlatList/{shared/Spinner → Refresh}/index.d.ts +1 -1
  13. package/core/FlatList/Refresh/index.js +8 -0
  14. package/core/FlatList/Refresh/index.js.map +1 -0
  15. package/core/FlatList/Refresh/index.less +22 -0
  16. package/core/FlatList/index.d.ts +3 -1
  17. package/core/FlatList/index.js +76 -26
  18. package/core/FlatList/index.js.map +1 -1
  19. package/core/FlatList/index.less +40 -0
  20. package/core/FlatList/type.d.ts +71 -37
  21. package/core/FlatList/type.js +1 -1
  22. package/core/FlatList/type.js.map +1 -1
  23. package/core/FlatList/useGap.d.ts +2 -0
  24. package/core/FlatList/useGap.js +12 -0
  25. package/core/FlatList/useGap.js.map +1 -0
  26. package/core/FlatList/util.d.ts +8 -0
  27. package/core/FlatList/util.js +35 -0
  28. package/core/FlatList/util.js.map +1 -0
  29. package/core/VirtualList.d.ts +5 -2
  30. package/core/VirtualList.js +8 -7
  31. package/core/VirtualList.js.map +1 -1
  32. package/hooks/useSwipe/controller.js +1 -0
  33. package/hooks/useSwipe/controller.js.map +1 -1
  34. package/hooks/useSwipe/type.d.ts +1 -0
  35. package/hooks/useSwipe/type.js.map +1 -1
  36. package/internal/polyfill/IntersectionObserver.d.ts +1 -0
  37. package/internal/polyfill/IntersectionObserver.js +5 -0
  38. package/internal/polyfill/IntersectionObserver.js.map +1 -0
  39. package/package.json +4 -2
  40. package/core/FlatList/VirtualFlatList/Item.d.ts +0 -11
  41. package/core/FlatList/VirtualFlatList/Item.js +0 -20
  42. package/core/FlatList/VirtualFlatList/Item.js.map +0 -1
  43. package/core/FlatList/VirtualFlatList/index.d.ts +0 -8
  44. package/core/FlatList/VirtualFlatList/index.js +0 -111
  45. package/core/FlatList/VirtualFlatList/index.js.map +0 -1
  46. package/core/FlatList/VirtualFlatList/index.less +0 -22
  47. package/core/FlatList/VirtualFlatList/type.d.ts +0 -20
  48. package/core/FlatList/VirtualFlatList/type.js +0 -2
  49. package/core/FlatList/VirtualFlatList/type.js.map +0 -1
  50. package/core/FlatList/shared/Footer/index.d.ts +0 -8
  51. package/core/FlatList/shared/Footer/index.js +0 -13
  52. package/core/FlatList/shared/Footer/index.js.map +0 -1
  53. package/core/FlatList/shared/GetRowKey.d.ts +0 -2
  54. package/core/FlatList/shared/GetRowKey.js +0 -12
  55. package/core/FlatList/shared/GetRowKey.js.map +0 -1
  56. package/core/FlatList/shared/Spinner/index.js +0 -10
  57. package/core/FlatList/shared/Spinner/index.js.map +0 -1
  58. package/core/FlatList/shared/Spinner/index.less +0 -13
  59. package/core/FlatList/shared/Wrapper/Loading.d.ts +0 -8
  60. package/core/FlatList/shared/Wrapper/Loading.js +0 -7
  61. package/core/FlatList/shared/Wrapper/Loading.js.map +0 -1
  62. package/core/FlatList/shared/Wrapper/index.d.ts +0 -14
  63. package/core/FlatList/shared/Wrapper/index.js +0 -109
  64. package/core/FlatList/shared/Wrapper/index.js.map +0 -1
  65. package/core/FlatList/shared/Wrapper/index.less +0 -33
  66. package/core/FlatList/shared/hooks/useBounceSwipe.d.ts +0 -22
  67. package/core/FlatList/shared/hooks/useBounceSwipe.js +0 -111
  68. package/core/FlatList/shared/hooks/useBounceSwipe.js.map +0 -1
  69. package/core/FlatList/shared/hooks/useElementScrollState.d.ts +0 -8
  70. package/core/FlatList/shared/hooks/useElementScrollState.js +0 -38
  71. package/core/FlatList/shared/hooks/useElementScrollState.js.map +0 -1
  72. package/core/FlatList/shared/hooks/useLoadingWithDelay.d.ts +0 -9
  73. package/core/FlatList/shared/hooks/useLoadingWithDelay.js +0 -52
  74. package/core/FlatList/shared/hooks/useLoadingWithDelay.js.map +0 -1
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import "./index.less";
3
+ interface Props {
4
+ hasNextPage: boolean;
5
+ endOfListMessage?: string;
6
+ hasNextPageMessage?: string;
7
+ loading?: boolean;
8
+ }
9
+ export declare const Footer: ({ loading, hasNextPage, hasNextPageMessage, endOfListMessage }: Props) => JSX.Element;
10
+ export {};
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { Loader } from "../../Loader";
3
+ import "./index.less";
4
+ export var Footer = function (_a) {
5
+ var loading = _a.loading, hasNextPage = _a.hasNextPage, hasNextPageMessage = _a.hasNextPageMessage, endOfListMessage = _a.endOfListMessage;
6
+ var ref = React.useRef(null);
7
+ var end = endOfListMessage !== null && endOfListMessage !== void 0 ? endOfListMessage : "All data loaded";
8
+ var next = hasNextPageMessage !== null && hasNextPageMessage !== void 0 ? hasNextPageMessage : "Pull up to load more";
9
+ return (React.createElement("div", { ref: ref, className: "g-flat-list-footer" }, loading ? React.createElement(Loader, null) : hasNextPage ? next : end));
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/FlatList/Content/Footer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACpC,OAAO,cAAc,CAAC;AAQtB,MAAM,CAAC,IAAM,MAAM,GAAG,UAAC,EAAmE;QAAlE,OAAO,aAAA,EAAE,WAAW,iBAAA,EAAE,kBAAkB,wBAAA,EAAE,gBAAgB,sBAAA;IAC9E,IAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAwB,IAAI,CAAC,CAAC;IACtD,IAAM,GAAG,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,iBAAiB,CAAC;IAClD,IAAM,IAAI,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,sBAAsB,CAAC;IAE1D,OAAO,CACH,6BAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,oBAAoB,IACxC,OAAO,CAAC,CAAC,CAAC,oBAAC,MAAM,OAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAC9C,CACT,CAAC;AACN,CAAC,CAAC"}
@@ -1,8 +1,7 @@
1
1
  .g-flat-list-footer {
2
- width: 100%;
3
2
  display: flex;
4
- flex-flow: row nowrap;
3
+ flex-flow: column nowrap;
5
4
  justify-content: center;
6
5
  align-items: center;
7
- padding: 5px;
6
+ padding: 15px 0;
8
7
  }
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import type { FlatListProps } from "../type";
3
+ import "../../../internal/polyfill/IntersectionObserver";
4
+ interface Props<T> extends Pick<FlatListProps<T>, "data" | "renderItem" | "gap" | "emptyPlaceholder" | "rowKey" | "Footer" | "endOfListMessage" | "onPullUpLoading"> {
5
+ loading: boolean;
6
+ hasNextPageMessage?: string;
7
+ }
8
+ export declare function Content<T>({ data, emptyPlaceholder, renderItem, gap, rowKey, loading, Footer, endOfListMessage, onPullUpLoading, hasNextPageMessage }: Props<T>): JSX.Element;
9
+ export {};
@@ -0,0 +1,71 @@
1
+ var __read = (this && this.__read) || function (o, n) {
2
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
3
+ if (!m) return o;
4
+ var i = m.call(o), r, ar = [], e;
5
+ try {
6
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
7
+ }
8
+ catch (error) { e = { error: error }; }
9
+ finally {
10
+ try {
11
+ if (r && !r.done && (m = i["return"])) m.call(i);
12
+ }
13
+ finally { if (e) throw e.error; }
14
+ }
15
+ return ar;
16
+ };
17
+ import React from "react";
18
+ import { useGap } from "../useGap";
19
+ import { Footer as DefaultFooter } from "./Footer";
20
+ import "../../../internal/polyfill/IntersectionObserver";
21
+ export function Content(_a) {
22
+ var data = _a.data, emptyPlaceholder = _a.emptyPlaceholder, renderItem = _a.renderItem, gap = _a.gap, rowKey = _a.rowKey, loading = _a.loading, Footer = _a.Footer, endOfListMessage = _a.endOfListMessage, onPullUpLoading = _a.onPullUpLoading, hasNextPageMessage = _a.hasNextPageMessage;
23
+ var Item = renderItem;
24
+ var itemStyle = useGap(gap);
25
+ var markerId = React.useRef(createKey());
26
+ var loadedDataKey = React.useRef(null);
27
+ var _b = React.useMemo(function () { return splitByLast(data, 2); }, [data]), first = _b.first, second = _b.second;
28
+ var _c = __read(React.useState(createKey()), 2), dataKey = _c[0], setDataKey = _c[1];
29
+ var onPullUpLoadingRef = React.useRef(onPullUpLoading);
30
+ onPullUpLoadingRef.current = onPullUpLoading;
31
+ React.useEffect(function () { return setDataKey(createKey()); }, [data]);
32
+ React.useEffect(function () {
33
+ var marker = document.getElementById(markerId.current);
34
+ if (!marker)
35
+ return;
36
+ var observer = new IntersectionObserver(function (mutations) {
37
+ var _a;
38
+ var mutation = mutations[0];
39
+ if (!mutation.isIntersecting)
40
+ return;
41
+ var currentDataKey = mutation.target.getAttribute("data-key");
42
+ if (loadedDataKey.current === currentDataKey)
43
+ return;
44
+ loadedDataKey.current = currentDataKey;
45
+ (_a = onPullUpLoadingRef.current) === null || _a === void 0 ? void 0 : _a.call(onPullUpLoadingRef);
46
+ });
47
+ observer.observe(marker);
48
+ return function () { return observer.disconnect(); };
49
+ }, []);
50
+ var createItem = function (source) {
51
+ return source.map(function (_a) {
52
+ var d = _a.d, i = _a.i;
53
+ return (React.createElement("div", { className: "g-flat-list-item", key: rowKey === "index" ? i : String(d[rowKey]), style: itemStyle },
54
+ React.createElement(Item, { data: d, index: i })));
55
+ });
56
+ };
57
+ return (React.createElement("div", { className: "g-flat-list-content" }, data.length === 0 && emptyPlaceholder ? (emptyPlaceholder) : (React.createElement(React.Fragment, null,
58
+ createItem(first),
59
+ React.createElement("div", { id: markerId.current, "data-key": dataKey }),
60
+ createItem(second),
61
+ Footer && data.length > 0 ? (React.createElement(Footer, { loading: loading })) : (React.createElement(DefaultFooter, { loading: loading, hasNextPage: onPullUpLoading !== undefined, endOfListMessage: endOfListMessage, hasNextPageMessage: hasNextPageMessage }))))));
62
+ }
63
+ function splitByLast(data, last) {
64
+ var pair = data.map(function (d, i) { return ({ d: d, i: i }); });
65
+ var from = Math.max(0, data.length - last);
66
+ return { first: pair.slice(0, from), second: pair.slice(from) };
67
+ }
68
+ function createKey() {
69
+ return Date.now().toString(36) + Math.random().toString(36).substring(2);
70
+ }
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/FlatList/Content/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import "./index.less";
3
+ export declare const Loader: () => JSX.Element;
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import "./index.less";
3
+ export var Loader = function () {
4
+ return (React.createElement("div", { className: "g-flat-list-loader" },
5
+ React.createElement("div", { className: "dot" }),
6
+ React.createElement("div", { className: "dot" }),
7
+ React.createElement("div", { className: "dot" })));
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/FlatList/Loader/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,IAAM,MAAM,GAAG;IAClB,OAAO,CACH,6BAAK,SAAS,EAAC,oBAAoB;QAC/B,6BAAK,SAAS,EAAC,KAAK,GAAG;QACvB,6BAAK,SAAS,EAAC,KAAK,GAAG;QACvB,6BAAK,SAAS,EAAC,KAAK,GAAG,CACrB,CACT,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ .g-flat-list-loader {
2
+ display: flex;
3
+ flex-flow: row nowrap;
4
+ gap: 10px;
5
+
6
+ .dot {
7
+ width: 8px;
8
+ height: 8px;
9
+ border-radius: 50%;
10
+ background-color: #c2c2c2;
11
+ animation-name: jumping;
12
+ animation-duration: 750ms;
13
+ animation-timing-function: ease-in-out;
14
+ animation-iteration-count: infinite;
15
+
16
+ .delay(@count) when (@count > 0) {
17
+ &:nth-of-type(@{count}) {
18
+ animation-delay: @count * 250ms;
19
+ }
20
+ .delay(@count - 1);
21
+ }
22
+
23
+ .delay(4);
24
+ }
25
+
26
+ @keyframes jumping {
27
+ 0% {
28
+ opacity: 1;
29
+ }
30
+
31
+ 50% {
32
+ opacity: 0;
33
+ }
34
+
35
+ 100% {
36
+ opacity: 1;
37
+ }
38
+ }
39
+ }
@@ -4,5 +4,5 @@ interface Props {
4
4
  loading: boolean;
5
5
  message?: string;
6
6
  }
7
- export declare const Spinner: (props: Props) => JSX.Element;
7
+ export declare const Refresh: ({ loading, message }: Props) => JSX.Element;
8
8
  export {};
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { Loader } from "../Loader";
3
+ import "./index.less";
4
+ export var Refresh = function (_a) {
5
+ var loading = _a.loading, message = _a.message;
6
+ return React.createElement("div", { className: "g-flat-list-default-refresh" }, loading ? React.createElement(Loader, null) : React.createElement("span", null, message !== null && message !== void 0 ? message : "release to refresh"));
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/FlatList/Refresh/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,WAAW,CAAC;AACjC,OAAO,cAAc,CAAC;AAOtB,MAAM,CAAC,IAAM,OAAO,GAAG,UAAC,EAAyB;QAAxB,OAAO,aAAA,EAAE,OAAO,aAAA;IACrC,OAAO,6BAAK,SAAS,EAAC,6BAA6B,IAAE,OAAO,CAAC,CAAC,CAAC,oBAAC,MAAM,OAAG,CAAC,CAAC,CAAC,kCAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,oBAAoB,CAAQ,CAAO,CAAC;AACtI,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ .g-flat-list-default-refresh {
2
+ width: 100%;
3
+ display: flex;
4
+ flex-flow: column nowrap;
5
+ justify-content: center;
6
+ align-items: center;
7
+ padding: 20px 0;
8
+
9
+ > span {
10
+ animation: fade-in 200ms ease-in;
11
+ }
12
+
13
+ @keyframes fade-in {
14
+ from {
15
+ opacity: 0;
16
+ }
17
+
18
+ to {
19
+ opacity: 1;
20
+ }
21
+ }
22
+ }
@@ -1,3 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import type { FlatListProps } from "./type";
3
- export declare const FlatList: <T>(props: FlatListProps<T>) => JSX.Element;
3
+ import "./index.less";
4
+ export * from "./type";
5
+ export declare const FlatList: <T>({ renderItem, data, rowKey, id, className, gap, refreshing, loading, onPullDownRefresh, onPullUpLoading, emptyPlaceholder, Refresh, Footer, pullDownMessage, pullUpMessage, endOfListMessage, }: FlatListProps<T>) => JSX.Element;
@@ -26,35 +26,85 @@ var __read = (this && this.__read) || function (o, n) {
26
26
  return ar;
27
27
  };
28
28
  import React from "react";
29
- import { Wrapper } from "./shared/Wrapper";
30
- import { Footer } from "./shared/Footer";
31
- import { useLoadingWithDelay } from "./shared/hooks/useLoadingWithDelay";
32
29
  import { classNames } from "../../util/ClassNames";
33
- import { GetRowKey } from "./shared/GetRowKey";
34
- export var FlatList = function (props) {
35
- var data = props.data, ItemRenderer = props.renderItem, rowKey = props.rowKey, loading = props.loading, _a = props.bounceEffect, bounceEffect = _a === void 0 ? true : _a, className = props.className, style = props.style, gap = props.gap, onPullDownRefresh = props.onPullDownRefresh, onPullUpLoading = props.onPullUpLoading, contentStyle = props.contentStyle, emptyPlaceholder = props.emptyPlaceholder, pullDownRefreshingMessage = props.pullDownRefreshingMessage, pullUpLoadMoreMessage = props.pullUpLoadMoreMessage, pullDownRefreshMessage = props.pullDownRefreshMessage, pullUpLoadingMessage = props.pullUpLoadingMessage, endOfListMessage = props.endOfListMessage, hideFooter = props.hideFooter;
36
- var listWrapperRef = React.useRef(null);
37
- var _b = __read(React.useState(null), 2), loadingType = _b[0], setLoadingType = _b[1];
38
- var loadingWithDelay = useLoadingWithDelay(loading !== null && loading !== void 0 ? loading : false, 250);
39
- React.useEffect(function () {
40
- if ((loading === undefined || loading === null) && (onPullDownRefresh || onPullUpLoading)) {
41
- throw new Error("Loading must be specify when given either onPullDownRefresh or onPullUpLoading");
30
+ import { Direction } from "../../hooks/useSwipe";
31
+ import { useSwipe, useTransform } from "../../hooks";
32
+ import { getBounaryFromStartDirection, isExceededBounary, isScrollBottom, isScrollTop } from "./util";
33
+ import { Refresh as DefaultRefresh } from "./Refresh";
34
+ import { Content } from "./Content";
35
+ import "./index.less";
36
+ export * from "./type";
37
+ var PULL_DOWN_REFRESH_THRESHOLD = 50;
38
+ export var FlatList = function (_a) {
39
+ var renderItem = _a.renderItem, data = _a.data, rowKey = _a.rowKey, id = _a.id, className = _a.className, gap = _a.gap, refreshing = _a.refreshing, _b = _a.loading, loading = _b === void 0 ? false : _b, onPullDownRefresh = _a.onPullDownRefresh, onPullUpLoading = _a.onPullUpLoading, emptyPlaceholder = _a.emptyPlaceholder, Refresh = _a.Refresh, Footer = _a.Footer, pullDownMessage = _a.pullDownMessage, pullUpMessage = _a.pullUpMessage, endOfListMessage = _a.endOfListMessage;
40
+ var scrollRef = React.useRef(null);
41
+ var animtedRef = React.useRef(null);
42
+ var refreshHeight = React.useRef(0);
43
+ var previousBoundary = React.useRef(null);
44
+ var _c = __read(React.useState(null), 2), startDelta = _c[0], setStartDelta = _c[1];
45
+ var transit = useTransform(animtedRef, {
46
+ timingFunction: "cubic-bezier(0, 0.89, 0.26, 1.02)",
47
+ duration: 800,
48
+ });
49
+ var transitRef = React.useRef(transit);
50
+ transitRef.current = transit;
51
+ var threshold = function (_a) {
52
+ var direction = _a.direction;
53
+ var element = scrollRef.current;
54
+ if (!element)
55
+ return false;
56
+ if (direction === Direction.DOWN && isScrollTop(element)) {
57
+ return true;
42
58
  }
43
- }, [onPullDownRefresh, onPullUpLoading, loading]);
44
- // Automatically loading new data when scroll near the bottom
45
- var onScroll = function (e) {
46
- if (!loadingWithDelay && onPullUpLoading) {
47
- var _a = e.currentTarget, scrollHeight = _a.scrollHeight, scrollTop = _a.scrollTop, clientHeight = _a.clientHeight;
48
- if (scrollHeight * 0.8 < clientHeight + scrollTop) {
49
- setLoadingType("loading");
50
- onPullUpLoading === null || onPullUpLoading === void 0 ? void 0 : onPullUpLoading();
51
- }
59
+ else if (direction === Direction.UP && isScrollBottom(element)) {
60
+ return true;
52
61
  }
62
+ return false;
53
63
  };
54
- var margin = React.useMemo(function () { return (gap ? (typeof gap === "number" ? { margin: gap } : { marginLeft: gap.left, marginRight: gap.right, marginBottom: gap.bottom, marginTop: gap.top }) : {}); }, [gap]);
55
- return (React.createElement(Wrapper, { className: classNames("g-flat-list", className), listWrapperRef: listWrapperRef, bounceEffect: bounceEffect, innerStyle: contentStyle, loadingType: loadingType, onLoadingTypeChange: setLoadingType, loading: loadingWithDelay, style: style, onPullDownRefresh: onPullDownRefresh, onPullUpLoading: onPullUpLoading, pullDownRefreshMessage: pullDownRefreshMessage, pullDownRefreshingMessage: pullDownRefreshingMessage, onScroll: onScroll }, data.length === 0 ? (emptyPlaceholder) : (React.createElement("div", { className: "list" },
56
- data.map(function (d, i) { return (React.createElement("div", { className: "g-flat-list-item", key: GetRowKey(rowKey, d, i), style: __assign({}, margin) },
57
- React.createElement(ItemRenderer, { data: d, index: i }))); }),
58
- !hideFooter && (React.createElement(Footer, { loading: loadingWithDelay && loadingType === "loading", ended: !onPullUpLoading, loadMoreMessage: pullUpLoadMoreMessage, loadingMessage: pullUpLoadingMessage, endMessage: endOfListMessage }))))));
64
+ var clear = function () {
65
+ transit.clear();
66
+ setStartDelta(null);
67
+ };
68
+ var bind = useSwipe({
69
+ onStart: function (_a) {
70
+ var _b = __read(_a.delta, 2), y = _b[1], direction = _a.direction;
71
+ setStartDelta(y);
72
+ previousBoundary.current = getBounaryFromStartDirection(direction);
73
+ },
74
+ onMove: function (_a) {
75
+ var _b = __read(_a.delta, 2), y = _b[1], cancel = _a.cancel;
76
+ if (!startDelta || !previousBoundary.current)
77
+ return;
78
+ var transform = y - startDelta;
79
+ transit.to({ y: transform, immediate: true });
80
+ isExceededBounary(transform, previousBoundary.current) && cancel();
81
+ },
82
+ onEnd: function (_a) {
83
+ var _b = __read(_a.delta, 2), y = _b[1];
84
+ if (!startDelta)
85
+ return;
86
+ if (previousBoundary.current === "top" && onPullDownRefresh && y - startDelta >= PULL_DOWN_REFRESH_THRESHOLD && !refreshing) {
87
+ onPullDownRefresh();
88
+ }
89
+ clear();
90
+ },
91
+ onCancel: clear,
92
+ }, { threshold: threshold, preventDefault: true, stopPropagation: true });
93
+ var onScroll = function () { return transit.clear(); };
94
+ var updateRefreshHeight = function (node) { return node && (refreshHeight.current = node.getBoundingClientRect().height); };
95
+ React.useEffect(function () {
96
+ if (refreshing && previousBoundary.current === "top") {
97
+ previousBoundary.current === null;
98
+ transitRef.current.to({ y: refreshHeight.current });
99
+ }
100
+ else {
101
+ transitRef.current.clear();
102
+ }
103
+ }, [refreshing]);
104
+ return (React.createElement("div", __assign({ id: id, className: classNames("g-flat-list", className) }, bind),
105
+ React.createElement("div", { className: "g-flat-list-inner-wrapper", ref: animtedRef },
106
+ onPullDownRefresh && refreshing !== undefined && (React.createElement("div", { className: "g-flat-list-refresh", ref: updateRefreshHeight }, Refresh ? React.createElement(Refresh, { loading: refreshing }) : React.createElement(DefaultRefresh, { loading: refreshing, message: pullDownMessage }))),
107
+ React.createElement("div", { className: "g-flat-list-scrollable", ref: scrollRef, style: { overflow: startDelta ? "hidden" : undefined }, onScroll: onScroll },
108
+ React.createElement(Content, { data: data, rowKey: rowKey, renderItem: renderItem, gap: gap, emptyPlaceholder: emptyPlaceholder, Footer: Footer, loading: loading, endOfListMessage: endOfListMessage, hasNextPageMessage: pullUpMessage, onPullUpLoading: onPullUpLoading })))));
59
109
  };
60
110
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/FlatList/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAC,mBAAmB,EAAC,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,IAAM,QAAQ,GAAG,UAAa,KAAuB;IAEpD,IAAA,IAAI,GAkBJ,KAAK,KAlBD,EACQ,YAAY,GAiBxB,KAAK,WAjBmB,EACxB,MAAM,GAgBN,KAAK,OAhBC,EACN,OAAO,GAeP,KAAK,QAfE,EACP,KAcA,KAAK,aAdc,EAAnB,YAAY,mBAAG,IAAI,KAAA,EACnB,SAAS,GAaT,KAAK,UAbI,EACT,KAAK,GAYL,KAAK,MAZA,EACL,GAAG,GAWH,KAAK,IAXF,EACH,iBAAiB,GAUjB,KAAK,kBAVY,EACjB,eAAe,GASf,KAAK,gBATU,EACf,YAAY,GAQZ,KAAK,aARO,EACZ,gBAAgB,GAOhB,KAAK,iBAPW,EAChB,yBAAyB,GAMzB,KAAK,0BANoB,EACzB,qBAAqB,GAKrB,KAAK,sBALgB,EACrB,sBAAsB,GAItB,KAAK,uBAJiB,EACtB,oBAAoB,GAGpB,KAAK,qBAHe,EACpB,gBAAgB,GAEhB,KAAK,iBAFW,EAChB,UAAU,GACV,KAAK,WADK,CACJ;IAEV,IAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IACpD,IAAA,KAAA,OAAgC,KAAK,CAAC,QAAQ,CAAc,IAAI,CAAC,IAAA,EAAhE,WAAW,QAAA,EAAE,cAAc,QAAqC,CAAC;IACxE,IAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpE,KAAK,CAAC,SAAS,CAAC;QACZ,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,eAAe,CAAC,EAAE;YACvF,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;SACrG;IACL,CAAC,EAAE,CAAC,iBAAiB,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAElD,6DAA6D;IAC7D,IAAM,QAAQ,GAAG,UAAC,CAAgB;QAC9B,IAAI,CAAC,gBAAgB,IAAI,eAAe,EAAE;YAChC,IAAA,KAA0C,CAAC,CAAC,aAAa,EAAxD,YAAY,kBAAA,EAAE,SAAS,eAAA,EAAE,YAAY,kBAAmB,CAAC;YAChE,IAAI,YAAY,GAAG,GAAG,GAAG,YAAY,GAAG,SAAS,EAAE;gBAC/C,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1B,eAAe,aAAf,eAAe,uBAAf,eAAe,EAAI,CAAC;aACvB;SACJ;IACL,CAAC,CAAC;IAEF,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CACxB,cAA2B,OAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC,EAAC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAArJ,CAAqJ,EAChL,CAAC,GAAG,CAAC,CACR,CAAC;IAEF,OAAO,CACH,oBAAC,OAAO,IACJ,SAAS,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,EAC/C,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,YAAY,EACxB,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,cAAc,EACnC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,sBAAsB,EAAE,sBAAsB,EAC9C,yBAAyB,EAAE,yBAAyB,EACpD,QAAQ,EAAE,QAAQ,IAEjB,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACjB,gBAAgB,CACnB,CAAC,CAAC,CAAC,CACA,6BAAK,SAAS,EAAC,MAAM;QAChB,IAAI,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAChB,6BAAK,SAAS,EAAC,kBAAkB,EAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,eAAM,MAAM;YAC7E,oBAAC,YAAY,IAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAI,CACjC,CACT,EAJmB,CAInB,CAAC;QACD,CAAC,UAAU,IAAI,CACZ,oBAAC,MAAM,IACH,OAAO,EAAE,gBAAgB,IAAI,WAAW,KAAK,SAAS,EACtD,KAAK,EAAE,CAAC,eAAe,EACvB,eAAe,EAAE,qBAAqB,EACtC,cAAc,EAAE,oBAAoB,EACpC,UAAU,EAAE,gBAAgB,GAC9B,CACL,CACC,CACT,CACK,CACb,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/FlatList/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ .g-flat-list {
2
+ position: relative;
3
+ display: flex;
4
+ flex-flow: column nowrap;
5
+ flex: 1;
6
+ overflow: hidden;
7
+ width: 100%;
8
+ height: 100%;
9
+
10
+ .g-flat-list-inner-wrapper {
11
+ display: flex;
12
+ flex-flow: column nowrap;
13
+ flex: 1;
14
+ max-height: 100%;
15
+ will-change: transform;
16
+ transition-timing-function: cubic-bezier(0, 0.89, 0.26, 1.02);
17
+ transition-duration: 800ms;
18
+
19
+ .g-flat-list-refresh {
20
+ position: absolute;
21
+ width: 100%;
22
+ height: auto;
23
+ transform: translateY(-100%);
24
+ }
25
+
26
+ .g-flat-list-scrollable {
27
+ display: flex;
28
+ height: 100%;
29
+ overflow: auto;
30
+ overscroll-behavior: none;
31
+ flex-flow: column nowrap;
32
+
33
+ .g-flat-list-content {
34
+ display: flex;
35
+ flex-flow: column nowrap;
36
+ height: 100%;
37
+ }
38
+ }
39
+ }
40
+ }
@@ -1,48 +1,82 @@
1
- /// <reference types="react" />
2
- export declare const PULL_DOWN_REFRESH_THRESHOLD = 50;
3
- export type LoadingType = "refresh" | "loading" | null;
4
- export interface FlatListItemProps<T> {
5
- data: T;
6
- index: number;
7
- }
8
- export type Gap = {
1
+ import type React from "react";
2
+ export type Boundary = "top" | "bottom";
3
+ export type Gap = number | {
9
4
  top?: number;
10
5
  bottom?: number;
11
6
  left?: number;
12
7
  right?: number;
13
- } | number;
14
- export type ItemRenderer<T> = React.FunctionComponent<FlatListItemProps<T>>;
15
- export type RowKey<T> = (keyof T & string) | ((data: T, index: number) => string) | "index";
8
+ };
9
+ export interface FlatListItemProps<T> {
10
+ data: T;
11
+ index: number;
12
+ }
16
13
  export interface FlatListProps<T> {
14
+ /**
15
+ * List of data to show in the list
16
+ */
17
17
  data: T[];
18
- renderItem: ItemRenderer<T>;
19
- rowKey: RowKey<T>;
18
+ /**
19
+ * Specify key for each `item` using Object key of type `T`
20
+ */
21
+ rowKey: keyof T | "index";
22
+ /**
23
+ * A component render for each item
24
+ */
25
+ renderItem: React.ComponentType<FlatListItemProps<T>>;
26
+ /**
27
+ * Set this to true when waiting for new data by pull down refresh
28
+ */
29
+ refreshing?: boolean;
30
+ /**
31
+ * Set this to true when waiting for new data by pull down refresh
32
+ */
20
33
  loading?: boolean;
21
- className?: string;
22
- style?: React.CSSProperties;
23
- /** When either onPullUpLoading or onPullDownRefresh is given, loading must be given too */
24
- onPullUpLoading?: () => void;
34
+ /**
35
+ * If Provided, `Refresh` component will be loaded into the FlatList, you can also specify your own Refresh component using `refresh` props
36
+ */
25
37
  onPullDownRefresh?: () => void;
38
+ /**
39
+ * If Provided, `Footer` component will be loaded into the FlatList, you can also specify your own Refresh component using `footer` props
40
+ */
41
+ onPullUpLoading?: () => void;
42
+ /**
43
+ * If Provided, Element will be shown when `data` is a empty array
44
+ */
26
45
  emptyPlaceholder?: string | React.ReactElement;
27
- contentStyle?: React.CSSProperties;
28
- bounceEffect?: boolean;
29
- hideFooter?: boolean;
46
+ /**
47
+ * if Provided, default `Footer` component will be replaced
48
+ */
49
+ Footer?: React.ComponentType<{
50
+ loading: boolean;
51
+ }>;
52
+ /**
53
+ * `refresh` component will be shown when `refreshing` is equal `true`
54
+ * if Provided, default `Refresh` component will be replaced
55
+ */
56
+ Refresh?: React.ComponentType<{
57
+ loading: boolean;
58
+ }>;
59
+ /**
60
+ * `pullUpMessage` will be show in `Refresh` only if `onPullDownRefresh` is defined
61
+ * if Provided, this message will replace the pull down message in default `Refresh`
62
+ * if `Refresh` is provided, this props will be ignored
63
+ */
64
+ pullDownMessage?: string;
65
+ /**
66
+ * `pullUpMessage` will be show in `Footer` only if `onPullUpLoading` is defined
67
+ * if Provided, this message will replace end of list message in default `Footer`
68
+ * if `Footer` is provided, this props will be ignored
69
+ */
70
+ pullUpMessage?: string;
71
+ /**
72
+ * if Provided, this message will replace end of list message in default `Footer`
73
+ * if `Footer` is provided, this props will be ignored
74
+ */
75
+ endOfListMessage?: string;
76
+ /**
77
+ * Set margin for each item
78
+ */
30
79
  gap?: Gap;
31
- pullDownRefreshMessage?: React.ReactElement | string;
32
- pullDownRefreshingMessage?: React.ReactElement | string;
33
- pullUpLoadMoreMessage?: React.ReactElement | string;
34
- pullUpLoadingMessage?: React.ReactElement | string;
35
- endOfListMessage?: React.ReactElement | string;
36
- }
37
- export interface FlatListItemProps<T> {
38
- data: T;
39
- index: number;
40
- }
41
- export interface FooterData {
42
- __markedAsFooterData: true;
43
- loading: boolean;
44
- ended: boolean;
45
- loadMoreMessage?: React.ReactElement | string;
46
- loadingMessage?: React.ReactElement | string;
47
- endMessage?: React.ReactElement | string;
80
+ className?: string;
81
+ id?: string;
48
82
  }
@@ -1,2 +1,2 @@
1
- export var PULL_DOWN_REFRESH_THRESHOLD = 50;
1
+ export {};
2
2
  //# sourceMappingURL=type.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/core/FlatList/type.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,2BAA2B,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/core/FlatList/type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { Gap } from "./type";
2
+ export declare const useGap: (gap?: Gap) => React.CSSProperties;
@@ -0,0 +1,12 @@
1
+ export var useGap = function (gap) {
2
+ if (!gap)
3
+ return {};
4
+ if (typeof gap === "number") {
5
+ return { paddingTop: gap, paddingBottom: gap, paddingLeft: gap, paddingRight: gap };
6
+ }
7
+ else {
8
+ var top_1 = gap.top, bottom = gap.bottom, left = gap.left, right = gap.right;
9
+ return { paddingTop: top_1, paddingBottom: bottom, paddingLeft: left, paddingRight: right };
10
+ }
11
+ };
12
+ //# sourceMappingURL=useGap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGap.js","sourceRoot":"","sources":["../../../src/core/FlatList/useGap.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAM,MAAM,GAAG,UAAC,GAAS;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACzB,OAAO,EAAC,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAC,CAAC;KACrF;SAAM;QACI,IAAA,KAAG,GAAyB,GAAG,IAA5B,EAAE,MAAM,GAAiB,GAAG,OAApB,EAAE,IAAI,GAAW,GAAG,KAAd,EAAE,KAAK,GAAI,GAAG,MAAP,CAAQ;QACvC,OAAO,EAAC,UAAU,EAAE,KAAG,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC;KAC3F;AACL,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Direction } from "../../hooks/useSwipe";
2
+ import type { Boundary } from "./type";
3
+ export declare function isExceededBounary(delta: number, boundary: Boundary): boolean;
4
+ export declare function getBounaryFromStartDirection(direction: Direction): Boundary | null;
5
+ export declare function isScrollTop(element: HTMLElement): boolean;
6
+ export declare function isScrollBottom(element: HTMLElement): boolean;
7
+ export declare function isScrollLeft(element: HTMLElement): boolean;
8
+ export declare function isScrollRight(element: HTMLElement): boolean;
@@ -0,0 +1,35 @@
1
+ import { Direction } from "../../hooks/useSwipe";
2
+ var OVER_BOUNDARY_LIMIT = 40;
3
+ export function isExceededBounary(delta, boundary) {
4
+ switch (boundary) {
5
+ case "top":
6
+ return delta < -OVER_BOUNDARY_LIMIT;
7
+ case "bottom":
8
+ return delta > OVER_BOUNDARY_LIMIT;
9
+ }
10
+ }
11
+ export function getBounaryFromStartDirection(direction) {
12
+ switch (direction) {
13
+ case Direction.DOWN:
14
+ return "top";
15
+ case Direction.UP:
16
+ return "bottom";
17
+ default:
18
+ return null;
19
+ }
20
+ }
21
+ export function isScrollTop(element) {
22
+ return element.scrollTop === 0;
23
+ }
24
+ export function isScrollBottom(element) {
25
+ var scrollTop = element.scrollTop, clientHeight = element.clientHeight, scrollHeight = element.scrollHeight;
26
+ return Math.ceil(scrollTop) + clientHeight >= scrollHeight;
27
+ }
28
+ export function isScrollLeft(element) {
29
+ return element.scrollLeft === 0;
30
+ }
31
+ export function isScrollRight(element) {
32
+ var scrollWidth = element.scrollWidth, scrollLeft = element.scrollLeft, clientWidth = element.clientWidth;
33
+ return Math.ceil(scrollLeft) + clientWidth >= scrollWidth;
34
+ }
35
+ //# sourceMappingURL=util.js.map