index.tsx 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. import {
  2. useImperativeHandle,
  3. forwardRef,
  4. useEffect,
  5. useState,
  6. type Ref,
  7. useRef
  8. } from "react";
  9. import {
  10. TouchableOpacity,
  11. View
  12. } from "react-native";
  13. import {
  14. type SelectBoxComponent,
  15. type ISelectBoxRef,
  16. type SelectBoxType,
  17. type SelectedItem
  18. } from "./type";
  19. import type ISelectBoxProps from "./type";
  20. import stylesheet, {
  21. getSelectBoxType,
  22. useStyles
  23. } from "./stylesheet";
  24. import {
  25. NCoreUIKitLocalize,
  26. NCoreUIKitTheme,
  27. NCoreUIKitToast
  28. } from "../../core/hooks";
  29. import {
  30. type NCoreUIKitIcon
  31. } from "../../types";
  32. import type {
  33. IBottomSheetRef
  34. } from "../bottomSheet/type";
  35. import type ITextProps from "../text/type";
  36. import {
  37. BadgeQuestionMarkIcon,
  38. BadgeSuccessIcon,
  39. BadgeDangerIcon,
  40. BadgeAlertIcon,
  41. BadgeInfoIcon,
  42. CleanIcon
  43. } from "../../assets/svg";
  44. import {
  45. uuid
  46. } from "../../utils";
  47. import SelectSheet from "../selectSheet";
  48. import Text from "../text";
  49. const SelectBoxTypeIcon: Record<Exclude<SelectBoxType, "default">, NCoreUIKitIcon> = {
  50. "question": BadgeQuestionMarkIcon,
  51. "success": BadgeSuccessIcon,
  52. "warning": BadgeAlertIcon,
  53. "danger": BadgeDangerIcon,
  54. "info": BadgeInfoIcon
  55. };
  56. function SelectBox<T>({
  57. renderLoadingIcon : LoadingIconComponentProp,
  58. rightIcon: RightIconComponentProp,
  59. hintTextIcon: HintTextIconProp,
  60. isShowSelectSheetTools = true,
  61. spreadBehaviour = "baseline",
  62. isShowHintTextIcon = false,
  63. customSelectSheetLocalize,
  64. isWorkWithRealtime = true,
  65. isMultipleSelect = false,
  66. icon: IconComponentProp,
  67. hintTextContainerStyle,
  68. removeSelectValidation,
  69. customSelectSheetTheme,
  70. isCleanEnabled = false,
  71. contentContainerStyle,
  72. subTitle = "Optional",
  73. initialSelectedItems,
  74. isSearchable = false,
  75. onFocus: onFocusProp,
  76. isRequired = false,
  77. isDisabled = false,
  78. onBlur: onBlurProp,
  79. moreLoadThreshold,
  80. hintTextIconStyle,
  81. data: initialData,
  82. selectSheetProps,
  83. variant = "text",
  84. type = "default",
  85. rightIconOnPress,
  86. renderOptionIcon,
  87. selectValidation,
  88. customLocalize,
  89. rightIconStyle,
  90. isShowSubTitle,
  91. cleanIconStyle,
  92. titleExtractor,
  93. maxChoice = -1,
  94. keyExtractor,
  95. contentStyle,
  96. customTheme,
  97. placeholder,
  98. iconOnPress,
  99. onMoreLoad,
  100. isOptional,
  101. renderItem,
  102. customKey,
  103. minChoice,
  104. iconStyle,
  105. onChange,
  106. hintText,
  107. onSearch,
  108. style,
  109. title
  110. }: ISelectBoxProps<T>, ref: Ref<ISelectBoxRef<T>>) {
  111. const {
  112. inlineSpaces,
  113. typography,
  114. radiuses,
  115. borders,
  116. spaces,
  117. colors
  118. } = NCoreUIKitTheme.useContext(customTheme);
  119. const {
  120. localize
  121. } = NCoreUIKitLocalize.useContext(customLocalize);
  122. const bottomSheetRef = useRef<IBottomSheetRef>(null);
  123. const selectBoxKey = useRef(customKey ? customKey : uuid());
  124. const currentType = getSelectBoxType({
  125. type
  126. });
  127. const styleType = type === "default" ? "neutral" : type === "question" ? "neutral" : type === "danger" ? "error" : type;
  128. const [
  129. data,
  130. setData
  131. ] = useState<Array<T & SelectedItem | SelectedItem>>([]);
  132. const [
  133. searchedData,
  134. setSearchedData
  135. ] = useState<Array<T & SelectedItem | SelectedItem>>([]);
  136. const [
  137. isActive,
  138. setIsActive
  139. ] = useState(false);
  140. const [
  141. searchText,
  142. setSearchText
  143. ] = useState("");
  144. const [
  145. isLoading,
  146. setIsLoading
  147. ] = useState(false);
  148. const [
  149. isMoreLoading,
  150. setIsMoreLoading
  151. ] = useState(true);
  152. const [
  153. selectedItems,
  154. setSelectedItems
  155. ] = useState<Array<SelectedItem>>(initialSelectedItems ?? []);
  156. const [
  157. tempSelectedItems,
  158. setTempSelectedItems
  159. ] = useState<Array<SelectedItem>>(initialSelectedItems ?? []);
  160. const mainSelectedItems = isWorkWithRealtime ? selectedItems : tempSelectedItems;
  161. const {
  162. contentContainer: contentContainerDynamicStyle,
  163. titleContainer: titleContainerDynamicStyle,
  164. hintTextIcon: hintTextIconDynamicStyle,
  165. contentText: contentTextDynamicStyle,
  166. cleanButton: cleanButtonDynamicStyle,
  167. rightIcon: rightIconDynamicStyle,
  168. container: containerDynamicStyle,
  169. hintText: hintTextDynamicStyle,
  170. required: requiredDynamicStyle,
  171. subTitle: subTitleDynamicStyle,
  172. overlay: overlayDynamicStyle,
  173. content: contentDynamicStyle,
  174. title: titleDynamicStyle,
  175. icon: iconDynamicStyle
  176. } = useStyles({
  177. icon: IconComponentProp ? true : false,
  178. spreadBehaviour,
  179. inlineSpaces,
  180. isSearchable,
  181. currentType,
  182. isDisabled,
  183. isActive,
  184. radiuses,
  185. borders,
  186. spaces,
  187. colors,
  188. title,
  189. type
  190. });
  191. useImperativeHandle(
  192. ref,
  193. () => ({
  194. setIsMoreLoading: (e) => setIsMoreLoading(e),
  195. setIsLoading: (e) => setIsLoading(e),
  196. updateSelections,
  197. cleanSelections,
  198. updateData,
  199. selectAll,
  200. cleanAll,
  201. cancel,
  202. focus,
  203. blur,
  204. ok
  205. }),
  206. []
  207. );
  208. useEffect(() => {
  209. if(isActive) {
  210. if(onFocus) onFocus();
  211. } else {
  212. if(!isWorkWithRealtime) {
  213. setTempSelectedItems([]);
  214. }
  215. setSearchText("");
  216. setSearchedData([]);
  217. setIsMoreLoading(false);
  218. if(onBlur) onBlur();
  219. }
  220. }, [isActive]);
  221. useEffect(() => {
  222. if(isSearchable && searchText && searchText.length) {
  223. if(onSearch) {
  224. const _searchedData = prepareDatas(onSearch({
  225. selectedItems: mainSelectedItems,
  226. setIsMoreLoading,
  227. setIsLoading,
  228. searchText,
  229. data
  230. }) as Array<T & SelectedItem>, mainSelectedItems);
  231. setSearchedData(_searchedData);
  232. } else {
  233. const _searchedData = data.filter(dI => {
  234. return dI.__title.toLocaleLowerCase().includes(searchText.toLocaleLowerCase());
  235. }) as Array<T & SelectedItem>;
  236. setSearchedData(_searchedData);
  237. }
  238. } else if(searchedData && searchedData.length) {
  239. setSearchedData([]);
  240. }
  241. }, [
  242. data,
  243. searchText
  244. ]);
  245. useEffect(() => {
  246. const initData = prepareDatas(initialData as Array<T & SelectedItem>, initialSelectedItems);
  247. setData(initData);
  248. }, []);
  249. const titleProps: ITextProps = {
  250. color: currentType.titleColor,
  251. variant: "bodyLargeSize"
  252. };
  253. const iconProps: NCoreUIKit.IconCallbackProps = {
  254. size: Number(typography.labelLargeSize.fontSize) + 6,
  255. color: currentType.iconColor
  256. };
  257. if(isDisabled) {
  258. iconProps.color = "disabled";
  259. }
  260. const blur = () => {
  261. setIsActive(false);
  262. };
  263. const focus = () => {
  264. if(!isWorkWithRealtime) {
  265. setTempSelectedItems(selectedItems);
  266. }
  267. setIsActive(true);
  268. };
  269. const cancel = () => {
  270. if(!isWorkWithRealtime) {
  271. bottomSheetRef.current?.close(() => {
  272. blur();
  273. });
  274. }
  275. };
  276. const ok = () => {
  277. if(!isWorkWithRealtime) {
  278. setSelectedItems(tempSelectedItems);
  279. bottomSheetRef.current?.close(() => {
  280. blur();
  281. });
  282. }
  283. };
  284. const cleanSelections = () => {
  285. setSelectedItems([]);
  286. if(!isWorkWithRealtime) {
  287. setTempSelectedItems([]);
  288. }
  289. if(onChange) {
  290. onChange([], data, setIsMoreLoading);
  291. }
  292. };
  293. const updateData = (newData: Array<T>, newSelectedItems: Array<SelectedItem>) => {
  294. const _newData = newData.map((bIItem, bIIndex) => {
  295. return {
  296. ...bIItem,
  297. __title: titleExtractor(bIItem as T & SelectedItem, bIIndex),
  298. __key: keyExtractor(bIItem as T & SelectedItem, bIIndex)
  299. };
  300. });
  301. setData(_newData);
  302. const _newSelectedItems = JSON.parse(JSON.stringify(newSelectedItems ? newSelectedItems : mainSelectedItems)).map((sItem: SelectedItem) => {
  303. const originalDataIndex = _newData.findIndex(ssItem => ssItem.__key === sItem.__key);
  304. return {
  305. __title: _newData[originalDataIndex]?.__title,
  306. __key: _newData[originalDataIndex]?.__key
  307. };
  308. });
  309. if(isWorkWithRealtime) {
  310. setSelectedItems(_newSelectedItems);
  311. } else {
  312. setTempSelectedItems(_newSelectedItems);
  313. }
  314. };
  315. const updateSelections = (newSelectedItems: Array<SelectedItem>) => {
  316. const _newSelectedItems = JSON.parse(JSON.stringify(newSelectedItems)).map((sItem: SelectedItem) => {
  317. const originalDataIndex = data.findIndex(ssItem => ssItem.__key === sItem.__key);
  318. return {
  319. ...sItem,
  320. __title: data[originalDataIndex]?.__title,
  321. __key: data[originalDataIndex]?.__key
  322. };
  323. });
  324. if(isWorkWithRealtime) {
  325. setSelectedItems(_newSelectedItems);
  326. } else {
  327. setTempSelectedItems(_newSelectedItems);
  328. }
  329. };
  330. const prepareDatas = (items: Array<T & SelectedItem>, sItems?: Array<SelectedItem>) => {
  331. const initData: Array<SelectedItem | T & SelectedItem> = [];
  332. if(sItems && sItems.length) {
  333. sItems.forEach((iS) => {
  334. const dataIndex = items.findIndex((iD, iDI) => keyExtractor(iD, iDI) === iS.__key);
  335. if(dataIndex === -1) {
  336. initData.unshift(iS);
  337. }
  338. });
  339. }
  340. const finalData = items.map((bIItem, bIIndex) => {
  341. return {
  342. ...bIItem,
  343. __title: titleExtractor(bIItem, bIIndex),
  344. __key: keyExtractor(bIItem, bIIndex)
  345. };
  346. });
  347. return [
  348. ...initData,
  349. ...finalData
  350. ];
  351. };
  352. const selectObject = (selectedItem: T & SelectedItem | SelectedItem) => {
  353. const isAlreadySelected = mainSelectedItems.findIndex(sItem => sItem.__key === selectedItem.__key);
  354. let _selectedItems = JSON.parse(JSON.stringify(mainSelectedItems));
  355. if(isAlreadySelected !== -1) {
  356. let isProcessPerm = false;
  357. if(isMultipleSelect) {
  358. if(minChoice) {
  359. if(_selectedItems.length > minChoice) {
  360. isProcessPerm = true;
  361. }
  362. } else {
  363. isProcessPerm = true;
  364. }
  365. } else {
  366. const _minChoice = minChoice === undefined ? 0 : minChoice;
  367. if(_minChoice > 0) {
  368. NCoreUIKitToast.open({
  369. title: localize("minimum-a-item-selection-required")
  370. });
  371. } else {
  372. isProcessPerm = true;
  373. }
  374. }
  375. if(isProcessPerm) {
  376. if(removeSelectValidation) {
  377. if(removeSelectValidation(selectedItem)) {
  378. _selectedItems = _selectedItems.filter((sItem: SelectedItem) => sItem.__key !== selectedItem.__key);
  379. }
  380. } else {
  381. _selectedItems = _selectedItems.filter((sItem: SelectedItem) => sItem.__key !== selectedItem.__key);
  382. }
  383. }
  384. } else {
  385. let isProcessPerm = false;
  386. if(isMultipleSelect) {
  387. if(_selectedItems.length < maxChoice || maxChoice === -1) {
  388. isProcessPerm = true;
  389. } else {
  390. NCoreUIKitToast.open({
  391. title: localize("maximum-selection-limit-has-been-reached")
  392. });
  393. }
  394. } else {
  395. _selectedItems = [];
  396. isProcessPerm = true;
  397. }
  398. if(isProcessPerm) {
  399. if(selectValidation) {
  400. if(selectValidation(selectedItem)) {
  401. _selectedItems.push({
  402. __title: selectedItem.__title,
  403. __key: selectedItem.__key
  404. });
  405. }
  406. } else {
  407. _selectedItems.push({
  408. __title: selectedItem.__title,
  409. __key: selectedItem.__key
  410. });
  411. }
  412. }
  413. }
  414. if(isWorkWithRealtime) {
  415. setSelectedItems(_selectedItems);
  416. } else {
  417. setTempSelectedItems(_selectedItems);
  418. }
  419. };
  420. const cleanAll = () => {
  421. if(minChoice) {
  422. console.error("minChoice must be 0 or undefined for cleanAll function.");
  423. return;
  424. }
  425. if(isWorkWithRealtime) {
  426. setSelectedItems([]);
  427. } else {
  428. setTempSelectedItems([]);
  429. }
  430. };
  431. const selectAll = () => {
  432. if(maxChoice !== -1) {
  433. console.error("maxChoice must be -1 for selectAll function.");
  434. return;
  435. }
  436. const _selectedItems = JSON.parse(JSON.stringify(mainSelectedItems));
  437. if(searchText && searchText.length) {
  438. searchedData.forEach(searchedItem => {
  439. if(mainSelectedItems.findIndex(sI => sI.__key === searchedItem.__key) === -1) {
  440. _selectedItems.push({
  441. __title: searchedItem.__title,
  442. __key: searchedItem.__key
  443. });
  444. }
  445. });
  446. } else {
  447. data.forEach(dataItem => {
  448. if(mainSelectedItems.findIndex(sI => sI.__key === dataItem.__key) === -1) {
  449. _selectedItems.push({
  450. __title: dataItem.__title,
  451. __key: dataItem.__key
  452. });
  453. }
  454. });
  455. }
  456. if(isWorkWithRealtime) {
  457. setSelectedItems(_selectedItems);
  458. } else {
  459. setTempSelectedItems(_selectedItems);
  460. }
  461. };
  462. const onFocus = () => {
  463. if(onFocusProp) onFocusProp();
  464. };
  465. const onBlur = () => {
  466. if(onBlurProp) onBlurProp();
  467. };
  468. const renderCleanButton = () => {
  469. if(isDisabled) {
  470. return null;
  471. }
  472. if(variant !== "text") {
  473. return null;
  474. }
  475. if(!isCleanEnabled || !selectedItems.length) {
  476. return null;
  477. }
  478. return <TouchableOpacity
  479. style={[
  480. cleanIconStyle,
  481. stylesheet.cleanButton,
  482. cleanButtonDynamicStyle
  483. ]}
  484. onPress={() => {
  485. if(isWorkWithRealtime) {
  486. setSelectedItems([]);
  487. } else {
  488. setTempSelectedItems([]);
  489. }
  490. if(onChange) {
  491. onChange([], data, setIsMoreLoading);
  492. }
  493. }}
  494. >
  495. <CleanIcon
  496. color="mid"
  497. size={20}
  498. />
  499. </TouchableOpacity>;
  500. };
  501. const renderIcon = () => {
  502. if (!IconComponentProp) {
  503. return null;
  504. }
  505. return <TouchableOpacity
  506. onPress={iconOnPress}
  507. style={[
  508. iconStyle,
  509. stylesheet.icon,
  510. iconDynamicStyle
  511. ]}
  512. >
  513. <IconComponentProp
  514. color={iconProps.color}
  515. size={iconProps.size}
  516. />
  517. </TouchableOpacity>;
  518. };
  519. const renderRightIcon = () => {
  520. if (!RightIconComponentProp) {
  521. return null;
  522. }
  523. if(isCleanEnabled && selectedItems.length > 0 && variant === "text") {
  524. return null;
  525. }
  526. return <TouchableOpacity
  527. onPress={rightIconOnPress}
  528. style={[
  529. rightIconStyle,
  530. stylesheet.rightIcon,
  531. rightIconDynamicStyle
  532. ]}
  533. >
  534. <RightIconComponentProp
  535. color={iconProps.color}
  536. size={iconProps.size}
  537. />
  538. </TouchableOpacity>;
  539. };
  540. const renderHintIcon = () => {
  541. if(!isShowHintTextIcon) {
  542. return null;
  543. }
  544. if(HintTextIconProp) {
  545. return <HintTextIconProp
  546. color={isDisabled ? "disabled" : currentType.hintTextIconColor}
  547. size={20}
  548. style={[
  549. hintTextIconStyle,
  550. stylesheet.hintTextIcon,
  551. hintTextIconDynamicStyle
  552. ]}
  553. />;
  554. }
  555. const CurrentHintIcon = SelectBoxTypeIcon[type === "default" ? "question" : type];
  556. return <CurrentHintIcon
  557. customColor={isDisabled ? colors.system.state.content.disabled[styleType] : undefined}
  558. color={currentType.hintTextIconColor}
  559. size={20}
  560. style={[
  561. hintTextIconStyle,
  562. stylesheet.hintTextIcon,
  563. hintTextIconDynamicStyle
  564. ]}
  565. />;
  566. };
  567. const renderHintText = () => {
  568. if (!hintText) {
  569. return null;
  570. }
  571. return <View
  572. style={[
  573. hintTextContainerStyle,
  574. stylesheet.hintText,
  575. hintTextDynamicStyle
  576. ]}
  577. >
  578. {renderHintIcon()}
  579. <Text
  580. customColor={isDisabled ? colors.system.state.content.disabled[styleType] : undefined}
  581. color={currentType.hintTextColor}
  582. variant="labelSmallSize"
  583. >
  584. {hintText}
  585. </Text>
  586. </View>;
  587. };
  588. const renderRequired = () => {
  589. if(!isRequired) {
  590. return null;
  591. }
  592. return <Text
  593. color="danger"
  594. style={[
  595. stylesheet.required,
  596. requiredDynamicStyle
  597. ]}
  598. >*</Text>;
  599. };
  600. const renderSubtitle = () => {
  601. if(!isShowSubTitle && !isOptional) {
  602. return null;
  603. }
  604. return <Text
  605. variant="labelLargeSize"
  606. color={titleProps.color}
  607. style={[
  608. stylesheet.subTitle,
  609. subTitleDynamicStyle
  610. ]}
  611. >
  612. ( {isOptional ? localize("is-optional") : subTitle} )
  613. </Text>;
  614. };
  615. const renderTitle = () => {
  616. if (!title) {
  617. return null;
  618. }
  619. return <TouchableOpacity
  620. style={[
  621. stylesheet.titleContainer,
  622. titleContainerDynamicStyle
  623. ]}
  624. onPress={() => {
  625. if(!isDisabled) {
  626. focus();
  627. }
  628. }}
  629. >
  630. {renderRequired()}
  631. <Text
  632. {...titleProps}
  633. variant={titleProps.variant}
  634. color={titleProps.color}
  635. style={[
  636. stylesheet.title,
  637. titleDynamicStyle
  638. ]}
  639. >
  640. {title}
  641. </Text>
  642. {renderSubtitle()}
  643. </TouchableOpacity>;
  644. };
  645. const renderValue = () => {
  646. if(!selectedItems.length) {
  647. return <Text
  648. variant="labelLargeSize"
  649. style={[
  650. stylesheet.contentText,
  651. contentTextDynamicStyle
  652. ]}
  653. >
  654. {placeholder ? placeholder : localize("select-an-option")}
  655. </Text>;
  656. }
  657. return <Text
  658. variant="labelLargeSize"
  659. style={[
  660. stylesheet.contentText,
  661. contentTextDynamicStyle
  662. ]}
  663. >
  664. {selectedItems.length > 1 ? localize("selected-options-with-count", [
  665. selectedItems.length
  666. ]) : selectedItems[0]?.__title}
  667. </Text>;
  668. };
  669. const renderContent = () => {
  670. return <View
  671. style={[
  672. contentStyle,
  673. stylesheet.content,
  674. contentDynamicStyle
  675. ]}
  676. >
  677. {renderValue()}
  678. </View>;
  679. };
  680. const renderOverlay = () => {
  681. return <View
  682. style={[
  683. stylesheet.overlay,
  684. overlayDynamicStyle
  685. ]}
  686. />;
  687. };
  688. return <View
  689. style={[
  690. style,
  691. stylesheet.container,
  692. containerDynamicStyle
  693. ]}
  694. >
  695. {renderTitle()}
  696. <TouchableOpacity
  697. disabled={isDisabled}
  698. style={[
  699. contentContainerStyle,
  700. stylesheet.contentContainer,
  701. contentContainerDynamicStyle
  702. ]}
  703. onPress={() => {
  704. if(!isDisabled) {
  705. focus();
  706. }
  707. }}
  708. >
  709. {renderOverlay()}
  710. {renderIcon()}
  711. {renderContent()}
  712. {renderCleanButton()}
  713. {renderRightIcon()}
  714. </TouchableOpacity>
  715. {renderHintText()}
  716. <SelectSheet
  717. LoadingIconComponentProp={LoadingIconComponentProp}
  718. customLocalize={customSelectSheetLocalize}
  719. isWorkWithRealtime={isWorkWithRealtime}
  720. mainSelectedItems={mainSelectedItems}
  721. moreLoadThreshold={moreLoadThreshold}
  722. isShowTools={isShowSelectSheetTools}
  723. customTheme={customSelectSheetTheme}
  724. isMultipleSelect={isMultipleSelect}
  725. renderOptionIcon={renderOptionIcon}
  726. setIsMoreLoading={setIsMoreLoading}
  727. bottomSheetProps={selectSheetProps}
  728. selectBoxKey={selectBoxKey.current}
  729. bottomSheetRef={bottomSheetRef}
  730. setSearchText={setSearchText}
  731. isMoreLoading={isMoreLoading}
  732. searchedData={searchedData}
  733. isSearchable={isSearchable}
  734. keyExtractor={keyExtractor}
  735. selectObject={selectObject}
  736. setIsLoading={setIsLoading}
  737. setIsActive={setIsActive}
  738. searchText={searchText}
  739. renderItem={renderItem}
  740. onMoreLoad={onMoreLoad}
  741. maxChoice={maxChoice}
  742. minChoice={minChoice}
  743. isLoading={isLoading}
  744. selectAll={selectAll}
  745. cleanAll={cleanAll}
  746. isActive={isActive}
  747. cancel={cancel}
  748. title={title}
  749. data={data}
  750. ok={ok}
  751. />
  752. </View>;
  753. };
  754. export default forwardRef(SelectBox) as unknown as SelectBoxComponent;