OptionsMenu.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React from 'react';
  2. import { TouchableOpacity, Text, StyleSheet, Dimensions } from 'react-native';
  3. import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
  4. import { MaterialCommunityIcons } from '@expo/vector-icons';
  5. import { Colors } from 'src/theme';
  6. interface MessagePosition {
  7. x: number;
  8. y: number;
  9. isMine: boolean;
  10. width: number;
  11. height: number;
  12. }
  13. interface OptionsMenuProps {
  14. messagePosition: MessagePosition | null;
  15. selectedMessage: any;
  16. handleOptionPress: (option: string) => void;
  17. }
  18. const OptionsMenu: React.FC<OptionsMenuProps> = ({
  19. messagePosition,
  20. selectedMessage,
  21. handleOptionPress
  22. }) =>
  23. selectedMessage &&
  24. messagePosition && (
  25. <Animated.View
  26. entering={FadeIn}
  27. exiting={FadeOut}
  28. style={[
  29. styles.optionsMenu,
  30. {
  31. top: messagePosition.y + messagePosition.height + 8,
  32. left: messagePosition.isMine
  33. ? Dimensions.get('window').width - Dimensions.get('window').width * 0.75 - 8
  34. : messagePosition.x
  35. }
  36. ]}
  37. >
  38. <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('reply')}>
  39. <Text style={styles.optionText}>Reply</Text>
  40. <MaterialCommunityIcons name="reply" size={20} color={Colors.DARK_BLUE} />
  41. </TouchableOpacity>
  42. {selectedMessage.currentMessage?.image || selectedMessage.currentMessage?.video ? (
  43. <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('download')}>
  44. <Text style={styles.optionText}>
  45. {selectedMessage.currentMessage?.image ? 'Download image' : 'Download video'}
  46. </Text>
  47. <MaterialCommunityIcons name="download" size={20} color={Colors.DARK_BLUE} />
  48. </TouchableOpacity>
  49. ) : null}
  50. <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('copy')}>
  51. <Text style={styles.optionText}>Copy</Text>
  52. <MaterialCommunityIcons name="content-copy" size={20} color={Colors.DARK_BLUE} />
  53. </TouchableOpacity>
  54. <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('delete')}>
  55. <Text style={styles.optionText}>Delete</Text>
  56. <MaterialCommunityIcons name="delete" size={20} color={Colors.DARK_BLUE} />
  57. </TouchableOpacity>
  58. {/* <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('pin')}>
  59. <Text style={styles.optionText}>Pin message</Text>
  60. <MaterialCommunityIcons name="pin" size={20} color={Colors.DARK_BLUE} />
  61. </TouchableOpacity> */}
  62. </Animated.View>
  63. );
  64. const styles = StyleSheet.create({
  65. optionsMenu: {
  66. position: 'absolute',
  67. backgroundColor: 'rgba(255, 255, 255, 1)',
  68. borderRadius: 10,
  69. padding: 8,
  70. shadowColor: '#000',
  71. shadowOpacity: 0.3,
  72. shadowOffset: { width: 0, height: 2 },
  73. shadowRadius: 5,
  74. elevation: 5,
  75. width: Dimensions.get('window').width * 0.75
  76. },
  77. optionButton: {
  78. paddingVertical: 10,
  79. paddingHorizontal: 12,
  80. flexDirection: 'row',
  81. justifyContent: 'space-between'
  82. },
  83. optionText: {
  84. fontSize: 16
  85. }
  86. });
  87. export default OptionsMenu;