mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {memo, useMemo, useState} from 'react'
2import {
3 type AppBskyFeedDefs,
4 type AppBskyFeedPost,
5 type AppBskyFeedThreadgate,
6 type RichText as RichTextAPI,
7} from '@atproto/api'
8import {msg} from '@lingui/macro'
9import {useLingui} from '@lingui/react'
10import type React from 'react'
11
12import {type Shadow} from '#/state/cache/post-shadow'
13import {EventStopper} from '#/view/com/util/EventStopper'
14import {DotGrid_Stroke2_Corner0_Rounded as DotsHorizontal} from '#/components/icons/DotGrid'
15import {useMenuControl} from '#/components/Menu'
16import * as Menu from '#/components/Menu'
17import {PostControlButton, PostControlButtonIcon} from '../PostControlButton'
18import {PostMenuItems} from './PostMenuItems'
19
20let PostMenuButton = ({
21 testID,
22 post,
23 postFeedContext,
24 postReqId,
25 big,
26 record,
27 richText,
28 timestamp,
29 threadgateRecord,
30 onShowLess,
31}: {
32 testID: string
33 post: Shadow<AppBskyFeedDefs.PostView>
34 postFeedContext: string | undefined
35 postReqId: string | undefined
36 big?: boolean
37 record: AppBskyFeedPost.Record
38 richText: RichTextAPI
39 timestamp: string
40 threadgateRecord?: AppBskyFeedThreadgate.Record
41 onShowLess?: (interaction: AppBskyFeedDefs.Interaction) => void
42}): React.ReactNode => {
43 const {_} = useLingui()
44
45 const menuControl = useMenuControl()
46 const [hasBeenOpen, setHasBeenOpen] = useState(false)
47 const lazyMenuControl = useMemo(
48 () => ({
49 ...menuControl,
50 open() {
51 setHasBeenOpen(true)
52 // HACK. We need the state update to be flushed by the time
53 // menuControl.open() fires but RN doesn't expose flushSync.
54 setTimeout(menuControl.open)
55 },
56 }),
57 [menuControl, setHasBeenOpen],
58 )
59 return (
60 <EventStopper onKeyDown={false}>
61 <Menu.Root control={lazyMenuControl}>
62 <Menu.Trigger label={_(msg`Open post options menu`)}>
63 {({props}) => {
64 return (
65 <PostControlButton
66 testID="postDropdownBtn"
67 big={big}
68 label={props.accessibilityLabel}
69 {...props}>
70 <PostControlButtonIcon icon={DotsHorizontal} />
71 </PostControlButton>
72 )
73 }}
74 </Menu.Trigger>
75 {hasBeenOpen && (
76 // Lazily initialized. Once mounted, they stay mounted.
77 <PostMenuItems
78 testID={testID}
79 post={post}
80 postFeedContext={postFeedContext}
81 postReqId={postReqId}
82 record={record}
83 richText={richText}
84 timestamp={timestamp}
85 threadgateRecord={threadgateRecord}
86 onShowLess={onShowLess}
87 />
88 )}
89 </Menu.Root>
90 </EventStopper>
91 )
92}
93
94PostMenuButton = memo(PostMenuButton)
95export {PostMenuButton}