about summary refs log tree commit diff
path: root/src/components/PostControls/PostMenu/index.tsx
diff options
context:
space:
mode:
authorSamuel Newman <mozzius@protonmail.com>2025-05-24 02:02:38 +0300
committerGitHub <noreply@github.com>2025-05-23 18:02:38 -0500
commitc3f88e0a48bdf22831736ad3d44222e7c4418486 (patch)
treed72137786908d5c61ad52a7cb7aa8fd37472a615 /src/components/PostControls/PostMenu/index.tsx
parent5aadb9e41b1305e673947b28ba0566bdc3a3325d (diff)
downloadvoidsky-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.tsx95
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}