import { useCallback, useMemo, useState } from 'react'; import { FlatList, Modal, Pressable, SafeAreaView, StyleSheet, Text, View, } from 'react-native'; import React from 'react'; import type { Item, ModalSelectProps } from 'src/types'; import EmptyIndicator from './EmptyIndicator'; import SelectItem from './Item'; const ModalSelect = ({ testID, placeholder, items, cancelTouchableText = 'cancel', emptyIndicatorText = 'Sorry, there is nothing to be shown here', closeModalText = 'Back', onChange, value, modalStyle, closeModalComponent, cancelModalComponent, pressableComponent, modalHeaderComponent, emptyIndicatorComponent, modalItemComponent, }: ModalSelectProps): JSX.Element => { const [modalVisibility, setModalVisibility] = useState(false); const [selectedItem, setSelectedItem] = useState( items.find((item) => item.value === value) ); const handleChangeSelectedItem = useCallback( (item: Item) => { onChange(item.value); setSelectedItem(item); setModalVisibility(false); }, [onChange] ); const handleCancel = () => { setSelectedItem(undefined); setModalVisibility(false); }; const modalStyles = useMemo(() => { return [styles.modal, modalStyle]; }, [modalStyle]); return ( {pressableComponent ? ( pressableComponent({ text: selectedItem ? selectedItem.label : placeholder, onOpen: () => setModalVisibility(true), }) ) : ( setModalVisibility(true)}> {selectedItem ? selectedItem.label : placeholder} )} setModalVisibility(false)} > {modalHeaderComponent ? ( modalHeaderComponent({ onClose: () => setModalVisibility(false), onCancel: handleCancel, title: selectedItem ? selectedItem.label : placeholder, }) ) : ( {selectedItem ? selectedItem.label : placeholder}{' '} {closeModalComponent ? ( closeModalComponent({ onClose: () => setModalVisibility(false), }) ) : ( setModalVisibility(false)}> {closeModalText} )} {cancelModalComponent ? ( cancelModalComponent({ onCancel: handleCancel, text: cancelTouchableText, }) ) : ( {cancelTouchableText} )} )} {!items.length ? ( <> {emptyIndicatorComponent ? ( emptyIndicatorComponent({ text: emptyIndicatorText, }) ) : ( {emptyIndicatorText} )} ) : ( { const { item, index } = info; return ( <> {modalItemComponent ? ( modalItemComponent({ item, index, focused: selectedItem?.value === item.value, onSelect: () => handleChangeSelectedItem(item), }) ) : ( handleChangeSelectedItem(item)} {...item} /> )} ); }} /> )} ); }; const styles = StyleSheet.create({ modal: { flex: 1, }, modalHeader: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', width: '100%', padding: 16, }, closeModalText: { fontSize: 16, }, cancelModalText: { fontSize: 16, }, modalTitleContainer: { position: 'absolute', alignItems: 'center', left: 0, right: 0, }, }); export default ModalSelect;