import React, { useState } from 'react'; import { TouchableOpacity, View } from 'react-native'; import { Logger } from '@sendbird/uikit-utils'; import Modal from '../../components/Modal'; import Text from '../../components/Text'; import createStyleSheet from '../../styles/createStyleSheet'; import useHeaderStyle from '../../styles/useHeaderStyle'; import useUIKitTheme from '../../theme/useUIKitTheme'; import DialogBox from '../Dialog/DialogBox'; import LoadingSpinner from '../LoadingSpinner'; export type ActionMenuItem = { title?: string; menuItems: { title: string; style?: 'destructive'; onPress?: (() => Promise) | (() => void); onError?: () => void; }[]; }; type Props = { visible: boolean; onHide: () => void; onError?: (error: unknown) => void; onDismiss?: () => void; } & ActionMenuItem; const ActionMenu = ({ visible, onHide, onError, onDismiss, title, menuItems }: Props) => { const { statusBarTranslucent } = useHeaderStyle(); const { colors } = useUIKitTheme(); const [pending, setPending] = useState(false); const _onHide = () => { if (!pending) onHide(); }; return ( {title} {pending && ( )} {menuItems.map((item, index) => { return ( { setPending(true); try { await item.onPress?.(); } catch (e: unknown) { const errorHandler = onError ?? item.onError; errorHandler?.(e); if (!errorHandler) Logger.error('ActionMenu onPress error', e); } finally { onHide(); setPending(false); } }} > {item.title} ); })} ); }; const styles = createStyleSheet({ title: { flexDirection: 'row', paddingHorizontal: 24, paddingVertical: 20, alignItems: 'center', justifyContent: 'flex-start', }, buttonContainer: { alignItems: 'flex-start', marginTop: 4, marginBottom: 8, }, button: { paddingHorizontal: 24, paddingVertical: 12, }, }); export default ActionMenu;