mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at tooltip 95 lines 2.8 kB view raw
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}