mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at remove-preload 86 lines 2.4 kB view raw
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}