react-native-hold-menu-actions 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,8 +38,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
38
38
  //#region dependencies
39
39
  //#endregion
40
40
  //#region utils & types
41
+ const defaultItems = [];
42
+
41
43
  const HoldItemComponent = ({
42
- items,
44
+ items = defaultItems,
43
45
  bottom,
44
46
  containerStyles,
45
47
  disableMove,
@@ -170,13 +172,19 @@ const HoldItemComponent = ({
170
172
  };
171
173
 
172
174
  const setContentRenderer = () => {
173
- contentRenderer.current = renderContent || null;
175
+ if (renderContent) {
176
+ contentRenderer.current = params => renderContent({
177
+ closeMenu: params
178
+ });
179
+ } else {
180
+ contentRenderer.current = null;
181
+ }
174
182
  };
175
183
 
176
184
  const onCompletion = isFinised => {
177
185
  'worklet';
178
186
 
179
- const isListValid = items && items.length > 0;
187
+ const isListValid = true; // items && items.length > 0;
180
188
 
181
189
  if (isFinised && isListValid) {
182
190
  state.value = _constants.CONTEXT_MENU_STATE.ACTIVE;
@@ -1 +1 @@
1
- {"version":3,"sources":["HoldItem.tsx"],"names":["HoldItemComponent","items","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","renderContent","state","menuProps","safeAreaInsets","contentRenderer","deviceOrientation","isActive","isAnimationStarted","itemRectY","itemRectX","itemRectWidth","itemRectHeight","itemScale","transformValue","transformOrigin","key","menuHeight","itemsWithSeparator","filter","item","withSeparator","length","isHold","containerRef","hapticResponse","style","Haptics","selectionAsync","impactAsync","ImpactFeedbackStyle","notificationAsync","NotificationFeedbackType","activateAnimation","ctx","didMeasureLayout","measured","value","pageY","pageX","height","width","position","WINDOW_WIDTH","WINDOW_HEIGHT","calculateTransformValue","isAnchorPointTop","tY","topTransform","styleGuide","spacing","bottomTransform","top","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","scaleBack","duration","HOLD_ITEM_TRANSFORM_DURATION","setContentRenderer","current","onCompletion","isFinised","isListValid","CONTEXT_MENU_STATE","ACTIVE","scaleHold","HOLD_ITEM_SCALE_DOWN_VALUE","HOLD_ITEM_SCALE_DOWN_DURATION","scaleTap","canCallActivateFunctions","willActivateWithTap","gestureEvent","onActive","_","context","onFinish","overlayGestureEvent","END","animatedContainerStyle","animateOpacity","opacity","transform","scale","containerStyle","React","useMemo","animatedPortalStyle","transformAnimation","SPRING_CONFIGURATION","zIndex","left","translateY","portalContainerStyle","styles","holdItem","animatedPortalProps","pointerEvents","_state","GestureHandler","handlerChildren","PortalOverlay","portalOverlay","HoldItem"],"mappings":"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","sourcesContent":["import React, { memo, useMemo } from 'react';\nimport { ViewProps } from 'react-native';\n\n//#region reanimated & gesture handler\nimport {\n TapGestureHandler,\n LongPressGestureHandler,\n TapGestureHandlerGestureEvent,\n LongPressGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedProps,\n useAnimatedRef,\n useAnimatedStyle,\n useSharedValue,\n withDelay,\n withTiming,\n withSequence,\n withSpring,\n useAnimatedReaction,\n} from 'react-native-reanimated';\n//#endregion\n\n//#region dependencies\nimport { Portal } from '@gorhom/portal';\nimport { nanoid } from 'nanoid/non-secure';\nimport * as Haptics from 'expo-haptics';\n//#endregion\n\n//#region utils & types\nimport {\n TransformOriginAnchorPosition,\n getTransformOrigin,\n calculateMenuHeight,\n} from '../../utils/calculations';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n HOLD_ITEM_SCALE_DOWN_DURATION,\n HOLD_ITEM_SCALE_DOWN_VALUE,\n SPRING_CONFIGURATION,\n WINDOW_HEIGHT,\n WINDOW_WIDTH,\n CONTEXT_MENU_STATE,\n} from '../../constants';\nimport { useDeviceOrientation } from '../../hooks';\nimport styles from './styles';\n\nimport type { HoldItemProps, GestureHandlerProps } from './types';\nimport styleGuide from '../../styleGuide';\nimport { useInternal } from '../../hooks';\n//#endregion\n\ntype Context = { didMeasureLayout: boolean };\n\nconst HoldItemComponent: React.FC<HoldItemProps> = ({\n items,\n bottom,\n containerStyles,\n disableMove,\n menuAnchorPosition,\n activateOn,\n hapticFeedback,\n actionParams,\n closeOnTap,\n longPressMinDurationMs = 150,\n children,\n renderContent,\n}) => {\n //#region hooks\n const { state, menuProps, safeAreaInsets, contentRenderer } = useInternal();\n const deviceOrientation = useDeviceOrientation();\n //#endregion\n\n //#region variables\n const isActive = useSharedValue(false);\n const isAnimationStarted = useSharedValue(false);\n\n const itemRectY = useSharedValue<number>(0);\n const itemRectX = useSharedValue<number>(0);\n const itemRectWidth = useSharedValue<number>(0);\n const itemRectHeight = useSharedValue<number>(0);\n const itemScale = useSharedValue<number>(1);\n const transformValue = useSharedValue<number>(0);\n\n const transformOrigin = useSharedValue<TransformOriginAnchorPosition>(\n menuAnchorPosition || 'top-right'\n );\n\n const key = useMemo(() => `hold-item-${nanoid()}`, []);\n const menuHeight = useMemo(() => {\n const itemsWithSeparator = items.filter(item => item.withSeparator);\n return calculateMenuHeight(items.length, itemsWithSeparator.length);\n }, [items]);\n\n const isHold = !activateOn || activateOn === 'hold';\n //#endregion\n\n //#region refs\n const containerRef = useAnimatedRef<Animated.View>();\n //#endregion\n\n //#region functions\n const hapticResponse = () => {\n const style = !hapticFeedback ? 'Medium' : hapticFeedback;\n switch (style) {\n case `Selection`:\n Haptics.selectionAsync();\n break;\n case `Light`:\n case `Medium`:\n case `Heavy`:\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle[style]);\n break;\n case `Success`:\n case `Warning`:\n case `Error`:\n Haptics.notificationAsync(Haptics.NotificationFeedbackType[style]);\n break;\n default:\n }\n };\n //#endregion\n\n //#region worklet functions\n const activateAnimation = (ctx: any) => {\n 'worklet';\n if (!ctx.didMeasureLayout) {\n const measured = measure(containerRef);\n\n itemRectY.value = measured.pageY;\n itemRectX.value = measured.pageX;\n itemRectHeight.value = measured.height;\n itemRectWidth.value = measured.width;\n\n if (!menuAnchorPosition) {\n const position = getTransformOrigin(\n measured.pageX,\n itemRectWidth.value,\n deviceOrientation === 'portrait' ? WINDOW_WIDTH : WINDOW_HEIGHT,\n bottom\n );\n transformOrigin.value = position;\n }\n }\n };\n\n const calculateTransformValue = () => {\n 'worklet';\n\n const height =\n deviceOrientation === 'portrait' ? WINDOW_HEIGHT : WINDOW_WIDTH;\n\n const isAnchorPointTop = itemRectY.value > WINDOW_HEIGHT / 2;\n\n let tY = 0;\n if (!disableMove) {\n if (isAnchorPointTop) {\n const topTransform =\n itemRectY.value +\n itemRectHeight.value +\n menuHeight +\n styleGuide.spacing +\n (safeAreaInsets?.bottom || 0);\n\n tY = topTransform > height ? height - topTransform : 0;\n } else {\n const bottomTransform =\n itemRectY.value - menuHeight - (safeAreaInsets?.top || 0);\n tY =\n bottomTransform < 0 ? -bottomTransform + styleGuide.spacing * 2 : 0;\n }\n }\n return tY;\n };\n\n const setMenuProps = () => {\n 'worklet';\n\n menuProps.value = {\n itemHeight: itemRectHeight.value,\n itemWidth: itemRectWidth.value,\n itemY: itemRectY.value,\n itemX: itemRectX.value,\n anchorPosition: transformOrigin.value,\n menuHeight: menuHeight,\n items,\n transformValue: transformValue.value,\n actionParams: actionParams || {},\n };\n };\n\n const scaleBack = () => {\n 'worklet';\n itemScale.value = withTiming(1, {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n });\n };\n\n const setContentRenderer = () => {\n contentRenderer.current = renderContent || null;\n };\n\n const onCompletion = (isFinised?: boolean) => {\n 'worklet';\n const isListValid = items && items.length > 0;\n if (isFinised && isListValid) {\n state.value = CONTEXT_MENU_STATE.ACTIVE;\n isActive.value = true;\n scaleBack();\n runOnJS(setContentRenderer)();\n if (hapticFeedback !== 'None') {\n runOnJS(hapticResponse)();\n }\n }\n\n isAnimationStarted.value = false;\n\n // TODO: Warn user if item list is empty or not given\n };\n\n const scaleHold = () => {\n 'worklet';\n itemScale.value = withTiming(\n HOLD_ITEM_SCALE_DOWN_VALUE,\n { duration: HOLD_ITEM_SCALE_DOWN_DURATION },\n onCompletion\n );\n };\n\n const scaleTap = () => {\n 'worklet';\n isAnimationStarted.value = true;\n\n itemScale.value = withSequence(\n withTiming(HOLD_ITEM_SCALE_DOWN_VALUE, {\n duration: HOLD_ITEM_SCALE_DOWN_DURATION,\n }),\n withTiming(\n 1,\n {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n },\n onCompletion\n )\n );\n };\n\n /**\n * When use tap activation (\"tap\") and trying to tap multiple times,\n * scale animation is called again despite it is started. This causes a bug.\n * To prevent this, it is better to check is animation already started.\n */\n const canCallActivateFunctions = () => {\n 'worklet';\n const willActivateWithTap =\n activateOn === 'double-tap' || activateOn === 'tap';\n\n return (\n (willActivateWithTap && !isAnimationStarted.value) || !willActivateWithTap\n );\n };\n //#endregion\n\n //#region gesture events\n const gestureEvent = useAnimatedGestureHandler<\n LongPressGestureHandlerGestureEvent | TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: (_, context) => {\n if (canCallActivateFunctions()) {\n if (!context.didMeasureLayout) {\n activateAnimation(context);\n transformValue.value = calculateTransformValue();\n setMenuProps();\n context.didMeasureLayout = true;\n }\n\n if (!isActive.value) {\n if (isHold) {\n scaleHold();\n } else {\n scaleTap();\n }\n }\n }\n },\n onFinish: (_, context) => {\n context.didMeasureLayout = false;\n if (isHold) {\n scaleBack();\n }\n },\n });\n\n const overlayGestureEvent = useAnimatedGestureHandler<\n TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: _ => {\n if (closeOnTap) state.value = CONTEXT_MENU_STATE.END;\n },\n });\n //#endregion\n\n //#region animated styles & props\n const animatedContainerStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(1, { duration: 0 }));\n\n return {\n opacity: isActive.value ? 0 : animateOpacity(),\n transform: [\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const containerStyle = React.useMemo(\n () => [containerStyles, animatedContainerStyle],\n [containerStyles, animatedContainerStyle]\n );\n\n const animatedPortalStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(0, { duration: 0 }));\n\n let tY = calculateTransformValue();\n const transformAnimation = () =>\n disableMove\n ? 0\n : isActive.value\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(-0.1, { duration: HOLD_ITEM_TRANSFORM_DURATION });\n\n return {\n zIndex: 10,\n position: 'absolute',\n top: itemRectY.value,\n left: itemRectX.value,\n width: itemRectWidth.value,\n height: itemRectHeight.value,\n opacity: isActive.value ? 1 : animateOpacity(),\n transform: [\n {\n translateY: transformAnimation(),\n },\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const portalContainerStyle = useMemo(\n () => [styles.holdItem, animatedPortalStyle],\n [animatedPortalStyle]\n );\n\n const animatedPortalProps = useAnimatedProps<ViewProps>(() => ({\n pointerEvents: isActive.value ? 'auto' : 'none',\n }));\n //#endregion\n\n //#region animated effects\n useAnimatedReaction(\n () => state.value,\n _state => {\n if (_state === CONTEXT_MENU_STATE.END) {\n isActive.value = false;\n }\n }\n );\n //#endregion\n\n //#region components\n const GestureHandler = useMemo(() => {\n switch (activateOn) {\n case `double-tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={2}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n case `tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n // default is hold\n default:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <LongPressGestureHandler\n minDurationMs={longPressMinDurationMs}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </LongPressGestureHandler>\n );\n }\n }, [activateOn, gestureEvent]);\n\n const PortalOverlay = useMemo(() => {\n return () => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={overlayGestureEvent}\n >\n <Animated.View style={styles.portalOverlay} />\n </TapGestureHandler>\n );\n }, [overlayGestureEvent]);\n //#endregion\n\n //#region render\n return (\n <>\n <GestureHandler>\n <Animated.View ref={containerRef} style={containerStyle}>\n {children}\n </Animated.View>\n </GestureHandler>\n\n <Portal key={key} name={key}>\n <Animated.View\n key={key}\n style={portalContainerStyle}\n animatedProps={animatedPortalProps}\n >\n <PortalOverlay />\n {children}\n </Animated.View>\n </Portal>\n </>\n );\n //#endregion\n};\n\nconst HoldItem = memo(HoldItemComponent) as React.FC<HoldItemProps>;\n\nexport default HoldItem;\n"]}
1
+ {"version":3,"sources":["HoldItem.tsx"],"names":["defaultItems","HoldItemComponent","items","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","renderContent","state","menuProps","safeAreaInsets","contentRenderer","deviceOrientation","isActive","isAnimationStarted","itemRectY","itemRectX","itemRectWidth","itemRectHeight","itemScale","transformValue","transformOrigin","key","menuHeight","itemsWithSeparator","filter","item","withSeparator","length","isHold","containerRef","hapticResponse","style","Haptics","selectionAsync","impactAsync","ImpactFeedbackStyle","notificationAsync","NotificationFeedbackType","activateAnimation","ctx","didMeasureLayout","measured","value","pageY","pageX","height","width","position","WINDOW_WIDTH","WINDOW_HEIGHT","calculateTransformValue","isAnchorPointTop","tY","topTransform","styleGuide","spacing","bottomTransform","top","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","scaleBack","duration","HOLD_ITEM_TRANSFORM_DURATION","setContentRenderer","current","params","closeMenu","onCompletion","isFinised","isListValid","CONTEXT_MENU_STATE","ACTIVE","scaleHold","HOLD_ITEM_SCALE_DOWN_VALUE","HOLD_ITEM_SCALE_DOWN_DURATION","scaleTap","canCallActivateFunctions","willActivateWithTap","gestureEvent","onActive","_","context","onFinish","overlayGestureEvent","END","animatedContainerStyle","animateOpacity","opacity","transform","scale","containerStyle","React","useMemo","animatedPortalStyle","transformAnimation","SPRING_CONFIGURATION","zIndex","left","translateY","portalContainerStyle","styles","holdItem","animatedPortalProps","pointerEvents","_state","GestureHandler","handlerChildren","PortalOverlay","portalOverlay","HoldItem"],"mappings":"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","sourcesContent":["import React, { memo, useMemo } from 'react';\nimport { ViewProps } from 'react-native';\n\n//#region reanimated & gesture handler\nimport {\n TapGestureHandler,\n LongPressGestureHandler,\n TapGestureHandlerGestureEvent,\n LongPressGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedProps,\n useAnimatedRef,\n useAnimatedStyle,\n useSharedValue,\n withDelay,\n withTiming,\n withSequence,\n withSpring,\n useAnimatedReaction,\n} from 'react-native-reanimated';\n//#endregion\n\n//#region dependencies\nimport { Portal } from '@gorhom/portal';\nimport { nanoid } from 'nanoid/non-secure';\nimport * as Haptics from 'expo-haptics';\n//#endregion\n\n//#region utils & types\nimport {\n TransformOriginAnchorPosition,\n getTransformOrigin,\n calculateMenuHeight,\n} from '../../utils/calculations';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n HOLD_ITEM_SCALE_DOWN_DURATION,\n HOLD_ITEM_SCALE_DOWN_VALUE,\n SPRING_CONFIGURATION,\n WINDOW_HEIGHT,\n WINDOW_WIDTH,\n CONTEXT_MENU_STATE,\n} from '../../constants';\nimport { useDeviceOrientation } from '../../hooks';\nimport styles from './styles';\n\nimport type { HoldItemProps, GestureHandlerProps } from './types';\nimport styleGuide from '../../styleGuide';\nimport { useInternal } from '../../hooks';\nimport { MenuItemProps } from '../menu/types';\n//#endregion\n\ntype Context = { didMeasureLayout: boolean };\nconst defaultItems = [] as MenuItemProps[];\nconst HoldItemComponent: React.FC<HoldItemProps> = ({\n items = defaultItems,\n bottom,\n containerStyles,\n disableMove,\n menuAnchorPosition,\n activateOn,\n hapticFeedback,\n actionParams,\n closeOnTap,\n longPressMinDurationMs = 150,\n children,\n renderContent,\n}) => {\n //#region hooks\n const { state, menuProps, safeAreaInsets, contentRenderer } = useInternal();\n const deviceOrientation = useDeviceOrientation();\n //#endregion\n\n //#region variables\n const isActive = useSharedValue(false);\n const isAnimationStarted = useSharedValue(false);\n\n const itemRectY = useSharedValue<number>(0);\n const itemRectX = useSharedValue<number>(0);\n const itemRectWidth = useSharedValue<number>(0);\n const itemRectHeight = useSharedValue<number>(0);\n const itemScale = useSharedValue<number>(1);\n const transformValue = useSharedValue<number>(0);\n\n const transformOrigin = useSharedValue<TransformOriginAnchorPosition>(\n menuAnchorPosition || 'top-right'\n );\n\n const key = useMemo(() => `hold-item-${nanoid()}`, []);\n const menuHeight = useMemo(() => {\n const itemsWithSeparator = items.filter(item => item.withSeparator);\n return calculateMenuHeight(items.length, itemsWithSeparator.length);\n }, [items]);\n\n const isHold = !activateOn || activateOn === 'hold';\n //#endregion\n\n //#region refs\n const containerRef = useAnimatedRef<Animated.View>();\n //#endregion\n\n //#region functions\n const hapticResponse = () => {\n const style = !hapticFeedback ? 'Medium' : hapticFeedback;\n switch (style) {\n case `Selection`:\n Haptics.selectionAsync();\n break;\n case `Light`:\n case `Medium`:\n case `Heavy`:\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle[style]);\n break;\n case `Success`:\n case `Warning`:\n case `Error`:\n Haptics.notificationAsync(Haptics.NotificationFeedbackType[style]);\n break;\n default:\n }\n };\n //#endregion\n\n //#region worklet functions\n const activateAnimation = (ctx: any) => {\n 'worklet';\n if (!ctx.didMeasureLayout) {\n const measured = measure(containerRef);\n\n itemRectY.value = measured.pageY;\n itemRectX.value = measured.pageX;\n itemRectHeight.value = measured.height;\n itemRectWidth.value = measured.width;\n\n if (!menuAnchorPosition) {\n const position = getTransformOrigin(\n measured.pageX,\n itemRectWidth.value,\n deviceOrientation === 'portrait' ? WINDOW_WIDTH : WINDOW_HEIGHT,\n bottom\n );\n transformOrigin.value = position;\n }\n }\n };\n\n const calculateTransformValue = () => {\n 'worklet';\n\n const height =\n deviceOrientation === 'portrait' ? WINDOW_HEIGHT : WINDOW_WIDTH;\n\n const isAnchorPointTop = itemRectY.value > WINDOW_HEIGHT / 2;\n\n let tY = 0;\n if (!disableMove) {\n if (isAnchorPointTop) {\n const topTransform =\n itemRectY.value +\n itemRectHeight.value +\n menuHeight +\n styleGuide.spacing +\n (safeAreaInsets?.bottom || 0);\n\n tY = topTransform > height ? height - topTransform : 0;\n } else {\n const bottomTransform =\n itemRectY.value - menuHeight - (safeAreaInsets?.top || 0);\n tY =\n bottomTransform < 0 ? -bottomTransform + styleGuide.spacing * 2 : 0;\n }\n }\n return tY;\n };\n\n const setMenuProps = () => {\n 'worklet';\n\n menuProps.value = {\n itemHeight: itemRectHeight.value,\n itemWidth: itemRectWidth.value,\n itemY: itemRectY.value,\n itemX: itemRectX.value,\n anchorPosition: transformOrigin.value,\n menuHeight: menuHeight,\n items,\n transformValue: transformValue.value,\n actionParams: actionParams || {},\n };\n };\n\n const scaleBack = () => {\n 'worklet';\n itemScale.value = withTiming(1, {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n });\n };\n\n const setContentRenderer = () => {\n if (renderContent) {\n contentRenderer.current = (params: any) =>\n renderContent({ closeMenu: params });\n } else {\n contentRenderer.current = null;\n }\n };\n\n const onCompletion = (isFinised?: boolean) => {\n 'worklet';\n const isListValid = true;\n // items && items.length > 0;\n if (isFinised && isListValid) {\n state.value = CONTEXT_MENU_STATE.ACTIVE;\n isActive.value = true;\n scaleBack();\n runOnJS(setContentRenderer)();\n if (hapticFeedback !== 'None') {\n runOnJS(hapticResponse)();\n }\n }\n\n isAnimationStarted.value = false;\n\n // TODO: Warn user if item list is empty or not given\n };\n\n const scaleHold = () => {\n 'worklet';\n itemScale.value = withTiming(\n HOLD_ITEM_SCALE_DOWN_VALUE,\n { duration: HOLD_ITEM_SCALE_DOWN_DURATION },\n onCompletion\n );\n };\n\n const scaleTap = () => {\n 'worklet';\n isAnimationStarted.value = true;\n\n itemScale.value = withSequence(\n withTiming(HOLD_ITEM_SCALE_DOWN_VALUE, {\n duration: HOLD_ITEM_SCALE_DOWN_DURATION,\n }),\n withTiming(\n 1,\n {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n },\n onCompletion\n )\n );\n };\n\n /**\n * When use tap activation (\"tap\") and trying to tap multiple times,\n * scale animation is called again despite it is started. This causes a bug.\n * To prevent this, it is better to check is animation already started.\n */\n const canCallActivateFunctions = () => {\n 'worklet';\n const willActivateWithTap =\n activateOn === 'double-tap' || activateOn === 'tap';\n\n return (\n (willActivateWithTap && !isAnimationStarted.value) || !willActivateWithTap\n );\n };\n //#endregion\n\n //#region gesture events\n const gestureEvent = useAnimatedGestureHandler<\n LongPressGestureHandlerGestureEvent | TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: (_, context) => {\n if (canCallActivateFunctions()) {\n if (!context.didMeasureLayout) {\n activateAnimation(context);\n transformValue.value = calculateTransformValue();\n setMenuProps();\n context.didMeasureLayout = true;\n }\n\n if (!isActive.value) {\n if (isHold) {\n scaleHold();\n } else {\n scaleTap();\n }\n }\n }\n },\n onFinish: (_, context) => {\n context.didMeasureLayout = false;\n if (isHold) {\n scaleBack();\n }\n },\n });\n\n const overlayGestureEvent = useAnimatedGestureHandler<\n TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: _ => {\n if (closeOnTap) state.value = CONTEXT_MENU_STATE.END;\n },\n });\n //#endregion\n\n //#region animated styles & props\n const animatedContainerStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(1, { duration: 0 }));\n\n return {\n opacity: isActive.value ? 0 : animateOpacity(),\n transform: [\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const containerStyle = React.useMemo(\n () => [containerStyles, animatedContainerStyle],\n [containerStyles, animatedContainerStyle]\n );\n\n const animatedPortalStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(0, { duration: 0 }));\n\n let tY = calculateTransformValue();\n const transformAnimation = () =>\n disableMove\n ? 0\n : isActive.value\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(-0.1, { duration: HOLD_ITEM_TRANSFORM_DURATION });\n\n return {\n zIndex: 10,\n position: 'absolute',\n top: itemRectY.value,\n left: itemRectX.value,\n width: itemRectWidth.value,\n height: itemRectHeight.value,\n opacity: isActive.value ? 1 : animateOpacity(),\n transform: [\n {\n translateY: transformAnimation(),\n },\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const portalContainerStyle = useMemo(\n () => [styles.holdItem, animatedPortalStyle],\n [animatedPortalStyle]\n );\n\n const animatedPortalProps = useAnimatedProps<ViewProps>(() => ({\n pointerEvents: isActive.value ? 'auto' : 'none',\n }));\n //#endregion\n\n //#region animated effects\n useAnimatedReaction(\n () => state.value,\n _state => {\n if (_state === CONTEXT_MENU_STATE.END) {\n isActive.value = false;\n }\n }\n );\n //#endregion\n\n //#region components\n const GestureHandler = useMemo(() => {\n switch (activateOn) {\n case `double-tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={2}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n case `tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n // default is hold\n default:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <LongPressGestureHandler\n minDurationMs={longPressMinDurationMs}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </LongPressGestureHandler>\n );\n }\n }, [activateOn, gestureEvent]);\n\n const PortalOverlay = useMemo(() => {\n return () => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={overlayGestureEvent}\n >\n <Animated.View style={styles.portalOverlay} />\n </TapGestureHandler>\n );\n }, [overlayGestureEvent]);\n //#endregion\n\n //#region render\n return (\n <>\n <GestureHandler>\n <Animated.View ref={containerRef} style={containerStyle}>\n {children}\n </Animated.View>\n </GestureHandler>\n\n <Portal key={key} name={key}>\n <Animated.View\n key={key}\n style={portalContainerStyle}\n animatedProps={animatedPortalProps}\n >\n <PortalOverlay />\n {children}\n </Animated.View>\n </Portal>\n </>\n );\n //#endregion\n};\n\nconst HoldItem = memo(HoldItemComponent) as React.FC<HoldItemProps>;\n\nexport default HoldItem;\n"]}
@@ -53,6 +53,8 @@ const Content = () => {
53
53
  };
54
54
  }, [menuProps]);
55
55
 
56
+ const closeMenu = () => state.value = _constants.CONTEXT_MENU_STATE.END;
57
+
56
58
  if (!renderContent) {
57
59
  return null;
58
60
  }
@@ -64,7 +66,7 @@ const Content = () => {
64
66
  left: 0,
65
67
  zIndex: 12
66
68
  }, wrapperStyles]
67
- }, isActive && renderContent());
69
+ }, isActive && renderContent(closeMenu));
68
70
  };
69
71
 
70
72
  var _default = Content;
@@ -1 +1 @@
1
- {"version":3,"sources":["Content.tsx"],"names":["Content","state","menuProps","contentRenderer","isActive","setIsActive","contentHeight","handleLayout","event","value","nativeEvent","layout","height","val","CONTEXT_MENU_STATE","ACTIVE","renderContent","current","wrapperStyles","anchorPositionVertical","anchorPosition","split","anchorPositionHorizontal","top","itemY","itemHeight","left","itemX","itemWidth","undefined","right","tY","transformValue","opacity","transform","translateY","SPRING_CONFIGURATION","duration","HOLD_ITEM_TRANSFORM_DURATION","position","zIndex"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { useInternal } from '../../hooks';\nimport {\n CONTEXT_MENU_STATE,\n HOLD_ITEM_TRANSFORM_DURATION,\n SPRING_CONFIGURATION,\n} from '../../constants';\n\nconst Content = () => {\n const { state, menuProps, contentRenderer } = useInternal();\n const [isActive, setIsActive] = useState(false);\n const contentHeight = useSharedValue(0);\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n contentHeight.value = event.nativeEvent.layout.height;\n },\n [contentHeight]\n );\n\n // синхронизируем Reanimated state → React state\n useAnimatedReaction(\n () => state.value,\n val => {\n runOnJS(setIsActive)(val === CONTEXT_MENU_STATE.ACTIVE);\n }\n );\n\n const renderContent = contentRenderer.current;\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n const anchorPositionHorizontal = menuProps.value.anchorPosition.split(\n '-'\n )[1];\n\n const top =\n anchorPositionVertical === 'top'\n ? menuProps.value.itemY - contentHeight.value - 8\n : menuProps.value.itemY + menuProps.value.itemHeight + 8;\n\n const left =\n anchorPositionHorizontal === 'center'\n ? menuProps.value.itemX / 2 - menuProps.value.itemWidth / 3\n : anchorPositionHorizontal === 'right'\n ? undefined\n : menuProps.value.itemX;\n const right = anchorPositionHorizontal === 'right' ? 0 : undefined;\n\n const tY = menuProps.value.transformValue;\n return {\n opacity:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withTiming(1)\n : withTiming(0),\n top,\n left,\n right,\n transform: [\n {\n translateY:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(0, { duration: HOLD_ITEM_TRANSFORM_DURATION }),\n },\n ],\n };\n }, [menuProps]);\n if (!renderContent) {\n return null;\n }\n return (\n <Animated.View\n onLayout={handleLayout}\n style={[{ position: 'absolute', left: 0, zIndex: 12 }, wrapperStyles]}\n >\n {isActive && renderContent()}\n </Animated.View>\n );\n};\n\nexport default Content;\n"]}
1
+ {"version":3,"sources":["Content.tsx"],"names":["Content","state","menuProps","contentRenderer","isActive","setIsActive","contentHeight","handleLayout","event","value","nativeEvent","layout","height","val","CONTEXT_MENU_STATE","ACTIVE","renderContent","current","wrapperStyles","anchorPositionVertical","anchorPosition","split","anchorPositionHorizontal","top","itemY","itemHeight","left","itemX","itemWidth","undefined","right","tY","transformValue","opacity","transform","translateY","SPRING_CONFIGURATION","duration","HOLD_ITEM_TRANSFORM_DURATION","closeMenu","END","position","zIndex"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { useInternal } from '../../hooks';\nimport {\n CONTEXT_MENU_STATE,\n HOLD_ITEM_TRANSFORM_DURATION,\n SPRING_CONFIGURATION,\n} from '../../constants';\n\nconst Content = () => {\n const { state, menuProps, contentRenderer } = useInternal();\n const [isActive, setIsActive] = useState(false);\n const contentHeight = useSharedValue(0);\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n contentHeight.value = event.nativeEvent.layout.height;\n },\n [contentHeight]\n );\n\n // синхронизируем Reanimated state → React state\n useAnimatedReaction(\n () => state.value,\n val => {\n runOnJS(setIsActive)(val === CONTEXT_MENU_STATE.ACTIVE);\n }\n );\n\n const renderContent = contentRenderer.current;\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n const anchorPositionHorizontal = menuProps.value.anchorPosition.split(\n '-'\n )[1];\n\n const top =\n anchorPositionVertical === 'top'\n ? menuProps.value.itemY - contentHeight.value - 8\n : menuProps.value.itemY + menuProps.value.itemHeight + 8;\n\n const left =\n anchorPositionHorizontal === 'center'\n ? menuProps.value.itemX / 2 - menuProps.value.itemWidth / 3\n : anchorPositionHorizontal === 'right'\n ? undefined\n : menuProps.value.itemX;\n const right = anchorPositionHorizontal === 'right' ? 0 : undefined;\n\n const tY = menuProps.value.transformValue;\n return {\n opacity:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withTiming(1)\n : withTiming(0),\n top,\n left,\n right,\n transform: [\n {\n translateY:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(0, { duration: HOLD_ITEM_TRANSFORM_DURATION }),\n },\n ],\n };\n }, [menuProps]);\n\n const closeMenu = () => (state.value = CONTEXT_MENU_STATE.END);\n\n if (!renderContent) {\n return null;\n }\n return (\n <Animated.View\n onLayout={handleLayout}\n style={[{ position: 'absolute', left: 0, zIndex: 12 }, wrapperStyles]}\n >\n {isActive && renderContent(closeMenu)}\n </Animated.View>\n );\n};\n\nexport default Content;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["Provider.tsx"],"names":["AnimatedIcon","ProviderComponent","children","theme","selectedTheme","iconComponent","safeAreaInsets","onOpen","onClose","Animated","createAnimatedComponent","state","CONTEXT_MENU_STATE","UNDETERMINED","menuProps","itemHeight","itemWidth","itemX","itemY","items","anchorPosition","menuHeight","transformValue","actionParams","contentRenderer","value","ACTIVE","END","internalContextVariables","top","bottom","left","right","flex","Provider"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAKA;;AAGA;;AAGA;;AAGA;;AAEA;;AACA;;;;;;;;AAVA;AAGA;AAcO,IAAIA,YAAJ;;;AAEP,MAAMC,iBAAkD,GAAG,CAAC;AAC1DC,EAAAA,QAD0D;AAE1DC,EAAAA,KAAK,EAAEC,aAFmD;AAG1DC,EAAAA,aAH0D;AAI1DC,EAAAA,cAJ0D;AAK1DC,EAAAA,MAL0D;AAM1DC,EAAAA;AAN0D,CAAD,KAOrD;AACJ,MAAIH,aAAJ,EACE,uBAAAL,YAAY,GAAGS,+BAASC,uBAAT,CAAiCL,aAAjC,CAAf;AAEF,QAAMM,KAAK,GAAG,2CACZC,8BAAmBC,YADP,CAAd;AAGA,QAAMV,KAAK,GAAG,2CAAiCC,aAAa,IAAI,OAAlD,CAAd;AACA,QAAMU,SAAS,GAAG,2CAAkC;AAClDC,IAAAA,UAAU,EAAE,CADsC;AAElDC,IAAAA,SAAS,EAAE,CAFuC;AAGlDC,IAAAA,KAAK,EAAE,CAH2C;AAIlDC,IAAAA,KAAK,EAAE,CAJ2C;AAKlDC,IAAAA,KAAK,EAAE,EAL2C;AAMlDC,IAAAA,cAAc,EAAE,YANkC;AAOlDC,IAAAA,UAAU,EAAE,CAPsC;AAQlDC,IAAAA,cAAc,EAAE,CARkC;AASlDC,IAAAA,YAAY,EAAE;AAToC,GAAlC,CAAlB;AAWA,QAAMC,eAAe,GAAG,mBAAuC,IAAvC,CAAxB;AAEA,wBAAU,MAAM;AACdrB,IAAAA,KAAK,CAACsB,KAAN,GAAcrB,aAAa,IAAI,OAA/B,CADc,CAEd;AACD,GAHD,EAGG,CAACA,aAAD,CAHH;AAKA,kDACE,MAAMO,KAAK,CAACc,KADd,EAEEd,KAAK,IAAI;AACP,YAAQA,KAAR;AACE,WAAKC,8BAAmBc,MAAxB;AAAgC;AAC9B,cAAInB,MAAJ,EAAY,oCAAQA,MAAR;AACZ;AACD;;AACD,WAAKK,8BAAmBe,GAAxB;AAA6B;AAC3B,cAAInB,OAAJ,EAAa,oCAAQA,OAAR;AACb;AACD;AARH;AAUD,GAbH,EAcE,CAACG,KAAD,CAdF;AAiBA,QAAMiB,wBAAwB,GAAG,oBAC/B,OAAO;AACLjB,IAAAA,KADK;AAELR,IAAAA,KAFK;AAGLW,IAAAA,SAHK;AAILU,IAAAA,eAJK;AAKLlB,IAAAA,cAAc,EAAEA,cAAc,IAAI;AAChCuB,MAAAA,GAAG,EAAE,CAD2B;AAEhCC,MAAAA,MAAM,EAAE,CAFwB;AAGhCC,MAAAA,IAAI,EAAE,CAH0B;AAIhCC,MAAAA,KAAK,EAAE;AAJyB;AAL7B,GAAP,CAD+B,EAa/B,CAACrB,KAAD,EAAQR,KAAR,EAAeW,SAAf,EAA0BR,cAA1B,CAb+B,CAAjC;AAgBA,sBACE,6BAAC,iDAAD;AAAwB,IAAA,KAAK,EAAE;AAAE2B,MAAAA,IAAI,EAAE;AAAR;AAA/B,kBACE,6BAAC,yBAAD,CAAiB,QAAjB;AAA0B,IAAA,KAAK,EAAEL;AAAjC,kBACE,6BAAC,sBAAD,QACG1B,QADH,eAEE,6BAAC,kBAAD,OAFF,eAGE,6BAAC,aAAD,OAHF,eAIE,6BAAC,gBAAD,OAJF,CADF,CADF,CADF;AAYD,CA9ED;;AAgFA,MAAMgC,QAAQ,gBAAG,iBAAKjC,iBAAL,CAAjB;eAEeiC,Q","sourcesContent":["import React, { memo, useEffect, useMemo, useRef } from 'react';\nimport { PortalProvider } from '@gorhom/portal';\nimport Animated, {\n useSharedValue,\n useAnimatedReaction,\n runOnJS,\n} from 'react-native-reanimated';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\n// Components\nimport { Backdrop } from '../backdrop';\n\n// Utils\nimport { InternalContext } from '../../context/internal';\nimport { HoldMenuProviderProps } from './types';\nimport { StateProps, Action } from './reducer';\nimport { CONTEXT_MENU_STATE } from '../../constants';\nimport { MenuInternalProps } from '../menu/types';\nimport Menu from '../menu';\nimport Content from './Content';\n\nexport interface Store {\n state: StateProps;\n dispatch?: React.Dispatch<Action>;\n}\n\nexport let AnimatedIcon: any;\n\nconst ProviderComponent: React.FC<HoldMenuProviderProps> = ({\n children,\n theme: selectedTheme,\n iconComponent,\n safeAreaInsets,\n onOpen,\n onClose,\n}) => {\n if (iconComponent)\n AnimatedIcon = Animated.createAnimatedComponent(iconComponent);\n\n const state = useSharedValue<CONTEXT_MENU_STATE>(\n CONTEXT_MENU_STATE.UNDETERMINED\n );\n const theme = useSharedValue<'light' | 'dark'>(selectedTheme || 'light');\n const menuProps = useSharedValue<MenuInternalProps>({\n itemHeight: 0,\n itemWidth: 0,\n itemX: 0,\n itemY: 0,\n items: [],\n anchorPosition: 'top-center',\n menuHeight: 0,\n transformValue: 0,\n actionParams: {},\n });\n const contentRenderer = useRef<(() => React.ReactNode) | null>(null);\n\n useEffect(() => {\n theme.value = selectedTheme || 'light';\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTheme]);\n\n useAnimatedReaction(\n () => state.value,\n state => {\n switch (state) {\n case CONTEXT_MENU_STATE.ACTIVE: {\n if (onOpen) runOnJS(onOpen)();\n break;\n }\n case CONTEXT_MENU_STATE.END: {\n if (onClose) runOnJS(onClose)();\n break;\n }\n }\n },\n [state]\n );\n\n const internalContextVariables = useMemo(\n () => ({\n state,\n theme,\n menuProps,\n contentRenderer,\n safeAreaInsets: safeAreaInsets || {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n }),\n [state, theme, menuProps, safeAreaInsets]\n );\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <InternalContext.Provider value={internalContextVariables}>\n <PortalProvider>\n {children}\n <Backdrop />\n <Menu />\n <Content />\n </PortalProvider>\n </InternalContext.Provider>\n </GestureHandlerRootView>\n );\n};\n\nconst Provider = memo(ProviderComponent) as React.FC<HoldMenuProviderProps>;\n\nexport default Provider;\n"]}
1
+ {"version":3,"sources":["Provider.tsx"],"names":["AnimatedIcon","ProviderComponent","children","theme","selectedTheme","iconComponent","safeAreaInsets","onOpen","onClose","Animated","createAnimatedComponent","state","CONTEXT_MENU_STATE","UNDETERMINED","menuProps","itemHeight","itemWidth","itemX","itemY","items","anchorPosition","menuHeight","transformValue","actionParams","contentRenderer","value","ACTIVE","END","internalContextVariables","top","bottom","left","right","flex","Provider"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAKA;;AAGA;;AAGA;;AAGA;;AAEA;;AACA;;;;;;;;AAVA;AAGA;AAcO,IAAIA,YAAJ;;;AAEP,MAAMC,iBAAkD,GAAG,CAAC;AAC1DC,EAAAA,QAD0D;AAE1DC,EAAAA,KAAK,EAAEC,aAFmD;AAG1DC,EAAAA,aAH0D;AAI1DC,EAAAA,cAJ0D;AAK1DC,EAAAA,MAL0D;AAM1DC,EAAAA;AAN0D,CAAD,KAOrD;AACJ,MAAIH,aAAJ,EACE,uBAAAL,YAAY,GAAGS,+BAASC,uBAAT,CAAiCL,aAAjC,CAAf;AAEF,QAAMM,KAAK,GAAG,2CACZC,8BAAmBC,YADP,CAAd;AAGA,QAAMV,KAAK,GAAG,2CAAiCC,aAAa,IAAI,OAAlD,CAAd;AACA,QAAMU,SAAS,GAAG,2CAAkC;AAClDC,IAAAA,UAAU,EAAE,CADsC;AAElDC,IAAAA,SAAS,EAAE,CAFuC;AAGlDC,IAAAA,KAAK,EAAE,CAH2C;AAIlDC,IAAAA,KAAK,EAAE,CAJ2C;AAKlDC,IAAAA,KAAK,EAAE,EAL2C;AAMlDC,IAAAA,cAAc,EAAE,YANkC;AAOlDC,IAAAA,UAAU,EAAE,CAPsC;AAQlDC,IAAAA,cAAc,EAAE,CARkC;AASlDC,IAAAA,YAAY,EAAE;AAToC,GAAlC,CAAlB;AAWA,QAAMC,eAAe,GAAG,mBACtB,IADsB,CAAxB;AAIA,wBAAU,MAAM;AACdrB,IAAAA,KAAK,CAACsB,KAAN,GAAcrB,aAAa,IAAI,OAA/B,CADc,CAEd;AACD,GAHD,EAGG,CAACA,aAAD,CAHH;AAKA,kDACE,MAAMO,KAAK,CAACc,KADd,EAEEd,KAAK,IAAI;AACP,YAAQA,KAAR;AACE,WAAKC,8BAAmBc,MAAxB;AAAgC;AAC9B,cAAInB,MAAJ,EAAY,oCAAQA,MAAR;AACZ;AACD;;AACD,WAAKK,8BAAmBe,GAAxB;AAA6B;AAC3B,cAAInB,OAAJ,EAAa,oCAAQA,OAAR;AACb;AACD;AARH;AAUD,GAbH,EAcE,CAACG,KAAD,CAdF;AAiBA,QAAMiB,wBAAwB,GAAG,oBAC/B,OAAO;AACLjB,IAAAA,KADK;AAELR,IAAAA,KAFK;AAGLW,IAAAA,SAHK;AAILU,IAAAA,eAJK;AAKLlB,IAAAA,cAAc,EAAEA,cAAc,IAAI;AAChCuB,MAAAA,GAAG,EAAE,CAD2B;AAEhCC,MAAAA,MAAM,EAAE,CAFwB;AAGhCC,MAAAA,IAAI,EAAE,CAH0B;AAIhCC,MAAAA,KAAK,EAAE;AAJyB;AAL7B,GAAP,CAD+B,EAa/B,CAACrB,KAAD,EAAQR,KAAR,EAAeW,SAAf,EAA0BR,cAA1B,CAb+B,CAAjC;AAgBA,sBACE,6BAAC,iDAAD;AAAwB,IAAA,KAAK,EAAE;AAAE2B,MAAAA,IAAI,EAAE;AAAR;AAA/B,kBACE,6BAAC,yBAAD,CAAiB,QAAjB;AAA0B,IAAA,KAAK,EAAEL;AAAjC,kBACE,6BAAC,sBAAD,QACG1B,QADH,eAEE,6BAAC,kBAAD,OAFF,eAGE,6BAAC,aAAD,OAHF,eAIE,6BAAC,gBAAD,OAJF,CADF,CADF,CADF;AAYD,CAhFD;;AAkFA,MAAMgC,QAAQ,gBAAG,iBAAKjC,iBAAL,CAAjB;eAEeiC,Q","sourcesContent":["import React, { memo, useEffect, useMemo, useRef } from 'react';\nimport { PortalProvider } from '@gorhom/portal';\nimport Animated, {\n useSharedValue,\n useAnimatedReaction,\n runOnJS,\n} from 'react-native-reanimated';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\n// Components\nimport { Backdrop } from '../backdrop';\n\n// Utils\nimport { InternalContext } from '../../context/internal';\nimport { HoldMenuProviderProps } from './types';\nimport { StateProps, Action } from './reducer';\nimport { CONTEXT_MENU_STATE } from '../../constants';\nimport { MenuInternalProps } from '../menu/types';\nimport Menu from '../menu';\nimport Content from './Content';\n\nexport interface Store {\n state: StateProps;\n dispatch?: React.Dispatch<Action>;\n}\n\nexport let AnimatedIcon: any;\n\nconst ProviderComponent: React.FC<HoldMenuProviderProps> = ({\n children,\n theme: selectedTheme,\n iconComponent,\n safeAreaInsets,\n onOpen,\n onClose,\n}) => {\n if (iconComponent)\n AnimatedIcon = Animated.createAnimatedComponent(iconComponent);\n\n const state = useSharedValue<CONTEXT_MENU_STATE>(\n CONTEXT_MENU_STATE.UNDETERMINED\n );\n const theme = useSharedValue<'light' | 'dark'>(selectedTheme || 'light');\n const menuProps = useSharedValue<MenuInternalProps>({\n itemHeight: 0,\n itemWidth: 0,\n itemX: 0,\n itemY: 0,\n items: [],\n anchorPosition: 'top-center',\n menuHeight: 0,\n transformValue: 0,\n actionParams: {},\n });\n const contentRenderer = useRef<((params: any) => React.ReactNode) | null>(\n null\n );\n\n useEffect(() => {\n theme.value = selectedTheme || 'light';\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTheme]);\n\n useAnimatedReaction(\n () => state.value,\n state => {\n switch (state) {\n case CONTEXT_MENU_STATE.ACTIVE: {\n if (onOpen) runOnJS(onOpen)();\n break;\n }\n case CONTEXT_MENU_STATE.END: {\n if (onClose) runOnJS(onClose)();\n break;\n }\n }\n },\n [state]\n );\n\n const internalContextVariables = useMemo(\n () => ({\n state,\n theme,\n menuProps,\n contentRenderer,\n safeAreaInsets: safeAreaInsets || {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n }),\n [state, theme, menuProps, safeAreaInsets]\n );\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <InternalContext.Provider value={internalContextVariables}>\n <PortalProvider>\n {children}\n <Backdrop />\n <Menu />\n <Content />\n </PortalProvider>\n </InternalContext.Provider>\n </GestureHandlerRootView>\n );\n};\n\nconst Provider = memo(ProviderComponent) as React.FC<HoldMenuProviderProps>;\n\nexport default Provider;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["internal.ts"],"names":["InternalContext"],"mappings":";;;;;;;AAAA;;AAuBA;AACO,MAAMA,eAAe,gBAAG,2BAAxB","sourcesContent":["import { createContext } from 'react';\nimport type { MutableRefObject } from 'react';\nimport type Animated from 'react-native-reanimated';\nimport type { CONTEXT_MENU_STATE } from '../constants';\nimport { MenuInternalProps } from '../components/menu/types';\n\nexport type ContentRendererRef = MutableRefObject<\n (() => React.ReactNode) | null\n>;\n\nexport type InternalContextType = {\n state: Animated.SharedValue<CONTEXT_MENU_STATE>;\n theme: Animated.SharedValue<'light' | 'dark'>;\n menuProps: Animated.SharedValue<MenuInternalProps>;\n contentRenderer: ContentRendererRef;\n safeAreaInsets?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n};\n\n// @ts-ignore\nexport const InternalContext = createContext<InternalContextType>();\n"]}
1
+ {"version":3,"sources":["internal.ts"],"names":["InternalContext"],"mappings":";;;;;;;AAAA;;AAuBA;AACO,MAAMA,eAAe,gBAAG,2BAAxB","sourcesContent":["import { createContext } from 'react';\nimport type { MutableRefObject } from 'react';\nimport type Animated from 'react-native-reanimated';\nimport type { CONTEXT_MENU_STATE } from '../constants';\nimport { MenuInternalProps } from '../components/menu/types';\n\nexport type ContentRendererRef = MutableRefObject<\n ((params: any) => React.ReactNode) | null\n>;\n\nexport type InternalContextType = {\n state: Animated.SharedValue<CONTEXT_MENU_STATE>;\n theme: Animated.SharedValue<'light' | 'dark'>;\n menuProps: Animated.SharedValue<MenuInternalProps>;\n contentRenderer: ContentRendererRef;\n safeAreaInsets?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n};\n\n// @ts-ignore\nexport const InternalContext = createContext<InternalContextType>();\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA","sourcesContent":["export { default as HoldItem } from './components/holdItem';\nexport { default as HoldMenuProvider } from './components/provider';\nexport { default as HoldMenuFlatList } from './components/flatList';\nexport { default as HoldMenuIcon } from './components/icon';\n\nexport type { HoldMenuProviderProps } from './components/provider';\nexport type { HoldItemProps } from './components/holdItem/types';\n"]}
1
+ {"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA","sourcesContent":["export { default as HoldItem } from './components/holdItem';\nexport { default as HoldMenuProvider } from './components/provider';\nexport { default as HoldMenuFlatList } from './components/flatList';\nexport { default as HoldMenuIcon } from './components/icon';\n\nexport type { HoldMenuProviderProps } from './components/provider';\nexport type {\n HoldItemProps,\n RenderContentParams,\n} from './components/holdItem/types';\n"]}
@@ -14,10 +14,11 @@ import { HOLD_ITEM_TRANSFORM_DURATION, HOLD_ITEM_SCALE_DOWN_DURATION, HOLD_ITEM_
14
14
  import { useDeviceOrientation } from '../../hooks';
15
15
  import styles from './styles';
16
16
  import styleGuide from '../../styleGuide';
17
- import { useInternal } from '../../hooks'; //#endregion
17
+ import { useInternal } from '../../hooks';
18
+ const defaultItems = [];
18
19
 
19
20
  const HoldItemComponent = ({
20
- items,
21
+ items = defaultItems,
21
22
  bottom,
22
23
  containerStyles,
23
24
  disableMove,
@@ -148,13 +149,19 @@ const HoldItemComponent = ({
148
149
  };
149
150
 
150
151
  const setContentRenderer = () => {
151
- contentRenderer.current = renderContent || null;
152
+ if (renderContent) {
153
+ contentRenderer.current = params => renderContent({
154
+ closeMenu: params
155
+ });
156
+ } else {
157
+ contentRenderer.current = null;
158
+ }
152
159
  };
153
160
 
154
161
  const onCompletion = isFinised => {
155
162
  'worklet';
156
163
 
157
- const isListValid = items && items.length > 0;
164
+ const isListValid = true; // items && items.length > 0;
158
165
 
159
166
  if (isFinised && isListValid) {
160
167
  state.value = CONTEXT_MENU_STATE.ACTIVE;
@@ -1 +1 @@
1
- {"version":3,"sources":["HoldItem.tsx"],"names":["React","memo","useMemo","TapGestureHandler","LongPressGestureHandler","Animated","measure","runOnJS","useAnimatedGestureHandler","useAnimatedProps","useAnimatedRef","useAnimatedStyle","useSharedValue","withDelay","withTiming","withSequence","withSpring","useAnimatedReaction","Portal","nanoid","Haptics","getTransformOrigin","calculateMenuHeight","HOLD_ITEM_TRANSFORM_DURATION","HOLD_ITEM_SCALE_DOWN_DURATION","HOLD_ITEM_SCALE_DOWN_VALUE","SPRING_CONFIGURATION","WINDOW_HEIGHT","WINDOW_WIDTH","CONTEXT_MENU_STATE","useDeviceOrientation","styles","styleGuide","useInternal","HoldItemComponent","items","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","renderContent","state","menuProps","safeAreaInsets","contentRenderer","deviceOrientation","isActive","isAnimationStarted","itemRectY","itemRectX","itemRectWidth","itemRectHeight","itemScale","transformValue","transformOrigin","key","menuHeight","itemsWithSeparator","filter","item","withSeparator","length","isHold","containerRef","hapticResponse","style","selectionAsync","impactAsync","ImpactFeedbackStyle","notificationAsync","NotificationFeedbackType","activateAnimation","ctx","didMeasureLayout","measured","value","pageY","pageX","height","width","position","calculateTransformValue","isAnchorPointTop","tY","topTransform","spacing","bottomTransform","top","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","scaleBack","duration","setContentRenderer","current","onCompletion","isFinised","isListValid","ACTIVE","scaleHold","scaleTap","canCallActivateFunctions","willActivateWithTap","gestureEvent","onActive","_","context","onFinish","overlayGestureEvent","END","animatedContainerStyle","animateOpacity","opacity","transform","scale","containerStyle","animatedPortalStyle","transformAnimation","zIndex","left","translateY","portalContainerStyle","holdItem","animatedPortalProps","pointerEvents","_state","GestureHandler","handlerChildren","PortalOverlay","portalOverlay","HoldItem"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,IAAhB,EAAsBC,OAAtB,QAAqC,OAArC;AAGA;AACA,SACEC,iBADF,EAEEC,uBAFF,QAKO,8BALP;AAMA,OAAOC,QAAP,IACEC,OADF,EAEEC,OAFF,EAGEC,yBAHF,EAIEC,gBAJF,EAKEC,cALF,EAMEC,gBANF,EAOEC,cAPF,EAQEC,SARF,EASEC,UATF,EAUEC,YAVF,EAWEC,UAXF,EAYEC,mBAZF,QAaO,yBAbP,C,CAcA;AAEA;;AACA,SAASC,MAAT,QAAuB,gBAAvB;AACA,SAASC,MAAT,QAAuB,mBAAvB;AACA,OAAO,KAAKC,OAAZ,MAAyB,cAAzB,C,CACA;AAEA;;AACA,SAEEC,kBAFF,EAGEC,mBAHF,QAIO,0BAJP;AAKA,SACEC,4BADF,EAEEC,6BAFF,EAGEC,0BAHF,EAIEC,oBAJF,EAKEC,aALF,EAMEC,YANF,EAOEC,kBAPF,QAQO,iBARP;AASA,SAASC,oBAAT,QAAqC,aAArC;AACA,OAAOC,MAAP,MAAmB,UAAnB;AAGA,OAAOC,UAAP,MAAuB,kBAAvB;AACA,SAASC,WAAT,QAA4B,aAA5B,C,CACA;;AAIA,MAAMC,iBAA0C,GAAG,CAAC;AAClDC,EAAAA,KADkD;AAElDC,EAAAA,MAFkD;AAGlDC,EAAAA,eAHkD;AAIlDC,EAAAA,WAJkD;AAKlDC,EAAAA,kBALkD;AAMlDC,EAAAA,UANkD;AAOlDC,EAAAA,cAPkD;AAQlDC,EAAAA,YARkD;AASlDC,EAAAA,UATkD;AAUlDC,EAAAA,sBAAsB,GAAG,GAVyB;AAWlDC,EAAAA,QAXkD;AAYlDC,EAAAA;AAZkD,CAAD,KAa7C;AACJ;AACA,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA,SAAT;AAAoBC,IAAAA,cAApB;AAAoCC,IAAAA;AAApC,MAAwDjB,WAAW,EAAzE;AACA,QAAMkB,iBAAiB,GAAGrB,oBAAoB,EAA9C,CAHI,CAIJ;AAEA;;AACA,QAAMsB,QAAQ,GAAGxC,cAAc,CAAC,KAAD,CAA/B;AACA,QAAMyC,kBAAkB,GAAGzC,cAAc,CAAC,KAAD,CAAzC;AAEA,QAAM0C,SAAS,GAAG1C,cAAc,CAAS,CAAT,CAAhC;AACA,QAAM2C,SAAS,GAAG3C,cAAc,CAAS,CAAT,CAAhC;AACA,QAAM4C,aAAa,GAAG5C,cAAc,CAAS,CAAT,CAApC;AACA,QAAM6C,cAAc,GAAG7C,cAAc,CAAS,CAAT,CAArC;AACA,QAAM8C,SAAS,GAAG9C,cAAc,CAAS,CAAT,CAAhC;AACA,QAAM+C,cAAc,GAAG/C,cAAc,CAAS,CAAT,CAArC;AAEA,QAAMgD,eAAe,GAAGhD,cAAc,CACpC2B,kBAAkB,IAAI,WADc,CAAtC;AAIA,QAAMsB,GAAG,GAAG3D,OAAO,CAAC,MAAO,aAAYiB,MAAM,EAAG,EAA7B,EAAgC,EAAhC,CAAnB;AACA,QAAM2C,UAAU,GAAG5D,OAAO,CAAC,MAAM;AAC/B,UAAM6D,kBAAkB,GAAG5B,KAAK,CAAC6B,MAAN,CAAaC,IAAI,IAAIA,IAAI,CAACC,aAA1B,CAA3B;AACA,WAAO5C,mBAAmB,CAACa,KAAK,CAACgC,MAAP,EAAeJ,kBAAkB,CAACI,MAAlC,CAA1B;AACD,GAHyB,EAGvB,CAAChC,KAAD,CAHuB,CAA1B;AAKA,QAAMiC,MAAM,GAAG,CAAC5B,UAAD,IAAeA,UAAU,KAAK,MAA7C,CA3BI,CA4BJ;AAEA;;AACA,QAAM6B,YAAY,GAAG3D,cAAc,EAAnC,CA/BI,CAgCJ;AAEA;;AACA,QAAM4D,cAAc,GAAG,MAAM;AAC3B,UAAMC,KAAK,GAAG,CAAC9B,cAAD,GAAkB,QAAlB,GAA6BA,cAA3C;;AACA,YAAQ8B,KAAR;AACE,WAAM,WAAN;AACEnD,QAAAA,OAAO,CAACoD,cAAR;AACA;;AACF,WAAM,OAAN;AACA,WAAM,QAAN;AACA,WAAM,OAAN;AACEpD,QAAAA,OAAO,CAACqD,WAAR,CAAoBrD,OAAO,CAACsD,mBAAR,CAA4BH,KAA5B,CAApB;AACA;;AACF,WAAM,SAAN;AACA,WAAM,SAAN;AACA,WAAM,OAAN;AACEnD,QAAAA,OAAO,CAACuD,iBAAR,CAA0BvD,OAAO,CAACwD,wBAAR,CAAiCL,KAAjC,CAA1B;AACA;;AACF;AAdF;AAgBD,GAlBD,CAnCI,CAsDJ;AAEA;;;AACA,QAAMM,iBAAiB,GAAIC,GAAD,IAAc;AACtC;;AACA,QAAI,CAACA,GAAG,CAACC,gBAAT,EAA2B;AACzB,YAAMC,QAAQ,GAAG1E,OAAO,CAAC+D,YAAD,CAAxB;AAEAf,MAAAA,SAAS,CAAC2B,KAAV,GAAkBD,QAAQ,CAACE,KAA3B;AACA3B,MAAAA,SAAS,CAAC0B,KAAV,GAAkBD,QAAQ,CAACG,KAA3B;AACA1B,MAAAA,cAAc,CAACwB,KAAf,GAAuBD,QAAQ,CAACI,MAAhC;AACA5B,MAAAA,aAAa,CAACyB,KAAd,GAAsBD,QAAQ,CAACK,KAA/B;;AAEA,UAAI,CAAC9C,kBAAL,EAAyB;AACvB,cAAM+C,QAAQ,GAAGjE,kBAAkB,CACjC2D,QAAQ,CAACG,KADwB,EAEjC3B,aAAa,CAACyB,KAFmB,EAGjC9B,iBAAiB,KAAK,UAAtB,GAAmCvB,YAAnC,GAAkDD,aAHjB,EAIjCS,MAJiC,CAAnC;AAMAwB,QAAAA,eAAe,CAACqB,KAAhB,GAAwBK,QAAxB;AACD;AACF;AACF,GApBD;;AAsBA,QAAMC,uBAAuB,GAAG,MAAM;AACpC;;AAEA,UAAMH,MAAM,GACVjC,iBAAiB,KAAK,UAAtB,GAAmCxB,aAAnC,GAAmDC,YADrD;AAGA,UAAM4D,gBAAgB,GAAGlC,SAAS,CAAC2B,KAAV,GAAkBtD,aAAa,GAAG,CAA3D;AAEA,QAAI8D,EAAE,GAAG,CAAT;;AACA,QAAI,CAACnD,WAAL,EAAkB;AAChB,UAAIkD,gBAAJ,EAAsB;AACpB,cAAME,YAAY,GAChBpC,SAAS,CAAC2B,KAAV,GACAxB,cAAc,CAACwB,KADf,GAEAnB,UAFA,GAGA9B,UAAU,CAAC2D,OAHX,IAIC,CAAA1C,cAAc,SAAd,IAAAA,cAAc,WAAd,YAAAA,cAAc,CAAEb,MAAhB,KAA0B,CAJ3B,CADF;AAOAqD,QAAAA,EAAE,GAAGC,YAAY,GAAGN,MAAf,GAAwBA,MAAM,GAAGM,YAAjC,GAAgD,CAArD;AACD,OATD,MASO;AACL,cAAME,eAAe,GACnBtC,SAAS,CAAC2B,KAAV,GAAkBnB,UAAlB,IAAgC,CAAAb,cAAc,SAAd,IAAAA,cAAc,WAAd,YAAAA,cAAc,CAAE4C,GAAhB,KAAuB,CAAvD,CADF;AAEAJ,QAAAA,EAAE,GACAG,eAAe,GAAG,CAAlB,GAAsB,CAACA,eAAD,GAAmB5D,UAAU,CAAC2D,OAAX,GAAqB,CAA9D,GAAkE,CADpE;AAED;AACF;;AACD,WAAOF,EAAP;AACD,GA3BD;;AA6BA,QAAMK,YAAY,GAAG,MAAM;AACzB;;AAEA9C,IAAAA,SAAS,CAACiC,KAAV,GAAkB;AAChBc,MAAAA,UAAU,EAAEtC,cAAc,CAACwB,KADX;AAEhBe,MAAAA,SAAS,EAAExC,aAAa,CAACyB,KAFT;AAGhBgB,MAAAA,KAAK,EAAE3C,SAAS,CAAC2B,KAHD;AAIhBiB,MAAAA,KAAK,EAAE3C,SAAS,CAAC0B,KAJD;AAKhBkB,MAAAA,cAAc,EAAEvC,eAAe,CAACqB,KALhB;AAMhBnB,MAAAA,UAAU,EAAEA,UANI;AAOhB3B,MAAAA,KAPgB;AAQhBwB,MAAAA,cAAc,EAAEA,cAAc,CAACsB,KARf;AAShBvC,MAAAA,YAAY,EAAEA,YAAY,IAAI;AATd,KAAlB;AAWD,GAdD;;AAgBA,QAAM0D,SAAS,GAAG,MAAM;AACtB;;AACA1C,IAAAA,SAAS,CAACuB,KAAV,GAAkBnE,UAAU,CAAC,CAAD,EAAI;AAC9BuF,MAAAA,QAAQ,EAAE9E,4BAA4B,GAAG;AADX,KAAJ,CAA5B;AAGD,GALD;;AAOA,QAAM+E,kBAAkB,GAAG,MAAM;AAC/BpD,IAAAA,eAAe,CAACqD,OAAhB,GAA0BzD,aAAa,IAAI,IAA3C;AACD,GAFD;;AAIA,QAAM0D,YAAY,GAAIC,SAAD,IAAyB;AAC5C;;AACA,UAAMC,WAAW,GAAGvE,KAAK,IAAIA,KAAK,CAACgC,MAAN,GAAe,CAA5C;;AACA,QAAIsC,SAAS,IAAIC,WAAjB,EAA8B;AAC5B3D,MAAAA,KAAK,CAACkC,KAAN,GAAcpD,kBAAkB,CAAC8E,MAAjC;AACAvD,MAAAA,QAAQ,CAAC6B,KAAT,GAAiB,IAAjB;AACAmB,MAAAA,SAAS;AACT7F,MAAAA,OAAO,CAAC+F,kBAAD,CAAP;;AACA,UAAI7D,cAAc,KAAK,MAAvB,EAA+B;AAC7BlC,QAAAA,OAAO,CAAC+D,cAAD,CAAP;AACD;AACF;;AAEDjB,IAAAA,kBAAkB,CAAC4B,KAAnB,GAA2B,KAA3B,CAb4C,CAe5C;AACD,GAhBD;;AAkBA,QAAM2B,SAAS,GAAG,MAAM;AACtB;;AACAlD,IAAAA,SAAS,CAACuB,KAAV,GAAkBnE,UAAU,CAC1BW,0BAD0B,EAE1B;AAAE4E,MAAAA,QAAQ,EAAE7E;AAAZ,KAF0B,EAG1BgF,YAH0B,CAA5B;AAKD,GAPD;;AASA,QAAMK,QAAQ,GAAG,MAAM;AACrB;;AACAxD,IAAAA,kBAAkB,CAAC4B,KAAnB,GAA2B,IAA3B;AAEAvB,IAAAA,SAAS,CAACuB,KAAV,GAAkBlE,YAAY,CAC5BD,UAAU,CAACW,0BAAD,EAA6B;AACrC4E,MAAAA,QAAQ,EAAE7E;AAD2B,KAA7B,CADkB,EAI5BV,UAAU,CACR,CADQ,EAER;AACEuF,MAAAA,QAAQ,EAAE9E,4BAA4B,GAAG;AAD3C,KAFQ,EAKRiF,YALQ,CAJkB,CAA9B;AAYD,GAhBD;AAkBA;AACF;AACA;AACA;AACA;;;AACE,QAAMM,wBAAwB,GAAG,MAAM;AACrC;;AACA,UAAMC,mBAAmB,GACvBvE,UAAU,KAAK,YAAf,IAA+BA,UAAU,KAAK,KADhD;AAGA,WACGuE,mBAAmB,IAAI,CAAC1D,kBAAkB,CAAC4B,KAA5C,IAAsD,CAAC8B,mBADzD;AAGD,GARD,CAzLI,CAkMJ;AAEA;;;AACA,QAAMC,YAAY,GAAGxG,yBAAyB,CAG5C;AACAyG,IAAAA,QAAQ,EAAE,CAACC,CAAD,EAAIC,OAAJ,KAAgB;AACxB,UAAIL,wBAAwB,EAA5B,EAAgC;AAC9B,YAAI,CAACK,OAAO,CAACpC,gBAAb,EAA+B;AAC7BF,UAAAA,iBAAiB,CAACsC,OAAD,CAAjB;AACAxD,UAAAA,cAAc,CAACsB,KAAf,GAAuBM,uBAAuB,EAA9C;AACAO,UAAAA,YAAY;AACZqB,UAAAA,OAAO,CAACpC,gBAAR,GAA2B,IAA3B;AACD;;AAED,YAAI,CAAC3B,QAAQ,CAAC6B,KAAd,EAAqB;AACnB,cAAIb,MAAJ,EAAY;AACVwC,YAAAA,SAAS;AACV,WAFD,MAEO;AACLC,YAAAA,QAAQ;AACT;AACF;AACF;AACF,KAlBD;AAmBAO,IAAAA,QAAQ,EAAE,CAACF,CAAD,EAAIC,OAAJ,KAAgB;AACxBA,MAAAA,OAAO,CAACpC,gBAAR,GAA2B,KAA3B;;AACA,UAAIX,MAAJ,EAAY;AACVgC,QAAAA,SAAS;AACV;AACF;AAxBD,GAH4C,CAA9C;AA8BA,QAAMiB,mBAAmB,GAAG7G,yBAAyB,CAGnD;AACAyG,IAAAA,QAAQ,EAAEC,CAAC,IAAI;AACb,UAAIvE,UAAJ,EAAgBI,KAAK,CAACkC,KAAN,GAAcpD,kBAAkB,CAACyF,GAAjC;AACjB;AAHD,GAHmD,CAArD,CAnOI,CA2OJ;AAEA;;AACA,QAAMC,sBAAsB,GAAG5G,gBAAgB,CAAC,MAAM;AACpD,UAAM6G,cAAc,GAAG,MACrB3G,SAAS,CAACU,4BAAD,EAA+BT,UAAU,CAAC,CAAD,EAAI;AAAEuF,MAAAA,QAAQ,EAAE;AAAZ,KAAJ,CAAzC,CADX;;AAGA,WAAO;AACLoB,MAAAA,OAAO,EAAErE,QAAQ,CAAC6B,KAAT,GAAiB,CAAjB,GAAqBuC,cAAc,EADvC;AAELE,MAAAA,SAAS,EAAE,CACT;AACEC,QAAAA,KAAK,EAAEvE,QAAQ,CAAC6B,KAAT,GACHnE,UAAU,CAAC,CAAD,EAAI;AAAEuF,UAAAA,QAAQ,EAAE9E;AAAZ,SAAJ,CADP,GAEHmC,SAAS,CAACuB;AAHhB,OADS;AAFN,KAAP;AAUD,GAd8C,CAA/C;AAeA,QAAM2C,cAAc,GAAG5H,KAAK,CAACE,OAAN,CACrB,MAAM,CAACmC,eAAD,EAAkBkF,sBAAlB,CADe,EAErB,CAAClF,eAAD,EAAkBkF,sBAAlB,CAFqB,CAAvB;AAKA,QAAMM,mBAAmB,GAAGlH,gBAAgB,CAAC,MAAM;AACjD,UAAM6G,cAAc,GAAG,MACrB3G,SAAS,CAACU,4BAAD,EAA+BT,UAAU,CAAC,CAAD,EAAI;AAAEuF,MAAAA,QAAQ,EAAE;AAAZ,KAAJ,CAAzC,CADX;;AAGA,QAAIZ,EAAE,GAAGF,uBAAuB,EAAhC;;AACA,UAAMuC,kBAAkB,GAAG,MACzBxF,WAAW,GACP,CADO,GAEPc,QAAQ,CAAC6B,KAAT,GACAjE,UAAU,CAACyE,EAAD,EAAK/D,oBAAL,CADV,GAEAZ,UAAU,CAAC,CAAC,GAAF,EAAO;AAAEuF,MAAAA,QAAQ,EAAE9E;AAAZ,KAAP,CALhB;;AAOA,WAAO;AACLwG,MAAAA,MAAM,EAAE,EADH;AAELzC,MAAAA,QAAQ,EAAE,UAFL;AAGLO,MAAAA,GAAG,EAAEvC,SAAS,CAAC2B,KAHV;AAIL+C,MAAAA,IAAI,EAAEzE,SAAS,CAAC0B,KAJX;AAKLI,MAAAA,KAAK,EAAE7B,aAAa,CAACyB,KALhB;AAMLG,MAAAA,MAAM,EAAE3B,cAAc,CAACwB,KANlB;AAOLwC,MAAAA,OAAO,EAAErE,QAAQ,CAAC6B,KAAT,GAAiB,CAAjB,GAAqBuC,cAAc,EAPvC;AAQLE,MAAAA,SAAS,EAAE,CACT;AACEO,QAAAA,UAAU,EAAEH,kBAAkB;AADhC,OADS,EAIT;AACEH,QAAAA,KAAK,EAAEvE,QAAQ,CAAC6B,KAAT,GACHnE,UAAU,CAAC,CAAD,EAAI;AAAEuF,UAAAA,QAAQ,EAAE9E;AAAZ,SAAJ,CADP,GAEHmC,SAAS,CAACuB;AAHhB,OAJS;AARN,KAAP;AAmBD,GA/B2C,CAA5C;AAgCA,QAAMiD,oBAAoB,GAAGhI,OAAO,CAClC,MAAM,CAAC6B,MAAM,CAACoG,QAAR,EAAkBN,mBAAlB,CAD4B,EAElC,CAACA,mBAAD,CAFkC,CAApC;AAKA,QAAMO,mBAAmB,GAAG3H,gBAAgB,CAAY,OAAO;AAC7D4H,IAAAA,aAAa,EAAEjF,QAAQ,CAAC6B,KAAT,GAAiB,MAAjB,GAA0B;AADoB,GAAP,CAAZ,CAA5C,CAvSI,CA0SJ;AAEA;;AACAhE,EAAAA,mBAAmB,CACjB,MAAM8B,KAAK,CAACkC,KADK,EAEjBqD,MAAM,IAAI;AACR,QAAIA,MAAM,KAAKzG,kBAAkB,CAACyF,GAAlC,EAAuC;AACrClE,MAAAA,QAAQ,CAAC6B,KAAT,GAAiB,KAAjB;AACD;AACF,GANgB,CAAnB,CA7SI,CAqTJ;AAEA;;AACA,QAAMsD,cAAc,GAAGrI,OAAO,CAAC,MAAM;AACnC,YAAQsC,UAAR;AACE,WAAM,YAAN;AACE,eAAO,CAAC;AAAEK,UAAAA,QAAQ,EAAE2F;AAAZ,SAAD,kBACL,oBAAC,iBAAD;AACE,UAAA,YAAY,EAAE,CADhB;AAEE,UAAA,oBAAoB,EAAExB;AAFxB,WAIGwB,eAJH,CADF;;AAQF,WAAM,KAAN;AACE,eAAO,CAAC;AAAE3F,UAAAA,QAAQ,EAAE2F;AAAZ,SAAD,kBACL,oBAAC,iBAAD;AACE,UAAA,YAAY,EAAE,CADhB;AAEE,UAAA,oBAAoB,EAAExB;AAFxB,WAIGwB,eAJH,CADF;AAQF;;AACA;AACE,eAAO,CAAC;AAAE3F,UAAAA,QAAQ,EAAE2F;AAAZ,SAAD,kBACL,oBAAC,uBAAD;AACE,UAAA,aAAa,EAAE5F,sBADjB;AAEE,UAAA,oBAAoB,EAAEoE;AAFxB,WAIGwB,eAJH,CADF;AArBJ;AA8BD,GA/B6B,EA+B3B,CAAChG,UAAD,EAAawE,YAAb,CA/B2B,CAA9B;AAiCA,QAAMyB,aAAa,GAAGvI,OAAO,CAAC,MAAM;AAClC,WAAO,mBACL,oBAAC,iBAAD;AACE,MAAA,YAAY,EAAE,CADhB;AAEE,MAAA,oBAAoB,EAAEmH;AAFxB,oBAIE,oBAAC,QAAD,CAAU,IAAV;AAAe,MAAA,KAAK,EAAEtF,MAAM,CAAC2G;AAA7B,MAJF,CADF;AAQD,GAT4B,EAS1B,CAACrB,mBAAD,CAT0B,CAA7B,CAzVI,CAmWJ;AAEA;;AACA,sBACE,uDACE,oBAAC,cAAD,qBACE,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,GAAG,EAAEhD,YAApB;AAAkC,IAAA,KAAK,EAAEuD;AAAzC,KACG/E,QADH,CADF,CADF,eAOE,oBAAC,MAAD;AAAQ,IAAA,GAAG,EAAEgB,GAAb;AAAkB,IAAA,IAAI,EAAEA;AAAxB,kBACE,oBAAC,QAAD,CAAU,IAAV;AACE,IAAA,GAAG,EAAEA,GADP;AAEE,IAAA,KAAK,EAAEqE,oBAFT;AAGE,IAAA,aAAa,EAAEE;AAHjB,kBAKE,oBAAC,aAAD,OALF,EAMGvF,QANH,CADF,CAPF,CADF,CAtWI,CA0XJ;AACD,CAxYD;;AA0YA,MAAM8F,QAAQ,gBAAG1I,IAAI,CAACiC,iBAAD,CAArB;AAEA,eAAeyG,QAAf","sourcesContent":["import React, { memo, useMemo } from 'react';\nimport { ViewProps } from 'react-native';\n\n//#region reanimated & gesture handler\nimport {\n TapGestureHandler,\n LongPressGestureHandler,\n TapGestureHandlerGestureEvent,\n LongPressGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedProps,\n useAnimatedRef,\n useAnimatedStyle,\n useSharedValue,\n withDelay,\n withTiming,\n withSequence,\n withSpring,\n useAnimatedReaction,\n} from 'react-native-reanimated';\n//#endregion\n\n//#region dependencies\nimport { Portal } from '@gorhom/portal';\nimport { nanoid } from 'nanoid/non-secure';\nimport * as Haptics from 'expo-haptics';\n//#endregion\n\n//#region utils & types\nimport {\n TransformOriginAnchorPosition,\n getTransformOrigin,\n calculateMenuHeight,\n} from '../../utils/calculations';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n HOLD_ITEM_SCALE_DOWN_DURATION,\n HOLD_ITEM_SCALE_DOWN_VALUE,\n SPRING_CONFIGURATION,\n WINDOW_HEIGHT,\n WINDOW_WIDTH,\n CONTEXT_MENU_STATE,\n} from '../../constants';\nimport { useDeviceOrientation } from '../../hooks';\nimport styles from './styles';\n\nimport type { HoldItemProps, GestureHandlerProps } from './types';\nimport styleGuide from '../../styleGuide';\nimport { useInternal } from '../../hooks';\n//#endregion\n\ntype Context = { didMeasureLayout: boolean };\n\nconst HoldItemComponent: React.FC<HoldItemProps> = ({\n items,\n bottom,\n containerStyles,\n disableMove,\n menuAnchorPosition,\n activateOn,\n hapticFeedback,\n actionParams,\n closeOnTap,\n longPressMinDurationMs = 150,\n children,\n renderContent,\n}) => {\n //#region hooks\n const { state, menuProps, safeAreaInsets, contentRenderer } = useInternal();\n const deviceOrientation = useDeviceOrientation();\n //#endregion\n\n //#region variables\n const isActive = useSharedValue(false);\n const isAnimationStarted = useSharedValue(false);\n\n const itemRectY = useSharedValue<number>(0);\n const itemRectX = useSharedValue<number>(0);\n const itemRectWidth = useSharedValue<number>(0);\n const itemRectHeight = useSharedValue<number>(0);\n const itemScale = useSharedValue<number>(1);\n const transformValue = useSharedValue<number>(0);\n\n const transformOrigin = useSharedValue<TransformOriginAnchorPosition>(\n menuAnchorPosition || 'top-right'\n );\n\n const key = useMemo(() => `hold-item-${nanoid()}`, []);\n const menuHeight = useMemo(() => {\n const itemsWithSeparator = items.filter(item => item.withSeparator);\n return calculateMenuHeight(items.length, itemsWithSeparator.length);\n }, [items]);\n\n const isHold = !activateOn || activateOn === 'hold';\n //#endregion\n\n //#region refs\n const containerRef = useAnimatedRef<Animated.View>();\n //#endregion\n\n //#region functions\n const hapticResponse = () => {\n const style = !hapticFeedback ? 'Medium' : hapticFeedback;\n switch (style) {\n case `Selection`:\n Haptics.selectionAsync();\n break;\n case `Light`:\n case `Medium`:\n case `Heavy`:\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle[style]);\n break;\n case `Success`:\n case `Warning`:\n case `Error`:\n Haptics.notificationAsync(Haptics.NotificationFeedbackType[style]);\n break;\n default:\n }\n };\n //#endregion\n\n //#region worklet functions\n const activateAnimation = (ctx: any) => {\n 'worklet';\n if (!ctx.didMeasureLayout) {\n const measured = measure(containerRef);\n\n itemRectY.value = measured.pageY;\n itemRectX.value = measured.pageX;\n itemRectHeight.value = measured.height;\n itemRectWidth.value = measured.width;\n\n if (!menuAnchorPosition) {\n const position = getTransformOrigin(\n measured.pageX,\n itemRectWidth.value,\n deviceOrientation === 'portrait' ? WINDOW_WIDTH : WINDOW_HEIGHT,\n bottom\n );\n transformOrigin.value = position;\n }\n }\n };\n\n const calculateTransformValue = () => {\n 'worklet';\n\n const height =\n deviceOrientation === 'portrait' ? WINDOW_HEIGHT : WINDOW_WIDTH;\n\n const isAnchorPointTop = itemRectY.value > WINDOW_HEIGHT / 2;\n\n let tY = 0;\n if (!disableMove) {\n if (isAnchorPointTop) {\n const topTransform =\n itemRectY.value +\n itemRectHeight.value +\n menuHeight +\n styleGuide.spacing +\n (safeAreaInsets?.bottom || 0);\n\n tY = topTransform > height ? height - topTransform : 0;\n } else {\n const bottomTransform =\n itemRectY.value - menuHeight - (safeAreaInsets?.top || 0);\n tY =\n bottomTransform < 0 ? -bottomTransform + styleGuide.spacing * 2 : 0;\n }\n }\n return tY;\n };\n\n const setMenuProps = () => {\n 'worklet';\n\n menuProps.value = {\n itemHeight: itemRectHeight.value,\n itemWidth: itemRectWidth.value,\n itemY: itemRectY.value,\n itemX: itemRectX.value,\n anchorPosition: transformOrigin.value,\n menuHeight: menuHeight,\n items,\n transformValue: transformValue.value,\n actionParams: actionParams || {},\n };\n };\n\n const scaleBack = () => {\n 'worklet';\n itemScale.value = withTiming(1, {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n });\n };\n\n const setContentRenderer = () => {\n contentRenderer.current = renderContent || null;\n };\n\n const onCompletion = (isFinised?: boolean) => {\n 'worklet';\n const isListValid = items && items.length > 0;\n if (isFinised && isListValid) {\n state.value = CONTEXT_MENU_STATE.ACTIVE;\n isActive.value = true;\n scaleBack();\n runOnJS(setContentRenderer)();\n if (hapticFeedback !== 'None') {\n runOnJS(hapticResponse)();\n }\n }\n\n isAnimationStarted.value = false;\n\n // TODO: Warn user if item list is empty or not given\n };\n\n const scaleHold = () => {\n 'worklet';\n itemScale.value = withTiming(\n HOLD_ITEM_SCALE_DOWN_VALUE,\n { duration: HOLD_ITEM_SCALE_DOWN_DURATION },\n onCompletion\n );\n };\n\n const scaleTap = () => {\n 'worklet';\n isAnimationStarted.value = true;\n\n itemScale.value = withSequence(\n withTiming(HOLD_ITEM_SCALE_DOWN_VALUE, {\n duration: HOLD_ITEM_SCALE_DOWN_DURATION,\n }),\n withTiming(\n 1,\n {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n },\n onCompletion\n )\n );\n };\n\n /**\n * When use tap activation (\"tap\") and trying to tap multiple times,\n * scale animation is called again despite it is started. This causes a bug.\n * To prevent this, it is better to check is animation already started.\n */\n const canCallActivateFunctions = () => {\n 'worklet';\n const willActivateWithTap =\n activateOn === 'double-tap' || activateOn === 'tap';\n\n return (\n (willActivateWithTap && !isAnimationStarted.value) || !willActivateWithTap\n );\n };\n //#endregion\n\n //#region gesture events\n const gestureEvent = useAnimatedGestureHandler<\n LongPressGestureHandlerGestureEvent | TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: (_, context) => {\n if (canCallActivateFunctions()) {\n if (!context.didMeasureLayout) {\n activateAnimation(context);\n transformValue.value = calculateTransformValue();\n setMenuProps();\n context.didMeasureLayout = true;\n }\n\n if (!isActive.value) {\n if (isHold) {\n scaleHold();\n } else {\n scaleTap();\n }\n }\n }\n },\n onFinish: (_, context) => {\n context.didMeasureLayout = false;\n if (isHold) {\n scaleBack();\n }\n },\n });\n\n const overlayGestureEvent = useAnimatedGestureHandler<\n TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: _ => {\n if (closeOnTap) state.value = CONTEXT_MENU_STATE.END;\n },\n });\n //#endregion\n\n //#region animated styles & props\n const animatedContainerStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(1, { duration: 0 }));\n\n return {\n opacity: isActive.value ? 0 : animateOpacity(),\n transform: [\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const containerStyle = React.useMemo(\n () => [containerStyles, animatedContainerStyle],\n [containerStyles, animatedContainerStyle]\n );\n\n const animatedPortalStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(0, { duration: 0 }));\n\n let tY = calculateTransformValue();\n const transformAnimation = () =>\n disableMove\n ? 0\n : isActive.value\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(-0.1, { duration: HOLD_ITEM_TRANSFORM_DURATION });\n\n return {\n zIndex: 10,\n position: 'absolute',\n top: itemRectY.value,\n left: itemRectX.value,\n width: itemRectWidth.value,\n height: itemRectHeight.value,\n opacity: isActive.value ? 1 : animateOpacity(),\n transform: [\n {\n translateY: transformAnimation(),\n },\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const portalContainerStyle = useMemo(\n () => [styles.holdItem, animatedPortalStyle],\n [animatedPortalStyle]\n );\n\n const animatedPortalProps = useAnimatedProps<ViewProps>(() => ({\n pointerEvents: isActive.value ? 'auto' : 'none',\n }));\n //#endregion\n\n //#region animated effects\n useAnimatedReaction(\n () => state.value,\n _state => {\n if (_state === CONTEXT_MENU_STATE.END) {\n isActive.value = false;\n }\n }\n );\n //#endregion\n\n //#region components\n const GestureHandler = useMemo(() => {\n switch (activateOn) {\n case `double-tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={2}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n case `tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n // default is hold\n default:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <LongPressGestureHandler\n minDurationMs={longPressMinDurationMs}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </LongPressGestureHandler>\n );\n }\n }, [activateOn, gestureEvent]);\n\n const PortalOverlay = useMemo(() => {\n return () => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={overlayGestureEvent}\n >\n <Animated.View style={styles.portalOverlay} />\n </TapGestureHandler>\n );\n }, [overlayGestureEvent]);\n //#endregion\n\n //#region render\n return (\n <>\n <GestureHandler>\n <Animated.View ref={containerRef} style={containerStyle}>\n {children}\n </Animated.View>\n </GestureHandler>\n\n <Portal key={key} name={key}>\n <Animated.View\n key={key}\n style={portalContainerStyle}\n animatedProps={animatedPortalProps}\n >\n <PortalOverlay />\n {children}\n </Animated.View>\n </Portal>\n </>\n );\n //#endregion\n};\n\nconst HoldItem = memo(HoldItemComponent) as React.FC<HoldItemProps>;\n\nexport default HoldItem;\n"]}
1
+ {"version":3,"sources":["HoldItem.tsx"],"names":["React","memo","useMemo","TapGestureHandler","LongPressGestureHandler","Animated","measure","runOnJS","useAnimatedGestureHandler","useAnimatedProps","useAnimatedRef","useAnimatedStyle","useSharedValue","withDelay","withTiming","withSequence","withSpring","useAnimatedReaction","Portal","nanoid","Haptics","getTransformOrigin","calculateMenuHeight","HOLD_ITEM_TRANSFORM_DURATION","HOLD_ITEM_SCALE_DOWN_DURATION","HOLD_ITEM_SCALE_DOWN_VALUE","SPRING_CONFIGURATION","WINDOW_HEIGHT","WINDOW_WIDTH","CONTEXT_MENU_STATE","useDeviceOrientation","styles","styleGuide","useInternal","defaultItems","HoldItemComponent","items","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","renderContent","state","menuProps","safeAreaInsets","contentRenderer","deviceOrientation","isActive","isAnimationStarted","itemRectY","itemRectX","itemRectWidth","itemRectHeight","itemScale","transformValue","transformOrigin","key","menuHeight","itemsWithSeparator","filter","item","withSeparator","length","isHold","containerRef","hapticResponse","style","selectionAsync","impactAsync","ImpactFeedbackStyle","notificationAsync","NotificationFeedbackType","activateAnimation","ctx","didMeasureLayout","measured","value","pageY","pageX","height","width","position","calculateTransformValue","isAnchorPointTop","tY","topTransform","spacing","bottomTransform","top","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","scaleBack","duration","setContentRenderer","current","params","closeMenu","onCompletion","isFinised","isListValid","ACTIVE","scaleHold","scaleTap","canCallActivateFunctions","willActivateWithTap","gestureEvent","onActive","_","context","onFinish","overlayGestureEvent","END","animatedContainerStyle","animateOpacity","opacity","transform","scale","containerStyle","animatedPortalStyle","transformAnimation","zIndex","left","translateY","portalContainerStyle","holdItem","animatedPortalProps","pointerEvents","_state","GestureHandler","handlerChildren","PortalOverlay","portalOverlay","HoldItem"],"mappings":"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","sourcesContent":["import React, { memo, useMemo } from 'react';\nimport { ViewProps } from 'react-native';\n\n//#region reanimated & gesture handler\nimport {\n TapGestureHandler,\n LongPressGestureHandler,\n TapGestureHandlerGestureEvent,\n LongPressGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedProps,\n useAnimatedRef,\n useAnimatedStyle,\n useSharedValue,\n withDelay,\n withTiming,\n withSequence,\n withSpring,\n useAnimatedReaction,\n} from 'react-native-reanimated';\n//#endregion\n\n//#region dependencies\nimport { Portal } from '@gorhom/portal';\nimport { nanoid } from 'nanoid/non-secure';\nimport * as Haptics from 'expo-haptics';\n//#endregion\n\n//#region utils & types\nimport {\n TransformOriginAnchorPosition,\n getTransformOrigin,\n calculateMenuHeight,\n} from '../../utils/calculations';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n HOLD_ITEM_SCALE_DOWN_DURATION,\n HOLD_ITEM_SCALE_DOWN_VALUE,\n SPRING_CONFIGURATION,\n WINDOW_HEIGHT,\n WINDOW_WIDTH,\n CONTEXT_MENU_STATE,\n} from '../../constants';\nimport { useDeviceOrientation } from '../../hooks';\nimport styles from './styles';\n\nimport type { HoldItemProps, GestureHandlerProps } from './types';\nimport styleGuide from '../../styleGuide';\nimport { useInternal } from '../../hooks';\nimport { MenuItemProps } from '../menu/types';\n//#endregion\n\ntype Context = { didMeasureLayout: boolean };\nconst defaultItems = [] as MenuItemProps[];\nconst HoldItemComponent: React.FC<HoldItemProps> = ({\n items = defaultItems,\n bottom,\n containerStyles,\n disableMove,\n menuAnchorPosition,\n activateOn,\n hapticFeedback,\n actionParams,\n closeOnTap,\n longPressMinDurationMs = 150,\n children,\n renderContent,\n}) => {\n //#region hooks\n const { state, menuProps, safeAreaInsets, contentRenderer } = useInternal();\n const deviceOrientation = useDeviceOrientation();\n //#endregion\n\n //#region variables\n const isActive = useSharedValue(false);\n const isAnimationStarted = useSharedValue(false);\n\n const itemRectY = useSharedValue<number>(0);\n const itemRectX = useSharedValue<number>(0);\n const itemRectWidth = useSharedValue<number>(0);\n const itemRectHeight = useSharedValue<number>(0);\n const itemScale = useSharedValue<number>(1);\n const transformValue = useSharedValue<number>(0);\n\n const transformOrigin = useSharedValue<TransformOriginAnchorPosition>(\n menuAnchorPosition || 'top-right'\n );\n\n const key = useMemo(() => `hold-item-${nanoid()}`, []);\n const menuHeight = useMemo(() => {\n const itemsWithSeparator = items.filter(item => item.withSeparator);\n return calculateMenuHeight(items.length, itemsWithSeparator.length);\n }, [items]);\n\n const isHold = !activateOn || activateOn === 'hold';\n //#endregion\n\n //#region refs\n const containerRef = useAnimatedRef<Animated.View>();\n //#endregion\n\n //#region functions\n const hapticResponse = () => {\n const style = !hapticFeedback ? 'Medium' : hapticFeedback;\n switch (style) {\n case `Selection`:\n Haptics.selectionAsync();\n break;\n case `Light`:\n case `Medium`:\n case `Heavy`:\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle[style]);\n break;\n case `Success`:\n case `Warning`:\n case `Error`:\n Haptics.notificationAsync(Haptics.NotificationFeedbackType[style]);\n break;\n default:\n }\n };\n //#endregion\n\n //#region worklet functions\n const activateAnimation = (ctx: any) => {\n 'worklet';\n if (!ctx.didMeasureLayout) {\n const measured = measure(containerRef);\n\n itemRectY.value = measured.pageY;\n itemRectX.value = measured.pageX;\n itemRectHeight.value = measured.height;\n itemRectWidth.value = measured.width;\n\n if (!menuAnchorPosition) {\n const position = getTransformOrigin(\n measured.pageX,\n itemRectWidth.value,\n deviceOrientation === 'portrait' ? WINDOW_WIDTH : WINDOW_HEIGHT,\n bottom\n );\n transformOrigin.value = position;\n }\n }\n };\n\n const calculateTransformValue = () => {\n 'worklet';\n\n const height =\n deviceOrientation === 'portrait' ? WINDOW_HEIGHT : WINDOW_WIDTH;\n\n const isAnchorPointTop = itemRectY.value > WINDOW_HEIGHT / 2;\n\n let tY = 0;\n if (!disableMove) {\n if (isAnchorPointTop) {\n const topTransform =\n itemRectY.value +\n itemRectHeight.value +\n menuHeight +\n styleGuide.spacing +\n (safeAreaInsets?.bottom || 0);\n\n tY = topTransform > height ? height - topTransform : 0;\n } else {\n const bottomTransform =\n itemRectY.value - menuHeight - (safeAreaInsets?.top || 0);\n tY =\n bottomTransform < 0 ? -bottomTransform + styleGuide.spacing * 2 : 0;\n }\n }\n return tY;\n };\n\n const setMenuProps = () => {\n 'worklet';\n\n menuProps.value = {\n itemHeight: itemRectHeight.value,\n itemWidth: itemRectWidth.value,\n itemY: itemRectY.value,\n itemX: itemRectX.value,\n anchorPosition: transformOrigin.value,\n menuHeight: menuHeight,\n items,\n transformValue: transformValue.value,\n actionParams: actionParams || {},\n };\n };\n\n const scaleBack = () => {\n 'worklet';\n itemScale.value = withTiming(1, {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n });\n };\n\n const setContentRenderer = () => {\n if (renderContent) {\n contentRenderer.current = (params: any) =>\n renderContent({ closeMenu: params });\n } else {\n contentRenderer.current = null;\n }\n };\n\n const onCompletion = (isFinised?: boolean) => {\n 'worklet';\n const isListValid = true;\n // items && items.length > 0;\n if (isFinised && isListValid) {\n state.value = CONTEXT_MENU_STATE.ACTIVE;\n isActive.value = true;\n scaleBack();\n runOnJS(setContentRenderer)();\n if (hapticFeedback !== 'None') {\n runOnJS(hapticResponse)();\n }\n }\n\n isAnimationStarted.value = false;\n\n // TODO: Warn user if item list is empty or not given\n };\n\n const scaleHold = () => {\n 'worklet';\n itemScale.value = withTiming(\n HOLD_ITEM_SCALE_DOWN_VALUE,\n { duration: HOLD_ITEM_SCALE_DOWN_DURATION },\n onCompletion\n );\n };\n\n const scaleTap = () => {\n 'worklet';\n isAnimationStarted.value = true;\n\n itemScale.value = withSequence(\n withTiming(HOLD_ITEM_SCALE_DOWN_VALUE, {\n duration: HOLD_ITEM_SCALE_DOWN_DURATION,\n }),\n withTiming(\n 1,\n {\n duration: HOLD_ITEM_TRANSFORM_DURATION / 2,\n },\n onCompletion\n )\n );\n };\n\n /**\n * When use tap activation (\"tap\") and trying to tap multiple times,\n * scale animation is called again despite it is started. This causes a bug.\n * To prevent this, it is better to check is animation already started.\n */\n const canCallActivateFunctions = () => {\n 'worklet';\n const willActivateWithTap =\n activateOn === 'double-tap' || activateOn === 'tap';\n\n return (\n (willActivateWithTap && !isAnimationStarted.value) || !willActivateWithTap\n );\n };\n //#endregion\n\n //#region gesture events\n const gestureEvent = useAnimatedGestureHandler<\n LongPressGestureHandlerGestureEvent | TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: (_, context) => {\n if (canCallActivateFunctions()) {\n if (!context.didMeasureLayout) {\n activateAnimation(context);\n transformValue.value = calculateTransformValue();\n setMenuProps();\n context.didMeasureLayout = true;\n }\n\n if (!isActive.value) {\n if (isHold) {\n scaleHold();\n } else {\n scaleTap();\n }\n }\n }\n },\n onFinish: (_, context) => {\n context.didMeasureLayout = false;\n if (isHold) {\n scaleBack();\n }\n },\n });\n\n const overlayGestureEvent = useAnimatedGestureHandler<\n TapGestureHandlerGestureEvent,\n Context\n >({\n onActive: _ => {\n if (closeOnTap) state.value = CONTEXT_MENU_STATE.END;\n },\n });\n //#endregion\n\n //#region animated styles & props\n const animatedContainerStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(1, { duration: 0 }));\n\n return {\n opacity: isActive.value ? 0 : animateOpacity(),\n transform: [\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const containerStyle = React.useMemo(\n () => [containerStyles, animatedContainerStyle],\n [containerStyles, animatedContainerStyle]\n );\n\n const animatedPortalStyle = useAnimatedStyle(() => {\n const animateOpacity = () =>\n withDelay(HOLD_ITEM_TRANSFORM_DURATION, withTiming(0, { duration: 0 }));\n\n let tY = calculateTransformValue();\n const transformAnimation = () =>\n disableMove\n ? 0\n : isActive.value\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(-0.1, { duration: HOLD_ITEM_TRANSFORM_DURATION });\n\n return {\n zIndex: 10,\n position: 'absolute',\n top: itemRectY.value,\n left: itemRectX.value,\n width: itemRectWidth.value,\n height: itemRectHeight.value,\n opacity: isActive.value ? 1 : animateOpacity(),\n transform: [\n {\n translateY: transformAnimation(),\n },\n {\n scale: isActive.value\n ? withTiming(1, { duration: HOLD_ITEM_TRANSFORM_DURATION })\n : itemScale.value,\n },\n ],\n };\n });\n const portalContainerStyle = useMemo(\n () => [styles.holdItem, animatedPortalStyle],\n [animatedPortalStyle]\n );\n\n const animatedPortalProps = useAnimatedProps<ViewProps>(() => ({\n pointerEvents: isActive.value ? 'auto' : 'none',\n }));\n //#endregion\n\n //#region animated effects\n useAnimatedReaction(\n () => state.value,\n _state => {\n if (_state === CONTEXT_MENU_STATE.END) {\n isActive.value = false;\n }\n }\n );\n //#endregion\n\n //#region components\n const GestureHandler = useMemo(() => {\n switch (activateOn) {\n case `double-tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={2}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n case `tap`:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </TapGestureHandler>\n );\n // default is hold\n default:\n return ({ children: handlerChildren }: GestureHandlerProps) => (\n <LongPressGestureHandler\n minDurationMs={longPressMinDurationMs}\n onHandlerStateChange={gestureEvent}\n >\n {handlerChildren}\n </LongPressGestureHandler>\n );\n }\n }, [activateOn, gestureEvent]);\n\n const PortalOverlay = useMemo(() => {\n return () => (\n <TapGestureHandler\n numberOfTaps={1}\n onHandlerStateChange={overlayGestureEvent}\n >\n <Animated.View style={styles.portalOverlay} />\n </TapGestureHandler>\n );\n }, [overlayGestureEvent]);\n //#endregion\n\n //#region render\n return (\n <>\n <GestureHandler>\n <Animated.View ref={containerRef} style={containerStyle}>\n {children}\n </Animated.View>\n </GestureHandler>\n\n <Portal key={key} name={key}>\n <Animated.View\n key={key}\n style={portalContainerStyle}\n animatedProps={animatedPortalProps}\n >\n <PortalOverlay />\n {children}\n </Animated.View>\n </Portal>\n </>\n );\n //#endregion\n};\n\nconst HoldItem = memo(HoldItemComponent) as React.FC<HoldItemProps>;\n\nexport default HoldItem;\n"]}
@@ -39,6 +39,8 @@ const Content = () => {
39
39
  };
40
40
  }, [menuProps]);
41
41
 
42
+ const closeMenu = () => state.value = CONTEXT_MENU_STATE.END;
43
+
42
44
  if (!renderContent) {
43
45
  return null;
44
46
  }
@@ -50,7 +52,7 @@ const Content = () => {
50
52
  left: 0,
51
53
  zIndex: 12
52
54
  }, wrapperStyles]
53
- }, isActive && renderContent());
55
+ }, isActive && renderContent(closeMenu));
54
56
  };
55
57
 
56
58
  export default Content;
@@ -1 +1 @@
1
- {"version":3,"sources":["Content.tsx"],"names":["React","useCallback","useState","Animated","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","withSpring","withTiming","useInternal","CONTEXT_MENU_STATE","HOLD_ITEM_TRANSFORM_DURATION","SPRING_CONFIGURATION","Content","state","menuProps","contentRenderer","isActive","setIsActive","contentHeight","handleLayout","event","value","nativeEvent","layout","height","val","ACTIVE","renderContent","current","wrapperStyles","anchorPositionVertical","anchorPosition","split","anchorPositionHorizontal","top","itemY","itemHeight","left","itemX","itemWidth","undefined","right","tY","transformValue","opacity","transform","translateY","duration","position","zIndex"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { useInternal } from '../../hooks';\nimport {\n CONTEXT_MENU_STATE,\n HOLD_ITEM_TRANSFORM_DURATION,\n SPRING_CONFIGURATION,\n} from '../../constants';\n\nconst Content = () => {\n const { state, menuProps, contentRenderer } = useInternal();\n const [isActive, setIsActive] = useState(false);\n const contentHeight = useSharedValue(0);\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n contentHeight.value = event.nativeEvent.layout.height;\n },\n [contentHeight]\n );\n\n // синхронизируем Reanimated state → React state\n useAnimatedReaction(\n () => state.value,\n val => {\n runOnJS(setIsActive)(val === CONTEXT_MENU_STATE.ACTIVE);\n }\n );\n\n const renderContent = contentRenderer.current;\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n const anchorPositionHorizontal = menuProps.value.anchorPosition.split(\n '-'\n )[1];\n\n const top =\n anchorPositionVertical === 'top'\n ? menuProps.value.itemY - contentHeight.value - 8\n : menuProps.value.itemY + menuProps.value.itemHeight + 8;\n\n const left =\n anchorPositionHorizontal === 'center'\n ? menuProps.value.itemX / 2 - menuProps.value.itemWidth / 3\n : anchorPositionHorizontal === 'right'\n ? undefined\n : menuProps.value.itemX;\n const right = anchorPositionHorizontal === 'right' ? 0 : undefined;\n\n const tY = menuProps.value.transformValue;\n return {\n opacity:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withTiming(1)\n : withTiming(0),\n top,\n left,\n right,\n transform: [\n {\n translateY:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(0, { duration: HOLD_ITEM_TRANSFORM_DURATION }),\n },\n ],\n };\n }, [menuProps]);\n if (!renderContent) {\n return null;\n }\n return (\n <Animated.View\n onLayout={handleLayout}\n style={[{ position: 'absolute', left: 0, zIndex: 12 }, wrapperStyles]}\n >\n {isActive && renderContent()}\n </Animated.View>\n );\n};\n\nexport default Content;\n"]}
1
+ {"version":3,"sources":["Content.tsx"],"names":["React","useCallback","useState","Animated","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","withSpring","withTiming","useInternal","CONTEXT_MENU_STATE","HOLD_ITEM_TRANSFORM_DURATION","SPRING_CONFIGURATION","Content","state","menuProps","contentRenderer","isActive","setIsActive","contentHeight","handleLayout","event","value","nativeEvent","layout","height","val","ACTIVE","renderContent","current","wrapperStyles","anchorPositionVertical","anchorPosition","split","anchorPositionHorizontal","top","itemY","itemHeight","left","itemX","itemWidth","undefined","right","tY","transformValue","opacity","transform","translateY","duration","closeMenu","END","position","zIndex"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\nimport type { LayoutChangeEvent } from 'react-native';\nimport { useInternal } from '../../hooks';\nimport {\n CONTEXT_MENU_STATE,\n HOLD_ITEM_TRANSFORM_DURATION,\n SPRING_CONFIGURATION,\n} from '../../constants';\n\nconst Content = () => {\n const { state, menuProps, contentRenderer } = useInternal();\n const [isActive, setIsActive] = useState(false);\n const contentHeight = useSharedValue(0);\n\n const handleLayout = useCallback(\n (event: LayoutChangeEvent) => {\n contentHeight.value = event.nativeEvent.layout.height;\n },\n [contentHeight]\n );\n\n // синхронизируем Reanimated state → React state\n useAnimatedReaction(\n () => state.value,\n val => {\n runOnJS(setIsActive)(val === CONTEXT_MENU_STATE.ACTIVE);\n }\n );\n\n const renderContent = contentRenderer.current;\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n const anchorPositionHorizontal = menuProps.value.anchorPosition.split(\n '-'\n )[1];\n\n const top =\n anchorPositionVertical === 'top'\n ? menuProps.value.itemY - contentHeight.value - 8\n : menuProps.value.itemY + menuProps.value.itemHeight + 8;\n\n const left =\n anchorPositionHorizontal === 'center'\n ? menuProps.value.itemX / 2 - menuProps.value.itemWidth / 3\n : anchorPositionHorizontal === 'right'\n ? undefined\n : menuProps.value.itemX;\n const right = anchorPositionHorizontal === 'right' ? 0 : undefined;\n\n const tY = menuProps.value.transformValue;\n return {\n opacity:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withTiming(1)\n : withTiming(0),\n top,\n left,\n right,\n transform: [\n {\n translateY:\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withSpring(tY, SPRING_CONFIGURATION)\n : withTiming(0, { duration: HOLD_ITEM_TRANSFORM_DURATION }),\n },\n ],\n };\n }, [menuProps]);\n\n const closeMenu = () => (state.value = CONTEXT_MENU_STATE.END);\n\n if (!renderContent) {\n return null;\n }\n return (\n <Animated.View\n onLayout={handleLayout}\n style={[{ position: 'absolute', left: 0, zIndex: 12 }, wrapperStyles]}\n >\n {isActive && renderContent(closeMenu)}\n </Animated.View>\n );\n};\n\nexport default Content;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["Provider.tsx"],"names":["React","memo","useEffect","useMemo","useRef","PortalProvider","Animated","useSharedValue","useAnimatedReaction","runOnJS","GestureHandlerRootView","Backdrop","InternalContext","CONTEXT_MENU_STATE","Menu","Content","AnimatedIcon","ProviderComponent","children","theme","selectedTheme","iconComponent","safeAreaInsets","onOpen","onClose","createAnimatedComponent","state","UNDETERMINED","menuProps","itemHeight","itemWidth","itemX","itemY","items","anchorPosition","menuHeight","transformValue","actionParams","contentRenderer","value","ACTIVE","END","internalContextVariables","top","bottom","left","right","flex","Provider"],"mappings":"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","sourcesContent":["import React, { memo, useEffect, useMemo, useRef } from 'react';\nimport { PortalProvider } from '@gorhom/portal';\nimport Animated, {\n useSharedValue,\n useAnimatedReaction,\n runOnJS,\n} from 'react-native-reanimated';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\n// Components\nimport { Backdrop } from '../backdrop';\n\n// Utils\nimport { InternalContext } from '../../context/internal';\nimport { HoldMenuProviderProps } from './types';\nimport { StateProps, Action } from './reducer';\nimport { CONTEXT_MENU_STATE } from '../../constants';\nimport { MenuInternalProps } from '../menu/types';\nimport Menu from '../menu';\nimport Content from './Content';\n\nexport interface Store {\n state: StateProps;\n dispatch?: React.Dispatch<Action>;\n}\n\nexport let AnimatedIcon: any;\n\nconst ProviderComponent: React.FC<HoldMenuProviderProps> = ({\n children,\n theme: selectedTheme,\n iconComponent,\n safeAreaInsets,\n onOpen,\n onClose,\n}) => {\n if (iconComponent)\n AnimatedIcon = Animated.createAnimatedComponent(iconComponent);\n\n const state = useSharedValue<CONTEXT_MENU_STATE>(\n CONTEXT_MENU_STATE.UNDETERMINED\n );\n const theme = useSharedValue<'light' | 'dark'>(selectedTheme || 'light');\n const menuProps = useSharedValue<MenuInternalProps>({\n itemHeight: 0,\n itemWidth: 0,\n itemX: 0,\n itemY: 0,\n items: [],\n anchorPosition: 'top-center',\n menuHeight: 0,\n transformValue: 0,\n actionParams: {},\n });\n const contentRenderer = useRef<(() => React.ReactNode) | null>(null);\n\n useEffect(() => {\n theme.value = selectedTheme || 'light';\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTheme]);\n\n useAnimatedReaction(\n () => state.value,\n state => {\n switch (state) {\n case CONTEXT_MENU_STATE.ACTIVE: {\n if (onOpen) runOnJS(onOpen)();\n break;\n }\n case CONTEXT_MENU_STATE.END: {\n if (onClose) runOnJS(onClose)();\n break;\n }\n }\n },\n [state]\n );\n\n const internalContextVariables = useMemo(\n () => ({\n state,\n theme,\n menuProps,\n contentRenderer,\n safeAreaInsets: safeAreaInsets || {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n }),\n [state, theme, menuProps, safeAreaInsets]\n );\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <InternalContext.Provider value={internalContextVariables}>\n <PortalProvider>\n {children}\n <Backdrop />\n <Menu />\n <Content />\n </PortalProvider>\n </InternalContext.Provider>\n </GestureHandlerRootView>\n );\n};\n\nconst Provider = memo(ProviderComponent) as React.FC<HoldMenuProviderProps>;\n\nexport default Provider;\n"]}
1
+ {"version":3,"sources":["Provider.tsx"],"names":["React","memo","useEffect","useMemo","useRef","PortalProvider","Animated","useSharedValue","useAnimatedReaction","runOnJS","GestureHandlerRootView","Backdrop","InternalContext","CONTEXT_MENU_STATE","Menu","Content","AnimatedIcon","ProviderComponent","children","theme","selectedTheme","iconComponent","safeAreaInsets","onOpen","onClose","createAnimatedComponent","state","UNDETERMINED","menuProps","itemHeight","itemWidth","itemX","itemY","items","anchorPosition","menuHeight","transformValue","actionParams","contentRenderer","value","ACTIVE","END","internalContextVariables","top","bottom","left","right","flex","Provider"],"mappings":"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","sourcesContent":["import React, { memo, useEffect, useMemo, useRef } from 'react';\nimport { PortalProvider } from '@gorhom/portal';\nimport Animated, {\n useSharedValue,\n useAnimatedReaction,\n runOnJS,\n} from 'react-native-reanimated';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\n// Components\nimport { Backdrop } from '../backdrop';\n\n// Utils\nimport { InternalContext } from '../../context/internal';\nimport { HoldMenuProviderProps } from './types';\nimport { StateProps, Action } from './reducer';\nimport { CONTEXT_MENU_STATE } from '../../constants';\nimport { MenuInternalProps } from '../menu/types';\nimport Menu from '../menu';\nimport Content from './Content';\n\nexport interface Store {\n state: StateProps;\n dispatch?: React.Dispatch<Action>;\n}\n\nexport let AnimatedIcon: any;\n\nconst ProviderComponent: React.FC<HoldMenuProviderProps> = ({\n children,\n theme: selectedTheme,\n iconComponent,\n safeAreaInsets,\n onOpen,\n onClose,\n}) => {\n if (iconComponent)\n AnimatedIcon = Animated.createAnimatedComponent(iconComponent);\n\n const state = useSharedValue<CONTEXT_MENU_STATE>(\n CONTEXT_MENU_STATE.UNDETERMINED\n );\n const theme = useSharedValue<'light' | 'dark'>(selectedTheme || 'light');\n const menuProps = useSharedValue<MenuInternalProps>({\n itemHeight: 0,\n itemWidth: 0,\n itemX: 0,\n itemY: 0,\n items: [],\n anchorPosition: 'top-center',\n menuHeight: 0,\n transformValue: 0,\n actionParams: {},\n });\n const contentRenderer = useRef<((params: any) => React.ReactNode) | null>(\n null\n );\n\n useEffect(() => {\n theme.value = selectedTheme || 'light';\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTheme]);\n\n useAnimatedReaction(\n () => state.value,\n state => {\n switch (state) {\n case CONTEXT_MENU_STATE.ACTIVE: {\n if (onOpen) runOnJS(onOpen)();\n break;\n }\n case CONTEXT_MENU_STATE.END: {\n if (onClose) runOnJS(onClose)();\n break;\n }\n }\n },\n [state]\n );\n\n const internalContextVariables = useMemo(\n () => ({\n state,\n theme,\n menuProps,\n contentRenderer,\n safeAreaInsets: safeAreaInsets || {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n }),\n [state, theme, menuProps, safeAreaInsets]\n );\n\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <InternalContext.Provider value={internalContextVariables}>\n <PortalProvider>\n {children}\n <Backdrop />\n <Menu />\n <Content />\n </PortalProvider>\n </InternalContext.Provider>\n </GestureHandlerRootView>\n );\n};\n\nconst Provider = memo(ProviderComponent) as React.FC<HoldMenuProviderProps>;\n\nexport default Provider;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["internal.ts"],"names":["createContext","InternalContext"],"mappings":"AAAA,SAASA,aAAT,QAA8B,OAA9B;AAuBA;AACA,OAAO,MAAMC,eAAe,gBAAGD,aAAa,EAArC","sourcesContent":["import { createContext } from 'react';\nimport type { MutableRefObject } from 'react';\nimport type Animated from 'react-native-reanimated';\nimport type { CONTEXT_MENU_STATE } from '../constants';\nimport { MenuInternalProps } from '../components/menu/types';\n\nexport type ContentRendererRef = MutableRefObject<\n (() => React.ReactNode) | null\n>;\n\nexport type InternalContextType = {\n state: Animated.SharedValue<CONTEXT_MENU_STATE>;\n theme: Animated.SharedValue<'light' | 'dark'>;\n menuProps: Animated.SharedValue<MenuInternalProps>;\n contentRenderer: ContentRendererRef;\n safeAreaInsets?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n};\n\n// @ts-ignore\nexport const InternalContext = createContext<InternalContextType>();\n"]}
1
+ {"version":3,"sources":["internal.ts"],"names":["createContext","InternalContext"],"mappings":"AAAA,SAASA,aAAT,QAA8B,OAA9B;AAuBA;AACA,OAAO,MAAMC,eAAe,gBAAGD,aAAa,EAArC","sourcesContent":["import { createContext } from 'react';\nimport type { MutableRefObject } from 'react';\nimport type Animated from 'react-native-reanimated';\nimport type { CONTEXT_MENU_STATE } from '../constants';\nimport { MenuInternalProps } from '../components/menu/types';\n\nexport type ContentRendererRef = MutableRefObject<\n ((params: any) => React.ReactNode) | null\n>;\n\nexport type InternalContextType = {\n state: Animated.SharedValue<CONTEXT_MENU_STATE>;\n theme: Animated.SharedValue<'light' | 'dark'>;\n menuProps: Animated.SharedValue<MenuInternalProps>;\n contentRenderer: ContentRendererRef;\n safeAreaInsets?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n};\n\n// @ts-ignore\nexport const InternalContext = createContext<InternalContextType>();\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"names":["default","HoldItem","HoldMenuProvider","HoldMenuFlatList","HoldMenuIcon"],"mappings":"AAAA,SAASA,OAAO,IAAIC,QAApB,QAAoC,uBAApC;AACA,SAASD,OAAO,IAAIE,gBAApB,QAA4C,uBAA5C;AACA,SAASF,OAAO,IAAIG,gBAApB,QAA4C,uBAA5C;AACA,SAASH,OAAO,IAAII,YAApB,QAAwC,mBAAxC","sourcesContent":["export { default as HoldItem } from './components/holdItem';\nexport { default as HoldMenuProvider } from './components/provider';\nexport { default as HoldMenuFlatList } from './components/flatList';\nexport { default as HoldMenuIcon } from './components/icon';\n\nexport type { HoldMenuProviderProps } from './components/provider';\nexport type { HoldItemProps } from './components/holdItem/types';\n"]}
1
+ {"version":3,"sources":["index.ts"],"names":["default","HoldItem","HoldMenuProvider","HoldMenuFlatList","HoldMenuIcon"],"mappings":"AAAA,SAASA,OAAO,IAAIC,QAApB,QAAoC,uBAApC;AACA,SAASD,OAAO,IAAIE,gBAApB,QAA4C,uBAA5C;AACA,SAASF,OAAO,IAAIG,gBAApB,QAA4C,uBAA5C;AACA,SAASH,OAAO,IAAII,YAApB,QAAwC,mBAAxC","sourcesContent":["export { default as HoldItem } from './components/holdItem';\nexport { default as HoldMenuProvider } from './components/provider';\nexport { default as HoldMenuFlatList } from './components/flatList';\nexport { default as HoldMenuIcon } from './components/icon';\n\nexport type { HoldMenuProviderProps } from './components/provider';\nexport type {\n HoldItemProps,\n RenderContentParams,\n} from './components/holdItem/types';\n"]}
@@ -2,13 +2,17 @@ import { ViewStyle } from 'react-native';
2
2
  import { MenuItemProps } from '../menu/types';
3
3
  import { TransformOriginAnchorPosition } from '../../utils/calculations';
4
4
 
5
+ export interface RenderContentParams {
6
+ closeMenu: () => void;
7
+ }
8
+
5
9
  export type HoldItemProps = {
6
10
  /**
7
11
  * List of context menu items.
8
12
  * @type MenuItemProps[]
9
13
  * @default []
10
14
  */
11
- items: MenuItemProps[];
15
+ items?: MenuItemProps[];
12
16
 
13
17
  /**
14
18
  * Object of keys that same name with items to match parameters to onPress actions.
@@ -128,11 +132,11 @@ export type HoldItemProps = {
128
132
  /**
129
133
  * Custom content renderer for this HoldItem.
130
134
  * Allows to render custom content (e.g. reactions) above/below the menu.
131
- * @type () => React.ReactNode
135
+ * @type (params: RenderContentParams) => React.ReactNode
132
136
  * @examples
133
- * renderContent={() => <MyReactions />}
137
+ * renderContent={({ closeMenu }) => <MyReactions onClose={closeMenu} />}
134
138
  */
135
- renderContent?: () => React.ReactNode;
139
+ renderContent?: (params: RenderContentParams) => React.ReactNode;
136
140
  };
137
141
 
138
142
  export type GestureHandlerProps = {
@@ -2,7 +2,7 @@ import type { MutableRefObject } from 'react';
2
2
  import type Animated from 'react-native-reanimated';
3
3
  import type { CONTEXT_MENU_STATE } from '../constants';
4
4
  import { MenuInternalProps } from '../components/menu/types';
5
- export declare type ContentRendererRef = MutableRefObject<(() => React.ReactNode) | null>;
5
+ export declare type ContentRendererRef = MutableRefObject<((params: any) => React.ReactNode) | null>;
6
6
  export declare type InternalContextType = {
7
7
  state: Animated.SharedValue<CONTEXT_MENU_STATE>;
8
8
  theme: Animated.SharedValue<'light' | 'dark'>;
@@ -3,4 +3,4 @@ export { default as HoldMenuProvider } from './components/provider';
3
3
  export { default as HoldMenuFlatList } from './components/flatList';
4
4
  export { default as HoldMenuIcon } from './components/icon';
5
5
  export type { HoldMenuProviderProps } from './components/provider';
6
- export type { HoldItemProps } from './components/holdItem/types';
6
+ export type { HoldItemProps, RenderContentParams, } from './components/holdItem/types';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-hold-menu-actions",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "A performant, easy to use hold to open context menu for React Native powered by Reanimated.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -51,12 +51,13 @@ import styles from './styles';
51
51
  import type { HoldItemProps, GestureHandlerProps } from './types';
52
52
  import styleGuide from '../../styleGuide';
53
53
  import { useInternal } from '../../hooks';
54
+ import { MenuItemProps } from '../menu/types';
54
55
  //#endregion
55
56
 
56
57
  type Context = { didMeasureLayout: boolean };
57
-
58
+ const defaultItems = [] as MenuItemProps[];
58
59
  const HoldItemComponent: React.FC<HoldItemProps> = ({
59
- items,
60
+ items = defaultItems,
60
61
  bottom,
61
62
  containerStyles,
62
63
  disableMove,
@@ -200,12 +201,18 @@ const HoldItemComponent: React.FC<HoldItemProps> = ({
200
201
  };
201
202
 
202
203
  const setContentRenderer = () => {
203
- contentRenderer.current = renderContent || null;
204
+ if (renderContent) {
205
+ contentRenderer.current = (params: any) =>
206
+ renderContent({ closeMenu: params });
207
+ } else {
208
+ contentRenderer.current = null;
209
+ }
204
210
  };
205
211
 
206
212
  const onCompletion = (isFinised?: boolean) => {
207
213
  'worklet';
208
- const isListValid = items && items.length > 0;
214
+ const isListValid = true;
215
+ // items && items.length > 0;
209
216
  if (isFinised && isListValid) {
210
217
  state.value = CONTEXT_MENU_STATE.ACTIVE;
211
218
  isActive.value = true;
@@ -2,13 +2,17 @@ import { ViewStyle } from 'react-native';
2
2
  import { MenuItemProps } from '../menu/types';
3
3
  import { TransformOriginAnchorPosition } from '../../utils/calculations';
4
4
 
5
+ export interface RenderContentParams {
6
+ closeMenu: () => void;
7
+ }
8
+
5
9
  export type HoldItemProps = {
6
10
  /**
7
11
  * List of context menu items.
8
12
  * @type MenuItemProps[]
9
13
  * @default []
10
14
  */
11
- items: MenuItemProps[];
15
+ items?: MenuItemProps[];
12
16
 
13
17
  /**
14
18
  * Object of keys that same name with items to match parameters to onPress actions.
@@ -128,11 +132,11 @@ export type HoldItemProps = {
128
132
  /**
129
133
  * Custom content renderer for this HoldItem.
130
134
  * Allows to render custom content (e.g. reactions) above/below the menu.
131
- * @type () => React.ReactNode
135
+ * @type (params: RenderContentParams) => React.ReactNode
132
136
  * @examples
133
- * renderContent={() => <MyReactions />}
137
+ * renderContent={({ closeMenu }) => <MyReactions onClose={closeMenu} />}
134
138
  */
135
- renderContent?: () => React.ReactNode;
139
+ renderContent?: (params: RenderContentParams) => React.ReactNode;
136
140
  };
137
141
 
138
142
  export type GestureHandlerProps = {
@@ -74,6 +74,9 @@ const Content = () => {
74
74
  ],
75
75
  };
76
76
  }, [menuProps]);
77
+
78
+ const closeMenu = () => (state.value = CONTEXT_MENU_STATE.END);
79
+
77
80
  if (!renderContent) {
78
81
  return null;
79
82
  }
@@ -82,7 +85,7 @@ const Content = () => {
82
85
  onLayout={handleLayout}
83
86
  style={[{ position: 'absolute', left: 0, zIndex: 12 }, wrapperStyles]}
84
87
  >
85
- {isActive && renderContent()}
88
+ {isActive && renderContent(closeMenu)}
86
89
  </Animated.View>
87
90
  );
88
91
  };
@@ -52,7 +52,9 @@ const ProviderComponent: React.FC<HoldMenuProviderProps> = ({
52
52
  transformValue: 0,
53
53
  actionParams: {},
54
54
  });
55
- const contentRenderer = useRef<(() => React.ReactNode) | null>(null);
55
+ const contentRenderer = useRef<((params: any) => React.ReactNode) | null>(
56
+ null
57
+ );
56
58
 
57
59
  useEffect(() => {
58
60
  theme.value = selectedTheme || 'light';
@@ -5,7 +5,7 @@ import type { CONTEXT_MENU_STATE } from '../constants';
5
5
  import { MenuInternalProps } from '../components/menu/types';
6
6
 
7
7
  export type ContentRendererRef = MutableRefObject<
8
- (() => React.ReactNode) | null
8
+ ((params: any) => React.ReactNode) | null
9
9
  >;
10
10
 
11
11
  export type InternalContextType = {
package/src/index.ts CHANGED
@@ -4,4 +4,7 @@ export { default as HoldMenuFlatList } from './components/flatList';
4
4
  export { default as HoldMenuIcon } from './components/icon';
5
5
 
6
6
  export type { HoldMenuProviderProps } from './components/provider';
7
- export type { HoldItemProps } from './components/holdItem/types';
7
+ export type {
8
+ HoldItemProps,
9
+ RenderContentParams,
10
+ } from './components/holdItem/types';