@bigbinary/neetoui-rn 0.0.115 → 0.0.116

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","selectedValue","deletedValue","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,selectedValue=_ref3.selectedValue,deletedValue=_ref3.deletedValue,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);deletedValue(item);};var handleSelection=function handleSelection(item){onSelect([].concat((0,_toConsumableArray2.default)(value),[item]));selectedValue(item);};return _react.default.createElement(_.Container,{elevation:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:173,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:174,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:function onPress(){setShowDropdown(!showDropdown);setSearchQuery("");},__self:_this,__source:{fileName:_jsxFileName,lineNumber:183,columnNumber:7}},_react.default.createElement(_reactNative.View,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:190,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:191,columnNumber:11}}),!multipleOptionsSelected&&_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:203,columnNumber:15}},!multipleOptionsSelected&&placeholder),multipleOptionsSelected&&_react.default.createElement(_.Container,{flexWrap:"wrap",flexDirection:"row",maxWidth:"85%",__self:_this,__source:{fileName:_jsxFileName,lineNumber:208,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:210,columnNumber:19}});})),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:224,columnNumber:15}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:229,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:240,columnNumber:9}}),isSearchable&&_react.default.createElement(_.Container,{p:1,__self:_this,__source:{fileName:_jsxFileName,lineNumber:253,columnNumber:13}},_react.default.createElement(_.Input,{placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",__self:_this,__source:{fileName:_jsxFileName,lineNumber:254,columnNumber:15}})),_react.default.createElement(_reactNative.ScrollView,{nestedScrollEnabled:true,__self:_this,__source:{fileName:_jsxFileName,lineNumber:261,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 handleSelection(item);},itemContainerStyle:itemContainerStyle,defaultDropdownItemHeight:defaultDropdownItemHeight,itemTextStyle:itemTextStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:274,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,selectedValue:_propTypes.default.func,deletedValue:_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(){},selectedValue:function selectedValue(){},deletedValue:function deletedValue(){},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.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.115",
3
+ "version": "0.0.116",
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,6 +139,8 @@ export const MultiSelect = ({
134
139
  label,
135
140
  value,
136
141
  placeholder,
142
+ labelExtractor,
143
+ valueExtractor,
137
144
  onSelect,
138
145
  selectedValue,
139
146
  deletedValue,
@@ -141,6 +148,7 @@ export const MultiSelect = ({
141
148
  isSearchable,
142
149
  labelStyle,
143
150
  containerStyle,
151
+ inputContainerStyle,
144
152
  dropdownContainerStyle,
145
153
  itemContainerStyle,
146
154
  itemTextStyle,
@@ -151,14 +159,40 @@ export const MultiSelect = ({
151
159
  const theme = useContext(ThemeContext);
152
160
  const [showDropdown, setShowDropdown] = useState(false);
153
161
  const [searchQuery, setSearchQuery] = useState("");
162
+ const dropdownAnimatedHeight = useSharedValue(0);
154
163
 
155
164
  const multipleOptionsSelected = value?.length > 0;
156
165
  const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
166
+ const dropdownHeight =
167
+ dropdownContainerStyle?.height ||
168
+ dropdownContainerStyle?.maxHeight ||
169
+ defaultDropdownItemHeight * 6;
157
170
  const formatStr = str => str?.toLowerCase()?.trim();
158
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
+
159
193
  const handleUnselection = item => {
160
194
  const newValue = value.filter(
161
- selectedItem => selectedItem.value !== item.value
195
+ selectedItem => valueExtractor(selectedItem) !== valueExtractor(item)
162
196
  );
163
197
  onSelect(newValue);
164
198
  deletedValue(item);
@@ -170,7 +204,7 @@ export const MultiSelect = ({
170
204
  };
171
205
 
172
206
  return (
173
- <Container elevation={0}>
207
+ <Container {...containerStyle}>
174
208
  <Typography
175
209
  fontFamily="inter400"
176
210
  mb={1}
@@ -182,108 +216,118 @@ export const MultiSelect = ({
182
216
  </Typography>
183
217
  <TouchableWithoutFeedback
184
218
  disabled={isLoading}
185
- onPress={() => {
186
- setShowDropdown(!showDropdown);
187
- setSearchQuery("");
188
- }}
219
+ onPress={handleOpenDropdown}
189
220
  >
190
- <View>
191
- <Container
192
- borderWidth={1}
193
- borderColor="border.grey400"
194
- p={multipleOptionsSelected ? 1 : 2}
195
- pr={2}
196
- flexDirection="row"
197
- justifyContent="space-between"
198
- alignItems="center"
199
- {...containerStyle}
200
- {...rest}
201
- >
202
- {!multipleOptionsSelected && (
203
- <Typography fontFamily="inter400" fontSize="s" color="font.grey">
204
- {!multipleOptionsSelected && placeholder}
205
- </Typography>
206
- )}
207
- {multipleOptionsSelected && (
208
- <Container flexWrap="wrap" flexDirection="row" maxWidth="85%">
209
- {value?.map((item, index) => (
210
- <MultiSelectItem
211
- key={index}
212
- item={item}
213
- index={index}
214
- onUnselect={() => handleUnselection(item)}
215
- multiSelectedItemContainerStyle={
216
- multiSelectedItemContainerStyle
217
- }
218
- multiSelectedItemTextStyle={multiSelectedItemTextStyle}
219
- />
220
- ))}
221
- </Container>
222
- )}
223
- {isLoading ? (
224
- <ActivityIndicator
225
- size="small"
226
- color={theme.colors.background.base}
227
- />
228
- ) : (
229
- <Icon
230
- name={`arrow-${showDropdown ? "up" : "down"}-s-line`}
231
- size="20"
232
- color="grey"
233
- />
234
- )}
235
- </Container>
236
- </View>
237
- </TouchableWithoutFeedback>
238
-
239
- {showDropdown && (
240
- <Card
241
- bg="background.white"
221
+ <Container
242
222
  borderWidth={1}
243
223
  borderColor="border.grey400"
244
- position="absolute"
245
- left={0}
246
- right={0}
247
- top="100%"
248
- maxHeight={defaultDropdownItemHeight * 6}
249
- elevation={5}
250
- {...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}
251
232
  >
252
- {isSearchable && (
253
- <Container p={1}>
254
- <Input
255
- placeholder="Search"
256
- onChangeText={setSearchQuery}
257
- fontSize="s"
258
- />
259
- </Container>
233
+ {!multipleOptionsSelected && (
234
+ <Typography fontFamily="inter400" fontSize="s" color="font.grey">
235
+ {!multipleOptionsSelected && placeholder}
236
+ </Typography>
237
+ )}
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>
260
262
  )}
261
- <ScrollView nestedScrollEnabled={true}>
262
- {options
263
- .filter(item => {
264
- const isItemAlreadySelected = Boolean(
265
- value.find(selectedItem => selectedItem.value === item.value)
266
- );
267
- return !isItemAlreadySelected;
268
- })
269
- .filter(item => {
270
- if (searchQuery.length === 0) return true;
271
- return formatStr(item.label).includes(formatStr(searchQuery));
272
- })
273
- .map((item, index) => (
274
- <DropdownItem
275
- key={index}
276
- item={item}
277
- index={index}
278
- onPress={() => handleSelection(item)}
279
- itemContainerStyle={itemContainerStyle}
280
- defaultDropdownItemHeight={defaultDropdownItemHeight}
281
- itemTextStyle={itemTextStyle}
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"
282
292
  />
283
- ))}
284
- </ScrollView>
285
- </Card>
286
- )}
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>
287
331
  </Container>
288
332
  );
289
333
  };
@@ -298,14 +342,22 @@ MultiSelect.propTypes = {
298
342
  */
299
343
  options: PropTypes.arrayOf(
300
344
  PropTypes.shape({
301
- label: PropTypes.string.isRequired,
302
- value: PropTypes.string.isRequired,
345
+ label: PropTypes.string,
346
+ value: PropTypes.string,
303
347
  })
304
348
  ).isRequired,
305
349
  /**
306
350
  * The text to be displayed if no option is selected.
307
351
  */
308
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,
309
361
  /**
310
362
  * The selected value to show for the Select input.
311
363
  */
@@ -335,9 +387,13 @@ MultiSelect.propTypes = {
335
387
  */
336
388
  labelStyle: PropTypes.object,
337
389
  /**
338
- * To customise Select input container styles.
390
+ * To customise outermost container style.
339
391
  */
340
392
  containerStyle: PropTypes.object,
393
+ /**
394
+ * To customise Select input container styles.
395
+ */
396
+ inputContainerStyle: PropTypes.object,
341
397
  /**
342
398
  * To customise dropdown container styles.
343
399
  */
@@ -363,6 +419,8 @@ MultiSelect.propTypes = {
363
419
  MultiSelect.defaultProps = {
364
420
  label: null,
365
421
  placeholder: "Select Option",
422
+ labelExtractor: option => option?.label,
423
+ valueExtractor: option => option?.value,
366
424
  value: null,
367
425
  onSelect: () => {},
368
426
  selectedValue: () => {},
@@ -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
- * options={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);