import React, {memo, useMemo, useState} from 'react' import { Pressable, type PressableProps, type StyleProp, type ViewStyle, } from 'react-native' import { AppBskyFeedDefs, AppBskyFeedPost, AppBskyFeedThreadgate, RichText as RichTextAPI, } from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useTheme} from '#/lib/ThemeContext' import {Shadow} from '#/state/cache/post-shadow' import {atoms as a, useTheme as useAlf} from '#/alf' import {DotGrid_Stroke2_Corner0_Rounded as DotsHorizontal} from '#/components/icons/DotGrid' import {useMenuControl} from '#/components/Menu' import * as Menu from '#/components/Menu' import {EventStopper} from '../EventStopper' import {PostDropdownMenuItems} from './PostDropdownBtnMenuItems' let PostDropdownBtn = ({ testID, post, postFeedContext, record, richText, style, hitSlop, size, timestamp, threadgateRecord, }: { testID: string post: Shadow postFeedContext: string | undefined record: AppBskyFeedPost.Record richText: RichTextAPI style?: StyleProp hitSlop?: PressableProps['hitSlop'] size?: 'lg' | 'md' | 'sm' timestamp: string threadgateRecord?: AppBskyFeedThreadgate.Record }): React.ReactNode => { const theme = useTheme() const alf = useAlf() const {_} = useLingui() const defaultCtrlColor = theme.palette.default.postCtrl const menuControl = useMenuControl() const [hasBeenOpen, setHasBeenOpen] = useState(false) const lazyMenuControl = useMemo( () => ({ ...menuControl, open() { setHasBeenOpen(true) // HACK. We need the state update to be flushed by the time // menuControl.open() fires but RN doesn't expose flushSync. setTimeout(menuControl.open) }, }), [menuControl, setHasBeenOpen], ) return ( {({props, state}) => { return ( ) }} {hasBeenOpen && ( // Lazily initialized. Once mounted, they stay mounted. )} ) } PostDropdownBtn = memo(PostDropdownBtn) export {PostDropdownBtn}