Skip to content

Context Menu

Context Menu Primitive Text Component

Demo


Shows a menu activated by either a right-click or a long-press.

Installation

Terminal window
npx @react-native-reusables/cli@latest add context-menu

Usage

import * as React from 'react';
import { Platform, View } from 'react-native';
import Animated, { FadeIn } from 'react-native-reanimated';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuItem,
ContextMenuLabel,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from '~/components/ui/context-menu';
import { Text } from '~/components/ui/text';
function Example() {
const [open, setOpen] = React.useState(false);
const [openSub, setOpenSub] = React.useState(false);
const insets = useSafeAreaInsets();
const contentInsets = {
top: insets.top,
bottom: insets.bottom,
left: 12,
right: 12,
};
const [checkboxValue, setCheckboxValue] = React.useState(false);
const [subCheckboxValue, setSubCheckboxValue] = React.useState(false);
const [radioValue, setRadioValue] = React.useState('pedro');
return (
<ContextMenu
open={open}
onOpenChange={(newVal) => {
setOpen(newVal);
if (!newVal) {
setOpenSub(false);
}
}}
>
<ContextMenuTrigger className='flex h-[150px] w-full max-w-[300px] mx-auto web:cursor-default items-center justify-center rounded-md border border-foreground border-dashed'>
<Text className='text-foreground text-sm native:text-lg'>
{Platform.OS === 'web' ? 'Right click here' : 'Long press here'}
</Text>
</ContextMenuTrigger>
<ContextMenuContent align='start' insets={contentInsets} className='w-64 native:w-72'>
<ContextMenuItem inset>
<Text>Back</Text>
<ContextMenuShortcut>⌘[</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem inset disabled>
<Text>Forward</Text>
<ContextMenuShortcut>⌘]</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem inset>
<Text>Reload</Text>
<ContextMenuShortcut>⌘R</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSub open={openSub} onOpenChange={setOpenSub}>
<ContextMenuSubTrigger inset>
<Text>More Tools</Text>
</ContextMenuSubTrigger>
<ContextMenuSubContent className='web:w-48 native:mt-1'>
<Animated.View entering={FadeIn.duration(200)}>
<ContextMenuItem>
<Text>Save Page As...</Text>
<ContextMenuShortcut>⇧⌘S</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
<Text>Create Shortcut...</Text>
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>
<Text>Developer Tools</Text>
</ContextMenuItem>
</Animated.View>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuCheckboxItem
checked={checkboxValue}
onCheckedChange={setCheckboxValue}
closeOnPress={false}
>
<Text>Show Bookmarks Bar</Text>
<ContextMenuShortcut>⌘⇧B</ContextMenuShortcut>
</ContextMenuCheckboxItem>
<ContextMenuCheckboxItem
checked={subCheckboxValue}
onCheckedChange={setSubCheckboxValue}
closeOnPress={false}
>
<Text>Show Full URLs</Text>
</ContextMenuCheckboxItem>
<ContextMenuSeparator />
<ContextMenuRadioGroup value={radioValue} onValueChange={setRadioValue}>
<ContextMenuLabel inset>People</ContextMenuLabel>
<ContextMenuSeparator />
<ContextMenuRadioItem value='pedro' closeOnPress={false}>
<Text>Elmer Fudd</Text>
</ContextMenuRadioItem>
<ContextMenuRadioItem value='colm' closeOnPress={false}>
<Text>Foghorn Leghorn</Text>
</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuContent>
</ContextMenu>
);
}

Props

ContextMenu

Extends View props

PropTypeNote
open*boolean
onOpenChange*(value: boolean) => void
asChildboolean(optional)
relativeTo’longPress’ | ‘trigger’Native Only_(optional)_

ContextMenuTrigger

Extends Pressable props

PropTypeNote
asChildboolean(optional)
insetboolean(optional)

ContextMenuPortal

PropTypeNote
children*React.ReactNode
forceMounttrue | undefined(optional)
hostNamestringWeb Only (optional)
containerHTMLElement | null | undefinedWeb Only (optional)

ContextMenuContent

Extends View props

PropTypeNote
asChildboolean(optional)
overlayStyleStyleProp<ViewStyle>(optional)
overlayClassNamestring(optional)
forceMounttrue | undefined(optional)
alignOffsetnumber(optional)
insetsInsets(optional)
avoidCollisionsboolean(optional)
align’start’ | ‘center’ | ‘end’(optional)
side’top’ | ‘bottom’(optional)
sideOffsetnumber(optional)
disablePositioningStylebooleanNative Only (optional)
loopbooleanWeb Only (optional)
onCloseAutoFocus(event: Event) => voidWeb Only (optional)
onEscapeKeyDown(event: KeyboardEvent) => voidWeb Only (optional)
onPointerDownOutside(event: PointerDownOutsideEvent) => voidWeb Only (optional)
onFocusOutside(event: FocusOutsideEvent) => voidWeb Only (optional)
onInteractOutsidePointerDownOutsideEvent | FocusOutsideEventWeb Only (optional)
collisionBoundaryElement | null | Array<Element | null>Web Only (optional)
sticky’partial’ | ‘always’Web Only (optional)
hideWhenDetachedbooleanWeb Only (optional)

ContextMenuGroup

Extends Text props

PropTypeNote
asChildboolean(optional)

ContextMenuLabel

Extends Text props

PropTypeNote
asChildboolean(optional)

ContextMenuItem

Extends Pressable props

PropTypeNote
asChildboolean(optional)
textValueboolean(optional)
closeOnPressboolean(optional)

ContextMenuCheckboxItem

Extends Pressable props

PropTypeNote
checked*boolean
onCheckedChange*(value: boolean) => void
textValue*string
asChildboolean(optional)
closeOnPressbooleanNative Only_(optional)_

ContextMenuRadioGroup

Extends View props

PropTypeNote
value*boolean
onValueChange*(value: boolean) => void
asChildboolean(optional)

ContextMenuRadioItem

Extends Pressable props

PropTypeNote
value*boolean
onCheckedChange*(value: boolean) => void
asChildboolean(optional)
closeOnPressbooleanNative Only_(optional)_

ContextMenuSeparator

Extends View props

PropTypeNote
asChildboolean(optional)
decorativeboolean(optional)

ContextMenuSub

Extends View props

PropTypeNote
asChildboolean(optional)
open*boolean
onOpenChange*(value: boolean) => void

ContextMenuSubTrigger

Extends Pressable props

PropTypeNote
textValuestring(optional)
asChildboolean(optional)

ContextMenuSubContent

Extends Pressable props

PropTypeNote
asChildboolean(optional)
forceMounttrue /undefined

ContextMenuShortcut

Extends Text props