[Chat] Message context menu fixes (#10314)
This commit is contained in:
@@ -54,7 +54,7 @@ import {HITSLOP_10} from '#/lib/constants'
|
|||||||
import {useHaptics} from '#/lib/haptics'
|
import {useHaptics} from '#/lib/haptics'
|
||||||
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
|
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {atoms as a, platform, tokens, useTheme} from '#/alf'
|
import {atoms as a, flatten, platform, tokens, useTheme} from '#/alf'
|
||||||
import {
|
import {
|
||||||
Context,
|
Context,
|
||||||
ItemContext,
|
ItemContext,
|
||||||
@@ -527,7 +527,8 @@ export function AuxiliaryView({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const menuContext = useMemo(() => ({align}), [align])
|
const xOffset = (flatten(style)?.marginLeft as number) ?? 0
|
||||||
|
const menuContext = useMemo(() => ({align, xOffset}), [align, xOffset])
|
||||||
|
|
||||||
const onLayout = useCallback(() => {
|
const onLayout = useCallback(() => {
|
||||||
if (!measurement) return
|
if (!measurement) return
|
||||||
@@ -655,7 +656,8 @@ export function Outer({
|
|||||||
[context.measurement, frame.height, insets, translationSV],
|
[context.measurement, frame.height, insets, translationSV],
|
||||||
)
|
)
|
||||||
|
|
||||||
const menuContext = useMemo(() => ({align}), [align])
|
const xOffset = (flatten(style)?.marginLeft as number) ?? 0
|
||||||
|
const menuContext = useMemo(() => ({align, xOffset}), [align, xOffset])
|
||||||
|
|
||||||
if (!context.isOpen || !context.measurement) return null
|
if (!context.isOpen || !context.measurement) return null
|
||||||
|
|
||||||
@@ -763,7 +765,7 @@ export function Item({
|
|||||||
onOut: onPressOut,
|
onOut: onPressOut,
|
||||||
} = useInteractionState()
|
} = useInteractionState()
|
||||||
const id = useId()
|
const id = useId()
|
||||||
const {align} = useContextMenuMenuContext()
|
const {align, xOffset: menuXOffset} = useContextMenuMenuContext()
|
||||||
|
|
||||||
const {close, measurement, registerHoverable} = context
|
const {close, measurement, registerHoverable} = context
|
||||||
|
|
||||||
@@ -779,8 +781,8 @@ export function Item({
|
|||||||
const xOffset = position
|
const xOffset = position
|
||||||
? position.x
|
? position.x
|
||||||
: align === 'left'
|
: align === 'left'
|
||||||
? measurement.x
|
? measurement.x + menuXOffset
|
||||||
: measurement.x + measurement.width - layout.width
|
: measurement.x + measurement.width - layout.width - menuXOffset
|
||||||
|
|
||||||
registerHoverable(
|
registerHoverable(
|
||||||
id,
|
id,
|
||||||
@@ -796,7 +798,16 @@ export function Item({
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
[id, measurement, registerHoverable, close, onPress, align, position],
|
[
|
||||||
|
id,
|
||||||
|
measurement,
|
||||||
|
registerHoverable,
|
||||||
|
close,
|
||||||
|
onPress,
|
||||||
|
align,
|
||||||
|
menuXOffset,
|
||||||
|
position,
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
const itemContext = useMemo(
|
const itemContext = useMemo(
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ export type ContextType = {
|
|||||||
|
|
||||||
export type MenuContextType = {
|
export type MenuContextType = {
|
||||||
align: 'left' | 'right'
|
align: 'left' | 'right'
|
||||||
|
xOffset: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ItemContextType = {
|
export type ItemContextType = {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export function EmojiReactionPicker({
|
|||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
const isFromSelf = message.sender?.did === currentAccount?.did
|
const isFromSelf = message.sender?.did === currentAccount?.did
|
||||||
const {measurement, close} = useContextMenuContext()
|
const {measurement, close} = useContextMenuContext()
|
||||||
const {align} = useContextMenuMenuContext()
|
const {align, xOffset} = useContextMenuMenuContext()
|
||||||
const [layout, setLayout] = useState({width: 0, height: 0})
|
const [layout, setLayout] = useState({width: 0, height: 0})
|
||||||
const {width: screenWidth} = useWindowDimensions()
|
const {width: screenWidth} = useWindowDimensions()
|
||||||
|
|
||||||
@@ -44,12 +44,15 @@ export function EmojiReactionPicker({
|
|||||||
|
|
||||||
const position = useMemo(() => {
|
const position = useMemo(() => {
|
||||||
return {
|
return {
|
||||||
x: align === 'left' ? 12 : screenWidth - layout.width - 12,
|
x:
|
||||||
|
align === 'left'
|
||||||
|
? (measurement?.x ?? 0) + xOffset
|
||||||
|
: (measurement?.x ?? 0) + (measurement?.width ?? 0) - layout.width,
|
||||||
y: (measurement?.y ?? 0) - tokens.space.xs - layout.height,
|
y: (measurement?.y ?? 0) - tokens.space.xs - layout.height,
|
||||||
height: layout.height,
|
height: layout.height,
|
||||||
width: layout.width,
|
width: layout.width,
|
||||||
}
|
}
|
||||||
}, [measurement, align, screenWidth, layout])
|
}, [measurement, align, xOffset, screenWidth, layout])
|
||||||
|
|
||||||
const limitReacted = hasReachedReactionLimit(message, currentAccount?.did)
|
const limitReacted = hasReachedReactionLimit(message, currentAccount?.did)
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ let MessageItemEmbed = ({
|
|||||||
<View
|
<View
|
||||||
style={[
|
style={[
|
||||||
!isFromSelf && a.ml_sm,
|
!isFromSelf && a.ml_sm,
|
||||||
t.atoms.bg,
|
|
||||||
native({
|
native({
|
||||||
flexBasis: 0,
|
flexBasis: 0,
|
||||||
width: Math.min(screen.width, 600) / 1.4,
|
width: Math.min(screen.width, 600) / 1.4,
|
||||||
|
|||||||
Reference in New Issue
Block a user