import React from 'react'; import { ActivityIndicator, Image, ImageSourcePropType, ImageStyle, StyleSheet, TextStyle, TouchableOpacity, View, ViewStyle, } from 'react-native'; import { useApi, useMessageItemPopover, useStyles } from '../../hooks'; import { ComponentStyleProp, LLComponentStyleFn } from '../../types'; import { LLText } from '../LLText'; export type LLChatMessageMenuOptionStyles = { menuItem: ViewStyle; menuItemText: TextStyle; menuItemIcon: ImageStyle; menuItemTopDivider: ViewStyle; menuItemBottomDivider: ViewStyle; }; export type LLChatMessageMenuOptionProps< OnClickApiFnResponseData extends Promise, > = ComponentStyleProp & { icon: ImageSourcePropType; textDesc: string; divider?: Partial<{ top: boolean; bottom: boolean; }>; onClickApiFn: () => OnClickApiFnResponseData; }; export function LLChatMessageMenuOption< OnClickApiFnResponseData extends Promise, >({ icon, textDesc, divider = {}, onClickApiFn, styles: stylesProp, }: LLChatMessageMenuOptionProps) { const { isLoading, onApi: onClick } = useApi(onClickApiFn); const menuItemStyles = useStyles({ componentStylesFn: getChatMessageMenuOptionStyles, stylesProp, }); const { hidePopover } = useMessageItemPopover(); return ( <> {divider.top && } onClick().finally(hidePopover)}> {isLoading ? ( ) : ( )} {textDesc} {divider.bottom && } ); } const getChatMessageMenuOptionStyles: LLComponentStyleFn< LLChatMessageMenuOptionStyles > = ({ theme }) => StyleSheet.create({ menuItem: { flexDirection: 'row', justifyContent: 'flex-start', alignItems: 'center', height: 45, padding: 5, }, menuItemText: { color: theme.text, }, menuItemIcon: { height: 18, width: 18, marginRight: 10, }, menuItemTopDivider: { borderTopWidth: 1, borderTopColor: theme.border, }, menuItemBottomDivider: { borderBottomWidth: 1, borderBottomColor: theme.border, }, });