mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2import {StyleSheet, View} from 'react-native'
3import {ChatBskyConvoDefs} from '@atproto-labs/api'
4
5import {atoms as a} from '#/alf'
6import {MessageMenu} from '#/components/dms/MessageMenu'
7import {useMenuControl} from '#/components/Menu'
8
9export function ActionsWrapper({
10 message,
11 isFromSelf,
12 children,
13}: {
14 message: ChatBskyConvoDefs.MessageView
15 isFromSelf: boolean
16 children: React.ReactNode
17}) {
18 const menuControl = useMenuControl()
19 const viewRef = React.useRef(null)
20
21 const [showActions, setShowActions] = React.useState(false)
22
23 const onMouseEnter = React.useCallback(() => {
24 setShowActions(true)
25 }, [])
26
27 const onMouseLeave = React.useCallback(() => {
28 setShowActions(false)
29 }, [])
30
31 // We need to handle the `onFocus` separately because we want to know if there is a related target (the element
32 // that is losing focus). If there isn't that means the focus is coming from a dropdown that is now closed.
33 const onFocus = React.useCallback<React.FocusEventHandler>(e => {
34 if (e.nativeEvent.relatedTarget == null) return
35 setShowActions(true)
36 }, [])
37
38 return (
39 <View
40 // @ts-expect-error web only
41 onMouseEnter={onMouseEnter}
42 onMouseLeave={onMouseLeave}
43 onFocus={onFocus}
44 onBlur={onMouseLeave}
45 style={StyleSheet.flatten([a.flex_1, a.flex_row])}
46 ref={viewRef}>
47 {isFromSelf && (
48 <View
49 style={[
50 a.mr_xl,
51 a.justify_center,
52 {
53 marginLeft: 'auto',
54 },
55 ]}>
56 <MessageMenu
57 message={message}
58 control={menuControl}
59 triggerOpacity={showActions || menuControl.isOpen ? 1 : 0}
60 onTriggerPress={onMouseEnter}
61 // @ts-expect-error web only
62 onMouseLeave={onMouseLeave}
63 />
64 </View>
65 )}
66 <View
67 style={{
68 maxWidth: '65%',
69 }}>
70 {children}
71 </View>
72 {!isFromSelf && (
73 <View style={[a.flex_row, a.align_center, a.ml_xl]}>
74 <MessageMenu
75 message={message}
76 control={menuControl}
77 triggerOpacity={showActions || menuControl.isOpen ? 1 : 0}
78 onTriggerPress={onMouseEnter}
79 // @ts-expect-error web only
80 onMouseLeave={onMouseLeave}
81 />
82 </View>
83 )}
84 </View>
85 )
86}