OptionsMenu.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('copy')}>
  43. <Text style={styles.optionText}>Copy</Text>
  44. <MaterialCommunityIcons name="content-copy" size={20} color={Colors.DARK_BLUE} />
  45. </TouchableOpacity>
  46. <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('delete')}>
  47. <Text style={styles.optionText}>Delete</Text>
  48. <MaterialCommunityIcons name="delete" size={20} color={Colors.DARK_BLUE} />
  49. </TouchableOpacity>
  50. {/* <TouchableOpacity style={styles.optionButton} onPress={() => handleOptionPress('pin')}>
  51. <Text style={styles.optionText}>Pin message</Text>
  52. <MaterialCommunityIcons name="pin" size={20} color={Colors.DARK_BLUE} />
  53. </TouchableOpacity> */}
  54. </Animated.View>
  55. );
  56. const styles = StyleSheet.create({
  57. optionsMenu: {
  58. position: 'absolute',
  59. backgroundColor: 'rgba(255, 255, 255, 0.9)',
  60. borderRadius: 10,
  61. padding: 8,
  62. shadowColor: '#000',
  63. shadowOpacity: 0.3,
  64. shadowOffset: { width: 0, height: 2 },
  65. shadowRadius: 5,
  66. elevation: 5,
  67. width: Dimensions.get('window').width * 0.75
  68. },
  69. optionButton: {
  70. paddingVertical: 10,
  71. paddingHorizontal: 12,
  72. flexDirection: 'row',
  73. justifyContent: 'space-between'
  74. },
  75. optionText: {
  76. fontSize: 16
  77. }
  78. });
  79. export default OptionsMenu;