handle focus/unfocus better
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {StyleSheet, View} from 'react-native'
|
import {NativeSyntheticEvent, StyleSheet, View} from 'react-native'
|
||||||
import {ChatBskyConvoDefs} from '@atproto-labs/api'
|
import {ChatBskyConvoDefs} from '@atproto-labs/api'
|
||||||
|
|
||||||
import {atoms as a} from '#/alf'
|
import {atoms as a} from '#/alf'
|
||||||
@@ -15,9 +15,10 @@ export function ActionsWrapper({
|
|||||||
isFromSelf: boolean
|
isFromSelf: boolean
|
||||||
children: React.ReactNode
|
children: React.ReactNode
|
||||||
}) {
|
}) {
|
||||||
const [showActions, setShowActions] = React.useState(false)
|
|
||||||
|
|
||||||
const menuControl = useMenuControl()
|
const menuControl = useMenuControl()
|
||||||
|
const viewRef = React.useRef(null)
|
||||||
|
|
||||||
|
const [showActions, setShowActions] = React.useState(false)
|
||||||
|
|
||||||
const onMouseEnter = React.useCallback(() => {
|
const onMouseEnter = React.useCallback(() => {
|
||||||
setShowActions(true)
|
setShowActions(true)
|
||||||
@@ -27,13 +28,21 @@ export function ActionsWrapper({
|
|||||||
setShowActions(false)
|
setShowActions(false)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
// We need to handle the `onFocus` separately because we want to know if there is a related target (the element
|
||||||
|
// that is losing focus). If there isn't that means the focus is coming from a dropdown that is now closed.
|
||||||
|
const onFocus = React.useCallback((e: NativeSyntheticEvent<any>) => {
|
||||||
|
if (e.nativeEvent.relatedTarget == null) return
|
||||||
|
setShowActions(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View
|
<View
|
||||||
onMouseEnter={onMouseEnter}
|
onMouseEnter={onMouseEnter}
|
||||||
onMouseLeave={onMouseLeave}
|
onMouseLeave={onMouseLeave}
|
||||||
onFocus={onMouseEnter}
|
onFocus={onFocus}
|
||||||
onBlur={onMouseLeave}
|
onBlur={onMouseLeave}
|
||||||
style={StyleSheet.flatten([a.flex_1, a.flex_row])}>
|
style={StyleSheet.flatten([a.flex_1, a.flex_row])}
|
||||||
|
ref={viewRef}>
|
||||||
{isFromSelf && (
|
{isFromSelf && (
|
||||||
<View
|
<View
|
||||||
style={[
|
style={[
|
||||||
@@ -45,7 +54,8 @@ export function ActionsWrapper({
|
|||||||
<MessageMenu
|
<MessageMenu
|
||||||
message={message}
|
message={message}
|
||||||
control={menuControl}
|
control={menuControl}
|
||||||
triggerOpacity={showActions ? 1 : 0}
|
triggerOpacity={showActions || menuControl.isOpen ? 1 : 0}
|
||||||
|
onTriggerPress={onMouseEnter}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
@@ -60,7 +70,8 @@ export function ActionsWrapper({
|
|||||||
<MessageMenu
|
<MessageMenu
|
||||||
message={message}
|
message={message}
|
||||||
control={menuControl}
|
control={menuControl}
|
||||||
triggerOpacity={showActions ? 1 : 0}
|
triggerOpacity={showActions || menuControl.isOpen ? 1 : 0}
|
||||||
|
onTriggerPress={onMouseEnter}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export let MessageMenu = ({
|
|||||||
}: {
|
}: {
|
||||||
hideTrigger?: boolean
|
hideTrigger?: boolean
|
||||||
triggerOpacity?: number
|
triggerOpacity?: number
|
||||||
|
onTriggerPress?: () => void
|
||||||
message: ChatBskyConvoDefs.MessageView
|
message: ChatBskyConvoDefs.MessageView
|
||||||
control: Menu.MenuControlProps
|
control: Menu.MenuControlProps
|
||||||
}): React.ReactNode => {
|
}): React.ReactNode => {
|
||||||
|
|||||||
Reference in New Issue
Block a user