expose as PeekMenu

This commit is contained in:
Samuel Newman
2026-04-20 12:25:41 +03:00
parent 343ce24cba
commit 13bc8da818
3 changed files with 83 additions and 20 deletions
+12
View File
@@ -0,0 +1,12 @@
export type {
MenuItemSpec,
PreviewContent,
} from '../../../modules/expo-bluesky-context-menu'
export {
Menu,
MenuItem,
MenuItemIcon,
MenuItemText,
Root,
Trigger,
} from '../../../modules/expo-bluesky-context-menu'
+54
View File
@@ -0,0 +1,54 @@
import {type ReactNode} from 'react'
import {type StyleProp, View, type ViewStyle} from 'react-native'
import {type IconWithSvgMeta} from '#/components/icons/TEMPLATE'
import {type PreviewContent} from '../../../modules/expo-bluesky-context-menu'
export type {
MenuItemSpec,
PreviewContent,
} from '../../../modules/expo-bluesky-context-menu'
export function Root({
children,
style,
}: {
children: ReactNode
style?: StyleProp<ViewStyle>
}) {
return <View style={style}>{children}</View>
}
export function Trigger({
children,
}: {
preview?: PreviewContent
onPreviewPress?: () => void
borderRadius?: number
style?: StyleProp<ViewStyle>
children: ReactNode
}) {
return <>{children}</>
}
export function Menu(_: {children: ReactNode}): null {
return null
}
export function MenuItem(_: {
id: string
destructive?: boolean
disabled?: boolean
onSelect: () => void
children: ReactNode
}): null {
return null
}
export function MenuItemIcon(_: {icon: IconWithSvgMeta}): null {
return null
}
export function MenuItemText(_: {children: string}): null {
return null
}
+17 -20
View File
@@ -1,14 +1,13 @@
import {type ReactNode} from 'react'
import {type StyleProp, type ViewStyle} from 'react-native'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {useLingui} from '@lingui/react/macro'
import {shareImageModal} from '#/lib/media/manip'
import {useSaveImageToMediaLibrary} from '#/lib/media/save-image'
import {ArrowShareRight_Stroke2_Corner2_Rounded as ShareIcon} from '#/components/icons/ArrowShareRight'
import {Download_Stroke2_Corner0_Rounded as DownloadIcon} from '#/components/icons/Download'
import * as PeekMenu from '#/components/PeekMenu'
import {IS_IOS} from '#/env'
import * as ContextMenu from '../../../../modules/expo-bluesky-context-menu'
/**
* Wraps an image embed with the iOS peek-and-menu interaction. On non-iOS
@@ -38,7 +37,7 @@ export function ImageContextMenu({
style?: StyleProp<ViewStyle>
children: ReactNode
}) {
const {_} = useLingui()
const {t: l} = useLingui()
const saveImage = useSaveImageToMediaLibrary()
if (!IS_IOS) {
@@ -53,8 +52,8 @@ export function ImageContextMenu({
}
return (
<ContextMenu.Root style={style}>
<ContextMenu.Trigger
<PeekMenu.Root style={style}>
<PeekMenu.Trigger
preview={{
type: 'image',
uri: fullsizeUri,
@@ -64,19 +63,17 @@ export function ImageContextMenu({
borderRadius={borderRadius}
onPreviewPress={onPreviewPress}>
{children}
</ContextMenu.Trigger>
<ContextMenu.Menu>
<ContextMenu.MenuItem id="save" onSelect={handleSave}>
<ContextMenu.MenuItemIcon icon={DownloadIcon} />
<ContextMenu.MenuItemText>
{_(msg`Save image`)}
</ContextMenu.MenuItemText>
</ContextMenu.MenuItem>
<ContextMenu.MenuItem id="share" onSelect={handleShare}>
<ContextMenu.MenuItemIcon icon={ShareIcon} />
<ContextMenu.MenuItemText>{_(msg`Share`)}</ContextMenu.MenuItemText>
</ContextMenu.MenuItem>
</ContextMenu.Menu>
</ContextMenu.Root>
</PeekMenu.Trigger>
<PeekMenu.Menu>
<PeekMenu.MenuItem id="save" onSelect={handleSave}>
<PeekMenu.MenuItemIcon icon={DownloadIcon} />
<PeekMenu.MenuItemText>{l`Save image`}</PeekMenu.MenuItemText>
</PeekMenu.MenuItem>
<PeekMenu.MenuItem id="share" onSelect={handleShare}>
<PeekMenu.MenuItemIcon icon={ShareIcon} />
<PeekMenu.MenuItemText>{l`Share`}</PeekMenu.MenuItemText>
</PeekMenu.MenuItem>
</PeekMenu.Menu>
</PeekMenu.Root>
)
}