react-native-hold-menu-actions 0.1.16 → 0.1.19

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.
Files changed (38) hide show
  1. package/lib/commonjs/components/backdrop/Backdrop.js +3 -3
  2. package/lib/commonjs/components/backdrop/Backdrop.js.map +1 -1
  3. package/lib/commonjs/components/customView/CustomView.js +25 -35
  4. package/lib/commonjs/components/customView/CustomView.js.map +1 -1
  5. package/lib/commonjs/components/holdItem/HoldItem.js +11 -5
  6. package/lib/commonjs/components/holdItem/HoldItem.js.map +1 -1
  7. package/lib/commonjs/components/menu/Menu.js +2 -5
  8. package/lib/commonjs/components/menu/Menu.js.map +1 -1
  9. package/lib/commonjs/components/menu/MenuList.js +0 -1
  10. package/lib/commonjs/components/menu/MenuList.js.map +1 -1
  11. package/lib/commonjs/components/provider/Provider.js +0 -1
  12. package/lib/commonjs/components/provider/Provider.js.map +1 -1
  13. package/lib/commonjs/utils/calculations.js +1 -48
  14. package/lib/commonjs/utils/calculations.js.map +1 -1
  15. package/lib/module/components/backdrop/Backdrop.js +2 -2
  16. package/lib/module/components/backdrop/Backdrop.js.map +1 -1
  17. package/lib/module/components/customView/CustomView.js +27 -36
  18. package/lib/module/components/customView/CustomView.js.map +1 -1
  19. package/lib/module/components/holdItem/HoldItem.js +12 -6
  20. package/lib/module/components/holdItem/HoldItem.js.map +1 -1
  21. package/lib/module/components/menu/Menu.js +3 -5
  22. package/lib/module/components/menu/Menu.js.map +1 -1
  23. package/lib/module/components/menu/MenuList.js +0 -1
  24. package/lib/module/components/menu/MenuList.js.map +1 -1
  25. package/lib/module/components/provider/Provider.js +0 -1
  26. package/lib/module/components/provider/Provider.js.map +1 -1
  27. package/lib/module/utils/calculations.js +0 -44
  28. package/lib/module/utils/calculations.js.map +1 -1
  29. package/lib/typescript/components/menu/MenuList.d.ts +1 -1
  30. package/lib/typescript/components/menu/types.d.ts +0 -1
  31. package/lib/typescript/utils/calculations.d.ts +0 -1
  32. package/package.json +1 -1
  33. package/src/components/customView/CustomView.tsx +39 -51
  34. package/src/components/holdItem/HoldItem.tsx +12 -16
  35. package/src/components/menu/Menu.tsx +2 -13
  36. package/src/components/menu/types.d.ts +0 -1
  37. package/src/components/provider/Provider.tsx +7 -10
  38. package/src/utils/calculations.ts +0 -53
@@ -13,7 +13,7 @@ var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reani
13
13
 
14
14
  var _reactNativeGestureHandler = require("react-native-gesture-handler");
15
15
 
16
- var _expoBlur = require("expo-blur");
16
+ var _blur = require("@react-native-community/blur");
17
17
 
18
18
  var _styles = require("./styles");
19
19
 
@@ -29,7 +29,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
29
29
 
30
30
  // Components
31
31
  // Utils
32
- const AnimatedBlurView = _constants.IS_IOS ? _reactNativeReanimated.default.createAnimatedComponent(_expoBlur.BlurView) : _reactNativeReanimated.default.View;
32
+ const AnimatedBlurView = _constants.IS_IOS ? _reactNativeReanimated.default.createAnimatedComponent(_blur.BlurView) : _reactNativeReanimated.default.View;
33
33
 
34
34
  const BackdropComponent = () => {
35
35
  const {
@@ -72,7 +72,7 @@ const BackdropComponent = () => {
72
72
  });
73
73
  const animatedContainerProps = (0, _reactNativeReanimated.useAnimatedProps)(() => {
74
74
  return {
75
- intensity: (0, _reactNativeReanimated.withTiming)(state.value === _constants.CONTEXT_MENU_STATE.ACTIVE ? 100 : 0, {
75
+ blurAmount: (0, _reactNativeReanimated.withTiming)(state.value === _constants.CONTEXT_MENU_STATE.ACTIVE ? 100 : 0, {
76
76
  duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
77
77
  })
78
78
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["Backdrop.tsx"],"names":["AnimatedBlurView","IS_IOS","Animated","createAnimatedComponent","BlurView","View","BackdropComponent","state","theme","tapGestureEvent","onStart","event","context","startPosition","x","y","onCancel","value","CONTEXT_MENU_STATE","END","onEnd","distance","Math","hypot","shouldClose","isStateActive","ACTIVE","animatedContainerStyle","topValueAnimation","HOLD_ITEM_TRANSFORM_DURATION","WINDOW_HEIGHT","duration","opacityValueAnimation","top","opacity","animatedContainerProps","intensity","animatedInnerContainerStyle","backgroundColor","BACKDROP_LIGHT_BACKGROUND_COLOR","BACKDROP_DARK_BACKGROUND_COLOR","styles","container","StyleSheet","absoluteFillObject","Backdrop"],"mappings":"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","sourcesContent":["import React, { memo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated, {\n useAnimatedGestureHandler,\n useAnimatedProps,\n useAnimatedStyle,\n withDelay,\n withTiming,\n} from 'react-native-reanimated';\nimport {\n TapGestureHandler,\n TapGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\n\n// Components\nimport { BlurView } from 'expo-blur';\n\n// Utils\nimport { styles } from './styles';\nimport {\n CONTEXT_MENU_STATE,\n HOLD_ITEM_TRANSFORM_DURATION,\n IS_IOS,\n WINDOW_HEIGHT,\n} from '../../constants';\nimport {\n BACKDROP_LIGHT_BACKGROUND_COLOR,\n BACKDROP_DARK_BACKGROUND_COLOR,\n} from './constants';\nimport { useInternal } from '../../hooks';\n\nconst AnimatedBlurView = IS_IOS\n ? Animated.createAnimatedComponent(BlurView)\n : Animated.View;\n\ntype Context = {\n startPosition: {\n x: number;\n y: number;\n };\n};\n\nconst BackdropComponent = () => {\n const { state, theme } = useInternal();\n\n const tapGestureEvent = useAnimatedGestureHandler<\n TapGestureHandlerGestureEvent,\n Context\n >(\n {\n onStart: (event, context) => {\n context.startPosition = { x: event.x, y: event.y };\n },\n onCancel: () => {\n state.value = CONTEXT_MENU_STATE.END;\n },\n onEnd: (event, context) => {\n const distance = Math.hypot(\n event.x - context.startPosition.x,\n event.y - context.startPosition.y\n );\n const shouldClose = distance < 10;\n const isStateActive = state.value === CONTEXT_MENU_STATE.ACTIVE;\n\n if (shouldClose && isStateActive) {\n state.value = CONTEXT_MENU_STATE.END;\n }\n },\n },\n [state]\n );\n\n const animatedContainerStyle = useAnimatedStyle(() => {\n const topValueAnimation = () =>\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? 0\n : withDelay(\n HOLD_ITEM_TRANSFORM_DURATION,\n withTiming(WINDOW_HEIGHT, {\n duration: 0,\n })\n );\n\n const opacityValueAnimation = () =>\n withTiming(state.value === CONTEXT_MENU_STATE.ACTIVE ? 1 : 0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n });\n\n return {\n top: topValueAnimation(),\n opacity: opacityValueAnimation(),\n };\n });\n\n const animatedContainerProps = useAnimatedProps(() => {\n return {\n intensity: withTiming(\n state.value === CONTEXT_MENU_STATE.ACTIVE ? 100 : 0,\n {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n }\n ),\n };\n });\n\n const animatedInnerContainerStyle = useAnimatedStyle(() => {\n const backgroundColor =\n theme.value === 'light'\n ? BACKDROP_LIGHT_BACKGROUND_COLOR\n : BACKDROP_DARK_BACKGROUND_COLOR;\n\n return { backgroundColor };\n }, [theme]);\n\n return (\n <TapGestureHandler onHandlerStateChange={tapGestureEvent}>\n <AnimatedBlurView\n // @ts-ignore\n tint=\"default\"\n animatedProps={animatedContainerProps}\n style={[styles.container, animatedContainerStyle]}\n >\n <Animated.View\n style={[\n { ...StyleSheet.absoluteFillObject },\n animatedInnerContainerStyle,\n ]}\n />\n </AnimatedBlurView>\n </TapGestureHandler>\n );\n};\n\nconst Backdrop = memo(BackdropComponent);\n\nexport default Backdrop;\n"]}
1
+ {"version":3,"sources":["Backdrop.tsx"],"names":["AnimatedBlurView","IS_IOS","Animated","createAnimatedComponent","BlurView","View","BackdropComponent","state","theme","tapGestureEvent","onStart","event","context","startPosition","x","y","onCancel","value","CONTEXT_MENU_STATE","END","onEnd","distance","Math","hypot","shouldClose","isStateActive","ACTIVE","animatedContainerStyle","topValueAnimation","HOLD_ITEM_TRANSFORM_DURATION","WINDOW_HEIGHT","duration","opacityValueAnimation","top","opacity","animatedContainerProps","blurAmount","animatedInnerContainerStyle","backgroundColor","BACKDROP_LIGHT_BACKGROUND_COLOR","BACKDROP_DARK_BACKGROUND_COLOR","styles","container","StyleSheet","absoluteFillObject","Backdrop"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAOA;;AAMA;;AAGA;;AACA;;AAMA;;AAIA;;;;;;AAfA;AAGA;AAcA,MAAMA,gBAAgB,GAAGC,oBACrBC,+BAASC,uBAAT,CAAiCC,cAAjC,CADqB,GAErBF,+BAASG,IAFb;;AAWA,MAAMC,iBAAiB,GAAG,MAAM;AAC9B,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAmB,yBAAzB;AAEA,QAAMC,eAAe,GAAG,sDAItB;AACEC,IAAAA,OAAO,EAAE,CAACC,KAAD,EAAQC,OAAR,KAAoB;AAC3BA,MAAAA,OAAO,CAACC,aAAR,GAAwB;AAAEC,QAAAA,CAAC,EAAEH,KAAK,CAACG,CAAX;AAAcC,QAAAA,CAAC,EAAEJ,KAAK,CAACI;AAAvB,OAAxB;AACD,KAHH;AAIEC,IAAAA,QAAQ,EAAE,MAAM;AACdT,MAAAA,KAAK,CAACU,KAAN,GAAcC,8BAAmBC,GAAjC;AACD,KANH;AAOEC,IAAAA,KAAK,EAAE,CAACT,KAAD,EAAQC,OAAR,KAAoB;AACzB,YAAMS,QAAQ,GAAGC,IAAI,CAACC,KAAL,CACfZ,KAAK,CAACG,CAAN,GAAUF,OAAO,CAACC,aAAR,CAAsBC,CADjB,EAEfH,KAAK,CAACI,CAAN,GAAUH,OAAO,CAACC,aAAR,CAAsBE,CAFjB,CAAjB;AAIA,YAAMS,WAAW,GAAGH,QAAQ,GAAG,EAA/B;AACA,YAAMI,aAAa,GAAGlB,KAAK,CAACU,KAAN,KAAgBC,8BAAmBQ,MAAzD;;AAEA,UAAIF,WAAW,IAAIC,aAAnB,EAAkC;AAChClB,QAAAA,KAAK,CAACU,KAAN,GAAcC,8BAAmBC,GAAjC;AACD;AACF;AAlBH,GAJsB,EAwBtB,CAACZ,KAAD,CAxBsB,CAAxB;AA2BA,QAAMoB,sBAAsB,GAAG,6CAAiB,MAAM;AACpD,UAAMC,iBAAiB,GAAG,MACxBrB,KAAK,CAACU,KAAN,KAAgBC,8BAAmBQ,MAAnC,GACI,CADJ,GAEI,sCACEG,uCADF,EAEE,uCAAWC,wBAAX,EAA0B;AACxBC,MAAAA,QAAQ,EAAE;AADc,KAA1B,CAFF,CAHN;;AAUA,UAAMC,qBAAqB,GAAG,MAC5B,uCAAWzB,KAAK,CAACU,KAAN,KAAgBC,8BAAmBQ,MAAnC,GAA4C,CAA5C,GAAgD,CAA3D,EAA8D;AAC5DK,MAAAA,QAAQ,EAAEF;AADkD,KAA9D,CADF;;AAKA,WAAO;AACLI,MAAAA,GAAG,EAAEL,iBAAiB,EADjB;AAELM,MAAAA,OAAO,EAAEF,qBAAqB;AAFzB,KAAP;AAID,GApB8B,CAA/B;AAsBA,QAAMG,sBAAsB,GAAG,6CAAiB,MAAM;AACpD,WAAO;AACLC,MAAAA,UAAU,EAAE,uCACV7B,KAAK,CAACU,KAAN,KAAgBC,8BAAmBQ,MAAnC,GAA4C,GAA5C,GAAkD,CADxC,EAEV;AACEK,QAAAA,QAAQ,EAAEF;AADZ,OAFU;AADP,KAAP;AAQD,GAT8B,CAA/B;AAWA,QAAMQ,2BAA2B,GAAG,6CAAiB,MAAM;AACzD,UAAMC,eAAe,GACnB9B,KAAK,CAACS,KAAN,KAAgB,OAAhB,GACIsB,2CADJ,GAEIC,0CAHN;AAKA,WAAO;AAAEF,MAAAA;AAAF,KAAP;AACD,GAPmC,EAOjC,CAAC9B,KAAD,CAPiC,CAApC;AASA,sBACE,6BAAC,4CAAD;AAAmB,IAAA,oBAAoB,EAAEC;AAAzC,kBACE,6BAAC,gBAAD,CACE;AADF;AAEE,IAAA,IAAI,EAAC,SAFP;AAGE,IAAA,aAAa,EAAE0B,sBAHjB;AAIE,IAAA,KAAK,EAAE,CAACM,eAAOC,SAAR,EAAmBf,sBAAnB;AAJT,kBAME,6BAAC,8BAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CACL,EAAE,GAAGgB,wBAAWC;AAAhB,KADK,EAELP,2BAFK;AADT,IANF,CADF,CADF;AAiBD,CAzFD;;AA2FA,MAAMQ,QAAQ,gBAAG,iBAAKvC,iBAAL,CAAjB;eAEeuC,Q","sourcesContent":["import React, { memo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated, {\n useAnimatedGestureHandler,\n useAnimatedProps,\n useAnimatedStyle,\n withDelay,\n withTiming,\n} from 'react-native-reanimated';\nimport {\n TapGestureHandler,\n TapGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\n\n// Components\nimport { BlurView } from '@react-native-community/blur';\n\n// Utils\nimport { styles } from './styles';\nimport {\n CONTEXT_MENU_STATE,\n HOLD_ITEM_TRANSFORM_DURATION,\n IS_IOS,\n WINDOW_HEIGHT,\n} from '../../constants';\nimport {\n BACKDROP_LIGHT_BACKGROUND_COLOR,\n BACKDROP_DARK_BACKGROUND_COLOR,\n} from './constants';\nimport { useInternal } from '../../hooks';\n\nconst AnimatedBlurView = IS_IOS\n ? Animated.createAnimatedComponent(BlurView)\n : Animated.View;\n\ntype Context = {\n startPosition: {\n x: number;\n y: number;\n };\n};\n\nconst BackdropComponent = () => {\n const { state, theme } = useInternal();\n\n const tapGestureEvent = useAnimatedGestureHandler<\n TapGestureHandlerGestureEvent,\n Context\n >(\n {\n onStart: (event, context) => {\n context.startPosition = { x: event.x, y: event.y };\n },\n onCancel: () => {\n state.value = CONTEXT_MENU_STATE.END;\n },\n onEnd: (event, context) => {\n const distance = Math.hypot(\n event.x - context.startPosition.x,\n event.y - context.startPosition.y\n );\n const shouldClose = distance < 10;\n const isStateActive = state.value === CONTEXT_MENU_STATE.ACTIVE;\n\n if (shouldClose && isStateActive) {\n state.value = CONTEXT_MENU_STATE.END;\n }\n },\n },\n [state]\n );\n\n const animatedContainerStyle = useAnimatedStyle(() => {\n const topValueAnimation = () =>\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? 0\n : withDelay(\n HOLD_ITEM_TRANSFORM_DURATION,\n withTiming(WINDOW_HEIGHT, {\n duration: 0,\n })\n );\n\n const opacityValueAnimation = () =>\n withTiming(state.value === CONTEXT_MENU_STATE.ACTIVE ? 1 : 0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n });\n\n return {\n top: topValueAnimation(),\n opacity: opacityValueAnimation(),\n };\n });\n\n const animatedContainerProps = useAnimatedProps(() => {\n return {\n blurAmount: withTiming(\n state.value === CONTEXT_MENU_STATE.ACTIVE ? 100 : 0,\n {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n }\n ),\n };\n });\n\n const animatedInnerContainerStyle = useAnimatedStyle(() => {\n const backgroundColor =\n theme.value === 'light'\n ? BACKDROP_LIGHT_BACKGROUND_COLOR\n : BACKDROP_DARK_BACKGROUND_COLOR;\n\n return { backgroundColor };\n }, [theme]);\n\n return (\n <TapGestureHandler onHandlerStateChange={tapGestureEvent}>\n <AnimatedBlurView\n // @ts-ignore\n tint=\"default\"\n animatedProps={animatedContainerProps}\n style={[styles.container, animatedContainerStyle]}\n >\n <Animated.View\n style={[\n { ...StyleSheet.absoluteFillObject },\n animatedInnerContainerStyle,\n ]}\n />\n </AnimatedBlurView>\n </TapGestureHandler>\n );\n};\n\nconst Backdrop = memo(BackdropComponent);\n\nexport default Backdrop;\n"]}
@@ -15,8 +15,6 @@ var _hooks = require("../../hooks");
15
15
 
16
16
  var _constants = require("../../constants");
17
17
 
18
- var _calculations = require("../../utils/calculations");
19
-
20
18
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
21
19
 
22
20
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -25,13 +23,11 @@ const CustomViewComponent = () => {
25
23
  const {
26
24
  state,
27
25
  menuProps,
28
- customViewRef,
29
- safeAreaInsets
26
+ customViewRef
30
27
  } = (0, _hooks.useInternal)();
31
28
  const [renderFn, setRenderFn] = (0, _react.useState)(null);
32
29
  const [customViewHeight, setCustomViewHeight] = (0, _react.useState)(0);
33
30
  const [customViewWidth, setCustomViewWidth] = (0, _react.useState)(0);
34
- const isActive = (0, _reactNativeReanimated.useSharedValue)(false);
35
31
  const closeMenu = (0, _react.useCallback)(() => {
36
32
  state.value = _constants.CONTEXT_MENU_STATE.END;
37
33
  }, [state]);
@@ -42,18 +38,12 @@ const CustomViewComponent = () => {
42
38
  } = event.nativeEvent.layout;
43
39
  setCustomViewHeight(height);
44
40
  setCustomViewWidth(width);
45
- menuProps.value = { ...menuProps.value,
46
- customViewHeight: height
47
- };
48
- }, [menuProps]);
41
+ }, []);
49
42
  const clearRenderFn = (0, _react.useCallback)(() => {
50
43
  setRenderFn(null);
51
44
  setCustomViewHeight(0);
52
45
  setCustomViewWidth(0);
53
- menuProps.value = { ...menuProps.value,
54
- customViewHeight: 0
55
- };
56
- }, [menuProps]);
46
+ }, []);
57
47
  const updateRenderFn = (0, _react.useCallback)(hasCustomView => {
58
48
  if (hasCustomView && customViewRef.current) {
59
49
  setRenderFn(() => customViewRef.current);
@@ -69,27 +59,11 @@ const CustomViewComponent = () => {
69
59
  hasCustomView
70
60
  }) => {
71
61
  if (currentState === _constants.CONTEXT_MENU_STATE.ACTIVE && hasCustomView) {
72
- isActive.value = true;
73
62
  (0, _reactNativeReanimated.runOnJS)(updateRenderFn)(true);
74
63
  } else if (currentState === _constants.CONTEXT_MENU_STATE.END) {
75
- isActive.value = false;
76
64
  (0, _reactNativeReanimated.runOnJS)(updateRenderFn)(false);
77
65
  }
78
- }, [state, menuProps]); // Visibility style: depends ONLY on isActive, won't re-trigger on menuProps changes
79
-
80
- const visibilityStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
81
- return {
82
- opacity: (0, _reactNativeReanimated.withTiming)(isActive.value ? 1 : 0, {
83
- duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
84
- }),
85
- transform: [{
86
- scale: isActive.value ? (0, _reactNativeReanimated.withSpring)(1, _constants.SPRING_CONFIGURATION_MENU) : (0, _reactNativeReanimated.withTiming)(0, {
87
- duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
88
- })
89
- }]
90
- };
91
- }, [isActive]); // Positioning style: depends on menuProps and customViewHeight
92
-
66
+ }, [state, menuProps]);
93
67
  const wrapperStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
94
68
  const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];
95
69
  const isAbove = anchorPositionVertical === 'top'; // Fixed anchor point: top of the item
@@ -108,34 +82,50 @@ const CustomViewComponent = () => {
108
82
  left = SCREEN_PADDING;
109
83
  }
110
84
 
111
- const tY = (0, _calculations.calculateDynamicTransformValue)(menuProps.value.itemY, menuProps.value.itemHeight, menuProps.value.menuHeight, menuProps.value.customViewHeight, menuProps.value.anchorPosition, _constants.WINDOW_HEIGHT, (safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.top) || 0, (safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.bottom) || 0); // Positional offset via translateY:
85
+ const tY = menuProps.value.transformValue; // Positional offset via translateY:
112
86
  // above item: shift up by customViewHeight + gap
113
87
  // below item: shift down by itemHeight + gap
114
88
 
115
89
  const positionOffsetY = isAbove ? -(customViewHeight + 8) : menuProps.value.itemHeight + 8;
90
+ const scaleAnimation = state.value === _constants.CONTEXT_MENU_STATE.ACTIVE ? (0, _reactNativeReanimated.withDelay)(150, (0, _reactNativeReanimated.withSpring)(1, _constants.SPRING_CONFIGURATION_MENU)) : (0, _reactNativeReanimated.withTiming)(0, {
91
+ duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
92
+ });
93
+ const opacityAnimation = (0, _reactNativeReanimated.withDelay)(150, (0, _reactNativeReanimated.withTiming)(state.value === _constants.CONTEXT_MENU_STATE.ACTIVE ? 1 : 0, {
94
+ duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
95
+ })); // Scale anchor: scale from the edge closest to the item
96
+
97
+ const scaleAnchorOffset = isAbove ? customViewHeight / 2 : -(customViewHeight / 2);
116
98
  return {
117
99
  top,
118
100
  left,
119
101
  maxWidth: MAX_WIDTH,
102
+ opacity: opacityAnimation,
120
103
  transform: [// 1. Transform value (screen boundary compensation)
121
104
  {
122
- translateY: (0, _reactNativeReanimated.withSpring)(tY, _constants.SPRING_CONFIGURATION)
105
+ translateY: state.value === _constants.CONTEXT_MENU_STATE.ACTIVE ? (0, _reactNativeReanimated.withSpring)(tY, _constants.SPRING_CONFIGURATION) : (0, _reactNativeReanimated.withTiming)(0, {
106
+ duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
107
+ })
123
108
  }, // 2. Position offset (animated when customViewHeight changes)
124
109
  {
125
110
  translateY: (0, _reactNativeReanimated.withSpring)(positionOffsetY, _constants.SPRING_CONFIGURATION_MENU)
111
+ }, // 3. Scale anchor: move to edge -> scale -> move back
112
+ {
113
+ translateY: scaleAnchorOffset
114
+ }, {
115
+ scale: scaleAnimation
116
+ }, {
117
+ translateY: -scaleAnchorOffset
126
118
  }]
127
119
  };
128
120
  }, [menuProps, customViewHeight, customViewWidth]);
129
121
  if (!renderFn) return null;
130
122
  return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
131
123
  style: [styles.customViewWrapper, wrapperStyles]
132
- }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
133
- style: visibilityStyles
134
124
  }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
135
125
  onLayout: onLayout
136
126
  }, renderFn({
137
127
  closeMenu
138
- }))));
128
+ })));
139
129
  };
140
130
 
141
131
  const styles = _reactNative.StyleSheet.create({
@@ -1 +1 @@
1
- {"version":3,"sources":["CustomView.tsx"],"names":["CustomViewComponent","state","menuProps","customViewRef","safeAreaInsets","renderFn","setRenderFn","customViewHeight","setCustomViewHeight","customViewWidth","setCustomViewWidth","isActive","closeMenu","value","CONTEXT_MENU_STATE","END","onLayout","event","height","width","nativeEvent","layout","clearRenderFn","updateRenderFn","hasCustomView","current","setTimeout","HOLD_ITEM_TRANSFORM_DURATION","currentState","ACTIVE","visibilityStyles","opacity","duration","transform","scale","SPRING_CONFIGURATION_MENU","wrapperStyles","anchorPositionVertical","anchorPosition","split","isAbove","top","itemY","SCREEN_PADDING","MAX_WIDTH","WINDOW_WIDTH","left","itemX","Math","max","tY","itemHeight","menuHeight","WINDOW_HEIGHT","bottom","positionOffsetY","maxWidth","translateY","SPRING_CONFIGURATION","styles","customViewWrapper","StyleSheet","create","position","zIndex","CustomView","React","memo"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { LayoutChangeEvent, StyleSheet } from 'react-native';\n\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\n\nimport { useInternal } from '../../hooks';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n CONTEXT_MENU_STATE,\n SPRING_CONFIGURATION,\n SPRING_CONFIGURATION_MENU,\n WINDOW_WIDTH,\n WINDOW_HEIGHT,\n} from '../../constants';\nimport { RenderCustomView } from '../menu/types';\nimport { calculateDynamicTransformValue } from '../../utils/calculations';\n\nconst CustomViewComponent = () => {\n const { state, menuProps, customViewRef, safeAreaInsets } = useInternal();\n\n const [renderFn, setRenderFn] = useState<RenderCustomView | null>(null);\n const [customViewHeight, setCustomViewHeight] = useState(0);\n const [customViewWidth, setCustomViewWidth] = useState(0);\n\n const isActive = useSharedValue(false);\n\n const closeMenu = useCallback(() => {\n state.value = CONTEXT_MENU_STATE.END;\n }, [state]);\n\n const onLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const { height, width } = event.nativeEvent.layout;\n setCustomViewHeight(height);\n setCustomViewWidth(width);\n menuProps.value = { ...menuProps.value, customViewHeight: height };\n },\n [menuProps]\n );\n\n const clearRenderFn = useCallback(() => {\n setRenderFn(null);\n setCustomViewHeight(0);\n setCustomViewWidth(0);\n menuProps.value = { ...menuProps.value, customViewHeight: 0 };\n }, [menuProps]);\n\n const updateRenderFn = useCallback(\n (hasCustomView: boolean) => {\n if (hasCustomView && customViewRef.current) {\n setRenderFn(() => customViewRef.current);\n } else {\n setTimeout(clearRenderFn, HOLD_ITEM_TRANSFORM_DURATION);\n }\n },\n [customViewRef, clearRenderFn]\n );\n\n useAnimatedReaction(\n () => ({\n currentState: state.value,\n hasCustomView: menuProps.value.hasCustomView,\n }),\n ({ currentState, hasCustomView }) => {\n if (currentState === CONTEXT_MENU_STATE.ACTIVE && hasCustomView) {\n isActive.value = true;\n runOnJS(updateRenderFn)(true);\n } else if (currentState === CONTEXT_MENU_STATE.END) {\n isActive.value = false;\n runOnJS(updateRenderFn)(false);\n }\n },\n [state, menuProps]\n );\n\n // Visibility style: depends ONLY on isActive, won't re-trigger on menuProps changes\n const visibilityStyles = useAnimatedStyle(() => {\n return {\n opacity: withTiming(isActive.value ? 1 : 0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n }),\n transform: [\n {\n scale: isActive.value\n ? withSpring(1, SPRING_CONFIGURATION_MENU)\n : withTiming(0, { duration: HOLD_ITEM_TRANSFORM_DURATION }),\n },\n ],\n };\n }, [isActive]);\n\n // Positioning style: depends on menuProps and customViewHeight\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n const isAbove = anchorPositionVertical === 'top';\n\n // Fixed anchor point: top of the item\n const top = menuProps.value.itemY;\n\n const SCREEN_PADDING = 16;\n const MAX_WIDTH = WINDOW_WIDTH - SCREEN_PADDING * 2;\n\n // Start at item's left edge\n let left = menuProps.value.itemX;\n\n // If the view overflows the right edge, shift left\n if (\n customViewWidth > 0 &&\n left + customViewWidth > WINDOW_WIDTH - SCREEN_PADDING\n ) {\n left = Math.max(\n SCREEN_PADDING,\n WINDOW_WIDTH - customViewWidth - SCREEN_PADDING\n );\n }\n if (left < SCREEN_PADDING) {\n left = SCREEN_PADDING;\n }\n const tY = calculateDynamicTransformValue(\n menuProps.value.itemY,\n menuProps.value.itemHeight,\n menuProps.value.menuHeight,\n menuProps.value.customViewHeight,\n menuProps.value.anchorPosition,\n WINDOW_HEIGHT,\n safeAreaInsets?.top || 0,\n safeAreaInsets?.bottom || 0\n );\n\n // Positional offset via translateY:\n // above item: shift up by customViewHeight + gap\n // below item: shift down by itemHeight + gap\n const positionOffsetY = isAbove\n ? -(customViewHeight + 8)\n : menuProps.value.itemHeight + 8;\n\n return {\n top,\n left,\n maxWidth: MAX_WIDTH,\n transform: [\n // 1. Transform value (screen boundary compensation)\n { translateY: withSpring(tY, SPRING_CONFIGURATION) },\n // 2. Position offset (animated when customViewHeight changes)\n { translateY: withSpring(positionOffsetY, SPRING_CONFIGURATION_MENU) },\n ],\n };\n }, [menuProps, customViewHeight, customViewWidth]);\n\n if (!renderFn) return null;\n\n return (\n <Animated.View style={[styles.customViewWrapper, wrapperStyles]}>\n <Animated.View style={visibilityStyles}>\n <Animated.View onLayout={onLayout}>\n {renderFn({ closeMenu })}\n </Animated.View>\n </Animated.View>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n customViewWrapper: {\n position: 'absolute',\n zIndex: 20,\n },\n});\n\nconst CustomView = React.memo(CustomViewComponent);\n\nexport default CustomView;\n"]}
1
+ {"version":3,"sources":["CustomView.tsx"],"names":["CustomViewComponent","state","menuProps","customViewRef","renderFn","setRenderFn","customViewHeight","setCustomViewHeight","customViewWidth","setCustomViewWidth","closeMenu","value","CONTEXT_MENU_STATE","END","onLayout","event","height","width","nativeEvent","layout","clearRenderFn","updateRenderFn","hasCustomView","current","setTimeout","HOLD_ITEM_TRANSFORM_DURATION","currentState","ACTIVE","wrapperStyles","anchorPositionVertical","anchorPosition","split","isAbove","top","itemY","SCREEN_PADDING","MAX_WIDTH","WINDOW_WIDTH","left","itemX","Math","max","tY","transformValue","positionOffsetY","itemHeight","scaleAnimation","SPRING_CONFIGURATION_MENU","duration","opacityAnimation","scaleAnchorOffset","maxWidth","opacity","transform","translateY","SPRING_CONFIGURATION","scale","styles","customViewWrapper","StyleSheet","create","position","zIndex","CustomView","React","memo"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { LayoutChangeEvent, StyleSheet } from 'react-native';\n\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n withDelay,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\n\nimport { useInternal } from '../../hooks';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n CONTEXT_MENU_STATE,\n SPRING_CONFIGURATION,\n SPRING_CONFIGURATION_MENU,\n WINDOW_WIDTH,\n} from '../../constants';\nimport { RenderCustomView } from '../menu/types';\n\nconst CustomViewComponent = () => {\n const { state, menuProps, customViewRef } = useInternal();\n\n const [renderFn, setRenderFn] = useState<RenderCustomView | null>(null);\n const [customViewHeight, setCustomViewHeight] = useState(0);\n const [customViewWidth, setCustomViewWidth] = useState(0);\n\n const closeMenu = useCallback(() => {\n state.value = CONTEXT_MENU_STATE.END;\n }, [state]);\n\n const onLayout = useCallback((event: LayoutChangeEvent) => {\n const { height, width } = event.nativeEvent.layout;\n setCustomViewHeight(height);\n setCustomViewWidth(width);\n }, []);\n\n const clearRenderFn = useCallback(() => {\n setRenderFn(null);\n setCustomViewHeight(0);\n setCustomViewWidth(0);\n }, []);\n\n const updateRenderFn = useCallback(\n (hasCustomView: boolean) => {\n if (hasCustomView && customViewRef.current) {\n setRenderFn(() => customViewRef.current);\n } else {\n setTimeout(clearRenderFn, HOLD_ITEM_TRANSFORM_DURATION);\n }\n },\n [customViewRef, clearRenderFn]\n );\n\n useAnimatedReaction(\n () => ({\n currentState: state.value,\n hasCustomView: menuProps.value.hasCustomView,\n }),\n ({ currentState, hasCustomView }) => {\n if (currentState === CONTEXT_MENU_STATE.ACTIVE && hasCustomView) {\n runOnJS(updateRenderFn)(true);\n } else if (currentState === CONTEXT_MENU_STATE.END) {\n runOnJS(updateRenderFn)(false);\n }\n },\n [state, menuProps]\n );\n\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n const isAbove = anchorPositionVertical === 'top';\n\n // Fixed anchor point: top of the item\n const top = menuProps.value.itemY;\n\n const SCREEN_PADDING = 16;\n const MAX_WIDTH = WINDOW_WIDTH - SCREEN_PADDING * 2;\n\n // Start at item's left edge\n let left = menuProps.value.itemX;\n\n // If the view overflows the right edge, shift left\n if (\n customViewWidth > 0 &&\n left + customViewWidth > WINDOW_WIDTH - SCREEN_PADDING\n ) {\n left = Math.max(\n SCREEN_PADDING,\n WINDOW_WIDTH - customViewWidth - SCREEN_PADDING\n );\n }\n if (left < SCREEN_PADDING) {\n left = SCREEN_PADDING;\n }\n const tY = menuProps.value.transformValue;\n\n // Positional offset via translateY:\n // above item: shift up by customViewHeight + gap\n // below item: shift down by itemHeight + gap\n const positionOffsetY = isAbove\n ? -(customViewHeight + 8)\n : menuProps.value.itemHeight + 8;\n\n const scaleAnimation =\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withDelay(150, withSpring(1, SPRING_CONFIGURATION_MENU))\n : withTiming(0, { duration: HOLD_ITEM_TRANSFORM_DURATION });\n\n const opacityAnimation = withDelay(\n 150,\n withTiming(state.value === CONTEXT_MENU_STATE.ACTIVE ? 1 : 0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n })\n );\n\n // Scale anchor: scale from the edge closest to the item\n const scaleAnchorOffset = isAbove\n ? customViewHeight / 2\n : -(customViewHeight / 2);\n\n return {\n top,\n left,\n maxWidth: MAX_WIDTH,\n opacity: opacityAnimation,\n transform: [\n // 1. Transform value (screen boundary compensation)\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 // 2. Position offset (animated when customViewHeight changes)\n { translateY: withSpring(positionOffsetY, SPRING_CONFIGURATION_MENU) },\n // 3. Scale anchor: move to edge -> scale -> move back\n { translateY: scaleAnchorOffset },\n { scale: scaleAnimation },\n { translateY: -scaleAnchorOffset },\n ],\n };\n }, [menuProps, customViewHeight, customViewWidth]);\n\n if (!renderFn) return null;\n\n return (\n <Animated.View style={[styles.customViewWrapper, wrapperStyles]}>\n <Animated.View onLayout={onLayout}>\n {renderFn({ closeMenu })}\n </Animated.View>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n customViewWrapper: {\n position: 'absolute',\n zIndex: 20,\n },\n});\n\nconst CustomView = React.memo(CustomViewComponent);\n\nexport default CustomView;\n"]}
@@ -129,14 +129,22 @@ const HoldItemComponent = ({
129
129
  const calculateTransformValue = () => {
130
130
  'worklet';
131
131
 
132
- const height = deviceOrientation === 'portrait' ? _constants.WINDOW_HEIGHT : _constants.WINDOW_WIDTH;
132
+ const screenH = deviceOrientation === 'portrait' ? _constants.WINDOW_HEIGHT : _constants.WINDOW_WIDTH;
133
+ const hasCustomView = !!renderCustomView; // If custom view exists, center item on screen
134
+
135
+ if (hasCustomView && !disableMove) {
136
+ const itemCenterY = itemRectY.value + itemRectHeight.value / 2;
137
+ const screenCenterY = screenH / 2;
138
+ return screenCenterY - itemCenterY;
139
+ }
140
+
133
141
  const isAnchorPointTop = transformOrigin.value.includes('top');
134
142
  let tY = 0;
135
143
 
136
144
  if (!disableMove) {
137
145
  if (isAnchorPointTop) {
138
146
  const topTransform = itemRectY.value + itemRectHeight.value + menuHeight + _styleGuide.default.spacing + ((safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.bottom) || 0);
139
- tY = topTransform > height ? height - topTransform : 0;
147
+ tY = topTransform > screenH ? screenH - topTransform : 0;
140
148
  } else {
141
149
  const bottomTransform = itemRectY.value - menuHeight - ((safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.top) || 0);
142
150
  tY = bottomTransform < 0 ? -bottomTransform + _styleGuide.default.spacing * 2 : 0;
@@ -163,7 +171,6 @@ const HoldItemComponent = ({
163
171
  menuHeight: menuHeight,
164
172
  items: items || [],
165
173
  transformValue: transformValue.value,
166
- customViewHeight: 0,
167
174
  actionParams: actionParams || {},
168
175
  hasCustomView: !!renderCustomView
169
176
  };
@@ -286,8 +293,7 @@ const HoldItemComponent = ({
286
293
  duration: 0
287
294
  }));
288
295
 
289
- const screenH = deviceOrientation === 'portrait' ? _constants.WINDOW_HEIGHT : _constants.WINDOW_WIDTH;
290
- let tY = (0, _calculations.calculateDynamicTransformValue)(itemRectY.value, itemRectHeight.value, menuHeight, menuProps.value.customViewHeight, transformOrigin.value, screenH, (safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.top) || 0, (safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.bottom) || 0);
296
+ let tY = calculateTransformValue();
291
297
 
292
298
  const transformAnimation = () => disableMove ? 0 : isActive.value ? (0, _reactNativeReanimated.withSpring)(tY, _constants.SPRING_CONFIGURATION) : (0, _reactNativeReanimated.withTiming)(-0.1, {
293
299
  duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
@@ -1 +1 @@
1
- {"version":3,"sources":["HoldItem.tsx"],"names":["HoldItemComponent","items","renderCustomView","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","state","menuProps","customViewRef","safeAreaInsets","deviceOrientation","isActive","isAnimationStarted","itemRectY","itemRectX","itemRectWidth","itemRectHeight","itemScale","transformValue","transformOrigin","key","menuHeight","length","itemsWithSeparator","filter","item","withSeparator","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","includes","tY","topTransform","styleGuide","spacing","bottomTransform","top","updateCustomViewRef","current","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","customViewHeight","hasCustomView","scaleBack","duration","HOLD_ITEM_TRANSFORM_DURATION","onCompletion","isFinised","hasItems","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","screenH","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 calculateDynamicTransformValue,\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 = ({\n items,\n renderCustomView,\n bottom,\n containerStyles,\n disableMove,\n menuAnchorPosition,\n activateOn,\n hapticFeedback,\n actionParams,\n closeOnTap,\n longPressMinDurationMs = 150,\n children,\n}: HoldItemProps) => {\n //#region hooks\n const { state, menuProps, customViewRef, safeAreaInsets } = 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 if (!items || items.length === 0) return 0;\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 = transformOrigin.value.includes('top');\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 updateCustomViewRef = () => {\n customViewRef.current = renderCustomView || null;\n };\n\n const setMenuProps = () => {\n 'worklet';\n\n runOnJS(updateCustomViewRef)();\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: items || [],\n transformValue: transformValue.value,\n customViewHeight: 0,\n actionParams: actionParams || {},\n hasCustomView: !!renderCustomView,\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 onCompletion = (isFinised?: boolean) => {\n 'worklet';\n const hasItems = items && items.length > 0;\n const hasCustomView = !!renderCustomView;\n if (isFinised && (hasItems || hasCustomView)) {\n state.value = CONTEXT_MENU_STATE.ACTIVE;\n isActive.value = true;\n scaleBack();\n if (hapticFeedback !== 'None') {\n runOnJS(hapticResponse)();\n }\n }\n\n isAnimationStarted.value = false;\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 const screenH =\n deviceOrientation === 'portrait' ? WINDOW_HEIGHT : WINDOW_WIDTH;\n let tY = calculateDynamicTransformValue(\n itemRectY.value,\n itemRectHeight.value,\n menuHeight,\n menuProps.value.customViewHeight,\n transformOrigin.value,\n screenH,\n safeAreaInsets?.top || 0,\n safeAreaInsets?.bottom || 0\n );\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);\n\nexport default HoldItem;\n"]}
1
+ {"version":3,"sources":["HoldItem.tsx"],"names":["HoldItemComponent","items","renderCustomView","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","state","menuProps","customViewRef","safeAreaInsets","deviceOrientation","isActive","isAnimationStarted","itemRectY","itemRectX","itemRectWidth","itemRectHeight","itemScale","transformValue","transformOrigin","key","menuHeight","length","itemsWithSeparator","filter","item","withSeparator","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","screenH","hasCustomView","itemCenterY","screenCenterY","isAnchorPointTop","includes","tY","topTransform","styleGuide","spacing","bottomTransform","top","updateCustomViewRef","current","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","scaleBack","duration","HOLD_ITEM_TRANSFORM_DURATION","onCompletion","isFinised","hasItems","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 = ({\n items,\n renderCustomView,\n bottom,\n containerStyles,\n disableMove,\n menuAnchorPosition,\n activateOn,\n hapticFeedback,\n actionParams,\n closeOnTap,\n longPressMinDurationMs = 150,\n children,\n}: HoldItemProps) => {\n //#region hooks\n const { state, menuProps, customViewRef, safeAreaInsets } = 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 if (!items || items.length === 0) return 0;\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 screenH =\n deviceOrientation === 'portrait' ? WINDOW_HEIGHT : WINDOW_WIDTH;\n\n const hasCustomView = !!renderCustomView;\n\n // If custom view exists, center item on screen\n if (hasCustomView && !disableMove) {\n const itemCenterY = itemRectY.value + itemRectHeight.value / 2;\n const screenCenterY = screenH / 2;\n return screenCenterY - itemCenterY;\n }\n\n const isAnchorPointTop = transformOrigin.value.includes('top');\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 > screenH ? screenH - 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 updateCustomViewRef = () => {\n customViewRef.current = renderCustomView || null;\n };\n\n const setMenuProps = () => {\n 'worklet';\n\n runOnJS(updateCustomViewRef)();\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: items || [],\n transformValue: transformValue.value,\n actionParams: actionParams || {},\n hasCustomView: !!renderCustomView,\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 onCompletion = (isFinised?: boolean) => {\n 'worklet';\n const hasItems = items && items.length > 0;\n const hasCustomView = !!renderCustomView;\n if (isFinised && (hasItems || hasCustomView)) {\n state.value = CONTEXT_MENU_STATE.ACTIVE;\n isActive.value = true;\n scaleBack();\n if (hapticFeedback !== 'None') {\n runOnJS(hapticResponse)();\n }\n }\n\n isAnimationStarted.value = false;\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);\n\nexport default HoldItem;\n"]}
@@ -17,8 +17,6 @@ var _hooks = require("../../hooks");
17
17
 
18
18
  var _constants = require("../../constants");
19
19
 
20
- var _calculations = require("../../utils/calculations");
21
-
22
20
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
23
21
 
24
22
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -28,15 +26,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
28
26
  const MenuComponent = () => {
29
27
  const {
30
28
  state,
31
- menuProps,
32
- safeAreaInsets
29
+ menuProps
33
30
  } = (0, _hooks.useInternal)();
34
31
  const wrapperStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
35
32
  const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];
36
33
  const top = anchorPositionVertical === 'top' ? menuProps.value.itemHeight + menuProps.value.itemY + 8 : menuProps.value.itemY - 8;
37
34
  const left = menuProps.value.itemX;
38
35
  const width = menuProps.value.itemWidth;
39
- const tY = (0, _calculations.calculateDynamicTransformValue)(menuProps.value.itemY, menuProps.value.itemHeight, menuProps.value.menuHeight, menuProps.value.customViewHeight, menuProps.value.anchorPosition, _constants.WINDOW_HEIGHT, (safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.top) || 0, (safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.bottom) || 0);
36
+ const tY = menuProps.value.transformValue;
40
37
  return {
41
38
  top,
42
39
  left,
@@ -1 +1 @@
1
- {"version":3,"sources":["Menu.tsx"],"names":["MenuComponent","state","menuProps","safeAreaInsets","wrapperStyles","anchorPositionVertical","value","anchorPosition","split","top","itemHeight","itemY","left","itemX","width","itemWidth","tY","menuHeight","customViewHeight","WINDOW_HEIGHT","bottom","transform","translateY","CONTEXT_MENU_STATE","ACTIVE","SPRING_CONFIGURATION","duration","HOLD_ITEM_TRANSFORM_DURATION","styles","menuWrapper","Menu","React","memo"],"mappings":";;;;;;;AAAA;;AAEA;;AAMA;;AAEA;;AACA;;AACA;;AAMA;;;;;;;;AAEA,MAAMA,aAAa,GAAG,MAAM;AAC1B,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA,SAAT;AAAoBC,IAAAA;AAApB,MAAuC,yBAA7C;AAEA,QAAMC,aAAa,GAAG,6CAAiB,MAAM;AAC3C,UAAMC,sBAAsB,GAAGH,SAAS,CAACI,KAAV,CAAgBC,cAAhB,CAA+BC,KAA/B,CAAqC,GAArC,EAA0C,CAA1C,CAA/B;AAEA,UAAMC,GAAG,GACPJ,sBAAsB,KAAK,KAA3B,GACIH,SAAS,CAACI,KAAV,CAAgBI,UAAhB,GAA6BR,SAAS,CAACI,KAAV,CAAgBK,KAA7C,GAAqD,CADzD,GAEIT,SAAS,CAACI,KAAV,CAAgBK,KAAhB,GAAwB,CAH9B;AAIA,UAAMC,IAAI,GAAGV,SAAS,CAACI,KAAV,CAAgBO,KAA7B;AACA,UAAMC,KAAK,GAAGZ,SAAS,CAACI,KAAV,CAAgBS,SAA9B;AACA,UAAMC,EAAE,GAAG,kDACTd,SAAS,CAACI,KAAV,CAAgBK,KADP,EAETT,SAAS,CAACI,KAAV,CAAgBI,UAFP,EAGTR,SAAS,CAACI,KAAV,CAAgBW,UAHP,EAITf,SAAS,CAACI,KAAV,CAAgBY,gBAJP,EAKThB,SAAS,CAACI,KAAV,CAAgBC,cALP,EAMTY,wBANS,EAOT,CAAAhB,cAAc,SAAd,IAAAA,cAAc,WAAd,YAAAA,cAAc,CAAEM,GAAhB,KAAuB,CAPd,EAQT,CAAAN,cAAc,SAAd,IAAAA,cAAc,WAAd,YAAAA,cAAc,CAAEiB,MAAhB,KAA0B,CARjB,CAAX;AAWA,WAAO;AACLX,MAAAA,GADK;AAELG,MAAAA,IAFK;AAGLE,MAAAA,KAHK;AAILO,MAAAA,SAAS,EAAE,CACT;AACEC,QAAAA,UAAU,EACRrB,KAAK,CAACK,KAAN,KAAgBiB,8BAAmBC,MAAnC,GACI,uCAAWR,EAAX,EAAeS,+BAAf,CADJ,GAEI,uCAAW,CAAX,EAAc;AAAEC,UAAAA,QAAQ,EAAEC;AAAZ,SAAd;AAJR,OADS;AAJN,KAAP;AAaD,GAjCqB,EAiCnB,CAACzB,SAAD,CAjCmB,CAAtB;AAmCA,sBACE,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAE,CAAC0B,gBAAOC,WAAR,EAAqBzB,aAArB;AAAtB,kBACE,6BAAC,iBAAD,OADF,CADF;AAKD,CA3CD;;AA6CA,MAAM0B,IAAI,gBAAGC,eAAMC,IAAN,CAAWhC,aAAX,CAAb;;eAEe8B,I","sourcesContent":["import React from 'react';\n\nimport Animated, {\n useAnimatedStyle,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\n\nimport MenuList from './MenuList';\n\nimport styles from './styles';\nimport { useInternal } from '../../hooks';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n CONTEXT_MENU_STATE,\n SPRING_CONFIGURATION,\n WINDOW_HEIGHT,\n} from '../../constants';\nimport { calculateDynamicTransformValue } from '../../utils/calculations';\n\nconst MenuComponent = () => {\n const { state, menuProps, safeAreaInsets } = useInternal();\n\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n\n const top =\n anchorPositionVertical === 'top'\n ? menuProps.value.itemHeight + menuProps.value.itemY + 8\n : menuProps.value.itemY - 8;\n const left = menuProps.value.itemX;\n const width = menuProps.value.itemWidth;\n const tY = calculateDynamicTransformValue(\n menuProps.value.itemY,\n menuProps.value.itemHeight,\n menuProps.value.menuHeight,\n menuProps.value.customViewHeight,\n menuProps.value.anchorPosition,\n WINDOW_HEIGHT,\n safeAreaInsets?.top || 0,\n safeAreaInsets?.bottom || 0\n );\n\n return {\n top,\n left,\n width,\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 return (\n <Animated.View style={[styles.menuWrapper, wrapperStyles]}>\n <MenuList />\n </Animated.View>\n );\n};\n\nconst Menu = React.memo(MenuComponent);\n\nexport default Menu;\n"]}
1
+ {"version":3,"sources":["Menu.tsx"],"names":["MenuComponent","state","menuProps","wrapperStyles","anchorPositionVertical","value","anchorPosition","split","top","itemHeight","itemY","left","itemX","width","itemWidth","tY","transformValue","transform","translateY","CONTEXT_MENU_STATE","ACTIVE","SPRING_CONFIGURATION","duration","HOLD_ITEM_TRANSFORM_DURATION","styles","menuWrapper","Menu","React","memo"],"mappings":";;;;;;;AAAA;;AAEA;;AAMA;;AAEA;;AACA;;AACA;;;;;;;;AAMA,MAAMA,aAAa,GAAG,MAAM;AAC1B,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAuB,yBAA7B;AAEA,QAAMC,aAAa,GAAG,6CAAiB,MAAM;AAC3C,UAAMC,sBAAsB,GAAGF,SAAS,CAACG,KAAV,CAAgBC,cAAhB,CAA+BC,KAA/B,CAAqC,GAArC,EAA0C,CAA1C,CAA/B;AAEA,UAAMC,GAAG,GACPJ,sBAAsB,KAAK,KAA3B,GACIF,SAAS,CAACG,KAAV,CAAgBI,UAAhB,GAA6BP,SAAS,CAACG,KAAV,CAAgBK,KAA7C,GAAqD,CADzD,GAEIR,SAAS,CAACG,KAAV,CAAgBK,KAAhB,GAAwB,CAH9B;AAIA,UAAMC,IAAI,GAAGT,SAAS,CAACG,KAAV,CAAgBO,KAA7B;AACA,UAAMC,KAAK,GAAGX,SAAS,CAACG,KAAV,CAAgBS,SAA9B;AACA,UAAMC,EAAE,GAAGb,SAAS,CAACG,KAAV,CAAgBW,cAA3B;AAEA,WAAO;AACLR,MAAAA,GADK;AAELG,MAAAA,IAFK;AAGLE,MAAAA,KAHK;AAILI,MAAAA,SAAS,EAAE,CACT;AACEC,QAAAA,UAAU,EACRjB,KAAK,CAACI,KAAN,KAAgBc,8BAAmBC,MAAnC,GACI,uCAAWL,EAAX,EAAeM,+BAAf,CADJ,GAEI,uCAAW,CAAX,EAAc;AAAEC,UAAAA,QAAQ,EAAEC;AAAZ,SAAd;AAJR,OADS;AAJN,KAAP;AAaD,GAxBqB,EAwBnB,CAACrB,SAAD,CAxBmB,CAAtB;AA0BA,sBACE,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAE,CAACsB,gBAAOC,WAAR,EAAqBtB,aAArB;AAAtB,kBACE,6BAAC,iBAAD,OADF,CADF;AAKD,CAlCD;;AAoCA,MAAMuB,IAAI,gBAAGC,eAAMC,IAAN,CAAW5B,aAAX,CAAb;;eAEe0B,I","sourcesContent":["import React from 'react';\n\nimport Animated, {\n useAnimatedStyle,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\n\nimport MenuList from './MenuList';\n\nimport styles from './styles';\nimport { useInternal } from '../../hooks';\nimport {\n HOLD_ITEM_TRANSFORM_DURATION,\n CONTEXT_MENU_STATE,\n SPRING_CONFIGURATION,\n} from '../../constants';\n\nconst MenuComponent = () => {\n const { state, menuProps } = useInternal();\n\n const wrapperStyles = useAnimatedStyle(() => {\n const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];\n\n const top =\n anchorPositionVertical === 'top'\n ? menuProps.value.itemHeight + menuProps.value.itemY + 8\n : menuProps.value.itemY - 8;\n const left = menuProps.value.itemX;\n const width = menuProps.value.itemWidth;\n const tY = menuProps.value.transformValue;\n\n return {\n top,\n left,\n width,\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 return (\n <Animated.View style={[styles.menuWrapper, wrapperStyles]}>\n <MenuList />\n </Animated.View>\n );\n};\n\nconst Menu = React.memo(MenuComponent);\n\nexport default Menu;\n"]}
@@ -93,7 +93,6 @@ const MenuListComponent = () => {
93
93
  (0, _reactNativeReanimated.runOnJS)(setter)(_items);
94
94
  }
95
95
  }, [menuProps]);
96
- if (itemList.length === 0) return null;
97
96
  return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
98
97
  style: [_styles.default.menuContainer, messageStyles]
99
98
  }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
@@ -1 +1 @@
1
- {"version":3,"sources":["MenuList.tsx"],"names":["MenuListComponent","state","theme","menuProps","itemList","setItemList","React","useState","menuHeight","itemsWithSeparator","value","items","filter","item","withSeparator","length","prevList","messageStyles","translate","anchorPosition","itemWidth","_leftPosition","menuScaleAnimation","CONTEXT_MENU_STATE","ACTIVE","SPRING_CONFIGURATION_MENU","duration","HOLD_ITEM_TRANSFORM_DURATION","opacityAnimation","left","height","opacity","transform","translateX","beginningTransformations","translateY","scale","endingTransformations","animatedInnerContainerStyle","color","backgroundColor","setter","_items","styles","menuContainer","StyleSheet","absoluteFillObject","menuInnerContainer","MenuList","memo"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\n\nimport {\n calculateMenuHeight,\n menuAnimationAnchor,\n} from '../../utils/calculations';\n\nimport MenuItems from './MenuItems';\n\nimport {\n SPRING_CONFIGURATION_MENU,\n HOLD_ITEM_TRANSFORM_DURATION,\n CONTEXT_MENU_STATE,\n} from '../../constants';\n\nimport styles from './styles';\nimport { MenuItemProps } from './types';\nimport { useInternal } from '../../hooks';\nimport { deepEqual } from '../../utils/validations';\nimport { leftOrRight } from './calculations';\n\nconst MenuListComponent = () => {\n const { state, theme, menuProps } = useInternal();\n\n const [itemList, setItemList] = React.useState<MenuItemProps[]>([]);\n\n const menuHeight = useDerivedValue(() => {\n const itemsWithSeparator = menuProps.value.items.filter(\n item => item.withSeparator\n );\n return calculateMenuHeight(\n menuProps.value.items.length,\n itemsWithSeparator.length\n );\n }, [menuProps]);\n const prevList = useSharedValue<MenuItemProps[]>([]);\n\n const messageStyles = useAnimatedStyle(() => {\n const itemsWithSeparator = menuProps.value.items.filter(\n item => item.withSeparator\n );\n\n const translate = menuAnimationAnchor(\n menuProps.value.anchorPosition,\n menuProps.value.itemWidth,\n menuProps.value.items.length,\n itemsWithSeparator.length\n );\n\n const _leftPosition = leftOrRight(menuProps);\n\n const menuScaleAnimation = () =>\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withSpring(1, SPRING_CONFIGURATION_MENU)\n : withTiming(0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n });\n\n const opacityAnimation = () =>\n withTiming(state.value === CONTEXT_MENU_STATE.ACTIVE ? 1 : 0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n });\n\n return {\n left: _leftPosition,\n height: menuHeight.value,\n opacity: opacityAnimation(),\n transform: [\n { translateX: translate.beginningTransformations.translateX },\n { translateY: translate.beginningTransformations.translateY },\n {\n scale: menuScaleAnimation(),\n },\n { translateX: translate.endingTransformations.translateX },\n { translateY: translate.endingTransformations.translateY },\n ],\n };\n });\n\n const animatedInnerContainerStyle = useAnimatedStyle(() => {\n const color = theme.value === 'light' ? '#fff' : '#1A1A1A';\n return {\n backgroundColor: color,\n };\n }, [theme]);\n\n const setter = (items: MenuItemProps[]) => {\n setItemList(items);\n prevList.value = items;\n };\n\n useAnimatedReaction(\n () => menuProps.value.items,\n _items => {\n if (!deepEqual(_items, prevList.value)) {\n runOnJS(setter)(_items);\n }\n },\n [menuProps]\n );\n\n if (itemList.length === 0) return null;\n\n return (\n <Animated.View style={[styles.menuContainer, messageStyles]}>\n <Animated.View\n style={[\n StyleSheet.absoluteFillObject,\n styles.menuInnerContainer,\n animatedInnerContainerStyle,\n ]}\n >\n <MenuItems items={itemList} />\n </Animated.View>\n </Animated.View>\n );\n};\n\nconst MenuList = React.memo(MenuListComponent);\n\nexport default MenuList;\n"]}
1
+ {"version":3,"sources":["MenuList.tsx"],"names":["MenuListComponent","state","theme","menuProps","itemList","setItemList","React","useState","menuHeight","itemsWithSeparator","value","items","filter","item","withSeparator","length","prevList","messageStyles","translate","anchorPosition","itemWidth","_leftPosition","menuScaleAnimation","CONTEXT_MENU_STATE","ACTIVE","SPRING_CONFIGURATION_MENU","duration","HOLD_ITEM_TRANSFORM_DURATION","opacityAnimation","left","height","opacity","transform","translateX","beginningTransformations","translateY","scale","endingTransformations","animatedInnerContainerStyle","color","backgroundColor","setter","_items","styles","menuContainer","StyleSheet","absoluteFillObject","menuInnerContainer","MenuList","memo"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\n\nimport {\n calculateMenuHeight,\n menuAnimationAnchor,\n} from '../../utils/calculations';\n\nimport MenuItems from './MenuItems';\n\nimport {\n SPRING_CONFIGURATION_MENU,\n HOLD_ITEM_TRANSFORM_DURATION,\n CONTEXT_MENU_STATE,\n} from '../../constants';\n\nimport styles from './styles';\nimport { MenuItemProps } from './types';\nimport { useInternal } from '../../hooks';\nimport { deepEqual } from '../../utils/validations';\nimport { leftOrRight } from './calculations';\n\nconst MenuListComponent = () => {\n const { state, theme, menuProps } = useInternal();\n\n const [itemList, setItemList] = React.useState<MenuItemProps[]>([]);\n\n const menuHeight = useDerivedValue(() => {\n const itemsWithSeparator = menuProps.value.items.filter(\n item => item.withSeparator\n );\n return calculateMenuHeight(\n menuProps.value.items.length,\n itemsWithSeparator.length\n );\n }, [menuProps]);\n const prevList = useSharedValue<MenuItemProps[]>([]);\n\n const messageStyles = useAnimatedStyle(() => {\n const itemsWithSeparator = menuProps.value.items.filter(\n item => item.withSeparator\n );\n\n const translate = menuAnimationAnchor(\n menuProps.value.anchorPosition,\n menuProps.value.itemWidth,\n menuProps.value.items.length,\n itemsWithSeparator.length\n );\n\n const _leftPosition = leftOrRight(menuProps);\n\n const menuScaleAnimation = () =>\n state.value === CONTEXT_MENU_STATE.ACTIVE\n ? withSpring(1, SPRING_CONFIGURATION_MENU)\n : withTiming(0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n });\n\n const opacityAnimation = () =>\n withTiming(state.value === CONTEXT_MENU_STATE.ACTIVE ? 1 : 0, {\n duration: HOLD_ITEM_TRANSFORM_DURATION,\n });\n\n return {\n left: _leftPosition,\n height: menuHeight.value,\n opacity: opacityAnimation(),\n transform: [\n { translateX: translate.beginningTransformations.translateX },\n { translateY: translate.beginningTransformations.translateY },\n {\n scale: menuScaleAnimation(),\n },\n { translateX: translate.endingTransformations.translateX },\n { translateY: translate.endingTransformations.translateY },\n ],\n };\n });\n\n const animatedInnerContainerStyle = useAnimatedStyle(() => {\n const color = theme.value === 'light' ? '#fff' : '#1A1A1A';\n return {\n backgroundColor: color,\n };\n }, [theme]);\n\n const setter = (items: MenuItemProps[]) => {\n setItemList(items);\n prevList.value = items;\n };\n\n useAnimatedReaction(\n () => menuProps.value.items,\n _items => {\n if (!deepEqual(_items, prevList.value)) {\n runOnJS(setter)(_items);\n }\n },\n [menuProps]\n );\n\n return (\n <Animated.View style={[styles.menuContainer, messageStyles]}>\n <Animated.View\n style={[\n StyleSheet.absoluteFillObject,\n styles.menuInnerContainer,\n animatedInnerContainerStyle,\n ]}\n >\n <MenuItems items={itemList} />\n </Animated.View>\n </Animated.View>\n );\n};\n\nconst MenuList = React.memo(MenuListComponent);\n\nexport default MenuList;\n"]}
@@ -54,7 +54,6 @@ const ProviderComponent = ({
54
54
  anchorPosition: 'top-center',
55
55
  menuHeight: 0,
56
56
  transformValue: 0,
57
- customViewHeight: 0,
58
57
  actionParams: {},
59
58
  hasCustomView: false
60
59
  });
@@ -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","customViewHeight","actionParams","hasCustomView","customViewRef","value","ACTIVE","END","internalContextVariables","top","bottom","left","right","flex","Provider"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAKA;;AAGA;;AAGA;;AAGA;;AAEA;;AACA;;;;;;;;AAVA;AAGA;AAeO,IAAIA,YAAJ;;;AAEP,MAAMC,iBAAiB,GAAG,CAAC;AACzBC,EAAAA,QADyB;AAEzBC,EAAAA,KAAK,EAAEC,aAFkB;AAGzBC,EAAAA,aAHyB;AAIzBC,EAAAA,cAJyB;AAKzBC,EAAAA,MALyB;AAMzBC,EAAAA;AANyB,CAAD,KAOG;AAC3B,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,gBAAgB,EAAE,CATgC;AAUlDC,IAAAA,YAAY,EAAE,EAVoC;AAWlDC,IAAAA,aAAa,EAAE;AAXmC,GAAlC,CAAlB;AAaA,QAAMC,aAAa,GAAG,mBAAgC,IAAhC,CAAtB;AAEA,wBAAU,MAAM;AACdvB,IAAAA,KAAK,CAACwB,KAAN,GAAcvB,aAAa,IAAI,OAA/B,CADc,CAEd;AACD,GAHD,EAGG,CAACA,aAAD,CAHH;AAKA,kDACE,MAAMO,KAAK,CAACgB,KADd,EAEEhB,KAAK,IAAI;AACP,YAAQA,KAAR;AACE,WAAKC,8BAAmBgB,MAAxB;AAAgC;AAC9B,cAAIrB,MAAJ,EAAY,oCAAQA,MAAR;AACZ;AACD;;AACD,WAAKK,8BAAmBiB,GAAxB;AAA6B;AAC3B,cAAIrB,OAAJ,EAAa,oCAAQA,OAAR;AACb;AACD;AARH;AAUD,GAbH,EAcE,CAACG,KAAD,CAdF;AAiBA,QAAMmB,wBAAwB,GAAG,oBAC/B,OAAO;AACLnB,IAAAA,KADK;AAELR,IAAAA,KAFK;AAGLW,IAAAA,SAHK;AAILY,IAAAA,aAJK;AAKLpB,IAAAA,cAAc,EAAEA,cAAc,IAAI;AAChCyB,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,CAACvB,KAAD,EAAQR,KAAR,EAAeW,SAAf,EAA0BR,cAA1B,CAb+B,CAAjC;AAgBA,sBACE,6BAAC,iDAAD;AAAwB,IAAA,KAAK,EAAE;AAAE6B,MAAAA,IAAI,EAAE;AAAR;AAA/B,kBACE,6BAAC,yBAAD,CAAiB,QAAjB;AAA0B,IAAA,KAAK,EAAEL;AAAjC,kBACE,6BAAC,sBAAD,QACG5B,QADH,eAEE,6BAAC,kBAAD,OAFF,eAGE,6BAAC,aAAD,OAHF,eAIE,6BAAC,mBAAD,OAJF,CADF,CADF,CADF;AAYD,CAhFD;;AAkFA,MAAMkC,QAAQ,gBAAG,iBAAKnC,iBAAL,CAAjB;eAEemC,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 CustomView from '../customView/CustomView';\nimport { RenderCustomView } from '../menu/types';\n\nexport interface Store {\n state: StateProps;\n dispatch?: React.Dispatch<Action>;\n}\n\nexport let AnimatedIcon: any;\n\nconst ProviderComponent = ({\n children,\n theme: selectedTheme,\n iconComponent,\n safeAreaInsets,\n onOpen,\n onClose,\n}: HoldMenuProviderProps) => {\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 customViewHeight: 0,\n actionParams: {},\n hasCustomView: false,\n });\n const customViewRef = useRef<RenderCustomView | 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 customViewRef,\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 <CustomView />\n </PortalProvider>\n </InternalContext.Provider>\n </GestureHandlerRootView>\n );\n};\n\nconst Provider = memo(ProviderComponent);\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","hasCustomView","customViewRef","value","ACTIVE","END","internalContextVariables","top","bottom","left","right","flex","Provider"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAGA;;AAGA;;AAGA;;AAEA;;AACA;;;;;;;;AAVA;AAGA;AAeO,IAAIA,YAAJ;;;AAEP,MAAMC,iBAAiB,GAAG,CAAC;AACzBC,EAAAA,QADyB;AAEzBC,EAAAA,KAAK,EAAEC,aAFkB;AAGzBC,EAAAA,aAHyB;AAIzBC,EAAAA,cAJyB;AAKzBC,EAAAA,MALyB;AAMzBC,EAAAA;AANyB,CAAD,KAOG;AAC3B,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,EAToC;AAUlDC,IAAAA,aAAa,EAAE;AAVmC,GAAlC,CAAlB;AAYA,QAAMC,aAAa,GAAG,mBAAgC,IAAhC,CAAtB;AAEA,wBAAU,MAAM;AACdtB,IAAAA,KAAK,CAACuB,KAAN,GAActB,aAAa,IAAI,OAA/B,CADc,CAEd;AACD,GAHD,EAGG,CAACA,aAAD,CAHH;AAKA,kDACE,MAAMO,KAAK,CAACe,KADd,EAEEf,KAAK,IAAI;AACP,YAAQA,KAAR;AACE,WAAKC,8BAAmBe,MAAxB;AAAgC;AAC9B,cAAIpB,MAAJ,EACE,oCAAQA,MAAR;AACF;AACD;;AACD,WAAKK,8BAAmBgB,GAAxB;AAA6B;AAC3B,cAAIpB,OAAJ,EACE,oCAAQA,OAAR;AACF;AACD;AAVH;AAYD,GAfH,EAgBE,CAACG,KAAD,CAhBF;AAmBA,QAAMkB,wBAAwB,GAAG,oBAC/B,OAAO;AACLlB,IAAAA,KADK;AAELR,IAAAA,KAFK;AAGLW,IAAAA,SAHK;AAILW,IAAAA,aAJK;AAKLnB,IAAAA,cAAc,EAAEA,cAAc,IAAI;AAChCwB,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,CAACtB,KAAD,EAAQR,KAAR,EAAeW,SAAf,EAA0BR,cAA1B,CAb+B,CAAjC;AAgBA,sBACE,6BAAC,iDAAD;AAAwB,IAAA,KAAK,EAAE;AAAE4B,MAAAA,IAAI,EAAE;AAAR;AAA/B,kBACE,6BAAC,yBAAD,CAAiB,QAAjB;AAA0B,IAAA,KAAK,EAAEL;AAAjC,kBACE,6BAAC,sBAAD,QACG3B,QADH,eAEE,6BAAC,kBAAD,OAFF,eAGE,6BAAC,aAAD,OAHF,eAIE,6BAAC,mBAAD,OAJF,CADF,CADF,CADF;AAYD,CAjFD;;AAmFA,MAAMiC,QAAQ,gBAAG,iBAAKlC,iBAAL,CAAjB;eAEekC,Q","sourcesContent":["import React, { memo, useEffect, useMemo, useRef } from 'react';\nimport { PortalProvider } from '@gorhom/portal';\nimport Animated, { useSharedValue, useAnimatedReaction, runOnJS } 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 CustomView from '../customView/CustomView';\nimport { RenderCustomView } from '../menu/types';\n\nexport interface Store {\n state: StateProps;\n dispatch?: React.Dispatch<Action>;\n}\n\nexport let AnimatedIcon: any;\n\nconst ProviderComponent = ({\n children,\n theme: selectedTheme,\n iconComponent,\n safeAreaInsets,\n onOpen,\n onClose,\n}: HoldMenuProviderProps) => {\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 hasCustomView: false,\n });\n const customViewRef = useRef<RenderCustomView | 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)\n runOnJS(onOpen)();\n break\n }\n case CONTEXT_MENU_STATE.END: {\n if (onClose)\n runOnJS(onClose)();\n break\n }\n }\n },\n [state]\n );\n\n const internalContextVariables = useMemo(\n () => ({\n state,\n theme,\n menuProps,\n customViewRef,\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 <CustomView />\n </PortalProvider>\n </InternalContext.Provider>\n </GestureHandlerRootView>\n );\n};\n\nconst Provider = memo(ProviderComponent);\n\nexport default Provider;\n"]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getTransformOrigin = exports.calculateDynamicTransformValue = exports.menuAnimationAnchor = exports.calculateMenuHeight = exports.MenuItemHeight = void 0;
6
+ exports.getTransformOrigin = exports.menuAnimationAnchor = exports.calculateMenuHeight = exports.MenuItemHeight = void 0;
7
7
 
8
8
  var _styleGuide = _interopRequireDefault(require("../styleGuide"));
9
9
 
@@ -52,53 +52,6 @@ const menuAnimationAnchor = (anchorPoint, itemWidth, itemLength, itemsWithSepara
52
52
 
53
53
  exports.menuAnimationAnchor = menuAnimationAnchor;
54
54
 
55
- const calculateDynamicTransformValue = (itemY, itemHeight, menuHeight, customViewHeight, anchorPosition, screenHeight, safeAreaTop, safeAreaBottom) => {
56
- 'worklet';
57
-
58
- const GAP = _styleGuide.default.spacing;
59
- const isAnchorTop = anchorPosition.includes('top');
60
-
61
- if (isAnchorTop) {
62
- // Menu below item, custom view above item
63
- // Total space needed below item: itemHeight + gap + menuHeight + safeAreaBottom
64
- // Total space needed above item: customViewHeight + gap + safeAreaTop
65
- const bottomEdge = itemY + itemHeight + GAP + menuHeight + safeAreaBottom;
66
- const topEdge = itemY - GAP - customViewHeight - safeAreaTop;
67
- let tY = 0; // If bottom overflows screen
68
-
69
- if (bottomEdge > screenHeight) {
70
- tY = screenHeight - bottomEdge;
71
- } // After shifting, check if custom view goes above safe area
72
-
73
-
74
- if (topEdge + tY < 0) {
75
- tY = -topEdge;
76
- }
77
-
78
- return tY;
79
- } else {
80
- // Menu above item, custom view below item
81
- // Total space needed above item: menuHeight + gap + safeAreaTop
82
- // Total space needed below item: itemHeight + gap + customViewHeight + safeAreaBottom
83
- const topEdge = itemY - GAP - menuHeight - safeAreaTop;
84
- const bottomEdge = itemY + itemHeight + GAP + customViewHeight + safeAreaBottom;
85
- let tY = 0; // If top overflows screen (goes above safe area)
86
-
87
- if (topEdge < 0) {
88
- tY = -topEdge;
89
- } // After shifting, check if custom view goes below screen
90
-
91
-
92
- if (bottomEdge + tY > screenHeight) {
93
- tY = screenHeight - bottomEdge;
94
- }
95
-
96
- return tY;
97
- }
98
- };
99
-
100
- exports.calculateDynamicTransformValue = calculateDynamicTransformValue;
101
-
102
55
  const getTransformOrigin = (posX, itemWidth, windowWidth, bottom) => {
103
56
  'worklet';
104
57