index.tsx 23 KB

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