@bigbinary/neetoui-rn 0.0.118 → 0.0.121

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 _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
+ 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","emptyOptionsPlaceholder","labelExtractor","valueExtractor","onSelect","selectedValue","deletedValue","isLoading","isSearchable","showCreateOption","showCreateOptionLoader","createOptionLabel","onPressCreateOption","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemLabelStyle","multiSelectedItemContainerStyle","multiSelectedItemLabelStyle","searchInputContainerStyle","searchInputStyle","emptyOptionsContainerStyle","emptyOptionsLabelStyle","createSearchedOptionContainerStyle","createSearchedOptionLabelStyle"];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,multiSelectedItemLabelStyle=_ref.multiSelectedItemLabelStyle;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:27,columnNumber:3}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",mr:2,maxWidth:"90%"},multiSelectedItemLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:39,columnNumber:5}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onUnselect,__self:_this,__source:{fileName:_jsxFileName,lineNumber:48,columnNumber:5}},_react.default.createElement(_reactNativeRemixIcon.default,{name:"ri-close-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:49,columnNumber:7}})));};MultiSelectItem.propTypes={label:_propTypes.default.string,onUnselect:_propTypes.default.func,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemLabelStyle:_propTypes.default.object};var DropdownItem=function DropdownItem(_ref2){var label=_ref2.label,onPress=_ref2.onPress,defaultDropdownItemHeight=_ref2.defaultDropdownItemHeight,itemContainerStyle=_ref2.itemContainerStyle,itemLabelStyle=_ref2.itemLabelStyle;return _react.default.createElement(_.Touchable,{bg:"background.white",onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:69,columnNumber:5}},_react.default.createElement(_.Container,(0,_extends2.default)({height:defaultDropdownItemHeight,p:2},itemContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:70,columnNumber:7}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},itemLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:75,columnNumber:9}}),label)));};DropdownItem.propTypes={label:_propTypes.default.string,onPress:_propTypes.default.func,defaultDropdownItemHeight:_propTypes.default.number,itemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object};var MultiSelect=function MultiSelect(_ref3){var options=_ref3.options,label=_ref3.label,value=_ref3.value,placeholder=_ref3.placeholder,emptyOptionsPlaceholder=_ref3.emptyOptionsPlaceholder,labelExtractor=_ref3.labelExtractor,valueExtractor=_ref3.valueExtractor,onSelect=_ref3.onSelect,selectedValue=_ref3.selectedValue,deletedValue=_ref3.deletedValue,isLoading=_ref3.isLoading,isSearchable=_ref3.isSearchable,showCreateOption=_ref3.showCreateOption,showCreateOptionLoader=_ref3.showCreateOptionLoader,createOptionLabel=_ref3.createOptionLabel,onPressCreateOption=_ref3.onPressCreateOption,labelStyle=_ref3.labelStyle,containerStyle=_ref3.containerStyle,inputContainerStyle=_ref3.inputContainerStyle,dropdownContainerStyle=_ref3.dropdownContainerStyle,itemContainerStyle=_ref3.itemContainerStyle,itemLabelStyle=_ref3.itemLabelStyle,multiSelectedItemContainerStyle=_ref3.multiSelectedItemContainerStyle,multiSelectedItemLabelStyle=_ref3.multiSelectedItemLabelStyle,searchInputContainerStyle=_ref3.searchInputContainerStyle,searchInputStyle=_ref3.searchInputStyle,emptyOptionsContainerStyle=_ref3.emptyOptionsContainerStyle,emptyOptionsLabelStyle=_ref3.emptyOptionsLabelStyle,createSearchedOptionContainerStyle=_ref3.createSearchedOptionContainerStyle,createSearchedOptionLabelStyle=_ref3.createSearchedOptionLabelStyle,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 formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var filteredOptions=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));});var isOptionsEmpty=!options||(options==null?void 0:options.length)===0;var isSearchedOptionsEmpty=searchQuery.length>0&&filteredOptions.length===0;var emptyOptionsPlaceholderHeight=40;var emptySearchedOptionsHeight=40;var searchInputHeight=35;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*Math.min(filteredOptions==null?void 0:filteredOptions.length,6)+(isSearchable?searchInputHeight+10:0)+(isOptionsEmpty?emptyOptionsPlaceholderHeight:0)+(isSearchedOptionsEmpty&&showCreateOption?emptySearchedOptionsHeight:0);var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease},function(){var _f=function _f(){if(dropdownAnimatedHeight.value===0){(0,_reactNativeReanimated.runOnJS)(setShowDropdown)(false);}};_f._closure={dropdownAnimatedHeight:dropdownAnimatedHeight,runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{dropdownAnimatedHeight,runOnJS,setShowDropdown}=jsThis._closure;{if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}}}";_f.__workletHash=8540692570337;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js (219:8)";return _f;}())};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease},runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing,runOnJS,setShowDropdown}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease},function(){if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}})};}}";_f.__workletHash=4835541372615;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/MultiSelect.js (211:42)";return _f;}(),[]);var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");if(!showDropdown){setShowDropdown(true);}if(showDropdown){dropdownAnimatedHeight.value=0;}};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);};(0,_react.useEffect)(function(){if(showDropdown){dropdownAnimatedHeight.value=dropdownHeight;}},[showDropdown,dropdownHeight]);return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:260,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:261,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:270,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:274,columnNumber:9}}),!multipleOptionsSelected&&_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:287,columnNumber:13}},!multipleOptionsSelected&&placeholder),multipleOptionsSelected&&_react.default.createElement(_reactNativeGestureHandler.ScrollView,{showsVerticalScrollIndicator:false,__self:_this,__source:{fileName:_jsxFileName,lineNumber:292,columnNumber:13}},_react.default.createElement(_.Container,{flexWrap:"wrap",flexDirection:"row",maxWidth:"85%",onStartShouldSetResponder:function onStartShouldSetResponder(){return true;},__self:_this,__source:{fileName:_jsxFileName,lineNumber:293,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,multiSelectedItemLabelStyle:multiSelectedItemLabelStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:302,columnNumber:21}});}))),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:317,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:322,columnNumber:13}}))),showDropdown&&_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:331,columnNumber:9}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:332,columnNumber:11}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:333,columnNumber:13}}),isSearchable&&_react.default.createElement(_.Container,(0,_extends2.default)({p:1},searchInputContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:341,columnNumber:17}}),_react.default.createElement(_.Input,(0,_extends2.default)({placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",containerStyles:{height:searchInputHeight,justifyContent:"center"}},searchInputStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:342,columnNumber:19}}))),isOptionsEmpty&&_react.default.createElement(_.Container,(0,_extends2.default)({height:emptyOptionsPlaceholderHeight,justifyContent:"center",alignItems:"center"},emptyOptionsContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:356,columnNumber:17}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},emptyOptionsLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:362,columnNumber:19}}),emptyOptionsPlaceholder||"No Options")),isSearchedOptionsEmpty&&showCreateOption&&_react.default.createElement(_.Touchable,(0,_extends2.default)({height:emptySearchedOptionsHeight,justifyContent:"center",alignItems:"center",onPress:function onPress(){return onPressCreateOption(searchQuery);}},createSearchedOptionContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:374,columnNumber:17}}),showCreateOptionLoader?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:382,columnNumber:21}}):_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},createSearchedOptionLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:387,columnNumber:21}}),createOptionLabel||"Create "+searchQuery+" option")),_react.default.createElement(_.Container,{height:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:399,columnNumber:15}},_react.default.createElement(_.Input,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:400,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:402,columnNumber:15}},filteredOptions.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,itemLabelStyle:itemLabelStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:406,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,emptyOptionsPlaceholder:_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,showCreateOption:_propTypes.default.bool,showCreateOptionLoader:_propTypes.default.bool,createOptionLabel:_propTypes.default.string,onPressCreateOption:_propTypes.default.func,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object,multiSelectedItemContainerStyle:_propTypes.default.object,multiSelectedItemLabelStyle:_propTypes.default.object,searchInputContainerStyle:_propTypes.default.object,searchInputStyle:_propTypes.default.object,emptyOptionsContainerStyle:_propTypes.default.object,emptyOptionsLabelStyle:_propTypes.default.object,createSearchedOptionContainerStyle:_propTypes.default.object,createSearchedOptionLabelStyle:_propTypes.default.object};MultiSelect.defaultProps={label:null,placeholder:"Select Option",emptyOptionsPlaceholder:null,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,showCreateOption:false,showCreateOptionLoader:false,createOptionLabel:null,onPressCreateOption:function onPressCreateOption(){}};
@@ -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 _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};
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","emptyOptionsPlaceholder","labelExtractor","valueExtractor","onSelect","isLoading","isSearchable","showCreateOption","showCreateOptionLoader","createOptionLabel","onPressCreateOption","labelStyle","containerStyle","inputContainerStyle","dropdownContainerStyle","itemContainerStyle","itemLabelStyle","selectedItemContainerStyle","selectedItemLabelStyle","searchInputContainerStyle","searchInputStyle","emptyOptionsContainerStyle","emptyOptionsLabelStyle","createSearchedOptionContainerStyle","createSearchedOptionLabelStyle"];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,itemLabelStyle=_ref.itemLabelStyle,selectedItemLabelStyle=_ref.selectedItemLabelStyle;return _react.default.createElement(_reactNative.TouchableWithoutFeedback,{onPress:onPress,__self:_this,__source:{fileName:_jsxFileName,lineNumber:31,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:32,columnNumber:5}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:isSelectedItem?"font.white":"font.grey"},itemLabelStyle,isSelectedItem&&selectedItemLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:39,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,itemLabelStyle:_propTypes.default.object,selectedItemLabelStyle:_propTypes.default.object};var Select=function Select(_ref2){var options=_ref2.options,label=_ref2.label,value=_ref2.value,placeholder=_ref2.placeholder,emptyOptionsPlaceholder=_ref2.emptyOptionsPlaceholder,labelExtractor=_ref2.labelExtractor,valueExtractor=_ref2.valueExtractor,onSelect=_ref2.onSelect,isLoading=_ref2.isLoading,isSearchable=_ref2.isSearchable,showCreateOption=_ref2.showCreateOption,showCreateOptionLoader=_ref2.showCreateOptionLoader,createOptionLabel=_ref2.createOptionLabel,onPressCreateOption=_ref2.onPressCreateOption,labelStyle=_ref2.labelStyle,containerStyle=_ref2.containerStyle,inputContainerStyle=_ref2.inputContainerStyle,dropdownContainerStyle=_ref2.dropdownContainerStyle,itemContainerStyle=_ref2.itemContainerStyle,itemLabelStyle=_ref2.itemLabelStyle,selectedItemContainerStyle=_ref2.selectedItemContainerStyle,selectedItemLabelStyle=_ref2.selectedItemLabelStyle,searchInputContainerStyle=_ref2.searchInputContainerStyle,searchInputStyle=_ref2.searchInputStyle,emptyOptionsContainerStyle=_ref2.emptyOptionsContainerStyle,emptyOptionsLabelStyle=_ref2.emptyOptionsLabelStyle,createSearchedOptionContainerStyle=_ref2.createSearchedOptionContainerStyle,createSearchedOptionLabelStyle=_ref2.createSearchedOptionLabelStyle,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 formatStr=function formatStr(str){var _str$toLowerCase;return str==null?void 0:(_str$toLowerCase=str.toLowerCase())==null?void 0:_str$toLowerCase.trim();};var filteredOptions=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));});var isOptionsEmpty=!options||(options==null?void 0:options.length)===0;var isSearchedOptionsEmpty=searchQuery.length>0&&filteredOptions.length===0;var emptyOptionsPlaceholderHeight=40;var emptySearchedOptionsHeight=40;var searchInputHeight=35;var defaultDropdownItemHeight=(itemContainerStyle==null?void 0:itemContainerStyle.height)||32;var dropdownHeight=(dropdownContainerStyle==null?void 0:dropdownContainerStyle.height)||(dropdownContainerStyle==null?void 0:dropdownContainerStyle.maxHeight)||defaultDropdownItemHeight*Math.min(filteredOptions==null?void 0:filteredOptions.length,6)+(isSearchable?searchInputHeight+10:0)+(isOptionsEmpty?emptyOptionsPlaceholderHeight:0)+(isSearchedOptionsEmpty&&showCreateOption?emptySearchedOptionsHeight:0);var selectedOptionLabel=labelExtractor(value||{});var selectedOptionValue=valueExtractor(value||{});var animatedStyles=(0,_reactNativeReanimated.useAnimatedStyle)(function(){var _f=function _f(){return{height:(0,_reactNativeReanimated.withTiming)(dropdownAnimatedHeight.value,{duration:100,easing:_reactNativeReanimated.Easing.ease},function(){var _f=function _f(){if(dropdownAnimatedHeight.value===0){(0,_reactNativeReanimated.runOnJS)(setShowDropdown)(false);}};_f._closure={dropdownAnimatedHeight:dropdownAnimatedHeight,runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{dropdownAnimatedHeight,runOnJS,setShowDropdown}=jsThis._closure;{if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}}}";_f.__workletHash=8540692570337;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js (176:8)";return _f;}())};};_f._closure={withTiming:_reactNativeReanimated.withTiming,dropdownAnimatedHeight:dropdownAnimatedHeight,Easing:{ease:_reactNativeReanimated.Easing.ease},runOnJS:_reactNativeReanimated.runOnJS,setShowDropdown:setShowDropdown};_f.asString="function _f(){const{withTiming,dropdownAnimatedHeight,Easing,runOnJS,setShowDropdown}=jsThis._closure;{return{height:withTiming(dropdownAnimatedHeight.value,{duration:100,easing:Easing.ease},function(){if(dropdownAnimatedHeight.value===0){runOnJS(setShowDropdown)(false);}})};}}";_f.__workletHash=4835541372615;_f.__location="/Users/runner/work/neeto-ui-rn/neeto-ui-rn/src/components/Select.js (168:42)";return _f;}(),[]);var toggleAnimation=function toggleAnimation(){dropdownAnimatedHeight.value=dropdownAnimatedHeight.value===0?dropdownHeight:0;};var handleOpenDropdown=function handleOpenDropdown(){_reactNative.Keyboard.dismiss();setSearchQuery("");if(!showDropdown){setShowDropdown(true);}if(showDropdown){toggleAnimation();}};var handleItemSelection=function handleItemSelection(item,index){toggleAnimation();onSelect(item,index);};(0,_react.useEffect)(function(){if(showDropdown){dropdownAnimatedHeight.value=dropdownHeight;}},[showDropdown,dropdownHeight]);return _react.default.createElement(_.Container,(0,_extends2.default)({},containerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:214,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:215,columnNumber:7}}),label),_react.default.createElement(_reactNative.TouchableWithoutFeedback,{disabled:isLoading,onPress:handleOpenDropdown,__self:_this,__source:{fileName:_jsxFileName,lineNumber:224,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:228,columnNumber:9}}),_react.default.createElement(_.Typography,{fontFamily:"inter400",fontSize:"s",color:"font.grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:238,columnNumber:11}},selectedOptionLabel||placeholder),isLoading?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:242,columnNumber:13}}):_react.default.createElement(_reactNativeRemixIcon.default,{name:"arrow-"+(showDropdown?"up":"down")+"-s-line",size:"20",color:"grey",__self:_this,__source:{fileName:_jsxFileName,lineNumber:247,columnNumber:13}}))),showDropdown&&_react.default.createElement(_.Container,{overflow:"hidden",__self:_this,__source:{fileName:_jsxFileName,lineNumber:256,columnNumber:9}},_react.default.createElement(_reactNativeReanimated.default.View,{style:animatedStyles,__self:_this,__source:{fileName:_jsxFileName,lineNumber:257,columnNumber:11}},_react.default.createElement(_.Card,(0,_extends2.default)({bg:"background.white",borderWidth:1,borderColor:"border.grey400",maxHeight:dropdownHeight},dropdownContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:258,columnNumber:13}}),isSearchable&&_react.default.createElement(_.Container,(0,_extends2.default)({p:1},searchInputContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:266,columnNumber:17}}),_react.default.createElement(_.Input,(0,_extends2.default)({placeholder:"Search",onChangeText:setSearchQuery,fontSize:"s",containerStyles:{height:searchInputHeight,justifyContent:"center"}},searchInputStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:267,columnNumber:19}}))),isOptionsEmpty&&_react.default.createElement(_.Container,(0,_extends2.default)({height:emptyOptionsPlaceholderHeight,justifyContent:"center",alignItems:"center"},emptyOptionsContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:281,columnNumber:17}}),_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},emptyOptionsLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:287,columnNumber:19}}),emptyOptionsPlaceholder||"No Options")),isSearchedOptionsEmpty&&showCreateOption&&_react.default.createElement(_.Touchable,(0,_extends2.default)({height:emptySearchedOptionsHeight,justifyContent:"center",alignItems:"center",onPress:function onPress(){return onPressCreateOption(searchQuery);}},createSearchedOptionContainerStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:298,columnNumber:17}}),showCreateOptionLoader?_react.default.createElement(_reactNative.ActivityIndicator,{size:"small",color:theme.colors.background.base,__self:_this,__source:{fileName:_jsxFileName,lineNumber:306,columnNumber:21}}):_react.default.createElement(_.Typography,(0,_extends2.default)({fontFamily:"inter400",fontSize:"s",color:"font.grey"},createSearchedOptionLabelStyle,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:311,columnNumber:21}}),createOptionLabel||"Create "+searchQuery+" option")),_react.default.createElement(_.Container,{height:0,__self:_this,__source:{fileName:_jsxFileName,lineNumber:323,columnNumber:15}},_react.default.createElement(_.Input,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:324,columnNumber:17}})),_react.default.createElement(_reactNativeGestureHandler.ScrollView,{__self:_this,__source:{fileName:_jsxFileName,lineNumber:326,columnNumber:15}},filteredOptions.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,itemLabelStyle:itemLabelStyle,selectedItemLabelStyle:selectedItemLabelStyle,__self:_this,__source:{fileName:_jsxFileName,lineNumber:333,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,emptyOptionsPlaceholder:_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,showCreateOption:_propTypes.default.bool,showCreateOptionLoader:_propTypes.default.bool,createOptionLabel:_propTypes.default.string,onPressCreateOption:_propTypes.default.func,labelStyle:_propTypes.default.object,containerStyle:_propTypes.default.object,inputContainerStyle:_propTypes.default.object,dropdownContainerStyle:_propTypes.default.object,itemContainerStyle:_propTypes.default.object,itemLabelStyle:_propTypes.default.object,selectedItemContainerStyle:_propTypes.default.object,selectedItemLabelStyle:_propTypes.default.object,searchInputContainerStyle:_propTypes.default.object,searchInputStyle:_propTypes.default.object,emptyOptionsContainerStyle:_propTypes.default.object,emptyOptionsLabelStyle:_propTypes.default.object,createSearchedOptionContainerStyle:_propTypes.default.object,createSearchedOptionLabelStyle:_propTypes.default.object};Select.defaultProps={label:null,placeholder:"Select Option",emptyOptionsPlaceholder:null,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,showCreateOption:false,showCreateOptionLoader:false,createOptionLabel:null,onPressCreateOption:function onPressCreateOption(){}};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigbinary/neetoui-rn",
3
- "version": "0.0.118",
3
+ "version": "0.0.121",
4
4
  "main": "lib/index.js",
5
5
  "author": "BigBinary",
6
6
  "license": "MIT",
@@ -1,4 +1,4 @@
1
- import React, { useState, useContext } from "react";
1
+ import React, { useState, useContext, useEffect } from "react";
2
2
  import Icon from "react-native-remix-icon";
3
3
  import PropTypes from "prop-types";
4
4
  import Animated, {
@@ -6,6 +6,7 @@ import Animated, {
6
6
  useAnimatedStyle,
7
7
  withTiming,
8
8
  Easing,
9
+ runOnJS,
9
10
  } from "react-native-reanimated";
10
11
  import {
11
12
  ActivityIndicator,
@@ -21,7 +22,7 @@ const MultiSelectItem = ({
21
22
  label,
22
23
  onUnselect,
23
24
  multiSelectedItemContainerStyle,
24
- multiSelectedItemTextStyle,
25
+ multiSelectedItemLabelStyle,
25
26
  }) => (
26
27
  <Container
27
28
  borderWidth={1}
@@ -40,7 +41,7 @@ const MultiSelectItem = ({
40
41
  fontSize="s"
41
42
  mr={2}
42
43
  maxWidth="90%"
43
- {...multiSelectedItemTextStyle}
44
+ {...multiSelectedItemLabelStyle}
44
45
  >
45
46
  {label}
46
47
  </Typography>
@@ -54,7 +55,7 @@ MultiSelectItem.propTypes = {
54
55
  label: PropTypes.string,
55
56
  onUnselect: PropTypes.func,
56
57
  multiSelectedItemContainerStyle: PropTypes.object,
57
- multiSelectedItemTextStyle: PropTypes.object,
58
+ multiSelectedItemLabelStyle: PropTypes.object,
58
59
  };
59
60
 
60
61
  const DropdownItem = ({
@@ -62,7 +63,7 @@ const DropdownItem = ({
62
63
  onPress,
63
64
  defaultDropdownItemHeight,
64
65
  itemContainerStyle,
65
- itemTextStyle,
66
+ itemLabelStyle,
66
67
  }) => {
67
68
  return (
68
69
  <Touchable bg="background.white" onPress={onPress}>
@@ -75,7 +76,7 @@ const DropdownItem = ({
75
76
  fontFamily="inter400"
76
77
  fontSize="s"
77
78
  color="font.grey"
78
- {...itemTextStyle}
79
+ {...itemLabelStyle}
79
80
  >
80
81
  {label}
81
82
  </Typography>
@@ -89,7 +90,7 @@ DropdownItem.propTypes = {
89
90
  onPress: PropTypes.func,
90
91
  defaultDropdownItemHeight: PropTypes.number,
91
92
  itemContainerStyle: PropTypes.object,
92
- itemTextStyle: PropTypes.object,
93
+ itemLabelStyle: PropTypes.object,
93
94
  };
94
95
 
95
96
  /**
@@ -139,6 +140,7 @@ export const MultiSelect = ({
139
140
  label,
140
141
  value,
141
142
  placeholder,
143
+ emptyOptionsPlaceholder,
142
144
  labelExtractor,
143
145
  valueExtractor,
144
146
  onSelect,
@@ -146,14 +148,24 @@ export const MultiSelect = ({
146
148
  deletedValue,
147
149
  isLoading,
148
150
  isSearchable,
151
+ showCreateOption,
152
+ showCreateOptionLoader,
153
+ createOptionLabel,
154
+ onPressCreateOption,
149
155
  labelStyle,
150
156
  containerStyle,
151
157
  inputContainerStyle,
152
158
  dropdownContainerStyle,
153
159
  itemContainerStyle,
154
- itemTextStyle,
160
+ itemLabelStyle,
155
161
  multiSelectedItemContainerStyle,
156
- multiSelectedItemTextStyle,
162
+ multiSelectedItemLabelStyle,
163
+ searchInputContainerStyle,
164
+ searchInputStyle,
165
+ emptyOptionsContainerStyle,
166
+ emptyOptionsLabelStyle,
167
+ createSearchedOptionContainerStyle,
168
+ createSearchedOptionLabelStyle,
157
169
  ...rest
158
170
  }) => {
159
171
  const theme = useContext(ThemeContext);
@@ -161,33 +173,67 @@ export const MultiSelect = ({
161
173
  const [searchQuery, setSearchQuery] = useState("");
162
174
  const dropdownAnimatedHeight = useSharedValue(0);
163
175
 
176
+ const formatStr = str => str?.toLowerCase()?.trim();
177
+ const filteredOptions = options
178
+ .filter((item, index) => {
179
+ const optionValue = valueExtractor(item, index);
180
+ const isItemAlreadySelected = Boolean(
181
+ value?.find(
182
+ selectedItem => valueExtractor(selectedItem) === optionValue
183
+ )
184
+ );
185
+ return !isItemAlreadySelected;
186
+ })
187
+ .filter((item, index) => {
188
+ const optionLabel = labelExtractor(item, index);
189
+ if (searchQuery.length === 0) return true;
190
+ return formatStr(optionLabel).includes(formatStr(searchQuery));
191
+ });
192
+
193
+ const isOptionsEmpty = !options || options?.length === 0;
194
+ const isSearchedOptionsEmpty =
195
+ searchQuery.length > 0 && filteredOptions.length === 0;
196
+ const emptyOptionsPlaceholderHeight = 40;
197
+ const emptySearchedOptionsHeight = 40;
198
+ const searchInputHeight = 35;
164
199
  const multipleOptionsSelected = value?.length > 0;
165
200
  const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
166
201
  const dropdownHeight =
167
202
  dropdownContainerStyle?.height ||
168
203
  dropdownContainerStyle?.maxHeight ||
169
- defaultDropdownItemHeight * 6;
170
- const formatStr = str => str?.toLowerCase()?.trim();
204
+ defaultDropdownItemHeight * Math.min(filteredOptions?.length, 6) +
205
+ (isSearchable ? searchInputHeight + 10 : 0) +
206
+ (isOptionsEmpty ? emptyOptionsPlaceholderHeight : 0) +
207
+ (isSearchedOptionsEmpty && showCreateOption
208
+ ? emptySearchedOptionsHeight
209
+ : 0);
171
210
 
172
211
  const animatedStyles = useAnimatedStyle(() => {
173
212
  return {
174
- height: withTiming(dropdownAnimatedHeight.value, {
175
- duration: 100,
176
- easing: Easing.ease,
177
- }),
213
+ height: withTiming(
214
+ dropdownAnimatedHeight.value,
215
+ {
216
+ duration: 100,
217
+ easing: Easing.ease,
218
+ },
219
+ () => {
220
+ if (dropdownAnimatedHeight.value === 0) {
221
+ runOnJS(setShowDropdown)(false);
222
+ }
223
+ }
224
+ ),
178
225
  };
179
- });
180
-
181
- const toggleAnimation = () => {
182
- dropdownAnimatedHeight.value =
183
- dropdownAnimatedHeight.value === 0 ? dropdownHeight : 0;
184
- };
226
+ }, []);
185
227
 
186
228
  const handleOpenDropdown = () => {
187
229
  Keyboard.dismiss();
188
230
  setSearchQuery("");
189
- setShowDropdown(!showDropdown);
190
- toggleAnimation();
231
+ if (!showDropdown) {
232
+ setShowDropdown(true);
233
+ }
234
+ if (showDropdown) {
235
+ dropdownAnimatedHeight.value = 0;
236
+ }
191
237
  };
192
238
 
193
239
  const handleUnselection = item => {
@@ -203,6 +249,13 @@ export const MultiSelect = ({
203
249
  selectedValue(item);
204
250
  };
205
251
 
252
+ useEffect(() => {
253
+ if (showDropdown) {
254
+ dropdownAnimatedHeight.value = dropdownHeight;
255
+ }
256
+ // eslint-disable-next-line react-hooks/exhaustive-deps
257
+ }, [showDropdown, dropdownHeight]);
258
+
206
259
  return (
207
260
  <Container {...containerStyle}>
208
261
  <Typography
@@ -253,7 +306,7 @@ export const MultiSelect = ({
253
306
  multiSelectedItemContainerStyle={
254
307
  multiSelectedItemContainerStyle
255
308
  }
256
- multiSelectedItemTextStyle={multiSelectedItemTextStyle}
309
+ multiSelectedItemLabelStyle={multiSelectedItemLabelStyle}
257
310
  />
258
311
  );
259
312
  })}
@@ -274,44 +327,80 @@ export const MultiSelect = ({
274
327
  )}
275
328
  </Container>
276
329
  </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"
292
- />
330
+ {showDropdown && (
331
+ <Container overflow="hidden">
332
+ <Animated.View style={animatedStyles}>
333
+ <Card
334
+ bg="background.white"
335
+ borderWidth={1}
336
+ borderColor="border.grey400"
337
+ maxHeight={dropdownHeight}
338
+ {...dropdownContainerStyle}
339
+ >
340
+ {isSearchable && (
341
+ <Container p={1} {...searchInputContainerStyle}>
342
+ <Input
343
+ placeholder="Search"
344
+ onChangeText={setSearchQuery}
345
+ fontSize="s"
346
+ // eslint-disable-next-line react-native/no-inline-styles
347
+ containerStyles={{
348
+ height: searchInputHeight,
349
+ justifyContent: "center",
350
+ }}
351
+ {...searchInputStyle}
352
+ />
353
+ </Container>
354
+ )}
355
+ {isOptionsEmpty && (
356
+ <Container
357
+ height={emptyOptionsPlaceholderHeight}
358
+ justifyContent="center"
359
+ alignItems="center"
360
+ {...emptyOptionsContainerStyle}
361
+ >
362
+ <Typography
363
+ fontFamily="inter400"
364
+ fontSize="s"
365
+ color="font.grey"
366
+ {...emptyOptionsLabelStyle}
367
+ >
368
+ {emptyOptionsPlaceholder || "No Options"}
369
+ </Typography>
370
+ </Container>
371
+ )}
372
+
373
+ {isSearchedOptionsEmpty && showCreateOption && (
374
+ <Touchable
375
+ height={emptySearchedOptionsHeight}
376
+ justifyContent="center"
377
+ alignItems="center"
378
+ onPress={() => onPressCreateOption(searchQuery)}
379
+ {...createSearchedOptionContainerStyle}
380
+ >
381
+ {showCreateOptionLoader ? (
382
+ <ActivityIndicator
383
+ size="small"
384
+ color={theme.colors.background.base}
385
+ />
386
+ ) : (
387
+ <Typography
388
+ fontFamily="inter400"
389
+ fontSize="s"
390
+ color="font.grey"
391
+ {...createSearchedOptionLabelStyle}
392
+ >
393
+ {createOptionLabel || `Create ${searchQuery} option`}
394
+ </Typography>
395
+ )}
396
+ </Touchable>
397
+ )}
398
+ {/* Animation not working without this hidden input */}
399
+ <Container height={0}>
400
+ <Input />
293
401
  </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) => {
402
+ <ScrollView>
403
+ {filteredOptions.map((item, index) => {
315
404
  const optionLabel = labelExtractor(item, index);
316
405
  return (
317
406
  <DropdownItem
@@ -320,14 +409,15 @@ export const MultiSelect = ({
320
409
  onPress={() => handleSelection(item)}
321
410
  itemContainerStyle={itemContainerStyle}
322
411
  defaultDropdownItemHeight={defaultDropdownItemHeight}
323
- itemTextStyle={itemTextStyle}
412
+ itemLabelStyle={itemLabelStyle}
324
413
  />
325
414
  );
326
415
  })}
327
- </ScrollView>
328
- </Card>
329
- </Animated.View>
330
- </Container>
416
+ </ScrollView>
417
+ </Card>
418
+ </Animated.View>
419
+ </Container>
420
+ )}
331
421
  </Container>
332
422
  );
333
423
  };
@@ -350,6 +440,10 @@ MultiSelect.propTypes = {
350
440
  * The text to be displayed if no option is selected.
351
441
  */
352
442
  placeholder: PropTypes.string,
443
+ /**
444
+ * The text to be displayed if no options are provided.
445
+ */
446
+ emptyOptionsPlaceholder: PropTypes.string,
353
447
  /**
354
448
  * Use custom key as label.
355
449
  */
@@ -382,6 +476,22 @@ MultiSelect.propTypes = {
382
476
  * Toggle Search bar within the options dropdown to search through the options.
383
477
  */
384
478
  isSearchable: PropTypes.bool,
479
+ /**
480
+ * Show option to create the searched label if not present in the options list
481
+ */
482
+ showCreateOption: PropTypes.bool,
483
+ /**
484
+ * Show loader while creating a searched option not present in the options list
485
+ */
486
+ showCreateOptionLoader: PropTypes.bool,
487
+ /**
488
+ * Custom label for creating searched option not present in the options list
489
+ */
490
+ createOptionLabel: PropTypes.string,
491
+ /**
492
+ * Callback when create searched option is pressed
493
+ */
494
+ onPressCreateOption: PropTypes.func,
385
495
  /**
386
496
  * To customise floating label styles.
387
497
  */
@@ -405,7 +515,7 @@ MultiSelect.propTypes = {
405
515
  /**
406
516
  * To customise dropdown item text styles.
407
517
  */
408
- itemTextStyle: PropTypes.object,
518
+ itemLabelStyle: PropTypes.object,
409
519
  /**
410
520
  * To customise item container styles for multi selected items.
411
521
  */
@@ -413,12 +523,37 @@ MultiSelect.propTypes = {
413
523
  /**
414
524
  * To customise item text styles for multi selected item.
415
525
  */
416
- multiSelectedItemTextStyle: PropTypes.object,
526
+ multiSelectedItemLabelStyle: PropTypes.object,
527
+ /**
528
+ * To customise search input containerr style.
529
+ */
530
+ searchInputContainerStyle: PropTypes.object,
531
+ /**
532
+ * To customise search input style.
533
+ */
534
+ searchInputStyle: PropTypes.object,
535
+ /**
536
+ * To customise empty options placeholder container style.
537
+ */
538
+ emptyOptionsContainerStyle: PropTypes.object,
539
+ /**
540
+ * To customise empty options placeholder text style.
541
+ */
542
+ emptyOptionsLabelStyle: PropTypes.object,
543
+ /**
544
+ * To customise empty options placeholder container style.
545
+ */
546
+ createSearchedOptionContainerStyle: PropTypes.object,
547
+ /**
548
+ * To customise empty options placeholder text style.
549
+ */
550
+ createSearchedOptionLabelStyle: PropTypes.object,
417
551
  };
418
552
 
419
553
  MultiSelect.defaultProps = {
420
554
  label: null,
421
555
  placeholder: "Select Option",
556
+ emptyOptionsPlaceholder: null,
422
557
  labelExtractor: option => option?.label,
423
558
  valueExtractor: option => option?.value,
424
559
  value: null,
@@ -427,4 +562,8 @@ MultiSelect.defaultProps = {
427
562
  deletedValue: () => {},
428
563
  isLoading: false,
429
564
  isSearchable: false,
565
+ showCreateOption: false,
566
+ showCreateOptionLoader: false,
567
+ createOptionLabel: null,
568
+ onPressCreateOption: () => {},
430
569
  };
@@ -1,4 +1,4 @@
1
- import React, { useState, useContext } from "react";
1
+ import React, { useState, useContext, useEffect } from "react";
2
2
  import Icon from "react-native-remix-icon";
3
3
  import PropTypes from "prop-types";
4
4
  import Animated, {
@@ -6,6 +6,7 @@ import Animated, {
6
6
  useAnimatedStyle,
7
7
  withTiming,
8
8
  Easing,
9
+ runOnJS,
9
10
  } from "react-native-reanimated";
10
11
  import {
11
12
  ActivityIndicator,
@@ -15,7 +16,7 @@ import {
15
16
  import { ThemeContext } from "styled-components/native";
16
17
  import { ScrollView } from "react-native-gesture-handler";
17
18
 
18
- import { Card, Container, Input, Typography } from "@components";
19
+ import { Card, Container, Input, Touchable, Typography } from "@components";
19
20
 
20
21
  const DropdownItem = ({
21
22
  label,
@@ -24,8 +25,8 @@ const DropdownItem = ({
24
25
  onPress,
25
26
  itemContainerStyle,
26
27
  selectedItemContainerStyle,
27
- itemTextStyle,
28
- selectedItemTextStyle,
28
+ itemLabelStyle,
29
+ selectedItemLabelStyle,
29
30
  }) => (
30
31
  <TouchableWithoutFeedback onPress={onPress}>
31
32
  <Container
@@ -39,8 +40,8 @@ const DropdownItem = ({
39
40
  fontFamily="inter400"
40
41
  fontSize="s"
41
42
  color={isSelectedItem ? "font.white" : "font.grey"}
42
- {...itemTextStyle}
43
- {...(isSelectedItem && selectedItemTextStyle)}
43
+ {...itemLabelStyle}
44
+ {...(isSelectedItem && selectedItemLabelStyle)}
44
45
  >
45
46
  {label}
46
47
  </Typography>
@@ -55,8 +56,8 @@ DropdownItem.propTypes = {
55
56
  onPress: PropTypes.func,
56
57
  itemContainerStyle: PropTypes.object,
57
58
  selectedItemContainerStyle: PropTypes.object,
58
- itemTextStyle: PropTypes.object,
59
- selectedItemTextStyle: PropTypes.object,
59
+ itemLabelStyle: PropTypes.object,
60
+ selectedItemLabelStyle: PropTypes.object,
60
61
  };
61
62
 
62
63
  /**
@@ -107,19 +108,30 @@ export const Select = ({
107
108
  label,
108
109
  value,
109
110
  placeholder,
111
+ emptyOptionsPlaceholder,
110
112
  labelExtractor,
111
113
  valueExtractor,
112
114
  onSelect,
113
115
  isLoading,
114
116
  isSearchable,
117
+ showCreateOption,
118
+ showCreateOptionLoader,
119
+ createOptionLabel,
120
+ onPressCreateOption,
115
121
  labelStyle,
116
122
  containerStyle,
117
123
  inputContainerStyle,
118
124
  dropdownContainerStyle,
119
125
  itemContainerStyle,
120
- itemTextStyle,
126
+ itemLabelStyle,
121
127
  selectedItemContainerStyle,
122
- selectedItemTextStyle,
128
+ selectedItemLabelStyle,
129
+ searchInputContainerStyle,
130
+ searchInputStyle,
131
+ emptyOptionsContainerStyle,
132
+ emptyOptionsLabelStyle,
133
+ createSearchedOptionContainerStyle,
134
+ createSearchedOptionLabelStyle,
123
135
  ...rest
124
136
  }) => {
125
137
  const theme = useContext(ThemeContext);
@@ -127,23 +139,48 @@ export const Select = ({
127
139
  const [searchQuery, setSearchQuery] = useState("");
128
140
  const dropdownAnimatedHeight = useSharedValue(0);
129
141
 
142
+ const formatStr = str => str?.toLowerCase()?.trim();
143
+ const filteredOptions = options.filter((item, index) => {
144
+ const label = labelExtractor(item, index);
145
+ if (searchQuery?.length === 0) return true;
146
+ return formatStr(label).includes(formatStr(searchQuery));
147
+ });
148
+
149
+ const isOptionsEmpty = !options || options?.length === 0;
150
+ const isSearchedOptionsEmpty =
151
+ searchQuery.length > 0 && filteredOptions.length === 0;
152
+ const emptyOptionsPlaceholderHeight = 40;
153
+ const emptySearchedOptionsHeight = 40;
154
+ const searchInputHeight = 35;
130
155
  const defaultDropdownItemHeight = itemContainerStyle?.height || 32;
131
156
  const dropdownHeight =
132
157
  dropdownContainerStyle?.height ||
133
158
  dropdownContainerStyle?.maxHeight ||
134
- defaultDropdownItemHeight * 6;
159
+ defaultDropdownItemHeight * Math.min(filteredOptions?.length, 6) +
160
+ (isSearchable ? searchInputHeight + 10 : 0) +
161
+ (isOptionsEmpty ? emptyOptionsPlaceholderHeight : 0) +
162
+ (isSearchedOptionsEmpty && showCreateOption
163
+ ? emptySearchedOptionsHeight
164
+ : 0);
135
165
  const selectedOptionLabel = labelExtractor(value || {});
136
166
  const selectedOptionValue = valueExtractor(value || {});
137
- const formatStr = str => str?.toLowerCase()?.trim();
138
167
 
139
168
  const animatedStyles = useAnimatedStyle(() => {
140
169
  return {
141
- height: withTiming(dropdownAnimatedHeight.value, {
142
- duration: 100,
143
- easing: Easing.ease,
144
- }),
170
+ height: withTiming(
171
+ dropdownAnimatedHeight.value,
172
+ {
173
+ duration: 100,
174
+ easing: Easing.ease,
175
+ },
176
+ () => {
177
+ if (dropdownAnimatedHeight.value === 0) {
178
+ runOnJS(setShowDropdown)(false);
179
+ }
180
+ }
181
+ ),
145
182
  };
146
- });
183
+ }, []);
147
184
 
148
185
  const toggleAnimation = () => {
149
186
  dropdownAnimatedHeight.value =
@@ -153,16 +190,26 @@ export const Select = ({
153
190
  const handleOpenDropdown = () => {
154
191
  Keyboard.dismiss();
155
192
  setSearchQuery("");
156
- setShowDropdown(!showDropdown);
157
- toggleAnimation();
193
+ if (!showDropdown) {
194
+ setShowDropdown(true);
195
+ }
196
+ if (showDropdown) {
197
+ toggleAnimation();
198
+ }
158
199
  };
159
200
 
160
201
  const handleItemSelection = (item, index) => {
161
- setShowDropdown(false);
162
202
  toggleAnimation();
163
203
  onSelect(item, index);
164
204
  };
165
205
 
206
+ useEffect(() => {
207
+ if (showDropdown) {
208
+ dropdownAnimatedHeight.value = dropdownHeight;
209
+ }
210
+ // eslint-disable-next-line react-hooks/exhaustive-deps
211
+ }, [showDropdown, dropdownHeight]);
212
+
166
213
  return (
167
214
  <Container {...containerStyle}>
168
215
  <Typography
@@ -205,32 +252,79 @@ export const Select = ({
205
252
  )}
206
253
  </Container>
207
254
  </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"
223
- />
255
+ {showDropdown && (
256
+ <Container overflow="hidden">
257
+ <Animated.View style={animatedStyles}>
258
+ <Card
259
+ bg="background.white"
260
+ borderWidth={1}
261
+ borderColor="border.grey400"
262
+ maxHeight={dropdownHeight}
263
+ {...dropdownContainerStyle}
264
+ >
265
+ {isSearchable && (
266
+ <Container p={1} {...searchInputContainerStyle}>
267
+ <Input
268
+ placeholder="Search"
269
+ onChangeText={setSearchQuery}
270
+ fontSize="s"
271
+ // eslint-disable-next-line react-native/no-inline-styles
272
+ containerStyles={{
273
+ height: searchInputHeight,
274
+ justifyContent: "center",
275
+ }}
276
+ {...searchInputStyle}
277
+ />
278
+ </Container>
279
+ )}
280
+ {isOptionsEmpty && (
281
+ <Container
282
+ height={emptyOptionsPlaceholderHeight}
283
+ justifyContent="center"
284
+ alignItems="center"
285
+ {...emptyOptionsContainerStyle}
286
+ >
287
+ <Typography
288
+ fontFamily="inter400"
289
+ fontSize="s"
290
+ color="font.grey"
291
+ {...emptyOptionsLabelStyle}
292
+ >
293
+ {emptyOptionsPlaceholder || "No Options"}
294
+ </Typography>
295
+ </Container>
296
+ )}
297
+ {isSearchedOptionsEmpty && showCreateOption && (
298
+ <Touchable
299
+ height={emptySearchedOptionsHeight}
300
+ justifyContent="center"
301
+ alignItems="center"
302
+ onPress={() => onPressCreateOption(searchQuery)}
303
+ {...createSearchedOptionContainerStyle}
304
+ >
305
+ {showCreateOptionLoader ? (
306
+ <ActivityIndicator
307
+ size="small"
308
+ color={theme.colors.background.base}
309
+ />
310
+ ) : (
311
+ <Typography
312
+ fontFamily="inter400"
313
+ fontSize="s"
314
+ color="font.grey"
315
+ {...createSearchedOptionLabelStyle}
316
+ >
317
+ {createOptionLabel || `Create ${searchQuery} option`}
318
+ </Typography>
319
+ )}
320
+ </Touchable>
321
+ )}
322
+ {/* Animation not working without this hidden input */}
323
+ <Container height={0}>
324
+ <Input />
224
325
  </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) => {
326
+ <ScrollView>
327
+ {filteredOptions.map((item, index) => {
234
328
  const optionLabel = labelExtractor(item, index);
235
329
  const optionValue = valueExtractor(item, index);
236
330
  const isSelectedItem =
@@ -244,15 +338,16 @@ export const Select = ({
244
338
  onPress={() => handleItemSelection(item, index)}
245
339
  itemContainerStyle={itemContainerStyle}
246
340
  selectedItemContainerStyle={selectedItemContainerStyle}
247
- itemTextStyle={itemTextStyle}
248
- selectedItemTextStyle={selectedItemTextStyle}
341
+ itemLabelStyle={itemLabelStyle}
342
+ selectedItemLabelStyle={selectedItemLabelStyle}
249
343
  />
250
344
  );
251
345
  })}
252
- </ScrollView>
253
- </Card>
254
- </Animated.View>
255
- </Container>
346
+ </ScrollView>
347
+ </Card>
348
+ </Animated.View>
349
+ </Container>
350
+ )}
256
351
  </Container>
257
352
  );
258
353
  };
@@ -275,6 +370,10 @@ Select.propTypes = {
275
370
  * The text to be displayed if no option is selected.
276
371
  */
277
372
  placeholder: PropTypes.string,
373
+ /**
374
+ * The text to be displayed if no options are provided.
375
+ */
376
+ emptyOptionsPlaceholder: PropTypes.string,
278
377
  /**
279
378
  * Use custom key as label.
280
379
  */
@@ -299,6 +398,22 @@ Select.propTypes = {
299
398
  * Toggle Search bar within the options dropdown to search through the options.
300
399
  */
301
400
  isSearchable: PropTypes.bool,
401
+ /**
402
+ * Show option to create the searched label if not present in the options list
403
+ */
404
+ showCreateOption: PropTypes.bool,
405
+ /**
406
+ * Show loader while creating a searched option not present in the options list
407
+ */
408
+ showCreateOptionLoader: PropTypes.bool,
409
+ /**
410
+ * Custom label for creating searched option not present in the options list
411
+ */
412
+ createOptionLabel: PropTypes.string,
413
+ /**
414
+ * Callback when create searched option is pressed
415
+ */
416
+ onPressCreateOption: PropTypes.func,
302
417
  /**
303
418
  * To customise floating label styles.
304
419
  */
@@ -322,7 +437,7 @@ Select.propTypes = {
322
437
  /**
323
438
  * To customise dropdown item text styles.
324
439
  */
325
- itemTextStyle: PropTypes.object,
440
+ itemLabelStyle: PropTypes.object,
326
441
  /**
327
442
  * To customise dropdown item container styles for selected item.
328
443
  */
@@ -330,16 +445,45 @@ Select.propTypes = {
330
445
  /**
331
446
  * To customise dropdown item text styles for selected item.
332
447
  */
333
- selectedItemTextStyle: PropTypes.object,
448
+ selectedItemLabelStyle: PropTypes.object,
449
+ /**
450
+ * To customise search input containerr style.
451
+ */
452
+ searchInputContainerStyle: PropTypes.object,
453
+ /**
454
+ * To customise search input style.
455
+ */
456
+ searchInputStyle: PropTypes.object,
457
+ /**
458
+ * To customise empty options placeholder container style.
459
+ */
460
+ emptyOptionsContainerStyle: PropTypes.object,
461
+ /**
462
+ * To customise empty options placeholder text style.
463
+ */
464
+ emptyOptionsLabelStyle: PropTypes.object,
465
+ /**
466
+ * To customise empty options placeholder container style.
467
+ */
468
+ createSearchedOptionContainerStyle: PropTypes.object,
469
+ /**
470
+ * To customise empty options placeholder text style.
471
+ */
472
+ createSearchedOptionLabelStyle: PropTypes.object,
334
473
  };
335
474
 
336
475
  Select.defaultProps = {
337
476
  label: null,
338
477
  placeholder: "Select Option",
478
+ emptyOptionsPlaceholder: null,
339
479
  labelExtractor: option => option?.label,
340
480
  valueExtractor: option => option?.value,
341
481
  value: null,
342
482
  onSelect: () => {},
343
483
  isLoading: false,
344
484
  isSearchable: false,
485
+ showCreateOption: false,
486
+ showCreateOptionLoader: false,
487
+ createOptionLabel: null,
488
+ onPressCreateOption: () => {},
345
489
  };