react-native-hold-menu-actions 0.1.6
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.
- package/LICENCE +21 -0
- package/README.md +38 -0
- package/lib/commonjs/components/backdrop/Backdrop.js +104 -0
- package/lib/commonjs/components/backdrop/Backdrop.js.map +1 -0
- package/lib/commonjs/components/backdrop/constants.js +14 -0
- package/lib/commonjs/components/backdrop/constants.js.map +1 -0
- package/lib/commonjs/components/backdrop/index.js +16 -0
- package/lib/commonjs/components/backdrop/index.js.map +1 -0
- package/lib/commonjs/components/backdrop/styles.js +17 -0
- package/lib/commonjs/components/backdrop/styles.js.map +1 -0
- package/lib/commonjs/components/flatList/FlatList.js +35 -0
- package/lib/commonjs/components/flatList/FlatList.js.map +1 -0
- package/lib/commonjs/components/flatList/index.js +16 -0
- package/lib/commonjs/components/flatList/index.js.map +1 -0
- package/lib/commonjs/components/holdItem/HoldItem.js +369 -0
- package/lib/commonjs/components/holdItem/HoldItem.js.map +1 -0
- package/lib/commonjs/components/holdItem/index.js +16 -0
- package/lib/commonjs/components/holdItem/index.js.map +1 -0
- package/lib/commonjs/components/holdItem/styles.js +22 -0
- package/lib/commonjs/components/holdItem/styles.js.map +1 -0
- package/lib/commonjs/components/holdItem/types.d.js +2 -0
- package/lib/commonjs/components/holdItem/types.d.js.map +1 -0
- package/lib/commonjs/components/icon/Icon.js +43 -0
- package/lib/commonjs/components/icon/Icon.js.map +1 -0
- package/lib/commonjs/components/icon/index.js +16 -0
- package/lib/commonjs/components/icon/index.js.map +1 -0
- package/lib/commonjs/components/menu/Menu.js +57 -0
- package/lib/commonjs/components/menu/Menu.js.map +1 -0
- package/lib/commonjs/components/menu/MenuItem.js +85 -0
- package/lib/commonjs/components/menu/MenuItem.js.map +1 -0
- package/lib/commonjs/components/menu/MenuItems.js +35 -0
- package/lib/commonjs/components/menu/MenuItems.js.map +1 -0
- package/lib/commonjs/components/menu/MenuList.js +121 -0
- package/lib/commonjs/components/menu/MenuList.js.map +1 -0
- package/lib/commonjs/components/menu/Separator.js +47 -0
- package/lib/commonjs/components/menu/Separator.js.map +1 -0
- package/lib/commonjs/components/menu/calculations.js +31 -0
- package/lib/commonjs/components/menu/calculations.js.map +1 -0
- package/lib/commonjs/components/menu/constants.js +21 -0
- package/lib/commonjs/components/menu/constants.js.map +1 -0
- package/lib/commonjs/components/menu/index.js +16 -0
- package/lib/commonjs/components/menu/index.js.map +1 -0
- package/lib/commonjs/components/menu/styles.js +77 -0
- package/lib/commonjs/components/menu/styles.js.map +1 -0
- package/lib/commonjs/components/menu/types.d.js +2 -0
- package/lib/commonjs/components/menu/types.d.js.map +1 -0
- package/lib/commonjs/components/provider/Provider.js +98 -0
- package/lib/commonjs/components/provider/Provider.js.map +1 -0
- package/lib/commonjs/components/provider/index.js +16 -0
- package/lib/commonjs/components/provider/index.js.map +1 -0
- package/lib/commonjs/components/provider/reducer.js +50 -0
- package/lib/commonjs/components/provider/reducer.js.map +1 -0
- package/lib/commonjs/components/provider/types.d.js +2 -0
- package/lib/commonjs/components/provider/types.d.js.map +1 -0
- package/lib/commonjs/constants.js +60 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/context/index.js +14 -0
- package/lib/commonjs/context/index.js.map +1 -0
- package/lib/commonjs/context/internal.js +13 -0
- package/lib/commonjs/context/internal.js.map +1 -0
- package/lib/commonjs/hooks/index.js +24 -0
- package/lib/commonjs/hooks/index.js.map +1 -0
- package/lib/commonjs/hooks/useDeviceOrientation.js +38 -0
- package/lib/commonjs/hooks/useDeviceOrientation.js.map +1 -0
- package/lib/commonjs/hooks/useInternal.js +15 -0
- package/lib/commonjs/hooks/useInternal.js.map +1 -0
- package/lib/commonjs/index.js +40 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/styleGuide.js +39 -0
- package/lib/commonjs/styleGuide.js.map +1 -0
- package/lib/commonjs/utils/calculations.js +73 -0
- package/lib/commonjs/utils/calculations.js.map +1 -0
- package/lib/commonjs/utils/validations.js +43 -0
- package/lib/commonjs/utils/validations.js.map +1 -0
- package/lib/module/components/backdrop/Backdrop.js +83 -0
- package/lib/module/components/backdrop/Backdrop.js.map +1 -0
- package/lib/module/components/backdrop/constants.js +4 -0
- package/lib/module/components/backdrop/constants.js.map +1 -0
- package/lib/module/components/backdrop/index.js +2 -0
- package/lib/module/components/backdrop/index.js.map +1 -0
- package/lib/module/components/backdrop/styles.js +7 -0
- package/lib/module/components/backdrop/styles.js.map +1 -0
- package/lib/module/components/flatList/FlatList.js +17 -0
- package/lib/module/components/flatList/FlatList.js.map +1 -0
- package/lib/module/components/flatList/index.js +2 -0
- package/lib/module/components/flatList/index.js.map +1 -0
- package/lib/module/components/holdItem/HoldItem.js +344 -0
- package/lib/module/components/holdItem/HoldItem.js.map +1 -0
- package/lib/module/components/holdItem/index.js +2 -0
- package/lib/module/components/holdItem/index.js.map +1 -0
- package/lib/module/components/holdItem/styles.js +12 -0
- package/lib/module/components/holdItem/styles.js.map +1 -0
- package/lib/module/components/holdItem/types.d.js +2 -0
- package/lib/module/components/holdItem/types.d.js.map +1 -0
- package/lib/module/components/icon/Icon.js +26 -0
- package/lib/module/components/icon/Icon.js.map +1 -0
- package/lib/module/components/icon/index.js +2 -0
- package/lib/module/components/icon/index.js.map +1 -0
- package/lib/module/components/menu/Menu.js +37 -0
- package/lib/module/components/menu/Menu.js.map +1 -0
- package/lib/module/components/menu/MenuItem.js +59 -0
- package/lib/module/components/menu/MenuItem.js.map +1 -0
- package/lib/module/components/menu/MenuItems.js +19 -0
- package/lib/module/components/menu/MenuItems.js.map +1 -0
- package/lib/module/components/menu/MenuList.js +93 -0
- package/lib/module/components/menu/MenuList.js.map +1 -0
- package/lib/module/components/menu/Separator.js +29 -0
- package/lib/module/components/menu/Separator.js.map +1 -0
- package/lib/module/components/menu/calculations.js +17 -0
- package/lib/module/components/menu/calculations.js.map +1 -0
- package/lib/module/components/menu/constants.js +8 -0
- package/lib/module/components/menu/constants.js.map +1 -0
- package/lib/module/components/menu/index.js +2 -0
- package/lib/module/components/menu/index.js.map +1 -0
- package/lib/module/components/menu/styles.js +63 -0
- package/lib/module/components/menu/styles.js.map +1 -0
- package/lib/module/components/menu/types.d.js +2 -0
- package/lib/module/components/menu/types.d.js.map +1 -0
- package/lib/module/components/provider/Provider.js +75 -0
- package/lib/module/components/provider/Provider.js.map +1 -0
- package/lib/module/components/provider/index.js +2 -0
- package/lib/module/components/provider/index.js.map +1 -0
- package/lib/module/components/provider/reducer.js +38 -0
- package/lib/module/components/provider/reducer.js.map +1 -0
- package/lib/module/components/provider/types.d.js +2 -0
- package/lib/module/components/provider/types.d.js.map +1 -0
- package/lib/module/constants.js +37 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/context/index.js +2 -0
- package/lib/module/context/index.js.map +1 -0
- package/lib/module/context/internal.js +4 -0
- package/lib/module/context/internal.js.map +1 -0
- package/lib/module/hooks/index.js +3 -0
- package/lib/module/hooks/index.js.map +1 -0
- package/lib/module/hooks/useDeviceOrientation.js +27 -0
- package/lib/module/hooks/useDeviceOrientation.js.map +1 -0
- package/lib/module/hooks/useInternal.js +4 -0
- package/lib/module/hooks/useInternal.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/styleGuide.js +30 -0
- package/lib/module/styleGuide.js.map +1 -0
- package/lib/module/utils/calculations.js +51 -0
- package/lib/module/utils/calculations.js.map +1 -0
- package/lib/module/utils/validations.js +38 -0
- package/lib/module/utils/validations.js.map +1 -0
- package/lib/typescript/components/backdrop/Backdrop.d.ts +3 -0
- package/lib/typescript/components/backdrop/constants.d.ts +2 -0
- package/lib/typescript/components/backdrop/index.d.ts +1 -0
- package/lib/typescript/components/backdrop/styles.d.ts +10 -0
- package/lib/typescript/components/flatList/FlatList.d.ts +5 -0
- package/lib/typescript/components/flatList/index.d.ts +2 -0
- package/lib/typescript/components/holdItem/HoldItem.d.ts +4 -0
- package/lib/typescript/components/holdItem/index.d.ts +2 -0
- package/lib/typescript/components/holdItem/styles.d.ts +15 -0
- package/lib/typescript/components/holdItem/types.d.ts +131 -0
- package/lib/typescript/components/icon/Icon.d.ts +7 -0
- package/lib/typescript/components/icon/index.d.ts +1 -0
- package/lib/typescript/components/menu/Menu.d.ts +3 -0
- package/lib/typescript/components/menu/MenuItem.d.ts +8 -0
- package/lib/typescript/components/menu/MenuItems.d.ts +6 -0
- package/lib/typescript/components/menu/MenuList.d.ts +3 -0
- package/lib/typescript/components/menu/Separator.d.ts +3 -0
- package/lib/typescript/components/menu/calculations.d.ts +4 -0
- package/lib/typescript/components/menu/constants.d.ts +7 -0
- package/lib/typescript/components/menu/index.d.ts +1 -0
- package/lib/typescript/components/menu/styles.d.ts +59 -0
- package/lib/typescript/components/menu/types.d.ts +28 -0
- package/lib/typescript/components/provider/Provider.d.ts +10 -0
- package/lib/typescript/components/provider/index.d.ts +2 -0
- package/lib/typescript/components/provider/reducer.d.ts +20 -0
- package/lib/typescript/components/provider/types.d.ts +33 -0
- package/lib/typescript/constants.d.ts +29 -0
- package/lib/typescript/context/index.d.ts +1 -0
- package/lib/typescript/context/internal.d.ts +16 -0
- package/lib/typescript/hooks/index.d.ts +2 -0
- package/lib/typescript/hooks/useDeviceOrientation.d.ts +3 -0
- package/lib/typescript/hooks/useInternal.d.ts +1 -0
- package/lib/typescript/index.d.ts +4 -0
- package/lib/typescript/styleGuide.d.ts +28 -0
- package/lib/typescript/utils/calculations.d.ts +14 -0
- package/lib/typescript/utils/validations.d.ts +3 -0
- package/package.json +106 -0
- package/src/components/backdrop/Backdrop.tsx +138 -0
- package/src/components/backdrop/constants.ts +8 -0
- package/src/components/backdrop/index.ts +1 -0
- package/src/components/backdrop/styles.ts +8 -0
- package/src/components/flatList/FlatList.tsx +23 -0
- package/src/components/flatList/index.ts +2 -0
- package/src/components/holdItem/HoldItem.tsx +449 -0
- package/src/components/holdItem/index.ts +2 -0
- package/src/components/holdItem/styles.ts +11 -0
- package/src/components/holdItem/types.d.ts +131 -0
- package/src/components/icon/Icon.tsx +33 -0
- package/src/components/icon/index.ts +1 -0
- package/src/components/menu/Menu.tsx +57 -0
- package/src/components/menu/MenuItem.tsx +79 -0
- package/src/components/menu/MenuItems.tsx +26 -0
- package/src/components/menu/MenuList.tsx +151 -0
- package/src/components/menu/Separator.tsx +28 -0
- package/src/components/menu/calculations.ts +49 -0
- package/src/components/menu/constants.ts +9 -0
- package/src/components/menu/index.ts +1 -0
- package/src/components/menu/styles.ts +64 -0
- package/src/components/menu/types.d.ts +28 -0
- package/src/components/provider/Provider.tsx +105 -0
- package/src/components/provider/index.ts +2 -0
- package/src/components/provider/reducer.ts +48 -0
- package/src/components/provider/types.d.ts +33 -0
- package/src/constants.ts +54 -0
- package/src/context/index.ts +1 -0
- package/src/context/internal.ts +19 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useDeviceOrientation.ts +28 -0
- package/src/hooks/useInternal.ts +4 -0
- package/src/index.ts +4 -0
- package/src/styleGuide.ts +31 -0
- package/src/utils/calculations.ts +110 -0
- package/src/utils/validations.ts +42 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNativeGestureHandler = require("react-native-gesture-handler");
|
|
11
|
+
|
|
12
|
+
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
13
|
+
|
|
14
|
+
var _portal = require("@gorhom/portal");
|
|
15
|
+
|
|
16
|
+
var _nonSecure = require("nanoid/non-secure");
|
|
17
|
+
|
|
18
|
+
var Haptics = _interopRequireWildcard(require("expo-haptics"));
|
|
19
|
+
|
|
20
|
+
var _calculations = require("../../utils/calculations");
|
|
21
|
+
|
|
22
|
+
var _constants = require("../../constants");
|
|
23
|
+
|
|
24
|
+
var _hooks = require("../../hooks");
|
|
25
|
+
|
|
26
|
+
var _styles = _interopRequireDefault(require("./styles"));
|
|
27
|
+
|
|
28
|
+
var _styleGuide = _interopRequireDefault(require("../../styleGuide"));
|
|
29
|
+
|
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
|
+
|
|
32
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
33
|
+
|
|
34
|
+
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; }
|
|
35
|
+
|
|
36
|
+
//#region reanimated & gesture handler
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region dependencies
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region utils & types
|
|
42
|
+
const HoldItemComponent = ({
|
|
43
|
+
items,
|
|
44
|
+
bottom,
|
|
45
|
+
containerStyles,
|
|
46
|
+
disableMove,
|
|
47
|
+
menuAnchorPosition,
|
|
48
|
+
activateOn,
|
|
49
|
+
hapticFeedback,
|
|
50
|
+
actionParams,
|
|
51
|
+
closeOnTap,
|
|
52
|
+
longPressMinDurationMs = 150,
|
|
53
|
+
children
|
|
54
|
+
}) => {
|
|
55
|
+
//#region hooks
|
|
56
|
+
const {
|
|
57
|
+
state,
|
|
58
|
+
menuProps,
|
|
59
|
+
safeAreaInsets
|
|
60
|
+
} = (0, _hooks.useInternal)();
|
|
61
|
+
const deviceOrientation = (0, _hooks.useDeviceOrientation)(); //#endregion
|
|
62
|
+
//#region variables
|
|
63
|
+
|
|
64
|
+
const isActive = (0, _reactNativeReanimated.useSharedValue)(false);
|
|
65
|
+
const isAnimationStarted = (0, _reactNativeReanimated.useSharedValue)(false);
|
|
66
|
+
const itemRectY = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
67
|
+
const itemRectX = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
68
|
+
const itemRectWidth = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
69
|
+
const itemRectHeight = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
70
|
+
const itemScale = (0, _reactNativeReanimated.useSharedValue)(1);
|
|
71
|
+
const transformValue = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
72
|
+
const transformOrigin = (0, _reactNativeReanimated.useSharedValue)(menuAnchorPosition || 'top-right');
|
|
73
|
+
const key = (0, _react.useMemo)(() => `hold-item-${(0, _nonSecure.nanoid)()}`, []);
|
|
74
|
+
const menuHeight = (0, _react.useMemo)(() => {
|
|
75
|
+
const itemsWithSeparator = items.filter(item => item.withSeparator);
|
|
76
|
+
return (0, _calculations.calculateMenuHeight)(items.length, itemsWithSeparator.length);
|
|
77
|
+
}, [items]);
|
|
78
|
+
const isHold = !activateOn || activateOn === 'hold'; //#endregion
|
|
79
|
+
//#region refs
|
|
80
|
+
|
|
81
|
+
const containerRef = (0, _reactNativeReanimated.useAnimatedRef)(); //#endregion
|
|
82
|
+
//#region functions
|
|
83
|
+
|
|
84
|
+
const hapticResponse = () => {
|
|
85
|
+
const style = !hapticFeedback ? 'Medium' : hapticFeedback;
|
|
86
|
+
|
|
87
|
+
switch (style) {
|
|
88
|
+
case `Selection`:
|
|
89
|
+
Haptics.selectionAsync();
|
|
90
|
+
break;
|
|
91
|
+
|
|
92
|
+
case `Light`:
|
|
93
|
+
case `Medium`:
|
|
94
|
+
case `Heavy`:
|
|
95
|
+
Haptics.impactAsync(Haptics.ImpactFeedbackStyle[style]);
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
case `Success`:
|
|
99
|
+
case `Warning`:
|
|
100
|
+
case `Error`:
|
|
101
|
+
Haptics.notificationAsync(Haptics.NotificationFeedbackType[style]);
|
|
102
|
+
break;
|
|
103
|
+
|
|
104
|
+
default:
|
|
105
|
+
}
|
|
106
|
+
}; //#endregion
|
|
107
|
+
//#region worklet functions
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
const activateAnimation = ctx => {
|
|
111
|
+
'worklet';
|
|
112
|
+
|
|
113
|
+
if (!ctx.didMeasureLayout) {
|
|
114
|
+
const measured = (0, _reactNativeReanimated.measure)(containerRef);
|
|
115
|
+
itemRectY.value = measured.pageY;
|
|
116
|
+
itemRectX.value = measured.pageX;
|
|
117
|
+
itemRectHeight.value = measured.height;
|
|
118
|
+
itemRectWidth.value = measured.width;
|
|
119
|
+
|
|
120
|
+
if (!menuAnchorPosition) {
|
|
121
|
+
const position = (0, _calculations.getTransformOrigin)(measured.pageX, itemRectWidth.value, deviceOrientation === 'portrait' ? _constants.WINDOW_WIDTH : _constants.WINDOW_HEIGHT, bottom);
|
|
122
|
+
transformOrigin.value = position;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const calculateTransformValue = () => {
|
|
128
|
+
'worklet';
|
|
129
|
+
|
|
130
|
+
const height = deviceOrientation === 'portrait' ? _constants.WINDOW_HEIGHT : _constants.WINDOW_WIDTH;
|
|
131
|
+
const isAnchorPointTop = transformOrigin.value.includes('top');
|
|
132
|
+
let tY = 0;
|
|
133
|
+
|
|
134
|
+
if (!disableMove) {
|
|
135
|
+
if (isAnchorPointTop) {
|
|
136
|
+
const topTransform = itemRectY.value + itemRectHeight.value + menuHeight + _styleGuide.default.spacing + ((safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.bottom) || 0);
|
|
137
|
+
tY = topTransform > height ? height - topTransform : 0;
|
|
138
|
+
} else {
|
|
139
|
+
const bottomTransform = itemRectY.value - menuHeight - ((safeAreaInsets === null || safeAreaInsets === void 0 ? void 0 : safeAreaInsets.top) || 0);
|
|
140
|
+
tY = bottomTransform < 0 ? -bottomTransform + _styleGuide.default.spacing * 2 : 0;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return tY;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const setMenuProps = () => {
|
|
148
|
+
'worklet';
|
|
149
|
+
|
|
150
|
+
menuProps.value = {
|
|
151
|
+
itemHeight: itemRectHeight.value,
|
|
152
|
+
itemWidth: itemRectWidth.value,
|
|
153
|
+
itemY: itemRectY.value,
|
|
154
|
+
itemX: itemRectX.value,
|
|
155
|
+
anchorPosition: transformOrigin.value,
|
|
156
|
+
menuHeight: menuHeight,
|
|
157
|
+
items,
|
|
158
|
+
transformValue: transformValue.value,
|
|
159
|
+
actionParams: actionParams || {}
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const scaleBack = () => {
|
|
164
|
+
'worklet';
|
|
165
|
+
|
|
166
|
+
itemScale.value = (0, _reactNativeReanimated.withTiming)(1, {
|
|
167
|
+
duration: _constants.HOLD_ITEM_TRANSFORM_DURATION / 2
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const onCompletion = isFinised => {
|
|
172
|
+
'worklet';
|
|
173
|
+
|
|
174
|
+
const isListValid = items && items.length > 0;
|
|
175
|
+
|
|
176
|
+
if (isFinised && isListValid) {
|
|
177
|
+
state.value = _constants.CONTEXT_MENU_STATE.ACTIVE;
|
|
178
|
+
isActive.value = true;
|
|
179
|
+
scaleBack();
|
|
180
|
+
|
|
181
|
+
if (hapticFeedback !== 'None') {
|
|
182
|
+
(0, _reactNativeReanimated.runOnJS)(hapticResponse)();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
isAnimationStarted.value = false; // TODO: Warn user if item list is empty or not given
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const scaleHold = () => {
|
|
190
|
+
'worklet';
|
|
191
|
+
|
|
192
|
+
itemScale.value = (0, _reactNativeReanimated.withTiming)(_constants.HOLD_ITEM_SCALE_DOWN_VALUE, {
|
|
193
|
+
duration: _constants.HOLD_ITEM_SCALE_DOWN_DURATION
|
|
194
|
+
}, onCompletion);
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const scaleTap = () => {
|
|
198
|
+
'worklet';
|
|
199
|
+
|
|
200
|
+
isAnimationStarted.value = true;
|
|
201
|
+
itemScale.value = (0, _reactNativeReanimated.withSequence)((0, _reactNativeReanimated.withTiming)(_constants.HOLD_ITEM_SCALE_DOWN_VALUE, {
|
|
202
|
+
duration: _constants.HOLD_ITEM_SCALE_DOWN_DURATION
|
|
203
|
+
}), (0, _reactNativeReanimated.withTiming)(1, {
|
|
204
|
+
duration: _constants.HOLD_ITEM_TRANSFORM_DURATION / 2
|
|
205
|
+
}, onCompletion));
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* When use tap activation ("tap") and trying to tap multiple times,
|
|
209
|
+
* scale animation is called again despite it is started. This causes a bug.
|
|
210
|
+
* To prevent this, it is better to check is animation already started.
|
|
211
|
+
*/
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
const canCallActivateFunctions = () => {
|
|
215
|
+
'worklet';
|
|
216
|
+
|
|
217
|
+
const willActivateWithTap = activateOn === 'double-tap' || activateOn === 'tap';
|
|
218
|
+
return willActivateWithTap && !isAnimationStarted.value || !willActivateWithTap;
|
|
219
|
+
}; //#endregion
|
|
220
|
+
//#region gesture events
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
const gestureEvent = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
|
|
224
|
+
onActive: (_, context) => {
|
|
225
|
+
if (canCallActivateFunctions()) {
|
|
226
|
+
if (!context.didMeasureLayout) {
|
|
227
|
+
activateAnimation(context);
|
|
228
|
+
transformValue.value = calculateTransformValue();
|
|
229
|
+
setMenuProps();
|
|
230
|
+
context.didMeasureLayout = true;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (!isActive.value) {
|
|
234
|
+
if (isHold) {
|
|
235
|
+
scaleHold();
|
|
236
|
+
} else {
|
|
237
|
+
scaleTap();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
onFinish: (_, context) => {
|
|
243
|
+
context.didMeasureLayout = false;
|
|
244
|
+
|
|
245
|
+
if (isHold) {
|
|
246
|
+
scaleBack();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
const overlayGestureEvent = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
|
|
251
|
+
onActive: _ => {
|
|
252
|
+
if (closeOnTap) state.value = _constants.CONTEXT_MENU_STATE.END;
|
|
253
|
+
}
|
|
254
|
+
}); //#endregion
|
|
255
|
+
//#region animated styles & props
|
|
256
|
+
|
|
257
|
+
const animatedContainerStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
258
|
+
const animateOpacity = () => (0, _reactNativeReanimated.withDelay)(_constants.HOLD_ITEM_TRANSFORM_DURATION, (0, _reactNativeReanimated.withTiming)(1, {
|
|
259
|
+
duration: 0
|
|
260
|
+
}));
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
opacity: isActive.value ? 0 : animateOpacity(),
|
|
264
|
+
transform: [{
|
|
265
|
+
scale: isActive.value ? (0, _reactNativeReanimated.withTiming)(1, {
|
|
266
|
+
duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
|
|
267
|
+
}) : itemScale.value
|
|
268
|
+
}]
|
|
269
|
+
};
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
const containerStyle = _react.default.useMemo(() => [containerStyles, animatedContainerStyle], [containerStyles, animatedContainerStyle]);
|
|
273
|
+
|
|
274
|
+
const animatedPortalStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
275
|
+
const animateOpacity = () => (0, _reactNativeReanimated.withDelay)(_constants.HOLD_ITEM_TRANSFORM_DURATION, (0, _reactNativeReanimated.withTiming)(0, {
|
|
276
|
+
duration: 0
|
|
277
|
+
}));
|
|
278
|
+
|
|
279
|
+
let tY = calculateTransformValue();
|
|
280
|
+
|
|
281
|
+
const transformAnimation = () => disableMove ? 0 : isActive.value ? (0, _reactNativeReanimated.withSpring)(tY, _constants.SPRING_CONFIGURATION) : (0, _reactNativeReanimated.withTiming)(-0.1, {
|
|
282
|
+
duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
zIndex: 10,
|
|
287
|
+
position: 'absolute',
|
|
288
|
+
top: itemRectY.value,
|
|
289
|
+
left: itemRectX.value,
|
|
290
|
+
width: itemRectWidth.value,
|
|
291
|
+
height: itemRectHeight.value,
|
|
292
|
+
opacity: isActive.value ? 1 : animateOpacity(),
|
|
293
|
+
transform: [{
|
|
294
|
+
translateY: transformAnimation()
|
|
295
|
+
}, {
|
|
296
|
+
scale: isActive.value ? (0, _reactNativeReanimated.withTiming)(1, {
|
|
297
|
+
duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
|
|
298
|
+
}) : itemScale.value
|
|
299
|
+
}]
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
const portalContainerStyle = (0, _react.useMemo)(() => [_styles.default.holdItem, animatedPortalStyle], [animatedPortalStyle]);
|
|
303
|
+
const animatedPortalProps = (0, _reactNativeReanimated.useAnimatedProps)(() => ({
|
|
304
|
+
pointerEvents: isActive.value ? 'auto' : 'none'
|
|
305
|
+
})); //#endregion
|
|
306
|
+
//#region animated effects
|
|
307
|
+
|
|
308
|
+
(0, _reactNativeReanimated.useAnimatedReaction)(() => state.value, _state => {
|
|
309
|
+
if (_state === _constants.CONTEXT_MENU_STATE.END) {
|
|
310
|
+
isActive.value = false;
|
|
311
|
+
}
|
|
312
|
+
}); //#endregion
|
|
313
|
+
//#region components
|
|
314
|
+
|
|
315
|
+
const GestureHandler = (0, _react.useMemo)(() => {
|
|
316
|
+
switch (activateOn) {
|
|
317
|
+
case `double-tap`:
|
|
318
|
+
return ({
|
|
319
|
+
children: handlerChildren
|
|
320
|
+
}) => /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
321
|
+
numberOfTaps: 2,
|
|
322
|
+
onHandlerStateChange: gestureEvent
|
|
323
|
+
}, handlerChildren);
|
|
324
|
+
|
|
325
|
+
case `tap`:
|
|
326
|
+
return ({
|
|
327
|
+
children: handlerChildren
|
|
328
|
+
}) => /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
329
|
+
numberOfTaps: 1,
|
|
330
|
+
onHandlerStateChange: gestureEvent
|
|
331
|
+
}, handlerChildren);
|
|
332
|
+
// default is hold
|
|
333
|
+
|
|
334
|
+
default:
|
|
335
|
+
return ({
|
|
336
|
+
children: handlerChildren
|
|
337
|
+
}) => /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.LongPressGestureHandler, {
|
|
338
|
+
minDurationMs: longPressMinDurationMs,
|
|
339
|
+
onHandlerStateChange: gestureEvent
|
|
340
|
+
}, handlerChildren);
|
|
341
|
+
}
|
|
342
|
+
}, [activateOn, gestureEvent]);
|
|
343
|
+
const PortalOverlay = (0, _react.useMemo)(() => {
|
|
344
|
+
return () => /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
345
|
+
numberOfTaps: 1,
|
|
346
|
+
onHandlerStateChange: overlayGestureEvent
|
|
347
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
348
|
+
style: _styles.default.portalOverlay
|
|
349
|
+
}));
|
|
350
|
+
}, [overlayGestureEvent]); //#endregion
|
|
351
|
+
//#region render
|
|
352
|
+
|
|
353
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(GestureHandler, null, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
354
|
+
ref: containerRef,
|
|
355
|
+
style: containerStyle
|
|
356
|
+
}, children)), /*#__PURE__*/_react.default.createElement(_portal.Portal, {
|
|
357
|
+
key: key,
|
|
358
|
+
name: key
|
|
359
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
360
|
+
key: key,
|
|
361
|
+
style: portalContainerStyle,
|
|
362
|
+
animatedProps: animatedPortalProps
|
|
363
|
+
}, /*#__PURE__*/_react.default.createElement(PortalOverlay, null), children))); //#endregion
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
const HoldItem = /*#__PURE__*/(0, _react.memo)(HoldItemComponent);
|
|
367
|
+
var _default = HoldItem;
|
|
368
|
+
exports.default = _default;
|
|
369
|
+
//# sourceMappingURL=HoldItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["HoldItem.tsx"],"names":["HoldItemComponent","items","bottom","containerStyles","disableMove","menuAnchorPosition","activateOn","hapticFeedback","actionParams","closeOnTap","longPressMinDurationMs","children","state","menuProps","safeAreaInsets","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","includes","tY","topTransform","styleGuide","spacing","bottomTransform","top","setMenuProps","itemHeight","itemWidth","itemY","itemX","anchorPosition","scaleBack","duration","HOLD_ITEM_TRANSFORM_DURATION","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';\n// @ts-ignore\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 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, 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 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 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 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 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);\n\nexport default HoldItem;\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "default", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _HoldItem.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
var _HoldItem = _interopRequireDefault(require("./HoldItem"));
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA","sourcesContent":["export { default } from './HoldItem';\nexport type { HoldItemProps } from './types';\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
|
|
10
|
+
const styles = _reactNative.StyleSheet.create({
|
|
11
|
+
holdItem: {
|
|
12
|
+
zIndex: 10,
|
|
13
|
+
position: 'absolute'
|
|
14
|
+
},
|
|
15
|
+
portalOverlay: { ..._reactNative.StyleSheet.absoluteFillObject,
|
|
16
|
+
zIndex: 15
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
var _default = styles;
|
|
21
|
+
exports.default = _default;
|
|
22
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["styles.ts"],"names":["styles","StyleSheet","create","holdItem","zIndex","position","portalOverlay","absoluteFillObject"],"mappings":";;;;;;;AAAA;;AAEA,MAAMA,MAAM,GAAGC,wBAAWC,MAAX,CAAkB;AAC/BC,EAAAA,QAAQ,EAAE;AAAEC,IAAAA,MAAM,EAAE,EAAV;AAAcC,IAAAA,QAAQ,EAAE;AAAxB,GADqB;AAE/BC,EAAAA,aAAa,EAAE,EACb,GAAGL,wBAAWM,kBADD;AAEbH,IAAAA,MAAM,EAAE;AAFK;AAFgB,CAAlB,CAAf;;eAQeJ,M","sourcesContent":["import { StyleSheet } from 'react-native';\n\nconst styles = StyleSheet.create({\n holdItem: { zIndex: 10, position: 'absolute' },\n portalOverlay: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 15,\n },\n});\n\nexport default styles;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
11
|
+
|
|
12
|
+
var _hooks = require("../../hooks");
|
|
13
|
+
|
|
14
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
15
|
+
|
|
16
|
+
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; }
|
|
17
|
+
|
|
18
|
+
const Icon = ({
|
|
19
|
+
iconComponent,
|
|
20
|
+
name
|
|
21
|
+
}) => {
|
|
22
|
+
const {
|
|
23
|
+
theme
|
|
24
|
+
} = (0, _hooks.useInternal)();
|
|
25
|
+
|
|
26
|
+
let AnimatedIcon = _reactNativeReanimated.default.createAnimatedComponent(iconComponent);
|
|
27
|
+
|
|
28
|
+
const iconProps = (0, _reactNativeReanimated.useAnimatedProps)(() => {
|
|
29
|
+
return {
|
|
30
|
+
color: theme.value === 'light' ? 'black' : 'white'
|
|
31
|
+
};
|
|
32
|
+
}, [theme]);
|
|
33
|
+
return /*#__PURE__*/_react.default.createElement(AnimatedIcon, {
|
|
34
|
+
name: name,
|
|
35
|
+
size: 18,
|
|
36
|
+
animatedProps: iconProps
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var _default = /*#__PURE__*/(0, _react.memo)(Icon);
|
|
41
|
+
|
|
42
|
+
exports.default = _default;
|
|
43
|
+
//# sourceMappingURL=Icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["Icon.tsx"],"names":["Icon","iconComponent","name","theme","AnimatedIcon","Animated","createAnimatedComponent","iconProps","color","value"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;;;;;AAcA,MAAMA,IAAI,GAAG,CAAC;AAAEC,EAAAA,aAAF;AAAiBC,EAAAA;AAAjB,CAAD,KAAwC;AACnD,QAAM;AAAEC,IAAAA;AAAF,MAAY,yBAAlB;;AACA,MAAIC,YAAY,GAAGC,+BAASC,uBAAT,CACjBL,aADiB,CAAnB;;AAIA,QAAMM,SAAS,GAAG,6CAAiB,MAAM;AACvC,WAAO;AACLC,MAAAA,KAAK,EAAEL,KAAK,CAACM,KAAN,KAAgB,OAAhB,GAA0B,OAA1B,GAAoC;AADtC,KAAP;AAGD,GAJiB,EAIf,CAACN,KAAD,CAJe,CAAlB;AAMA,sBAAO,6BAAC,YAAD;AAAc,IAAA,IAAI,EAAED,IAApB;AAA0B,IAAA,IAAI,EAAE,EAAhC;AAAoC,IAAA,aAAa,EAAEK;AAAnD,IAAP;AACD,CAbD;;4BAee,iBAAKP,IAAL,C","sourcesContent":["import React, { memo } from 'react';\n\nimport Animated, { useAnimatedProps } from 'react-native-reanimated';\nimport { useInternal } from '../../hooks';\n\ntype IconComponentProps = {\n name: string;\n size: number;\n animatedProps: Partial<{ color: string }>;\n};\n\n// Update iconComponent type, React.ComponentClass<IconComponentProps, any>\ntype IconProps = {\n iconComponent: any;\n name: string;\n};\n\nconst Icon = ({ iconComponent, name }: IconProps) => {\n const { theme } = useInternal();\n let AnimatedIcon = Animated.createAnimatedComponent<IconComponentProps>(\n iconComponent\n );\n\n const iconProps = useAnimatedProps(() => {\n return {\n color: theme.value === 'light' ? 'black' : 'white',\n };\n }, [theme]);\n\n return <AnimatedIcon name={name} size={18} animatedProps={iconProps} />;\n};\n\nexport default memo(Icon);\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "default", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _Icon.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
var _Icon = _interopRequireDefault(require("./Icon"));
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA","sourcesContent":["export { default } from './Icon';\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
11
|
+
|
|
12
|
+
var _MenuList = _interopRequireDefault(require("./MenuList"));
|
|
13
|
+
|
|
14
|
+
var _styles = _interopRequireDefault(require("./styles"));
|
|
15
|
+
|
|
16
|
+
var _hooks = require("../../hooks");
|
|
17
|
+
|
|
18
|
+
var _constants = require("../../constants");
|
|
19
|
+
|
|
20
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
21
|
+
|
|
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; }
|
|
23
|
+
|
|
24
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
+
|
|
26
|
+
const MenuComponent = () => {
|
|
27
|
+
const {
|
|
28
|
+
state,
|
|
29
|
+
menuProps
|
|
30
|
+
} = (0, _hooks.useInternal)();
|
|
31
|
+
const wrapperStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
32
|
+
const anchorPositionVertical = menuProps.value.anchorPosition.split('-')[0];
|
|
33
|
+
const top = anchorPositionVertical === 'top' ? menuProps.value.itemHeight + menuProps.value.itemY + 8 : menuProps.value.itemY - 8;
|
|
34
|
+
const left = menuProps.value.itemX;
|
|
35
|
+
const width = menuProps.value.itemWidth;
|
|
36
|
+
const tY = menuProps.value.transformValue;
|
|
37
|
+
return {
|
|
38
|
+
top,
|
|
39
|
+
left,
|
|
40
|
+
width,
|
|
41
|
+
transform: [{
|
|
42
|
+
translateY: state.value === _constants.CONTEXT_MENU_STATE.ACTIVE ? (0, _reactNativeReanimated.withSpring)(tY, _constants.SPRING_CONFIGURATION) : (0, _reactNativeReanimated.withTiming)(0, {
|
|
43
|
+
duration: _constants.HOLD_ITEM_TRANSFORM_DURATION
|
|
44
|
+
})
|
|
45
|
+
}]
|
|
46
|
+
};
|
|
47
|
+
}, [menuProps]);
|
|
48
|
+
return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
49
|
+
style: [_styles.default.menuWrapper, wrapperStyles]
|
|
50
|
+
}, /*#__PURE__*/_react.default.createElement(_MenuList.default, null));
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const Menu = /*#__PURE__*/_react.default.memo(MenuComponent);
|
|
54
|
+
|
|
55
|
+
var _default = Menu;
|
|
56
|
+
exports.default = _default;
|
|
57
|
+
//# sourceMappingURL=Menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|