diff options
author | Samuel Newman <mozzius@protonmail.com> | 2025-05-24 02:02:38 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-23 18:02:38 -0500 |
commit | c3f88e0a48bdf22831736ad3d44222e7c4418486 (patch) | |
tree | d72137786908d5c61ad52a7cb7aa8fd37472a615 /src/components/PostControls/PostMenu/index.tsx | |
parent | 5aadb9e41b1305e673947b28ba0566bdc3a3325d (diff) | |
download | voidsky-c3f88e0a48bdf22831736ad3d44222e7c4418486.tar.zst |
Share menu (#7840)
* move post ctrls to #/components * restructure post controls, basic share menu * add border radius to searchable people list for android * Revert "add border radius to searchable people list for android" This reverts commit 417449086e25b82f5683b12f6405d972f48ce50e. * add copy link to native share menu * reorg files again * open native share menu on long press * Translation comments Thanks @surfdude29 * abs path * update type imports, remove forwardRef * rm react import * equal spacing of buttons, extract disco debug * add better icon * add right offset to share button for visual alignment * Add recent chats to share menu (#7853) * add recent chats to share menu * Update RecentChats.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update RecentChats.tsx * add fading edge on andriod * tweak scrollview * Add metrics and A/B alt icon to share menu (#8401) * add metrics * add a/b tested alt icon --------- Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * More descriptive share text/icon on web (#7854) * more descriptive share text on web * revert dev mode changes * add missing import * use modified share icon everywhere * Add back conflicting changes --------- Co-authored-by: Eric Bailey <git@esb.lol> --------- Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> Co-authored-by: Eric Bailey <git@esb.lol>
Diffstat (limited to 'src/components/PostControls/PostMenu/index.tsx')
-rw-r--r-- | src/components/PostControls/PostMenu/index.tsx | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/components/PostControls/PostMenu/index.tsx b/src/components/PostControls/PostMenu/index.tsx new file mode 100644 index 000000000..63aa460fb --- /dev/null +++ b/src/components/PostControls/PostMenu/index.tsx @@ -0,0 +1,95 @@ +import {memo, useMemo, useState} from 'react' +import { + type AppBskyFeedDefs, + type AppBskyFeedPost, + type AppBskyFeedThreadgate, + type RichText as RichTextAPI, +} from '@atproto/api' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' +import type React from 'react' + +import {type Shadow} from '#/state/cache/post-shadow' +import {EventStopper} from '#/view/com/util/EventStopper' +import {DotGrid_Stroke2_Corner0_Rounded as DotsHorizontal} from '#/components/icons/DotGrid' +import {useMenuControl} from '#/components/Menu' +import * as Menu from '#/components/Menu' +import {PostControlButton, PostControlButtonIcon} from '../PostControlButton' +import {PostMenuItems} from './PostMenuItems' + +let PostMenuButton = ({ + testID, + post, + postFeedContext, + postReqId, + big, + record, + richText, + timestamp, + threadgateRecord, + onShowLess, +}: { + testID: string + post: Shadow<AppBskyFeedDefs.PostView> + postFeedContext: string | undefined + postReqId: string | undefined + big?: boolean + record: AppBskyFeedPost.Record + richText: RichTextAPI + timestamp: string + threadgateRecord?: AppBskyFeedThreadgate.Record + onShowLess?: (interaction: AppBskyFeedDefs.Interaction) => void +}): React.ReactNode => { + const {_} = useLingui() + + 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 ( + <EventStopper onKeyDown={false}> + <Menu.Root control={lazyMenuControl}> + <Menu.Trigger label={_(msg`Open post options menu`)}> + {({props}) => { + return ( + <PostControlButton + testID="postDropdownBtn" + big={big} + label={props.accessibilityLabel} + {...props}> + <PostControlButtonIcon icon={DotsHorizontal} /> + </PostControlButton> + ) + }} + </Menu.Trigger> + {hasBeenOpen && ( + // Lazily initialized. Once mounted, they stay mounted. + <PostMenuItems + testID={testID} + post={post} + postFeedContext={postFeedContext} + postReqId={postReqId} + record={record} + richText={richText} + timestamp={timestamp} + threadgateRecord={threadgateRecord} + onShowLess={onShowLess} + /> + )} + </Menu.Root> + </EventStopper> + ) +} + +PostMenuButton = memo(PostMenuButton) +export {PostMenuButton} |