@bigbinary/neetoui-rn 0.0.149 → 0.0.150
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/components/Accordion.js +1 -1
- package/lib/components/FlashList.js +1 -1
- package/lib/hooks/index.js +1 -1
- package/lib/hooks/useRefreshByUser.js +1 -0
- package/package.json +3 -2
- package/src/components/FlashList.js +89 -18
- package/src/hooks/index.js +1 -0
- package/src/hooks/useRefreshByUser.js +20 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Accordion=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _native=require("styled-components/native");var _=require("./");var _excluded=["header","noBorder","iconProp","children"];var _this=this,_jsxFileName="/home/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Accordion.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var Accordion=function Accordion(props){var header=props.header,_props$noBorder=props.noBorder,noBorder=_props$noBorder===void 0?false:_props$noBorder,_props$iconProp=props.iconProp,iconProp=_props$iconProp===void 0?{}:_props$iconProp,children=props.children,rest=(0,_objectWithoutProperties2.default)(props,_excluded);var name=iconProp.name,Label=iconProp.Label,size=iconProp.size,color=iconProp.color;var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),isExpanded=_useState2[0],setExpanded=_useState2[1];var _useState3=(0,_react.useState)(0),_useState4=(0,_slicedToArray2.default)(_useState3,2),viewHeight=_useState4[0],setViewHeight=_useState4[1];var animationController=(0,_react.useRef)(new _reactNative.Animated.Value(isExpanded?1:0)).current;var getLayout=function getLayout(event){var height=event.nativeEvent.layout.height;setViewHeight(height);};
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Accordion=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _native=require("styled-components/native");var _=require("./");var _excluded=["header","noBorder","iconProp","children"];var _this=this,_jsxFileName="/home/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Accordion.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var Accordion=function Accordion(props){var header=props.header,_props$noBorder=props.noBorder,noBorder=_props$noBorder===void 0?false:_props$noBorder,_props$iconProp=props.iconProp,iconProp=_props$iconProp===void 0?{}:_props$iconProp,children=props.children,rest=(0,_objectWithoutProperties2.default)(props,_excluded);var name=iconProp.name,Label=iconProp.Label,size=iconProp.size,color=iconProp.color;var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),isExpanded=_useState2[0],setExpanded=_useState2[1];var _useState3=(0,_react.useState)(0),_useState4=(0,_slicedToArray2.default)(_useState3,2),viewHeight=_useState4[0],setViewHeight=_useState4[1];var animationController=(0,_react.useRef)(new _reactNative.Animated.Value(isExpanded?1:0)).current;var getLayout=function getLayout(event){var height=event.nativeEvent.layout.height;setViewHeight(height);};(0,_react.useEffect)(function(){_reactNative.Animated.timing(animationController,{duration:300,toValue:isExpanded?1:0,useNativeDriver:false}).start();},[isExpanded]);var handleAnimation=function handleAnimation(){setExpanded(!isExpanded);};var arrowAngle=animationController.interpolate({inputRange:[0,1],outputRange:["0rad",Math.PI+"rad"]});var bodyContentHeight=animationController.interpolate({inputRange:[0,1],outputRange:[0,viewHeight]});return _react.default.createElement(_.Container,(0,_extends2.default)({},!noBorder&&{borderColor:"border.grey400",borderWidth:1,borderRadius:8},{width:"100%"},rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:86,columnNumber:5}}),_react.default.createElement(_.Card,{p:2,flexDirection:"row",alignItems:"center",onPress:function onPress(){handleAnimation();},__self:_this,__source:{fileName:_jsxFileName,lineNumber:95,columnNumber:7}},!!header&&_react.default.createElement(_.Container,{flexGrow:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:103,columnNumber:22}},header()),_react.default.createElement(_.Container,{alignItems:"center",justifyContent:"center",flexDirection:"row",px:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:104,columnNumber:9}},Label&&_react.default.createElement(Label,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:110,columnNumber:21}}),_react.default.createElement(_reactNative.Animated.View,{style:{alignItems:"flex-end",transform:[{rotateZ:arrowAngle}]},__self:_this,__source:{fileName:_jsxFileName,lineNumber:111,columnNumber:11}},_react.default.createElement(_.Container,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:117,columnNumber:13}},_react.default.createElement(_reactNativeRemixIcon.default,{name:name!=null?name:"ri-arrow-down-s-line",color:color!=null?color:theme.colors.font.grey700,size:size!=null?size:24,__self:_this,__source:{fileName:_jsxFileName,lineNumber:118,columnNumber:15}}))))),_react.default.createElement(_reactNative.Animated.View,{style:{height:bodyContentHeight,overflow:"hidden"},__self:_this,__source:{fileName:_jsxFileName,lineNumber:127,columnNumber:7}},_react.default.createElement(_.Container,{width:"100%",position:"absolute",onLayout:getLayout,__self:_this,__source:{fileName:_jsxFileName,lineNumber:128,columnNumber:9}},children)));};exports.Accordion=Accordion;Accordion.propTypes={header:_propTypes.default.func,children:_propTypes.default.node,noBorder:_propTypes.default.bool,iconProp:_propTypes.default.shape({name:_propTypes.default.string,Label:_propTypes.default.elementType,size:_propTypes.default.number,color:_propTypes.default.string})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.FlashList=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireWildcard(require("react"));var _flashList=require("@shopify/flash-list");var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _propTypes=_interopRequireDefault(require("prop-types"));var _native=_interopRequireWildcard(require("react-content-loader/native"));var _native2=require("styled-components/native");var _reactNative=require("react-native");var _hooks=require("../hooks");var _excluded=["durationPerItem","SkeletonComponent","placeHolderItemCount","isLoading","data","onRefresh","keyExtractor"],_excluded2=["renderItem","initialDelay","durationPerItem","isLoading","SkeletonComponent"];var _this=this,_jsxFileName="/home/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/FlashList.js";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var Placeholder=function Placeholder(){var theme=(0,_react.useContext)(_native2.ThemeContext);return _react.default.createElement(_native.default,{height:68,width:400,viewBox:"0 0 400 50",backgroundColor:theme.colors.lightgrey,foregroundColor:theme.colors.grey300,__self:_this,__source:{fileName:_jsxFileName,lineNumber:22,columnNumber:5}},_react.default.createElement(_native.Rect,{x:"0",y:"8",width:400,height:"70",__self:_this,__source:{fileName:_jsxFileName,lineNumber:29,columnNumber:7}}));};var FlashList=function FlashList(_ref){var _ref$durationPerItem=_ref.durationPerItem,durationPerItem=_ref$durationPerItem===void 0?200:_ref$durationPerItem,SkeletonComponent=_ref.SkeletonComponent,_ref$placeHolderItemC=_ref.placeHolderItemCount,placeHolderItemCount=_ref$placeHolderItemC===void 0?10:_ref$placeHolderItemC,_ref$isLoading=_ref.isLoading,isLoading=_ref$isLoading===void 0?false:_ref$isLoading,_ref$data=_ref.data,data=_ref$data===void 0?[]:_ref$data,_ref$onRefresh=_ref.onRefresh,onRefresh=_ref$onRefresh===void 0?function(){}:_ref$onRefresh,_keyExtractor=_ref.keyExtractor,rest=(0,_objectWithoutProperties2.default)(_ref,_excluded);var dummyData=Array.apply(null,Array(placeHolderItemCount));var _useRefreshByUser=(0,_hooks.useRefreshByUser)(onRefresh),isRefetchingByUser=_useRefreshByUser.isRefetchingByUser,refetchByUser=_useRefreshByUser.refetchByUser;return _react.default.createElement(FadeInFlatList,(0,_extends2.default)({durationPerItem:durationPerItem,SkeletonComponent:SkeletonComponent,isLoading:isLoading,extraData:{isLoading:isLoading},data:isLoading?dummyData:data,refreshControl:onRefresh&&_react.default.createElement(_reactNative.RefreshControl,{refreshing:isRefetchingByUser,onRefresh:refetchByUser,__self:_this,__source:{fileName:_jsxFileName,lineNumber:57,columnNumber:11}}),keyExtractor:function keyExtractor(item,index){return isLoading||!_keyExtractor?index.toString():_keyExtractor(item,index);}},rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:49,columnNumber:5}}));};exports.FlashList=FlashList;var FadeInFlatList=function FadeInFlatList(_ref2){var originalRenderItem=_ref2.renderItem,_ref2$initialDelay=_ref2.initialDelay,initialDelay=_ref2$initialDelay===void 0?250:_ref2$initialDelay,_ref2$durationPerItem=_ref2.durationPerItem,durationPerItem=_ref2$durationPerItem===void 0?200:_ref2$durationPerItem,_ref2$isLoading=_ref2.isLoading,isLoading=_ref2$isLoading===void 0?false:_ref2$isLoading,SkeletonComponent=_ref2.SkeletonComponent,props=(0,_objectWithoutProperties2.default)(_ref2,_excluded2);var value=(0,_reactNativeReanimated.useSharedValue)(0);var FadeInComponent=(0,_react.useCallback)(function(_ref3){var index=_ref3.index,children=_ref3.children;var inputRange=index===0?[-1,0,1,2]:[index-1,index,index+1,index+2];var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{opacity:(0,_reactNativeReanimated.interpolate)(value.value,inputRange,[0,0,1,1],_reactNativeReanimated.Extrapolation.CLAMP),transform:[{translateX:(0,_reactNativeReanimated.interpolate)(value.value,inputRange,[25,15,10,0],_reactNativeReanimated.Extrapolation.CLAMP)}]};};_f._closure={interpolate:_reactNativeReanimated.interpolate,value:value,inputRange:inputRange,Extrapolation:{CLAMP:_reactNativeReanimated.Extrapolation.CLAMP}};_f.asString="function _f(){const{interpolate,value,inputRange,Extrapolation}=jsThis._closure;{return{opacity:interpolate(value.value,inputRange,[0,0,1,1],Extrapolation.CLAMP),transform:[{translateX:interpolate(value.value,inputRange,[25,15,10,0],Extrapolation.CLAMP)}]};}}";_f.__workletHash=13443821877058;_f.__location="/home/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/FlashList.js (88:46)";_f.__optimalization=3;return _f;}());return _react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:109,columnNumber:14}},children);},[]);var Item=(0,_react.useCallback)(function(_ref4){var _item$extraData;var item=_ref4.item;return item!=null&&(_item$extraData=item.extraData)!=null&&_item$extraData.isLoading?_react.default.createElement(FadeInComponent,{index:item.index,__self:_this,__source:{fileName:_jsxFileName,lineNumber:118,columnNumber:9}},SkeletonComponent||_react.default.createElement(Placeholder,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:119,columnNumber:33}})):item.index===0?originalRenderItem(item):_react.default.createElement(FadeInComponent,{index:item.index,__self:_this,__source:{fileName:_jsxFileName,lineNumber:124,columnNumber:9}},originalRenderItem(item));},[]);var renderItem=(0,_react.useCallback)(function(item){return _react.default.createElement(Item,{item:item,__self:_this,__source:{fileName:_jsxFileName,lineNumber:134,columnNumber:12}});},[]);(0,_react.useEffect)(function(){value.value=0;value.value=(0,_reactNativeReanimated.withDelay)(initialDelay,(0,_reactNativeReanimated.withTiming)(props.data.length+1,{duration:props.data.length*durationPerItem}));},[props.data.length,durationPerItem,initialDelay,value,isLoading]);return _react.default.createElement(_flashList.FlashList,(0,_extends2.default)({},props,{renderItem:renderItem,__self:_this,__source:{fileName:_jsxFileName,lineNumber:147,columnNumber:10}}));};FlashList.propTypes={SkeletonComponent:_propTypes.default.element,durationPerItem:_propTypes.default.number,data:_propTypes.default.array.isRequired,isLoading:_propTypes.default.bool,placeHolderItemCount:_propTypes.default.number,onRefresh:_propTypes.default.func,keyExtractor:_propTypes.default.func};
|
package/lib/hooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"useDebounce",{enumerable:true,get:function get(){return _useDebounce.useDebounce;}});Object.defineProperty(exports,"useKeyboard",{enumerable:true,get:function get(){return _useKeyboard.useKeyboard;}});var _useKeyboard=require("./useKeyboard");var _useDebounce=require("./useDebounce");
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"useDebounce",{enumerable:true,get:function get(){return _useDebounce.useDebounce;}});Object.defineProperty(exports,"useKeyboard",{enumerable:true,get:function get(){return _useKeyboard.useKeyboard;}});Object.defineProperty(exports,"useRefreshByUser",{enumerable:true,get:function get(){return _useRefreshByUser.useRefreshByUser;}});var _useKeyboard=require("./useKeyboard");var _useDebounce=require("./useDebounce");var _useRefreshByUser=require("./useRefreshByUser");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.useRefreshByUser=useRefreshByUser;var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _react=require("react");function useRefreshByUser(refetch){var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),isRefetchingByUser=_useState2[0],setIsRefetchingByUser=_useState2[1];function refetchByUser(){return _regenerator.default.async(function refetchByUser$(_context){while(1){switch(_context.prev=_context.next){case 0:setIsRefetchingByUser(true);_context.prev=1;_context.next=4;return _regenerator.default.awrap(refetch());case 4:_context.prev=4;setIsRefetchingByUser(false);return _context.finish(4);case 7:case"end":return _context.stop();}}},null,null,[[1,,4,7]],Promise);}return{isRefetchingByUser:isRefetchingByUser,refetchByUser:refetchByUser};}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigbinary/neetoui-rn",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.150",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"author": "BigBinary",
|
|
6
6
|
"license": "MIT",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"@shopify/flash-list": "^1.2.0",
|
|
51
51
|
"@styled-system/prop-types": "^5.1.5",
|
|
52
52
|
"dayjs": "^1.11.4",
|
|
53
|
+
"react-content-loader": "^6.2.0",
|
|
53
54
|
"react-native-calendars": "^1.1285.0",
|
|
54
55
|
"react-native-gesture-handler": "^2.4.0",
|
|
55
56
|
"react-native-material-ripple": "^0.9.1",
|
|
@@ -68,6 +69,7 @@
|
|
|
68
69
|
"@babel/cli": "^7.16.0",
|
|
69
70
|
"@babel/core": "^7.12.9",
|
|
70
71
|
"@babel/runtime": "^7.12.5",
|
|
72
|
+
"@bigbinary/eslint-plugin-neeto": "^1.0.11",
|
|
71
73
|
"@react-native-async-storage/async-storage": "^1.15.11",
|
|
72
74
|
"@react-native-community/datetimepicker": "^3.5.2",
|
|
73
75
|
"@react-native-community/eslint-config": "^3.0.1",
|
|
@@ -99,7 +101,6 @@
|
|
|
99
101
|
"eslint-import-resolver-babel-module": "^5.3.1",
|
|
100
102
|
"eslint-plugin-import": "^2.25.3",
|
|
101
103
|
"eslint-plugin-jest": "^25.2.4",
|
|
102
|
-
"eslint-plugin-neeto": "^1.0.10",
|
|
103
104
|
"eslint-plugin-prettier": "^4.0.0",
|
|
104
105
|
"eslint-plugin-promise": "^5.1.1",
|
|
105
106
|
"eslint-plugin-react": "^7.27.0",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable react/prop-types */
|
|
2
|
-
import React, { useCallback, useEffect } from "react";
|
|
2
|
+
import React, { useCallback, useContext, useEffect } from "react";
|
|
3
3
|
import { FlashList as ShopifyFlashList } from "@shopify/flash-list";
|
|
4
4
|
import Animated, {
|
|
5
5
|
Extrapolation,
|
|
@@ -9,10 +9,64 @@ import Animated, {
|
|
|
9
9
|
withDelay,
|
|
10
10
|
withTiming,
|
|
11
11
|
} from "react-native-reanimated";
|
|
12
|
+
import PropTypes from "prop-types";
|
|
13
|
+
import ContentLoader, { Rect } from "react-content-loader/native";
|
|
14
|
+
import { ThemeContext } from "styled-components/native";
|
|
15
|
+
import { RefreshControl } from "react-native";
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
import { useRefreshByUser } from "@hooks";
|
|
18
|
+
|
|
19
|
+
const Placeholder = () => {
|
|
20
|
+
const theme = useContext(ThemeContext);
|
|
14
21
|
return (
|
|
15
|
-
<
|
|
22
|
+
<ContentLoader
|
|
23
|
+
height={68}
|
|
24
|
+
width={400}
|
|
25
|
+
viewBox="0 0 400 50"
|
|
26
|
+
backgroundColor={theme.colors.lightgrey}
|
|
27
|
+
foregroundColor={theme.colors.grey300}
|
|
28
|
+
>
|
|
29
|
+
<Rect x="0" y="8" width={400} height="70" />
|
|
30
|
+
</ContentLoader>
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const FlashList = ({
|
|
35
|
+
durationPerItem = 200,
|
|
36
|
+
SkeletonComponent,
|
|
37
|
+
placeHolderItemCount = 10,
|
|
38
|
+
isLoading = false,
|
|
39
|
+
data = [],
|
|
40
|
+
onRefresh = () => {},
|
|
41
|
+
keyExtractor,
|
|
42
|
+
...rest
|
|
43
|
+
}) => {
|
|
44
|
+
const dummyData = Array.apply(null, Array(placeHolderItemCount));
|
|
45
|
+
|
|
46
|
+
const { isRefetchingByUser, refetchByUser } = useRefreshByUser(onRefresh);
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<FadeInFlatList
|
|
50
|
+
durationPerItem={durationPerItem}
|
|
51
|
+
SkeletonComponent={SkeletonComponent}
|
|
52
|
+
isLoading={isLoading}
|
|
53
|
+
extraData={{ isLoading }}
|
|
54
|
+
data={isLoading ? dummyData : data}
|
|
55
|
+
refreshControl={
|
|
56
|
+
onRefresh && (
|
|
57
|
+
<RefreshControl
|
|
58
|
+
refreshing={isRefetchingByUser}
|
|
59
|
+
onRefresh={refetchByUser}
|
|
60
|
+
/>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
keyExtractor={(item, index) => {
|
|
64
|
+
return isLoading || !keyExtractor
|
|
65
|
+
? index.toString()
|
|
66
|
+
: keyExtractor(item, index);
|
|
67
|
+
}}
|
|
68
|
+
{...rest}
|
|
69
|
+
/>
|
|
16
70
|
);
|
|
17
71
|
};
|
|
18
72
|
|
|
@@ -20,7 +74,8 @@ const FadeInFlatList = ({
|
|
|
20
74
|
renderItem: originalRenderItem,
|
|
21
75
|
initialDelay = 250,
|
|
22
76
|
durationPerItem = 200,
|
|
23
|
-
|
|
77
|
+
isLoading = false,
|
|
78
|
+
SkeletonComponent,
|
|
24
79
|
...props
|
|
25
80
|
}) => {
|
|
26
81
|
const value = useSharedValue(0);
|
|
@@ -57,31 +112,47 @@ const FadeInFlatList = ({
|
|
|
57
112
|
[]
|
|
58
113
|
);
|
|
59
114
|
|
|
60
|
-
const Item = useCallback(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
115
|
+
const Item = useCallback(
|
|
116
|
+
({ item }) => {
|
|
117
|
+
return item?.extraData?.isLoading ? (
|
|
118
|
+
<FadeInComponent index={item.index}>
|
|
119
|
+
{SkeletonComponent || <Placeholder />}
|
|
120
|
+
</FadeInComponent>
|
|
121
|
+
) : item.index === 0 ? (
|
|
122
|
+
originalRenderItem(item)
|
|
123
|
+
) : (
|
|
124
|
+
<FadeInComponent index={item.index}>
|
|
125
|
+
{originalRenderItem(item)}
|
|
126
|
+
</FadeInComponent>
|
|
127
|
+
);
|
|
128
|
+
},
|
|
68
129
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
69
|
-
|
|
130
|
+
[]
|
|
131
|
+
);
|
|
70
132
|
|
|
71
133
|
const renderItem = useCallback(item => {
|
|
72
134
|
return <Item item={item} />;
|
|
73
135
|
}, []);
|
|
74
136
|
|
|
75
137
|
useEffect(() => {
|
|
138
|
+
value.value = 0;
|
|
76
139
|
value.value = withDelay(
|
|
77
140
|
initialDelay,
|
|
78
|
-
withTiming(data.length + 1, {
|
|
79
|
-
duration: data.length * durationPerItem,
|
|
141
|
+
withTiming(props.data.length + 1, {
|
|
142
|
+
duration: props.data.length * durationPerItem,
|
|
80
143
|
})
|
|
81
144
|
);
|
|
82
|
-
}, [data.length, durationPerItem, initialDelay, value]);
|
|
145
|
+
}, [props.data.length, durationPerItem, initialDelay, value, isLoading]);
|
|
83
146
|
|
|
84
|
-
return <ShopifyFlashList {...props}
|
|
147
|
+
return <ShopifyFlashList {...props} renderItem={renderItem} />;
|
|
85
148
|
};
|
|
86
149
|
|
|
87
|
-
|
|
150
|
+
FlashList.propTypes = {
|
|
151
|
+
SkeletonComponent: PropTypes.element,
|
|
152
|
+
durationPerItem: PropTypes.number,
|
|
153
|
+
data: PropTypes.array.isRequired,
|
|
154
|
+
isLoading: PropTypes.bool,
|
|
155
|
+
placeHolderItemCount: PropTypes.number,
|
|
156
|
+
onRefresh: PropTypes.func,
|
|
157
|
+
keyExtractor: PropTypes.func,
|
|
158
|
+
};
|
package/src/hooks/index.js
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
export function useRefreshByUser(refetch) {
|
|
4
|
+
const [isRefetchingByUser, setIsRefetchingByUser] = useState(false);
|
|
5
|
+
|
|
6
|
+
async function refetchByUser() {
|
|
7
|
+
setIsRefetchingByUser(true);
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
await refetch();
|
|
11
|
+
} finally {
|
|
12
|
+
setIsRefetchingByUser(false);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
isRefetchingByUser,
|
|
18
|
+
refetchByUser,
|
|
19
|
+
};
|
|
20
|
+
}
|