@bigbinary/neetoui-rn 0.0.114 → 0.0.117

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 +1 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.MultiSelect=void 0;var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _=require("./");var _excluded=["options","label","value","placeholder","onSelect","isLoading","isSearchable","labelStyle","containerStyle","dropdownContainerStyle","itemContainerStyle","itemTextStyle","multiSelectedItemContainerStyle","multiSelectedItemTextStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.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 MultiSelectItem=function MultiSelectItem(_ref){var item=_ref.item,onUnselect=_ref.onUnselect,multiSelectedItemContainerStyle=_ref.multiSelectedItemContainerStyle,multiSelectedItemTextStyle=_ref.multiSelectedItemTextStyle;return _react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.base",bg:"background.grey100",borderRadius:2,flexDirection:"row",alignItems:"center",p:1,m:1},multiSelectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:20,columnNumber:3}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",mr:2},multiSelectedItemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,columnNumber:5}}),item==null?void 0:item.label),_react.default.createElement(_.Touchable,{onPress:onUnselect,__self:_this,__source:{fileName:_jsxFileName,lineNumber:39,columnNumber:5}},_react.default.createElement(_reactNativeRemixIcon.default,{name:"ri-close-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:40,columnNumber:7}})));};MultiSelectItem.propTypes={item:_propTypes.default.object,onUnselect:_propTypes.default.func,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemTextStyle:_propTypes.default.object};var DropdownItem=function DropdownItem(_ref2){var item=_ref2.item,index=_ref2.index,onPress=_ref2.onPress,defaultDropdownItemHeight=_ref2.defaultDropdownItemHeight,itemContainerStyle=_ref2.itemContainerStyle,itemTextStyle=_ref2.itemTextStyle;return _react.default.createElement(_.Touchable,{key:index,bg:"background.white",onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:61,columnNumber:5}},_react.default.createElement(_.Container,(0,_extends2.default)({height:defaultDropdownItemHeight,p:2},itemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:62,columnNumber:7}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},itemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:67,columnNumber:9}}),item==null?void 0:item.label)));};DropdownItem.propTypes={item:_propTypes.default.object,index:_propTypes.default.number,onPress:_propTypes.default.func,defaultDropdownItemHeight:_propTypes.default.number,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object};var MultiSelect=function MultiSelect(_ref3){var options=_ref3.options,label=_ref3.label,value=_ref3.value,placeholder=_ref3.placeholder,onSelect=_ref3.onSelect,isLoading=_ref3.isLoading,isSearchable=_ref3.isSearchable,labelStyle=_ref3.labelStyle,containerStyle=_ref3.containerStyle,dropdownContainerStyle=_ref3.dropdownContainerStyle,itemContainerStyle=_ref3.itemContainerStyle,itemTextStyle=_ref3.itemTextStyle,multiSelectedItemContainerStyle=_ref3.multiSelectedItemContainerStyle,multiSelectedItemTextStyle=_ref3.multiSelectedItemTextStyle,rest=(0,_objectWithoutProperties2.default)(_ref3,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var multipleOptionsSelected=(value==null?void 0:value.length)>0;var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var handleUnselection=function handleUnselection(item){var newValue=value.filter(function(selectedItem){return selectedItem.value!==item.value;});onSelect(newValue);};return _react.default.createElement(_.Container,{elevation:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:165,columnNumber:5}},_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:166,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:function onPress(){setShowDropdown(!showDropdown);setSearchQuery("");},__self:_this,__source:{fileName:_jsxFileName,lineNumber:175,columnNumber:7}},_react.default.createElement(_reactNative.View,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:182,columnNumber:9}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",p:multipleOptionsSelected?1:2,pr:2,flexDirection:"row",justifyContent:"space-between",alignItems:"center"},containerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:183,columnNumber:11}}),!multipleOptionsSelected&&_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:195,columnNumber:15}},!multipleOptionsSelected&&placeholder),multipleOptionsSelected&&_react.default.createElement(_.Container,{flexWrap:"wrap",flexDirection:"row",maxWidth:"85%",__self:_this,__source:{fileName:_jsxFileName,lineNumber:200,columnNumber:15}},value==null?void 0:value.map(function(item,index){return _react.default.createElement(MultiSelectItem,{key:index,item:item,index:index,onUnselect:function onUnselect(){return handleUnselection(item);},multiSelectedItemContainerStyle:multiSelectedItemContainerStyle,multiSelectedItemTextStyle:multiSelectedItemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:202,columnNumber:19}});})),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:216,columnNumber:15}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:221,columnNumber:15}})))),showDropdown&&_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",position:"absolute",left:0,right:0,top:"100%",maxHeight:defaultDropdownItemHeight*6,elevation:5},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:232,columnNumber:9}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:245,columnNumber:13}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:246,columnNumber:15}})),_react.default.createElement(_reactNative.ScrollView,{nestedScrollEnabled:true,__self:_this,__source:{fileName:_jsxFileName,lineNumber:253,columnNumber:11}},options.filter(function(item){var isItemAlreadySelected=Boolean(value.find(function(selectedItem){return selectedItem.value===item.value;}));return!isItemAlreadySelected;}).filter(function(item){if(searchQuery.length===0)return true;return formatStr(item.label).includes(formatStr(searchQuery));}).map(function(item,index){return _react.default.createElement(DropdownItem,{key:index,item:item,index:index,onPress:function onPress(){return onSelect([].concat((0,_toConsumableArray2.default)(value),[item]));},itemContainerStyle:itemContainerStyle,defaultDropdownItemHeight:defaultDropdownItemHeight,itemTextStyle:itemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:266,columnNumber:17}});}))));};exports.MultiSelect=MultiSelect;MultiSelect.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string.isRequired,value:_propTypes.default.string.isRequired})).isRequired,placeholder:_propTypes.default.string,value:_propTypes.default.oneOfType([_propTypes.default.string,_propTypes.default.array]),onSelect:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemTextStyle:_propTypes.default.object};MultiSelect.defaultProps={label:null,placeholder:"Select Option",value:null,onSelect:function onSelect(){},isLoading:false,isSearchable:false};
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.MultiSelect=void 0;var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _=require("./");var _excluded=["options","label","value","placeholder","labelExtractor","valueExtractor","onSelect","selectedValue","deletedValue","isLoading","isSearchable","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemTextStyle","multiSelectedItemContainerStyle","multiSelectedItemTextStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.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 MultiSelectItem=function MultiSelectItem(_ref){var label=_ref.label,onUnselect=_ref.onUnselect,multiSelectedItemContainerStyle=_ref.multiSelectedItemContainerStyle,multiSelectedItemTextStyle=_ref.multiSelectedItemTextStyle;return _react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.base",bg:"background.grey100",borderRadius:2,flexDirection:"row",alignItems:"center",justifyContent:"space-between",p:1,m:1},multiSelectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:26,columnNumber:3}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",mr:2,maxWidth:"90%"},multiSelectedItemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:38,columnNumber:5}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onUnselect,__self:_this,__source:{fileName:_jsxFileName,lineNumber:47,columnNumber:5}},_react.default.createElement(_reactNativeRemixIcon.default,{name:"ri-close-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:48,columnNumber:7}})));};MultiSelectItem.propTypes={label:_propTypes.default.string,onUnselect:_propTypes.default.func,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemTextStyle:_propTypes.default.object};var DropdownItem=function DropdownItem(_ref2){var label=_ref2.label,onPress=_ref2.onPress,defaultDropdownItemHeight=_ref2.defaultDropdownItemHeight,itemContainerStyle=_ref2.itemContainerStyle,itemTextStyle=_ref2.itemTextStyle;return _react.default.createElement(_.Touchable,{bg:"background.white",onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:68,columnNumber:5}},_react.default.createElement(_.Container,(0,_extends2.default)({height:defaultDropdownItemHeight,p:2},itemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:69,columnNumber:7}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},itemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:74,columnNumber:9}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string,onPress:_propTypes.default.func,defaultDropdownItemHeight:_propTypes.default.number,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object};var MultiSelect=function MultiSelect(_ref3){var options=_ref3.options,label=_ref3.label,value=_ref3.value,placeholder=_ref3.placeholder,labelExtractor=_ref3.labelExtractor,valueExtractor=_ref3.valueExtractor,onSelect=_ref3.onSelect,selectedValue=_ref3.selectedValue,deletedValue=_ref3.deletedValue,isLoading=_ref3.isLoading,isSearchable=_ref3.isSearchable,labelStyle=_ref3.labelStyle,containerStyle=_ref3.containerStyle,inputContainerStyle=_ref3.inputContainerStyle,dropdownContainerStyle=_ref3.dropdownContainerStyle,itemContainerStyle=_ref3.itemContainerStyle,itemTextStyle=_ref3.itemTextStyle,multiSelectedItemContainerStyle=_ref3.multiSelectedItemContainerStyle,multiSelectedItemTextStyle=_ref3.multiSelectedItemTextStyle,rest=(0,_objectWithoutProperties2.default)(_ref3,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var dropdownAnimatedHeight=(0,_reactNativeReanimated.useSharedValue)(0);var multipleOptionsSelected=(value==null?void 0:value.length)>0;var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*6;var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease})};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease}};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease})};}}";_f.__workletHash=10836038512691;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js (172:42)";_f.__optimalization=2;return _f;}());var toggleAnimation=function toggleAnimation(){dropdownAnimatedHeight.value=dropdownAnimatedHeight.value===0?dropdownHeight:0;};var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");setShowDropdown(!showDropdown);toggleAnimation();};var handleUnselection=function handleUnselection(item){var newValue=value.filter(function(selectedItem){return valueExtractor(selectedItem)!==valueExtractor(item);});onSelect(newValue);deletedValue(item);};var handleSelection=function handleSelection(item){onSelect([].concat((0,_toConsumableArray2.default)(value),[item]));selectedValue(item);};return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:207,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:208,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:217,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",flexDirection:"row",justifyContent:"space-between",alignItems:"center",p:multipleOptionsSelected?1:2,pr:2,maxHeight:120},inputContainerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:221,columnNumber:9}}),!multipleOptionsSelected&&_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:234,columnNumber:13}},!multipleOptionsSelected&&placeholder),multipleOptionsSelected&&_react.default.createElement(_reactNativeGestureHandler.ScrollView,{showsVerticalScrollIndicator:false,__self:_this,__source:{fileName:_jsxFileName,lineNumber:239,columnNumber:13}},_react.default.createElement(_.Container,{flexWrap:"wrap",flexDirection:"row",maxWidth:"85%",onStartShouldSetResponder:function onStartShouldSetResponder(){return true;},__self:_this,__source:{fileName:_jsxFileName,lineNumber:240,columnNumber:15}},value==null?void 0:value.map(function(item,index){var optionLabel=labelExtractor(item,index);return _react.default.createElement(MultiSelectItem,{key:index,label:optionLabel,onUnselect:function onUnselect(){return handleUnselection(item);},multiSelectedItemContainerStyle:multiSelectedItemContainerStyle,multiSelectedItemTextStyle:multiSelectedItemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:249,columnNumber:21}});}))),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:264,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:269,columnNumber:13}}))),_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:277,columnNumber:7}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:278,columnNumber:9}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:279,columnNumber:11}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:287,columnNumber:15}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:288,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:295,columnNumber:13}},options.filter(function(item,index){var optionValue=valueExtractor(item,index);var isItemAlreadySelected=Boolean(value==null?void 0:value.find(function(selectedItem){return valueExtractor(selectedItem)===optionValue;}));return!isItemAlreadySelected;}).filter(function(item,index){var optionLabel=labelExtractor(item,index);if(searchQuery.length===0)return true;return formatStr(optionLabel).includes(formatStr(searchQuery));}).map(function(item,index){var optionLabel=labelExtractor(item,index);return _react.default.createElement(DropdownItem,{key:index,label:optionLabel,onPress:function onPress(){return handleSelection(item);},itemContainerStyle:itemContainerStyle,defaultDropdownItemHeight:defaultDropdownItemHeight,itemTextStyle:itemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:317,columnNumber:21}});}))))));};exports.MultiSelect=MultiSelect;MultiSelect.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string,value:_propTypes.default.string})).isRequired,placeholder:_propTypes.default.string,labelExtractor:_propTypes.default.func,valueExtractor:_propTypes.default.func,value:_propTypes.default.oneOfType([_propTypes.default.string,_propTypes.default.array]),onSelect:_propTypes.default.func,selectedValue:_propTypes.default.func,deletedValue:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemTextStyle:_propTypes.default.object};MultiSelect.defaultProps={label:null,placeholder:"Select Option",labelExtractor:function labelExtractor(option){return option==null?void 0:option.label;},valueExtractor:function valueExtractor(option){return option==null?void 0:option.value;},value:null,onSelect:function onSelect(){},selectedValue:function selectedValue(){},deletedValue:function deletedValue(){},isLoading:false,isSearchable:false};
@@ -1 +1 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.TouchableOpacity=exports.Popover=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _taggedTemplateLiteralLoose2=_interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose"));var _react=_interopRequireWildcard(require("react"));var _reactNativePopoverView=_interopRequireDefault(require("react-native-popover-view"));var _propTypes=_interopRequireDefault(require("prop-types"));var _native=_interopRequireDefault(require("styled-components/native"));var _reactNative=require("react-native");var _styledSystem=require("styled-system");var _=require("./");var _excluded=["children","data","fontFamily","fontSize"];var _templateObject,_this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Popover.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 TouchableOpacity=_native.default.TouchableOpacity(_templateObject||(_templateObject=(0,_taggedTemplateLiteralLoose2.default)(["\n ","\n ","\n ","\n ","\n ","\n"])),_styledSystem.space,_styledSystem.border,_styledSystem.color,_styledSystem.flexbox,_styledSystem.layout);exports.TouchableOpacity=TouchableOpacity;var PopOverItem=function PopOverItem(_ref){var item=_ref.item,fontFamily=_ref.fontFamily,fontSize=_ref.fontSize,hidePopOver=_ref.hidePopOver;var Icon=item.Icon,label=item.label,_onPress=item.onPress;return _react.default.createElement(TouchableOpacity,{onPress:function onPress(){hidePopOver();_onPress();},flexDirection:"row",p:2,px:3,alignItems:"center",__self:_this,__source:{fileName:_jsxFileName,lineNumber:21,columnNumber:5}},_react.default.createElement(Icon,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,columnNumber:7}}),_react.default.createElement(_.Typography,{px:2,fontSize:fontSize,fontColor:"font.primary",fontFamily:fontFamily,__self:_this,__source:{fileName:_jsxFileName,lineNumber:32,columnNumber:7}},label));};PopOverItem.propTypes={item:_propTypes.default.object,fontFamily:_propTypes.default.string,fontSize:_propTypes.default.oneOfType([_propTypes.default.number,_propTypes.default.oneOf(["xs","s","m","l","xl","xxl"])]),hidePopOver:_propTypes.default.func};var Popover=function Popover(_ref2){var children=_ref2.children,data=_ref2.data,_ref2$fontFamily=_ref2.fontFamily,fontFamily=_ref2$fontFamily===void 0?null:_ref2$fontFamily,_ref2$fontSize=_ref2.fontSize,fontSize=_ref2$fontSize===void 0?"l":_ref2$fontSize,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var popoverRef=(0,_react.useRef)();return _react.default.createElement(_reactNativePopoverView.default,(0,_extends2.default)({ref:popoverRef,popoverStyle:styles.popoverStyle},rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:144,columnNumber:5}}),data==null?void 0:data.map(function(item,index){return _react.default.createElement(PopOverItem,{key:index,item:item,fontFamily:fontFamily,fontSize:fontSize,hidePopOver:function hidePopOver(){var _popoverRef$current;popoverRef==null?void 0:(_popoverRef$current=popoverRef.current)==null?void 0:_popoverRef$current.setState({isVisible:false});},__self:_this,__source:{fileName:_jsxFileName,lineNumber:151,columnNumber:11}});}),children);};exports.Popover=Popover;Popover.propTypes={children:_propTypes.default.node,data:_propTypes.default.array,fontFamily:_propTypes.default.string,fontSize:_propTypes.default.oneOfType([_propTypes.default.number,_propTypes.default.oneOf(["xs","s","m","l","xl","xxl"])])};var styles=_reactNative.StyleSheet.create({popoverStyle:{borderRadius:15,padding:5}});
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.TouchableOpacity=exports.Popover=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _taggedTemplateLiteralLoose2=_interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose"));var _react=_interopRequireWildcard(require("react"));var _reactNativePopoverView=_interopRequireDefault(require("react-native-popover-view"));var _propTypes=_interopRequireDefault(require("prop-types"));var _native=_interopRequireDefault(require("styled-components/native"));var _reactNative=require("react-native");var _styledSystem=require("styled-system");var _=require("./");var _excluded=["children","data","fontFamily","fontSize"];var _templateObject,_this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Popover.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 TouchableOpacity=_native.default.TouchableOpacity(_templateObject||(_templateObject=(0,_taggedTemplateLiteralLoose2.default)(["\n ","\n ","\n ","\n ","\n ","\n"])),_styledSystem.space,_styledSystem.border,_styledSystem.color,_styledSystem.flexbox,_styledSystem.layout);exports.TouchableOpacity=TouchableOpacity;var PopOverItem=function PopOverItem(_ref){var item=_ref.item,onPress=_ref.onPress,fontFamily=_ref.fontFamily,fontSize=_ref.fontSize;var Icon=item.Icon,label=item.label;return _react.default.createElement(TouchableOpacity,{onPress:onPress,flexDirection:"row",p:2,px:3,alignItems:"center",__self:_this,__source:{fileName:_jsxFileName,lineNumber:22,columnNumber:5}},_react.default.createElement(Icon,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:29,columnNumber:7}}),_react.default.createElement(_.Typography,{px:2,fontSize:fontSize,fontColor:"font.primary",fontFamily:fontFamily,__self:_this,__source:{fileName:_jsxFileName,lineNumber:30,columnNumber:7}},label));};PopOverItem.propTypes={item:_propTypes.default.object,onPress:_propTypes.default.func,fontFamily:_propTypes.default.string,fontSize:_propTypes.default.oneOfType([_propTypes.default.number,_propTypes.default.oneOf(["xs","s","m","l","xl","xxl"])])};var Popover=function Popover(_ref2){var children=_ref2.children,data=_ref2.data,_ref2$fontFamily=_ref2.fontFamily,fontFamily=_ref2$fontFamily===void 0?null:_ref2$fontFamily,_ref2$fontSize=_ref2.fontSize,fontSize=_ref2$fontSize===void 0?"l":_ref2$fontSize,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var popoverRef=(0,_react.useRef)();var onPressItemRef=(0,_react.useRef)(function(){});return _react.default.createElement(_reactNativePopoverView.default,(0,_extends2.default)({ref:popoverRef,popoverStyle:styles.popoverStyle,onOpenStart:function onOpenStart(){onPressItemRef.current=function(){};},onCloseComplete:function onCloseComplete(){return onPressItemRef.current();}},rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:144,columnNumber:5}}),data==null?void 0:data.map(function(item,index){return _react.default.createElement(PopOverItem,{key:index,item:item,fontFamily:fontFamily,fontSize:fontSize,onPress:function onPress(){var _popoverRef$current;popoverRef==null?void 0:(_popoverRef$current=popoverRef.current)==null?void 0:_popoverRef$current.setState({isVisible:false});onPressItemRef.current=item.onPress;},__self:_this,__source:{fileName:_jsxFileName,lineNumber:155,columnNumber:11}});}),children);};exports.Popover=Popover;Popover.propTypes={children:_propTypes.default.node,data:_propTypes.default.array,fontFamily:_propTypes.default.string,fontSize:_propTypes.default.oneOfType([_propTypes.default.number,_propTypes.default.oneOf(["xs","s","m","l","xl","xxl"])])};var styles=_reactNative.StyleSheet.create({popoverStyle:{borderRadius:15,padding:5}});
@@ -1 +1 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Select=void 0;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _=require("./");var _excluded=["options","label","value","placeholder","onSelect","isLoading","isSearchable","labelStyle","containerStyle","dropdownContainerStyle","itemContainerStyle","itemTextStyle","selectedItemContainerStyle","selectedItemTextStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.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 DropdownItem=function DropdownItem(_ref){var item=_ref.item,index=_ref.index,isSelectedItem=_ref.isSelectedItem,defaultDropdownItemHeight=_ref.defaultDropdownItemHeight,onPress=_ref.onPress,itemContainerStyle=_ref.itemContainerStyle,selectedItemContainerStyle=_ref.selectedItemContainerStyle,itemTextStyle=_ref.itemTextStyle,selectedItemTextStyle=_ref.selectedItemTextStyle;return _react.default.createElement(_.Touchable,{key:index,bg:isSelectedItem?"background.base":"background.white",onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:20,columnNumber:3}},_react.default.createElement(_.Container,(0,_extends2.default)({height:defaultDropdownItemHeight,p:2},itemContainerStyle,isSelectedItem&&selectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:25,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:isSelectedItem?"font.white":"font.grey"},itemTextStyle,isSelectedItem&&selectedItemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,columnNumber:7}}),item==null?void 0:item.label)));};DropdownItem.propTypes={item:_propTypes.default.object,index:_propTypes.default.number,isSelectedItem:_propTypes.default.bool,defaultDropdownItemHeight:_propTypes.default.number,onPress:_propTypes.default.func,itemContainerStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,selectedItemTextStyle:_propTypes.default.object};var Select=function Select(_ref2){var _options$selectedItem;var options=_ref2.options,label=_ref2.label,value=_ref2.value,placeholder=_ref2.placeholder,onSelect=_ref2.onSelect,isLoading=_ref2.isLoading,isSearchable=_ref2.isSearchable,labelStyle=_ref2.labelStyle,containerStyle=_ref2.containerStyle,dropdownContainerStyle=_ref2.dropdownContainerStyle,itemContainerStyle=_ref2.itemContainerStyle,itemTextStyle=_ref2.itemTextStyle,selectedItemContainerStyle=_ref2.selectedItemContainerStyle,selectedItemTextStyle=_ref2.selectedItemTextStyle,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var theme=(0,_react.useContext)(_native.ThemeContext);var selectedItemIndex=options==null?void 0:options.findIndex(function(item){return(item==null?void 0:item.value)===value;});var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var handleItemSelection=function handleItemSelection(item,index){setShowDropdown(false);onSelect(item,index);};return _react.default.createElement(_.Container,{elevation:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:130,columnNumber:5}},_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:131,columnNumber:7}}),label),_react.default.createElement(_.Touchable,{disabled:isLoading,onPress:function onPress(){setShowDropdown(!showDropdown);setSearchQuery("");},__self:_this,__source:{fileName:_jsxFileName,lineNumber:140,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",p:2,flexDirection:"row",justifyContent:"space-between",alignItems:"center"},containerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:147,columnNumber:9}}),_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:157,columnNumber:11}},(options==null?void 0:(_options$selectedItem=options[selectedItemIndex])==null?void 0:_options$selectedItem.label)||placeholder),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:161,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:166,columnNumber:13}}))),showDropdown&&_react.default.createElement(_.Container,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",position:"absolute",left:0,right:0,top:"100%",maxHeight:defaultDropdownItemHeight*6,shadowOpacity:0.25,shadowRadius:3.84,"shadow-color":"#000",shadowOffset:{width:0,height:2},elevation:5},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:175,columnNumber:9}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:195,columnNumber:13}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:196,columnNumber:15}})),_react.default.createElement(_reactNative.ScrollView,{nestedScrollEnabled:true,__self:_this,__source:{fileName:_jsxFileName,lineNumber:203,columnNumber:11}},options.filter(function(item){if((searchQuery==null?void 0:searchQuery.length)===0)return true;return formatStr(item.label).includes(formatStr(searchQuery));}).map(function(item,index){return _react.default.createElement(DropdownItem,{key:index,item:item,index:index,isSelectedItem:(item==null?void 0:item.value)===value,defaultDropdownItemHeight:defaultDropdownItemHeight,onPress:function onPress(){return handleItemSelection(item,index);},itemContainerStyle:itemContainerStyle,selectedItemContainerStyle:selectedItemContainerStyle,itemTextStyle:itemTextStyle,selectedItemTextStyle:selectedItemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:210,columnNumber:17}});}))));};exports.Select=Select;Select.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string.isRequired,value:_propTypes.default.string.isRequired})).isRequired,placeholder:_propTypes.default.string,value:_propTypes.default.string,onSelect:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,selectedItemTextStyle:_propTypes.default.object};Select.defaultProps={label:null,placeholder:"Select Option",value:null,onSelect:function onSelect(){},isLoading:false,isSearchable:false};
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Select=void 0;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireWildcard(require("react"));var _reactNativeRemixIcon=_interopRequireDefault(require("react-native-remix-icon"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _reactNative=require("react-native");var _native=require("styled-components/native");var _reactNativeGestureHandler=require("react-native-gesture-handler");var _=require("./");var _excluded=["options","label","value","placeholder","labelExtractor","valueExtractor","onSelect","isLoading","isSearchable","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemTextStyle","selectedItemContainerStyle","selectedItemTextStyle"];var _this=this,_jsxFileName="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.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 DropdownItem=function DropdownItem(_ref){var label=_ref.label,isSelectedItem=_ref.isSelectedItem,defaultDropdownItemHeight=_ref.defaultDropdownItemHeight,onPress=_ref.onPress,itemContainerStyle=_ref.itemContainerStyle,selectedItemContainerStyle=_ref.selectedItemContainerStyle,itemTextStyle=_ref.itemTextStyle,selectedItemTextStyle=_ref.selectedItemTextStyle;return _react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:30,columnNumber:3}},_react.default.createElement(_.Container,(0,_extends2.default)({bg:isSelectedItem?"background.base":"background.white",height:defaultDropdownItemHeight,p:2},itemContainerStyle,isSelectedItem&&selectedItemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:isSelectedItem?"font.white":"font.grey"},itemTextStyle,isSelectedItem&&selectedItemTextStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:38,columnNumber:7}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string.isRequired,isSelectedItem:_propTypes.default.bool,defaultDropdownItemHeight:_propTypes.default.number,onPress:_propTypes.default.func,itemContainerStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,selectedItemTextStyle:_propTypes.default.object};var Select=function Select(_ref2){var options=_ref2.options,label=_ref2.label,value=_ref2.value,placeholder=_ref2.placeholder,labelExtractor=_ref2.labelExtractor,valueExtractor=_ref2.valueExtractor,onSelect=_ref2.onSelect,isLoading=_ref2.isLoading,isSearchable=_ref2.isSearchable,labelStyle=_ref2.labelStyle,containerStyle=_ref2.containerStyle,inputContainerStyle=_ref2.inputContainerStyle,dropdownContainerStyle=_ref2.dropdownContainerStyle,itemContainerStyle=_ref2.itemContainerStyle,itemTextStyle=_ref2.itemTextStyle,selectedItemContainerStyle=_ref2.selectedItemContainerStyle,selectedItemTextStyle=_ref2.selectedItemTextStyle,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var theme=(0,_react.useContext)(_native.ThemeContext);var _useState=(0,_react.useState)(false),_useState2=(0,_slicedToArray2.default)(_useState,2),showDropdown=_useState2[0],setShowDropdown=_useState2[1];var _useState3=(0,_react.useState)(""),_useState4=(0,_slicedToArray2.default)(_useState3,2),searchQuery=_useState4[0],setSearchQuery=_useState4[1];var dropdownAnimatedHeight=(0,_reactNativeReanimated.useSharedValue)(0);var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*6;var selectedOptionLabel=labelExtractor(value||{});var selectedOptionValue=valueExtractor(value||{});var formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease})};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease}};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease})};}}";_f.__workletHash=10836038512691;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js (139:42)";_f.__optimalization=2;return _f;}());var toggleAnimation=function toggleAnimation(){dropdownAnimatedHeight.value=dropdownAnimatedHeight.value===0?dropdownHeight:0;};var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");setShowDropdown(!showDropdown);toggleAnimation();};var handleItemSelection=function handleItemSelection(item,index){setShowDropdown(false);toggleAnimation();onSelect(item,index);};return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:167,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",mb:1,fontSize:"s",color:"font.base"},labelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:168,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:177,columnNumber:7}},_react.default.createElement(_.Container,(0,_extends2.default)({borderWidth:1,borderColor:"border.grey400",p:2,flexDirection:"row",justifyContent:"space-between",alignItems:"center"},inputContainerStyle,rest,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:181,columnNumber:9}}),_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:191,columnNumber:11}},selectedOptionLabel||placeholder),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:195,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:200,columnNumber:13}}))),_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:208,columnNumber:7}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:209,columnNumber:9}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:210,columnNumber:11}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:218,columnNumber:15}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:219,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:226,columnNumber:13}},options.filter(function(item,index){var label=labelExtractor(item,index);if((searchQuery==null?void 0:searchQuery.length)===0)return true;return formatStr(label).includes(formatStr(searchQuery));}).map(function(item,index){var optionLabel=labelExtractor(item,index);var optionValue=valueExtractor(item,index);var isSelectedItem=selectedOptionValue&&selectedOptionValue===optionValue;return _react.default.createElement(DropdownItem,{key:index,label:optionLabel,isSelectedItem:isSelectedItem,defaultDropdownItemHeight:defaultDropdownItemHeight,onPress:function onPress(){return handleItemSelection(item,index);},itemContainerStyle:itemContainerStyle,selectedItemContainerStyle:selectedItemContainerStyle,itemTextStyle:itemTextStyle,selectedItemTextStyle:selectedItemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:239,columnNumber:21}});}))))));};exports.Select=Select;Select.propTypes={label:_propTypes.default.string,options:_propTypes.default.arrayOf(_propTypes.default.shape({label:_propTypes.default.string,value:_propTypes.default.string})).isRequired,placeholder:_propTypes.default.string,labelExtractor:_propTypes.default.func,valueExtractor:_propTypes.default.func,value:_propTypes.default.object,onSelect:_propTypes.default.func,isLoading:_propTypes.default.bool,isSearchable:_propTypes.default.bool,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemTextStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,selectedItemTextStyle:_propTypes.default.object};Select.defaultProps={label:null,placeholder:"Select Option",labelExtractor:function labelExtractor(option){return option==null?void 0:option.label;},valueExtractor:function valueExtractor(option){return option==null?void 0:option.value;},value:null,onSelect:function onSelect(){},isLoading:false,isSearchable:false};
@@ -0,0 +1 @@
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.ProviderContext=void 0;var _react=_interopRequireDefault(require("react"));var ProviderContext=_react.default.createContext(null);exports.ProviderContext=ProviderContext;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigbinary/neetoui-rn",
3
- "version": "0.0.114",
3
+ "version": "0.0.117",
4
4
  "main": "lib/index.js",
5
5
  "author": "BigBinary",
6
6
  "license": "MIT",
@@ -1,18 +1,24 @@
1
1
  import React, { useState, useContext } from "react";
2
2
  import Icon from "react-native-remix-icon";
3
3
  import PropTypes from "prop-types";
4
+ import Animated, {
5
+ useSharedValue,
6
+ useAnimatedStyle,
7
+ withTiming,
8
+ Easing,
9
+ } from "react-native-reanimated";
4
10
  import {
5
11
  ActivityIndicator,
6
- ScrollView,
7
- View,
8
12
  TouchableWithoutFeedback,
13
+ Keyboard,
9
14
  } from "react-native";
10
15
  import { ThemeContext } from "styled-components/native";
16
+ import { ScrollView } from "react-native-gesture-handler";
11
17
 
12
18
  import { Container, Input, Touchable, Typography, Card } from "@components";
13
19
 
14
20
  const MultiSelectItem = ({
15
- item,
21
+ label,
16
22
  onUnselect,
17
23
  multiSelectedItemContainerStyle,
18
24
  multiSelectedItemTextStyle,
@@ -24,6 +30,7 @@ const MultiSelectItem = ({
24
30
  borderRadius={2}
25
31
  flexDirection="row"
26
32
  alignItems="center"
33
+ justifyContent="space-between"
27
34
  p={1}
28
35
  m={1}
29
36
  {...multiSelectedItemContainerStyle}
@@ -32,33 +39,33 @@ const MultiSelectItem = ({
32
39
  fontFamily="inter400"
33
40
  fontSize="s"
34
41
  mr={2}
42
+ maxWidth="90%"
35
43
  {...multiSelectedItemTextStyle}
36
44
  >
37
- {item?.label}
45
+ {label}
38
46
  </Typography>
39
- <Touchable onPress={onUnselect}>
47
+ <TouchableWithoutFeedback onPress={onUnselect}>
40
48
  <Icon name="ri-close-line" size="20" color="grey" />
41
- </Touchable>
49
+ </TouchableWithoutFeedback>
42
50
  </Container>
43
51
  );
44
52
 
45
53
  MultiSelectItem.propTypes = {
46
- item: PropTypes.object,
54
+ label: PropTypes.string,
47
55
  onUnselect: PropTypes.func,
48
56
  multiSelectedItemContainerStyle: PropTypes.object,
49
57
  multiSelectedItemTextStyle: PropTypes.object,
50
58
  };
51
59
 
52
60
  const DropdownItem = ({
53
- item,
54
- index,
61
+ label,
55
62
  onPress,
56
63
  defaultDropdownItemHeight,
57
64
  itemContainerStyle,
58
65
  itemTextStyle,
59
66
  }) => {
60
67
  return (
61
- <Touchable key={index} bg="background.white" onPress={onPress}>
68
+ <Touchable bg="background.white" onPress={onPress}>
62
69
  <Container
63
70
  height={defaultDropdownItemHeight}
64
71
  p={2}
@@ -70,7 +77,7 @@ const DropdownItem = ({
70
77
  color="font.grey"
71
78
  {...itemTextStyle}
72
79
  >
73
- {item?.label}
80
+ {label}
74
81
  </Typography>
75
82
  </Container>
76
83
  </Touchable>
@@ -78,8 +85,7 @@ const DropdownItem = ({
78
85
  };
79
86
 
80
87
  DropdownItem.propTypes = {
81
- item: PropTypes.object,
82
- index: PropTypes.number,
88
+ label: PropTypes.string,
83
89
  onPress: PropTypes.func,
84
90
  defaultDropdownItemHeight: PropTypes.number,
85
91
  itemContainerStyle: PropTypes.object,
@@ -94,7 +100,9 @@ DropdownItem.propTypes = {
94
100
  * <img src="screenshots/multiSelect/multiSelect.png" />
95
101
  * </div>
96
102
  *
97
- * ## Usage
103
+ * ## Usage
104
+ *
105
+ * ### Import and use MultiSelect component.
98
106
  *
99
107
  * ```js
100
108
  * import * as React, { useState } from 'react';
@@ -115,18 +123,15 @@ DropdownItem.propTypes = {
115
123
  * const [selectedOptions, setSelectedOptions] = useState([])
116
124
  *
117
125
  * return (
118
- * <Container>
119
- * <MultiSelect
120
- * label="Select"
121
- * options={OPTIONS}
122
- * value={selectedOptions}
123
- * onSelect={setSelectedOptions}
124
- * />
125
- * </Container>
126
+ * <MultiSelect
127
+ * label="Select"
128
+ * options={OPTIONS}
129
+ * value={selectedOptions}
130
+ * onSelect={setSelectedOptions}
131
+ * />
126
132
  * );
127
133
  * }
128
134
  * ```
129
- *
130
135
  */
131
136
 
132
137
  export const MultiSelect = ({
@@ -134,11 +139,16 @@ export const MultiSelect = ({
134
139
  label,
135
140
  value,
136
141
  placeholder,
142
+ labelExtractor,
143
+ valueExtractor,
137
144
  onSelect,
145
+ selectedValue,
146
+ deletedValue,
138
147
  isLoading,
139
148
  isSearchable,
140
149
  labelStyle,
141
150
  containerStyle,
151
+ inputContainerStyle,
142
152
  dropdownContainerStyle,
143
153
  itemContainerStyle,
144
154
  itemTextStyle,
@@ -149,20 +159,52 @@ export const MultiSelect = ({
149
159
  const theme = useContext(ThemeContext);
150
160
  const [showDropdown, setShowDropdown] = useState(false);
151
161
  const [searchQuery, setSearchQuery] = useState("");
162
+ const dropdownAnimatedHeight = useSharedValue(0);
152
163
 
153
164
  const multipleOptionsSelected = value?.length > 0;
154
165
  const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
166
+ const dropdownHeight =
167
+ dropdownContainerStyle?.height ||
168
+ dropdownContainerStyle?.maxHeight ||
169
+ defaultDropdownItemHeight * 6;
155
170
  const formatStr = str => str?.toLowerCase()?.trim();
156
171
 
172
+ const animatedStyles = useAnimatedStyle(() => {
173
+ return {
174
+ height: withTiming(dropdownAnimatedHeight.value, {
175
+ duration: 100,
176
+ easing: Easing.ease,
177
+ }),
178
+ };
179
+ });
180
+
181
+ const toggleAnimation = () => {
182
+ dropdownAnimatedHeight.value =
183
+ dropdownAnimatedHeight.value === 0 ? dropdownHeight : 0;
184
+ };
185
+
186
+ const handleOpenDropdown = () => {
187
+ Keyboard.dismiss();
188
+ setSearchQuery("");
189
+ setShowDropdown(!showDropdown);
190
+ toggleAnimation();
191
+ };
192
+
157
193
  const handleUnselection = item => {
158
194
  const newValue = value.filter(
159
- selectedItem => selectedItem.value !== item.value
195
+ selectedItem => valueExtractor(selectedItem) !== valueExtractor(item)
160
196
  );
161
197
  onSelect(newValue);
198
+ deletedValue(item);
199
+ };
200
+
201
+ const handleSelection = item => {
202
+ onSelect([...value, item]);
203
+ selectedValue(item);
162
204
  };
163
205
 
164
206
  return (
165
- <Container elevation={0}>
207
+ <Container {...containerStyle}>
166
208
  <Typography
167
209
  fontFamily="inter400"
168
210
  mb={1}
@@ -174,108 +216,118 @@ export const MultiSelect = ({
174
216
  </Typography>
175
217
  <TouchableWithoutFeedback
176
218
  disabled={isLoading}
177
- onPress={() => {
178
- setShowDropdown(!showDropdown);
179
- setSearchQuery("");
180
- }}
219
+ onPress={handleOpenDropdown}
181
220
  >
182
- <View>
183
- <Container
184
- borderWidth={1}
185
- borderColor="border.grey400"
186
- p={multipleOptionsSelected ? 1 : 2}
187
- pr={2}
188
- flexDirection="row"
189
- justifyContent="space-between"
190
- alignItems="center"
191
- {...containerStyle}
192
- {...rest}
193
- >
194
- {!multipleOptionsSelected && (
195
- <Typography fontFamily="inter400" fontSize="s" color="font.grey">
196
- {!multipleOptionsSelected && placeholder}
197
- </Typography>
198
- )}
199
- {multipleOptionsSelected && (
200
- <Container flexWrap="wrap" flexDirection="row" maxWidth="85%">
201
- {value?.map((item, index) => (
202
- <MultiSelectItem
203
- key={index}
204
- item={item}
205
- index={index}
206
- onUnselect={() => handleUnselection(item)}
207
- multiSelectedItemContainerStyle={
208
- multiSelectedItemContainerStyle
209
- }
210
- multiSelectedItemTextStyle={multiSelectedItemTextStyle}
211
- />
212
- ))}
213
- </Container>
214
- )}
215
- {isLoading ? (
216
- <ActivityIndicator
217
- size="small"
218
- color={theme.colors.background.base}
219
- />
220
- ) : (
221
- <Icon
222
- name={`arrow-${showDropdown ? "up" : "down"}-s-line`}
223
- size="20"
224
- color="grey"
225
- />
226
- )}
227
- </Container>
228
- </View>
229
- </TouchableWithoutFeedback>
230
-
231
- {showDropdown && (
232
- <Card
233
- bg="background.white"
221
+ <Container
234
222
  borderWidth={1}
235
223
  borderColor="border.grey400"
236
- position="absolute"
237
- left={0}
238
- right={0}
239
- top="100%"
240
- maxHeight={defaultDropdownItemHeight * 6}
241
- elevation={5}
242
- {...dropdownContainerStyle}
224
+ flexDirection="row"
225
+ justifyContent="space-between"
226
+ alignItems="center"
227
+ p={multipleOptionsSelected ? 1 : 2}
228
+ pr={2}
229
+ maxHeight={120}
230
+ {...inputContainerStyle}
231
+ {...rest}
243
232
  >
244
- {isSearchable && (
245
- <Container p={1}>
246
- <Input
247
- placeholder="Search"
248
- onChangeText={setSearchQuery}
249
- fontSize="s"
250
- />
251
- </Container>
233
+ {!multipleOptionsSelected && (
234
+ <Typography fontFamily="inter400" fontSize="s" color="font.grey">
235
+ {!multipleOptionsSelected && placeholder}
236
+ </Typography>
252
237
  )}
253
- <ScrollView nestedScrollEnabled={true}>
254
- {options
255
- .filter(item => {
256
- const isItemAlreadySelected = Boolean(
257
- value.find(selectedItem => selectedItem.value === item.value)
258
- );
259
- return !isItemAlreadySelected;
260
- })
261
- .filter(item => {
262
- if (searchQuery.length === 0) return true;
263
- return formatStr(item.label).includes(formatStr(searchQuery));
264
- })
265
- .map((item, index) => (
266
- <DropdownItem
267
- key={index}
268
- item={item}
269
- index={index}
270
- onPress={() => onSelect([...value, item])}
271
- itemContainerStyle={itemContainerStyle}
272
- defaultDropdownItemHeight={defaultDropdownItemHeight}
273
- itemTextStyle={itemTextStyle}
238
+ {multipleOptionsSelected && (
239
+ <ScrollView showsVerticalScrollIndicator={false}>
240
+ <Container
241
+ flexWrap="wrap"
242
+ flexDirection="row"
243
+ maxWidth="85%"
244
+ onStartShouldSetResponder={() => true}
245
+ >
246
+ {value?.map((item, index) => {
247
+ const optionLabel = labelExtractor(item, index);
248
+ return (
249
+ <MultiSelectItem
250
+ key={index}
251
+ label={optionLabel}
252
+ onUnselect={() => handleUnselection(item)}
253
+ multiSelectedItemContainerStyle={
254
+ multiSelectedItemContainerStyle
255
+ }
256
+ multiSelectedItemTextStyle={multiSelectedItemTextStyle}
257
+ />
258
+ );
259
+ })}
260
+ </Container>
261
+ </ScrollView>
262
+ )}
263
+ {isLoading ? (
264
+ <ActivityIndicator
265
+ size="small"
266
+ color={theme.colors.background.base}
267
+ />
268
+ ) : (
269
+ <Icon
270
+ name={`arrow-${showDropdown ? "up" : "down"}-s-line`}
271
+ size="20"
272
+ color="grey"
273
+ />
274
+ )}
275
+ </Container>
276
+ </TouchableWithoutFeedback>
277
+ <Container overflow="hidden">
278
+ <Animated.View style={animatedStyles}>
279
+ <Card
280
+ bg="background.white"
281
+ borderWidth={1}
282
+ borderColor="border.grey400"
283
+ maxHeight={dropdownHeight}
284
+ {...dropdownContainerStyle}
285
+ >
286
+ {isSearchable && (
287
+ <Container p={1}>
288
+ <Input
289
+ placeholder="Search"
290
+ onChangeText={setSearchQuery}
291
+ fontSize="s"
274
292
  />
275
- ))}
276
- </ScrollView>
277
- </Card>
278
- )}
293
+ </Container>
294
+ )}
295
+ <ScrollView>
296
+ {options
297
+ .filter((item, index) => {
298
+ const optionValue = valueExtractor(item, index);
299
+ const isItemAlreadySelected = Boolean(
300
+ value?.find(
301
+ selectedItem =>
302
+ valueExtractor(selectedItem) === optionValue
303
+ )
304
+ );
305
+ return !isItemAlreadySelected;
306
+ })
307
+ .filter((item, index) => {
308
+ const optionLabel = labelExtractor(item, index);
309
+ if (searchQuery.length === 0) return true;
310
+ return formatStr(optionLabel).includes(
311
+ formatStr(searchQuery)
312
+ );
313
+ })
314
+ .map((item, index) => {
315
+ const optionLabel = labelExtractor(item, index);
316
+ return (
317
+ <DropdownItem
318
+ key={index}
319
+ label={optionLabel}
320
+ onPress={() => handleSelection(item)}
321
+ itemContainerStyle={itemContainerStyle}
322
+ defaultDropdownItemHeight={defaultDropdownItemHeight}
323
+ itemTextStyle={itemTextStyle}
324
+ />
325
+ );
326
+ })}
327
+ </ScrollView>
328
+ </Card>
329
+ </Animated.View>
330
+ </Container>
279
331
  </Container>
280
332
  );
281
333
  };
@@ -290,22 +342,38 @@ MultiSelect.propTypes = {
290
342
  */
291
343
  options: PropTypes.arrayOf(
292
344
  PropTypes.shape({
293
- label: PropTypes.string.isRequired,
294
- value: PropTypes.string.isRequired,
345
+ label: PropTypes.string,
346
+ value: PropTypes.string,
295
347
  })
296
348
  ).isRequired,
297
349
  /**
298
350
  * The text to be displayed if no option is selected.
299
351
  */
300
352
  placeholder: PropTypes.string,
353
+ /**
354
+ * Use custom key as label.
355
+ */
356
+ labelExtractor: PropTypes.func,
357
+ /**
358
+ * Use custom key as value.
359
+ */
360
+ valueExtractor: PropTypes.func,
301
361
  /**
302
362
  * The selected value to show for the Select input.
303
363
  */
304
364
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
305
365
  /**
306
- * Callback function when an option is selected, receives the select option object.
366
+ * Callback function when an option is selected, receives an array of object of options selected.
307
367
  */
308
368
  onSelect: PropTypes.func,
369
+ /**
370
+ * Callback function when an option is selected, receives the selected option object.
371
+ */
372
+ selectedValue: PropTypes.func,
373
+ /**
374
+ * Callback function when an option is selected, receives the deleted option object.
375
+ */
376
+ deletedValue: PropTypes.func,
309
377
  /**
310
378
  * Used to show if the dropdown is loading state, while loading Select input will be disabled.
311
379
  */
@@ -319,9 +387,13 @@ MultiSelect.propTypes = {
319
387
  */
320
388
  labelStyle: PropTypes.object,
321
389
  /**
322
- * To customise Select input container styles.
390
+ * To customise outermost container style.
323
391
  */
324
392
  containerStyle: PropTypes.object,
393
+ /**
394
+ * To customise Select input container styles.
395
+ */
396
+ inputContainerStyle: PropTypes.object,
325
397
  /**
326
398
  * To customise dropdown container styles.
327
399
  */
@@ -347,8 +419,12 @@ MultiSelect.propTypes = {
347
419
  MultiSelect.defaultProps = {
348
420
  label: null,
349
421
  placeholder: "Select Option",
422
+ labelExtractor: option => option?.label,
423
+ valueExtractor: option => option?.value,
350
424
  value: null,
351
425
  onSelect: () => {},
426
+ selectedValue: () => {},
427
+ deletedValue: () => {},
352
428
  isLoading: false,
353
429
  isSearchable: false,
354
430
  };
@@ -15,14 +15,12 @@ export const TouchableOpacity = styled.TouchableOpacity`
15
15
  ${layout}
16
16
  `;
17
17
 
18
- const PopOverItem = ({ item, fontFamily, fontSize, hidePopOver }) => {
19
- const { Icon, label, onPress } = item;
18
+ const PopOverItem = ({ item, onPress, fontFamily, fontSize }) => {
19
+ const { Icon, label } = item;
20
+
20
21
  return (
21
22
  <TouchableOpacity
22
- onPress={() => {
23
- hidePopOver();
24
- onPress();
25
- }}
23
+ onPress={onPress}
26
24
  flexDirection="row"
27
25
  p={2}
28
26
  px={3}
@@ -43,12 +41,12 @@ const PopOverItem = ({ item, fontFamily, fontSize, hidePopOver }) => {
43
41
 
44
42
  PopOverItem.propTypes = {
45
43
  item: PropTypes.object,
44
+ onPress: PropTypes.func,
46
45
  fontFamily: PropTypes.string,
47
46
  fontSize: PropTypes.oneOfType([
48
47
  PropTypes.number,
49
48
  PropTypes.oneOf(["xs", "s", "m", "l", "xl", "xxl"]),
50
49
  ]),
51
- hidePopOver: PropTypes.func,
52
50
  };
53
51
 
54
52
  /**
@@ -140,10 +138,16 @@ export const Popover = ({
140
138
  ...rest
141
139
  }) => {
142
140
  const popoverRef = useRef();
141
+ const onPressItemRef = useRef(() => {});
142
+
143
143
  return (
144
144
  <OriginalPopover
145
145
  ref={popoverRef}
146
146
  popoverStyle={styles.popoverStyle}
147
+ onOpenStart={() => {
148
+ onPressItemRef.current = () => {};
149
+ }}
150
+ onCloseComplete={() => onPressItemRef.current()}
147
151
  {...rest}
148
152
  >
149
153
  {data?.map((item, index) => {
@@ -153,8 +157,9 @@ export const Popover = ({
153
157
  item={item}
154
158
  fontFamily={fontFamily}
155
159
  fontSize={fontSize}
156
- hidePopOver={() => {
160
+ onPress={() => {
157
161
  popoverRef?.current?.setState({ isVisible: false });
162
+ onPressItemRef.current = item.onPress;
158
163
  }}
159
164
  />
160
165
  );
@@ -1,14 +1,24 @@
1
1
  import React, { useState, useContext } from "react";
2
2
  import Icon from "react-native-remix-icon";
3
3
  import PropTypes from "prop-types";
4
- import { ActivityIndicator, ScrollView } from "react-native";
4
+ import Animated, {
5
+ useSharedValue,
6
+ useAnimatedStyle,
7
+ withTiming,
8
+ Easing,
9
+ } from "react-native-reanimated";
10
+ import {
11
+ ActivityIndicator,
12
+ TouchableWithoutFeedback,
13
+ Keyboard,
14
+ } from "react-native";
5
15
  import { ThemeContext } from "styled-components/native";
16
+ import { ScrollView } from "react-native-gesture-handler";
6
17
 
7
- import { Container, Input, Touchable, Typography } from "@components";
18
+ import { Card, Container, Input, Typography } from "@components";
8
19
 
9
20
  const DropdownItem = ({
10
- item,
11
- index,
21
+ label,
12
22
  isSelectedItem,
13
23
  defaultDropdownItemHeight,
14
24
  onPress,
@@ -17,12 +27,9 @@ const DropdownItem = ({
17
27
  itemTextStyle,
18
28
  selectedItemTextStyle,
19
29
  }) => (
20
- <Touchable
21
- key={index}
22
- bg={isSelectedItem ? "background.base" : "background.white"}
23
- onPress={onPress}
24
- >
30
+ <TouchableWithoutFeedback onPress={onPress}>
25
31
  <Container
32
+ bg={isSelectedItem ? "background.base" : "background.white"}
26
33
  height={defaultDropdownItemHeight}
27
34
  p={2}
28
35
  {...itemContainerStyle}
@@ -35,15 +42,14 @@ const DropdownItem = ({
35
42
  {...itemTextStyle}
36
43
  {...(isSelectedItem && selectedItemTextStyle)}
37
44
  >
38
- {item?.label}
45
+ {label}
39
46
  </Typography>
40
47
  </Container>
41
- </Touchable>
48
+ </TouchableWithoutFeedback>
42
49
  );
43
50
 
44
51
  DropdownItem.propTypes = {
45
- item: PropTypes.object,
46
- index: PropTypes.number,
52
+ label: PropTypes.string.isRequired,
47
53
  isSelectedItem: PropTypes.bool,
48
54
  defaultDropdownItemHeight: PropTypes.number,
49
55
  onPress: PropTypes.func,
@@ -62,7 +68,9 @@ DropdownItem.propTypes = {
62
68
  * <img src="screenshots/select/select2.png" />
63
69
  * </div>
64
70
  *
65
- * ## Usage
71
+ * ## Usage
72
+ *
73
+ * ### Import and use Select component.
66
74
  *
67
75
  * ```js
68
76
  * import * as React, { useState } from 'react';
@@ -83,18 +91,15 @@ DropdownItem.propTypes = {
83
91
  * const [selectedOption, setSelectedOption] = useState(null)
84
92
  *
85
93
  * return (
86
- * <Container>
87
- * <Select
88
- * label="Select"
89
- * data={OPTIONS}
90
- * value={selectedOption?.value}
91
- * onSelect={setSelectedOption}
92
- * />
93
- * </Container>
94
+ * <Select
95
+ * label="Select"
96
+ * options={OPTIONS}
97
+ * value={selectedOption}
98
+ * onSelect={setSelectedOption}
99
+ * />
94
100
  * );
95
101
  * }
96
102
  * ```
97
- *
98
103
  */
99
104
 
100
105
  export const Select = ({
@@ -102,11 +107,14 @@ export const Select = ({
102
107
  label,
103
108
  value,
104
109
  placeholder,
110
+ labelExtractor,
111
+ valueExtractor,
105
112
  onSelect,
106
113
  isLoading,
107
114
  isSearchable,
108
115
  labelStyle,
109
116
  containerStyle,
117
+ inputContainerStyle,
110
118
  dropdownContainerStyle,
111
119
  itemContainerStyle,
112
120
  itemTextStyle,
@@ -114,20 +122,49 @@ export const Select = ({
114
122
  selectedItemTextStyle,
115
123
  ...rest
116
124
  }) => {
125
+ const theme = useContext(ThemeContext);
117
126
  const [showDropdown, setShowDropdown] = useState(false);
118
127
  const [searchQuery, setSearchQuery] = useState("");
119
- const theme = useContext(ThemeContext);
120
- const selectedItemIndex = options?.findIndex(item => item?.value === value);
128
+ const dropdownAnimatedHeight = useSharedValue(0);
129
+
121
130
  const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
131
+ const dropdownHeight =
132
+ dropdownContainerStyle?.height ||
133
+ dropdownContainerStyle?.maxHeight ||
134
+ defaultDropdownItemHeight * 6;
135
+ const selectedOptionLabel = labelExtractor(value || {});
136
+ const selectedOptionValue = valueExtractor(value || {});
122
137
  const formatStr = str => str?.toLowerCase()?.trim();
123
138
 
139
+ const animatedStyles = useAnimatedStyle(() => {
140
+ return {
141
+ height: withTiming(dropdownAnimatedHeight.value, {
142
+ duration: 100,
143
+ easing: Easing.ease,
144
+ }),
145
+ };
146
+ });
147
+
148
+ const toggleAnimation = () => {
149
+ dropdownAnimatedHeight.value =
150
+ dropdownAnimatedHeight.value === 0 ? dropdownHeight : 0;
151
+ };
152
+
153
+ const handleOpenDropdown = () => {
154
+ Keyboard.dismiss();
155
+ setSearchQuery("");
156
+ setShowDropdown(!showDropdown);
157
+ toggleAnimation();
158
+ };
159
+
124
160
  const handleItemSelection = (item, index) => {
125
161
  setShowDropdown(false);
162
+ toggleAnimation();
126
163
  onSelect(item, index);
127
164
  };
128
165
 
129
166
  return (
130
- <Container elevation={0}>
167
+ <Container {...containerStyle}>
131
168
  <Typography
132
169
  fontFamily="inter400"
133
170
  mb={1}
@@ -137,12 +174,9 @@ export const Select = ({
137
174
  >
138
175
  {label}
139
176
  </Typography>
140
- <Touchable
177
+ <TouchableWithoutFeedback
141
178
  disabled={isLoading}
142
- onPress={() => {
143
- setShowDropdown(!showDropdown);
144
- setSearchQuery("");
145
- }}
179
+ onPress={handleOpenDropdown}
146
180
  >
147
181
  <Container
148
182
  borderWidth={1}
@@ -151,11 +185,11 @@ export const Select = ({
151
185
  flexDirection="row"
152
186
  justifyContent="space-between"
153
187
  alignItems="center"
154
- {...containerStyle}
188
+ {...inputContainerStyle}
155
189
  {...rest}
156
190
  >
157
191
  <Typography fontFamily="inter400" fontSize="s" color="font.grey">
158
- {options?.[selectedItemIndex]?.label || placeholder}
192
+ {selectedOptionLabel || placeholder}
159
193
  </Typography>
160
194
  {isLoading ? (
161
195
  <ActivityIndicator
@@ -170,59 +204,55 @@ export const Select = ({
170
204
  />
171
205
  )}
172
206
  </Container>
173
- </Touchable>
174
- {showDropdown && (
175
- <Container
176
- bg="background.white"
177
- borderWidth={1}
178
- borderColor="border.grey400"
179
- position="absolute"
180
- left={0}
181
- right={0}
182
- top="100%"
183
- maxHeight={defaultDropdownItemHeight * 6}
184
- shadowOpacity={0.25}
185
- shadowRadius={3.84}
186
- shadow-color="#000"
187
- shadowOffset={{
188
- width: 0,
189
- height: 2,
190
- }}
191
- elevation={5}
192
- {...dropdownContainerStyle}
193
- >
194
- {isSearchable && (
195
- <Container p={1}>
196
- <Input
197
- placeholder="Search"
198
- onChangeText={setSearchQuery}
199
- fontSize="s"
200
- />
201
- </Container>
202
- )}
203
- <ScrollView nestedScrollEnabled={true}>
204
- {options
205
- .filter(item => {
206
- if (searchQuery?.length === 0) return true;
207
- return formatStr(item.label).includes(formatStr(searchQuery));
208
- })
209
- .map((item, index) => (
210
- <DropdownItem
211
- key={index}
212
- item={item}
213
- index={index}
214
- isSelectedItem={item?.value === value}
215
- defaultDropdownItemHeight={defaultDropdownItemHeight}
216
- onPress={() => handleItemSelection(item, index)}
217
- itemContainerStyle={itemContainerStyle}
218
- selectedItemContainerStyle={selectedItemContainerStyle}
219
- itemTextStyle={itemTextStyle}
220
- selectedItemTextStyle={selectedItemTextStyle}
207
+ </TouchableWithoutFeedback>
208
+ <Container overflow="hidden">
209
+ <Animated.View style={animatedStyles}>
210
+ <Card
211
+ bg="background.white"
212
+ borderWidth={1}
213
+ borderColor="border.grey400"
214
+ maxHeight={dropdownHeight}
215
+ {...dropdownContainerStyle}
216
+ >
217
+ {isSearchable && (
218
+ <Container p={1}>
219
+ <Input
220
+ placeholder="Search"
221
+ onChangeText={setSearchQuery}
222
+ fontSize="s"
221
223
  />
222
- ))}
223
- </ScrollView>
224
- </Container>
225
- )}
224
+ </Container>
225
+ )}
226
+ <ScrollView>
227
+ {options
228
+ .filter((item, index) => {
229
+ const label = labelExtractor(item, index);
230
+ if (searchQuery?.length === 0) return true;
231
+ return formatStr(label).includes(formatStr(searchQuery));
232
+ })
233
+ .map((item, index) => {
234
+ const optionLabel = labelExtractor(item, index);
235
+ const optionValue = valueExtractor(item, index);
236
+ const isSelectedItem =
237
+ selectedOptionValue && selectedOptionValue === optionValue;
238
+ return (
239
+ <DropdownItem
240
+ key={index}
241
+ label={optionLabel}
242
+ isSelectedItem={isSelectedItem}
243
+ defaultDropdownItemHeight={defaultDropdownItemHeight}
244
+ onPress={() => handleItemSelection(item, index)}
245
+ itemContainerStyle={itemContainerStyle}
246
+ selectedItemContainerStyle={selectedItemContainerStyle}
247
+ itemTextStyle={itemTextStyle}
248
+ selectedItemTextStyle={selectedItemTextStyle}
249
+ />
250
+ );
251
+ })}
252
+ </ScrollView>
253
+ </Card>
254
+ </Animated.View>
255
+ </Container>
226
256
  </Container>
227
257
  );
228
258
  };
@@ -237,18 +267,26 @@ Select.propTypes = {
237
267
  */
238
268
  options: PropTypes.arrayOf(
239
269
  PropTypes.shape({
240
- label: PropTypes.string.isRequired,
241
- value: PropTypes.string.isRequired,
270
+ label: PropTypes.string,
271
+ value: PropTypes.string,
242
272
  })
243
273
  ).isRequired,
244
274
  /**
245
275
  * The text to be displayed if no option is selected.
246
276
  */
247
277
  placeholder: PropTypes.string,
278
+ /**
279
+ * Use custom key as label.
280
+ */
281
+ labelExtractor: PropTypes.func,
282
+ /**
283
+ * Use custom key as value.
284
+ */
285
+ valueExtractor: PropTypes.func,
248
286
  /**
249
287
  * The selected value to show for the Select input.
250
288
  */
251
- value: PropTypes.string,
289
+ value: PropTypes.object,
252
290
  /**
253
291
  * Callback function when an option is selected, receives the select option object.
254
292
  */
@@ -266,9 +304,13 @@ Select.propTypes = {
266
304
  */
267
305
  labelStyle: PropTypes.object,
268
306
  /**
269
- * To customise Select input container styles.
307
+ * To customise outermost container style.
270
308
  */
271
309
  containerStyle: PropTypes.object,
310
+ /**
311
+ * To customise Select input container styles.
312
+ */
313
+ inputContainerStyle: PropTypes.object,
272
314
  /**
273
315
  * To customise dropdown container styles.
274
316
  */
@@ -294,6 +336,8 @@ Select.propTypes = {
294
336
  Select.defaultProps = {
295
337
  label: null,
296
338
  placeholder: "Select Option",
339
+ labelExtractor: option => option?.label,
340
+ valueExtractor: option => option?.value,
297
341
  value: null,
298
342
  onSelect: () => {},
299
343
  isLoading: false,
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+
3
+ export const ProviderContext = React.createContext(null);