@draftbit/core 47.2.13 → 47.2.14-76dc6c.2
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/lib/src/components/SwipeableItem/SwipeableItem.d.ts +43 -0
- package/lib/src/components/SwipeableItem/SwipeableItem.js +114 -0
- package/lib/src/components/SwipeableItem/SwipeableItem.js.map +1 -0
- package/lib/src/components/SwipeableItem/SwipeableItemButton.d.ts +5 -0
- package/lib/src/components/SwipeableItem/SwipeableItemButton.js +6 -0
- package/lib/src/components/SwipeableItem/SwipeableItemButton.js.map +1 -0
- package/lib/src/components/SwipeableItem/SwipeableItemCommon.d.ts +30 -0
- package/lib/src/components/SwipeableItem/SwipeableItemCommon.js +44 -0
- package/lib/src/components/SwipeableItem/SwipeableItemCommon.js.map +1 -0
- package/lib/src/components/SwipeableItem/SwipeableList.d.ts +17 -0
- package/lib/src/components/SwipeableItem/SwipeableList.js +29 -0
- package/lib/src/components/SwipeableItem/SwipeableList.js.map +1 -0
- package/lib/src/components/SwipeableItem/index.d.ts +3 -0
- package/lib/src/components/SwipeableItem/index.js +4 -0
- package/lib/src/components/{SwipeableView → SwipeableItem}/index.js.map +1 -1
- package/lib/src/index.d.ts +1 -1
- package/lib/src/index.js +1 -1
- package/lib/src/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/components/SwipeableItem/SwipeableItem.js +114 -0
- package/src/components/SwipeableItem/SwipeableItem.js.map +1 -0
- package/src/components/{SwipeableView/SwipeableView.tsx → SwipeableItem/SwipeableItem.tsx} +95 -88
- package/src/components/SwipeableItem/SwipeableItemButton.js +6 -0
- package/src/components/SwipeableItem/SwipeableItemButton.js.map +1 -0
- package/src/components/SwipeableItem/SwipeableItemButton.tsx +11 -0
- package/src/components/SwipeableItem/SwipeableItemCommon.js +44 -0
- package/src/components/SwipeableItem/SwipeableItemCommon.js.map +1 -0
- package/src/components/SwipeableItem/SwipeableItemCommon.ts +80 -0
- package/src/components/SwipeableItem/SwipeableList.js +29 -0
- package/src/components/SwipeableItem/SwipeableList.js.map +1 -0
- package/src/components/SwipeableItem/SwipeableList.tsx +62 -0
- package/src/components/SwipeableItem/index.js +4 -0
- package/src/components/{SwipeableView → SwipeableItem}/index.js.map +1 -1
- package/src/components/SwipeableItem/index.tsx +3 -0
- package/src/index.js +1 -1
- package/src/index.js.map +1 -1
- package/src/index.tsx +4 -4
- package/lib/src/components/SwipeableView/SwipeableView.d.ts +0 -28
- package/lib/src/components/SwipeableView/SwipeableView.js +0 -119
- package/lib/src/components/SwipeableView/SwipeableView.js.map +0 -1
- package/lib/src/components/SwipeableView/SwipeableViewButton.d.ts +0 -12
- package/lib/src/components/SwipeableView/SwipeableViewButton.js +0 -6
- package/lib/src/components/SwipeableView/SwipeableViewButton.js.map +0 -1
- package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.d.ts +0 -12
- package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.js +0 -6
- package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.js.map +0 -1
- package/lib/src/components/SwipeableView/index.d.ts +0 -3
- package/lib/src/components/SwipeableView/index.js +0 -4
- package/src/components/SwipeableView/SwipeableView.js +0 -119
- package/src/components/SwipeableView/SwipeableView.js.map +0 -1
- package/src/components/SwipeableView/SwipeableViewButton.js +0 -6
- package/src/components/SwipeableView/SwipeableViewButton.js.map +0 -1
- package/src/components/SwipeableView/SwipeableViewButton.tsx +0 -18
- package/src/components/SwipeableView/SwipeableViewSwipeHandler.js +0 -6
- package/src/components/SwipeableView/SwipeableViewSwipeHandler.js.map +0 -1
- package/src/components/SwipeableView/SwipeableViewSwipeHandler.tsx +0 -20
- package/src/components/SwipeableView/index.js +0 -4
- package/src/components/SwipeableView/index.tsx +0 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@draftbit/core",
|
|
3
|
-
"version": "47.2.
|
|
3
|
+
"version": "47.2.14-76dc6c.2+76dc6c6",
|
|
4
4
|
"description": "Core (non-native) Components",
|
|
5
5
|
"main": "lib/src/index.js",
|
|
6
6
|
"types": "lib/src/index.d.ts",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@date-io/date-fns": "^1.3.13",
|
|
41
41
|
"@draftbit/react-theme-provider": "^2.1.1",
|
|
42
|
-
"@draftbit/types": "47.2.
|
|
42
|
+
"@draftbit/types": "^47.2.14-76dc6c.2+76dc6c6",
|
|
43
43
|
"@material-ui/core": "^4.11.0",
|
|
44
44
|
"@material-ui/pickers": "^3.2.10",
|
|
45
45
|
"@react-native-community/slider": "4.2.4",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"node_modules/",
|
|
78
78
|
"lib/"
|
|
79
79
|
],
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "76dc6c64290b8b38fb6b0728b0b862fa7db7d547"
|
|
81
81
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { View, StyleSheet, Text, } from "react-native";
|
|
3
|
+
import Pressable from "../Pressable";
|
|
4
|
+
import { extractBorderAndMarginStyles, extractEffectStyles, extractFlexItemStyles, extractPositionStyles, extractSizeStyles, extractStyles, } from "../../utilities";
|
|
5
|
+
import { SwipeRow } from "react-native-swipe-list-view";
|
|
6
|
+
import { withTheme } from "../../theming";
|
|
7
|
+
import { SwipeableListContext } from "./SwipeableList";
|
|
8
|
+
import { leftSwipeToSwipeableItemBehindItem, rightSwipeToSwipeableItemBehindItem, extractLeftSwipeProps, extractRightSwipeProps, } from "./SwipeableItemCommon";
|
|
9
|
+
const SwipeableItem = ({ theme, style, children, Icon, closeOnPress, leftOpenValue, rightOpenValue, leftActivationValue, rightActivationValue, swipeActivationPercentage = 80, stopLeftSwipe, stopRightSwipe, friction = 20, ...rest }) => {
|
|
10
|
+
const instanceOfSwipeableItemButtonProps = (object) => {
|
|
11
|
+
return "title" in object && "revealSwipeDirection" in object;
|
|
12
|
+
};
|
|
13
|
+
const isEmptyObject = (object) => {
|
|
14
|
+
return Object.keys(object).length === 0;
|
|
15
|
+
};
|
|
16
|
+
const { onStartSwiping, onStopSwiping } = React.useContext(SwipeableListContext);
|
|
17
|
+
const { viewStyles, textStyles } = extractStyles(style);
|
|
18
|
+
const { borderStyles, marginStyles } = extractBorderAndMarginStyles(viewStyles);
|
|
19
|
+
const sizeStyles = extractSizeStyles(viewStyles);
|
|
20
|
+
const parentContainerStyles = StyleSheet.flatten([
|
|
21
|
+
borderStyles,
|
|
22
|
+
marginStyles,
|
|
23
|
+
extractFlexItemStyles(viewStyles),
|
|
24
|
+
extractPositionStyles(viewStyles),
|
|
25
|
+
extractEffectStyles(viewStyles),
|
|
26
|
+
sizeStyles,
|
|
27
|
+
]);
|
|
28
|
+
//Remove styles already consumed from viewStyles
|
|
29
|
+
Object.keys(parentContainerStyles).forEach((key) => delete viewStyles[key]);
|
|
30
|
+
const surfaceContainerStyles = StyleSheet.flatten([
|
|
31
|
+
viewStyles,
|
|
32
|
+
sizeStyles /* Size styles needs to be readded to surface container due to inconsistencies on web */,
|
|
33
|
+
]);
|
|
34
|
+
const [componentWidth, setComponentWidth] = React.useState(null);
|
|
35
|
+
const leftSwipeButtons = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
|
|
36
|
+
instanceOfSwipeableItemButtonProps(child.props) &&
|
|
37
|
+
child.props.revealSwipeDirection === "left"), [children]);
|
|
38
|
+
const rightSwipeButtons = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
|
|
39
|
+
instanceOfSwipeableItemButtonProps(child.props) &&
|
|
40
|
+
child.props.revealSwipeDirection === "right"), [children]);
|
|
41
|
+
const remainingChildren = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
|
|
42
|
+
!instanceOfSwipeableItemButtonProps(child.props)), [children]);
|
|
43
|
+
const leftSwipe = extractLeftSwipeProps(rest);
|
|
44
|
+
const rightSwipe = extractRightSwipeProps(rest);
|
|
45
|
+
const isLeftSwipeHandled = !isEmptyObject(leftSwipe);
|
|
46
|
+
const isRightSwipeHandled = !isEmptyObject(rightSwipe);
|
|
47
|
+
if (leftSwipeButtons.length > 2 || rightSwipeButtons.length > 2) {
|
|
48
|
+
throw Error("Cannot have more than 2 SwipeableItemButton(s) per side");
|
|
49
|
+
}
|
|
50
|
+
if ((leftSwipeButtons.length && isLeftSwipeHandled) ||
|
|
51
|
+
(rightSwipeButtons.length && isRightSwipeHandled)) {
|
|
52
|
+
throw Error("Colliding configuration in SwipeableItem. You cannot have SwipeableItemButton(s) on the side where swipe handling is configured. Either reset swipe configuration or remove the button(s).");
|
|
53
|
+
}
|
|
54
|
+
//Renders a single 'behind' item. Used for both buttons and swipe handler
|
|
55
|
+
const renderBehindItem = (item, index) => (React.createElement(Pressable, { key: index.toString(), onPress: item.onPress, style: [
|
|
56
|
+
styles.buttonContainer,
|
|
57
|
+
{ backgroundColor: item.backgroundColor || theme.colors.primary },
|
|
58
|
+
] },
|
|
59
|
+
item.icon && (React.createElement(Icon, { name: item.icon, size: item.iconSize || 25, color: item.color || theme.colors.surface })),
|
|
60
|
+
React.createElement(Text, { style: [textStyles, { color: item.color || theme.colors.surface }] }, item.title)));
|
|
61
|
+
const defaultLeftOpenValue = componentWidth ? componentWidth / 2 : 0;
|
|
62
|
+
const defaultRightOpenValue = componentWidth ? -componentWidth / 2 : 0;
|
|
63
|
+
return (React.createElement(View, { onLayout: (event) => {
|
|
64
|
+
setComponentWidth(event.nativeEvent.layout.width);
|
|
65
|
+
}, style: [styles.parentContainer, parentContainerStyles] },
|
|
66
|
+
React.createElement(SwipeRow, { leftOpenValue: isRightSwipeHandled ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
|
|
67
|
+
, rightOpenValue: isLeftSwipeHandled ? 0 : rightOpenValue || defaultRightOpenValue, leftActivationValue: leftActivationValue || isRightSwipeHandled
|
|
68
|
+
? defaultLeftOpenValue * (swipeActivationPercentage / 100) //When swipe passes activation percentage then it should be considered activated (call onSwipe)
|
|
69
|
+
: defaultLeftOpenValue, rightActivationValue: rightActivationValue || isLeftSwipeHandled
|
|
70
|
+
? defaultRightOpenValue * (swipeActivationPercentage / 100)
|
|
71
|
+
: defaultRightOpenValue, stopLeftSwipe: stopRightSwipe || defaultLeftOpenValue, stopRightSwipe: stopLeftSwipe || defaultRightOpenValue, onLeftAction: isRightSwipeHandled ? () => { var _a; return (_a = rightSwipe.onSwipeRight) === null || _a === void 0 ? void 0 : _a.call(rightSwipe); } : undefined, onRightAction: isLeftSwipeHandled ? () => { var _a; return (_a = leftSwipe.onSwipeLeft) === null || _a === void 0 ? void 0 : _a.call(leftSwipe); } : undefined, swipeGestureBegan: onStartSwiping, swipeGestureEnded: onStopSwiping, closeOnRowPress: closeOnPress, friction: friction, ...rest },
|
|
72
|
+
React.createElement(View, { style: styles.behindContainer },
|
|
73
|
+
React.createElement(View, { style: styles.behindContainerItem }, isRightSwipeHandled
|
|
74
|
+
? renderBehindItem(rightSwipeToSwipeableItemBehindItem(rightSwipe), 0)
|
|
75
|
+
: rightSwipeButtons.map((item, index) => renderBehindItem(item.props, index))),
|
|
76
|
+
React.createElement(View, { style: styles.behindContainerItem }, isLeftSwipeHandled
|
|
77
|
+
? renderBehindItem(leftSwipeToSwipeableItemBehindItem(leftSwipe), 0)
|
|
78
|
+
: leftSwipeButtons.map((item, index) => renderBehindItem(item.props, index)))),
|
|
79
|
+
React.createElement(View, { style: [
|
|
80
|
+
styles.surfaceContainer,
|
|
81
|
+
{
|
|
82
|
+
backgroundColor: theme.colors.background,
|
|
83
|
+
},
|
|
84
|
+
surfaceContainerStyles,
|
|
85
|
+
] }, remainingChildren))));
|
|
86
|
+
};
|
|
87
|
+
const styles = StyleSheet.create({
|
|
88
|
+
parentContainer: {
|
|
89
|
+
overflow: "hidden",
|
|
90
|
+
minHeight: 50,
|
|
91
|
+
},
|
|
92
|
+
behindContainer: {
|
|
93
|
+
flex: 1,
|
|
94
|
+
width: "100%",
|
|
95
|
+
height: "100%",
|
|
96
|
+
flexDirection: "row",
|
|
97
|
+
},
|
|
98
|
+
behindContainerItem: {
|
|
99
|
+
flex: 1,
|
|
100
|
+
flexDirection: "row",
|
|
101
|
+
},
|
|
102
|
+
buttonContainer: {
|
|
103
|
+
flex: 1,
|
|
104
|
+
alignItems: "center",
|
|
105
|
+
justifyContent: "center",
|
|
106
|
+
},
|
|
107
|
+
surfaceContainer: {
|
|
108
|
+
width: "100%",
|
|
109
|
+
minHeight: 50,
|
|
110
|
+
overflow: "hidden",
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
export default withTheme(SwipeableItem);
|
|
114
|
+
//# sourceMappingURL=SwipeableItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwipeableItem.js","sourceRoot":"","sources":["SwipeableItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,IAAI,EAIJ,UAAU,EACV,IAAI,GACL,MAAM,cAAc,CAAC;AACtB,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAIL,kCAAkC,EAClC,mCAAmC,EACnC,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAuC/B,MAAM,aAAa,GAA6C,CAAC,EAC/D,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,GAAG,EAAE,EAC9B,aAAa,EACb,cAAc,EACd,QAAQ,GAAG,EAAE,EACb,GAAG,IAAI,EACR,EAAE,EAAE;IACH,MAAM,kCAAkC,GAAG,CACzC,MAAW,EACyB,EAAE;QACtC,OAAO,OAAO,IAAI,MAAM,IAAI,sBAAsB,IAAI,MAAM,CAAC;IAC/D,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE;QACvC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GACrC,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAEzC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAExD,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAClC,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC;QAC/C,YAAY;QACZ,YAAY;QACZ,qBAAqB,CAAC,UAAU,CAAC;QACjC,qBAAqB,CAAC,UAAU,CAAC;QACjC,mBAAmB,CAAC,UAAU,CAAC;QAC/B,UAAU;KACX,CAAC,CAAC;IAEH,gDAAgD;IAChD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,CAAC;QAChD,UAAU;QACV,UAAU,CAAC,wFAAwF;KACpG,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CACxD,IAAI,CACL,CAAC;IACF,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CACpC,GAAG,EAAE,CACH,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CACrC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;QAC3B,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/C,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,MAAM,CACI,EACrD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CACrC,GAAG,EAAE,CACH,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CACrC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;QAC3B,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/C,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,OAAO,CACG,EACrD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CACrC,GAAG,EAAE,CACH,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CACrC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;QAC3B,CAAC,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC,CACnD,EACH,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAEhD,MAAM,kBAAkB,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,mBAAmB,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAEvD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/D,MAAM,KAAK,CAAC,yDAAyD,CAAC,CAAC;KACxE;IAED,IACE,CAAC,gBAAgB,CAAC,MAAM,IAAI,kBAAkB,CAAC;QAC/C,CAAC,iBAAiB,CAAC,MAAM,IAAI,mBAAmB,CAAC,EACjD;QACA,MAAM,KAAK,CACT,4LAA4L,CAC7L,CAAC;KACH;IAED,yEAAyE;IACzE,MAAM,gBAAgB,GAAG,CAAC,IAA6B,EAAE,KAAa,EAAE,EAAE,CAAC,CACzE,oBAAC,SAAS,IACR,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,EACrB,OAAO,EAAG,IAAY,CAAC,OAAO,EAC9B,KAAK,EAAE;YACL,MAAM,CAAC,eAAe;YACtB,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;SAClE;QAEA,IAAI,CAAC,IAAI,IAAI,CACZ,oBAAC,IAAI,IACH,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EACzB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,GACzC,CACH;QACD,oBAAC,IAAI,IAAC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IACrE,IAAI,CAAC,KAAK,CACN,CACG,CACb,CAAC;IAEF,MAAM,oBAAoB,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,qBAAqB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,OAAO,CACL,oBAAC,IAAI,IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC,EACD,KAAK,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;QAGtD,oBAAC,QAAQ,IACP,aAAa,EACX,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,oBAAoB,CAAC,qCAAqC;cAEvG,cAAc,EACZ,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,qBAAqB,EAElE,mBAAmB,EACjB,mBAAmB,IAAI,mBAAmB;gBACxC,CAAC,CAAC,oBAAoB,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAC,+FAA+F;gBAC1J,CAAC,CAAC,oBAAoB,EAE1B,oBAAoB,EAClB,oBAAoB,IAAI,kBAAkB;gBACxC,CAAC,CAAC,qBAAqB,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC;gBAC3D,CAAC,CAAC,qBAAqB,EAE3B,aAAa,EAAE,cAAc,IAAI,oBAAoB,EACrD,cAAc,EAAE,aAAa,IAAI,qBAAqB,EACtD,YAAY,EACV,mBAAmB,CAAC,CAAC,CAAC,GAAG,EAAE,WAAC,OAAA,MAAA,UAAU,CAAC,YAAY,0DAAI,CAAA,EAAA,CAAC,CAAC,CAAC,SAAS,EAErE,aAAa,EACX,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE,WAAC,OAAA,MAAA,SAAS,CAAC,WAAW,yDAAI,CAAA,EAAA,CAAC,CAAC,CAAC,SAAS,EAElE,iBAAiB,EAAE,cAAc,EACjC,iBAAiB,EAAE,aAAa,EAChC,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,QAAQ,KACd,IAAI;YAER,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,eAAe;gBACjC,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,mBAAmB,IACpC,mBAAmB;oBAClB,CAAC,CAAC,gBAAgB,CACd,mCAAmC,CAAC,UAAU,CAAC,EAC/C,CAAC,CACF;oBACH,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CACpC,CACA;gBACP,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,mBAAmB,IACpC,kBAAkB;oBACjB,CAAC,CAAC,gBAAgB,CACd,kCAAkC,CAAC,SAAS,CAAC,EAC7C,CAAC,CACF;oBACH,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CACpC,CACA,CACF;YACP,oBAAC,IAAI,IACH,KAAK,EAAE;oBACL,MAAM,CAAC,gBAAgB;oBACvB;wBACE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;qBACzC;oBACD,sBAAsB;iBACvB,IAEA,iBAAiB,CACb,CACE,CACN,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,eAAe,EAAE;QACf,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,EAAE;KACd;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,aAAa,EAAE,KAAK;KACrB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC;QACP,aAAa,EAAE,KAAK;KACrB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,QAAQ;KACnB;CACF,CAAC,CAAC;AAEH,eAAe,SAAS,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -20,10 +20,33 @@ import { SwipeRow } from "react-native-swipe-list-view";
|
|
|
20
20
|
import { IconSlot } from "../../interfaces/Icon";
|
|
21
21
|
import type { Theme } from "../../styles/DefaultTheme";
|
|
22
22
|
import { withTheme } from "../../theming";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
23
|
+
import { SwipeableItemButtonProps } from "./SwipeableItemButton";
|
|
24
|
+
import { SwipeableListContext } from "./SwipeableList";
|
|
25
|
+
import {
|
|
26
|
+
RightSwipeProps,
|
|
27
|
+
LeftSwipeProps,
|
|
28
|
+
SwipeableItemBehindItem,
|
|
29
|
+
leftSwipeToSwipeableItemBehindItem,
|
|
30
|
+
rightSwipeToSwipeableItemBehindItem,
|
|
31
|
+
extractLeftSwipeProps,
|
|
32
|
+
extractRightSwipeProps,
|
|
33
|
+
} from "./SwipeableItemCommon";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Clarification Regarding left/right directions and what they mean in the context of this component
|
|
37
|
+
* ------------------------------------------------------------------------------------------------------------
|
|
38
|
+
* Swipe Left / Left Swipe = Swiping to the left (i.e. Swiping from the right)
|
|
39
|
+
* Swipe Right / Right Swipe = Swiping to the right (i.e. Swiping from the left)
|
|
40
|
+
*
|
|
41
|
+
* This is only applies in the context of swipes, and not anywhere where a direction is refernced.
|
|
42
|
+
* For example 'rightOpenValue' referes to the open value on the right side.
|
|
43
|
+
* While 'stopRightSwipe' refers to the stop value of the swipe from left to right, which is on the left side.
|
|
44
|
+
* This is because one refers to a swipe and one does not, so the word 'right' has different meanings.
|
|
45
|
+
*
|
|
46
|
+
* This component is built around this concept to avoid confusion
|
|
47
|
+
*/
|
|
25
48
|
|
|
26
|
-
export interface
|
|
49
|
+
export interface SwipeableItemProps extends IconSlot {
|
|
27
50
|
closeOnPress?: boolean;
|
|
28
51
|
leftOpenValue?: number;
|
|
29
52
|
rightOpenValue?: number;
|
|
@@ -44,7 +67,9 @@ export interface SwipeableViewProps extends IconSlot {
|
|
|
44
67
|
theme: Theme;
|
|
45
68
|
}
|
|
46
69
|
|
|
47
|
-
|
|
70
|
+
type Props = SwipeableItemProps & RightSwipeProps & LeftSwipeProps;
|
|
71
|
+
|
|
72
|
+
const SwipeableItem: React.FC<React.PropsWithChildren<Props>> = ({
|
|
48
73
|
theme,
|
|
49
74
|
style,
|
|
50
75
|
children,
|
|
@@ -60,18 +85,19 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
|
|
|
60
85
|
friction = 20,
|
|
61
86
|
...rest
|
|
62
87
|
}) => {
|
|
63
|
-
const
|
|
88
|
+
const instanceOfSwipeableItemButtonProps = (
|
|
64
89
|
object: any
|
|
65
|
-
): object is
|
|
66
|
-
return "title" in object && "
|
|
90
|
+
): object is SwipeableItemButtonProps => {
|
|
91
|
+
return "title" in object && "revealSwipeDirection" in object;
|
|
67
92
|
};
|
|
68
93
|
|
|
69
|
-
const
|
|
70
|
-
object
|
|
71
|
-
): object is SwipeableViewSwipeHandlerProps => {
|
|
72
|
-
return "title" in object && "side" in object && "onSwipe" in object;
|
|
94
|
+
const isEmptyObject = (object: object) => {
|
|
95
|
+
return Object.keys(object).length === 0;
|
|
73
96
|
};
|
|
74
97
|
|
|
98
|
+
const { onStartSwiping, onStopSwiping } =
|
|
99
|
+
React.useContext(SwipeableListContext);
|
|
100
|
+
|
|
75
101
|
const { viewStyles, textStyles } = extractStyles(style);
|
|
76
102
|
|
|
77
103
|
const { borderStyles, marginStyles } =
|
|
@@ -98,47 +124,25 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
|
|
|
98
124
|
const [componentWidth, setComponentWidth] = React.useState<number | null>(
|
|
99
125
|
null
|
|
100
126
|
);
|
|
101
|
-
const
|
|
102
|
-
() =>
|
|
103
|
-
React.Children.toArray(children).filter(
|
|
104
|
-
(child) =>
|
|
105
|
-
React.isValidElement(child) &&
|
|
106
|
-
instanceOfSwipeableViewButtonProps(child.props) &&
|
|
107
|
-
child.props.side === "left"
|
|
108
|
-
) as React.ReactElement<SwipeableViewButtonProps>[],
|
|
109
|
-
[children]
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
const rightButtons = React.useMemo(
|
|
127
|
+
const leftSwipeButtons = React.useMemo(
|
|
113
128
|
() =>
|
|
114
129
|
React.Children.toArray(children).filter(
|
|
115
130
|
(child) =>
|
|
116
131
|
React.isValidElement(child) &&
|
|
117
|
-
|
|
118
|
-
child.props.
|
|
119
|
-
) as React.ReactElement<
|
|
132
|
+
instanceOfSwipeableItemButtonProps(child.props) &&
|
|
133
|
+
child.props.revealSwipeDirection === "left"
|
|
134
|
+
) as React.ReactElement<SwipeableItemButtonProps>[],
|
|
120
135
|
[children]
|
|
121
136
|
);
|
|
122
137
|
|
|
123
|
-
const
|
|
138
|
+
const rightSwipeButtons = React.useMemo(
|
|
124
139
|
() =>
|
|
125
140
|
React.Children.toArray(children).filter(
|
|
126
141
|
(child) =>
|
|
127
142
|
React.isValidElement(child) &&
|
|
128
|
-
|
|
129
|
-
child.props.
|
|
130
|
-
) as React.ReactElement<
|
|
131
|
-
[children]
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
const rightSwipeHandlers = React.useMemo(
|
|
135
|
-
() =>
|
|
136
|
-
React.Children.toArray(children).filter(
|
|
137
|
-
(child) =>
|
|
138
|
-
React.isValidElement(child) &&
|
|
139
|
-
instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
|
|
140
|
-
child.props.side === "right"
|
|
141
|
-
) as React.ReactElement<SwipeableViewSwipeHandlerProps>[],
|
|
143
|
+
instanceOfSwipeableItemButtonProps(child.props) &&
|
|
144
|
+
child.props.revealSwipeDirection === "right"
|
|
145
|
+
) as React.ReactElement<SwipeableItemButtonProps>[],
|
|
142
146
|
[children]
|
|
143
147
|
);
|
|
144
148
|
|
|
@@ -147,58 +151,53 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
|
|
|
147
151
|
React.Children.toArray(children).filter(
|
|
148
152
|
(child) =>
|
|
149
153
|
React.isValidElement(child) &&
|
|
150
|
-
!
|
|
151
|
-
!instanceOfSwipeableViewButtonProps(child.props)
|
|
154
|
+
!instanceOfSwipeableItemButtonProps(child.props)
|
|
152
155
|
),
|
|
153
156
|
[children]
|
|
154
157
|
);
|
|
155
158
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
+
const leftSwipe = extractLeftSwipeProps(rest);
|
|
160
|
+
const rightSwipe = extractRightSwipeProps(rest);
|
|
161
|
+
|
|
162
|
+
const isLeftSwipeHandled = !isEmptyObject(leftSwipe);
|
|
163
|
+
const isRightSwipeHandled = !isEmptyObject(rightSwipe);
|
|
159
164
|
|
|
160
|
-
if (
|
|
161
|
-
throw Error("Cannot have more than
|
|
165
|
+
if (leftSwipeButtons.length > 2 || rightSwipeButtons.length > 2) {
|
|
166
|
+
throw Error("Cannot have more than 2 SwipeableItemButton(s) per side");
|
|
162
167
|
}
|
|
163
168
|
|
|
164
169
|
if (
|
|
165
|
-
(
|
|
166
|
-
(
|
|
170
|
+
(leftSwipeButtons.length && isLeftSwipeHandled) ||
|
|
171
|
+
(rightSwipeButtons.length && isRightSwipeHandled)
|
|
167
172
|
) {
|
|
168
|
-
throw Error(
|
|
173
|
+
throw Error(
|
|
174
|
+
"Colliding configuration in SwipeableItem. You cannot have SwipeableItemButton(s) on the side where swipe handling is configured. Either reset swipe configuration or remove the button(s)."
|
|
175
|
+
);
|
|
169
176
|
}
|
|
170
177
|
|
|
171
|
-
//Renders a single
|
|
172
|
-
const renderBehindItem = (
|
|
173
|
-
props: SwipeableViewSwipeHandlerProps | SwipeableViewButtonProps,
|
|
174
|
-
index: number
|
|
175
|
-
) => (
|
|
178
|
+
//Renders a single 'behind' item. Used for both buttons and swipe handler
|
|
179
|
+
const renderBehindItem = (item: SwipeableItemBehindItem, index: number) => (
|
|
176
180
|
<Pressable
|
|
177
181
|
key={index.toString()}
|
|
178
|
-
onPress={(
|
|
182
|
+
onPress={(item as any).onPress}
|
|
179
183
|
style={[
|
|
180
184
|
styles.buttonContainer,
|
|
181
|
-
{ backgroundColor:
|
|
185
|
+
{ backgroundColor: item.backgroundColor || theme.colors.primary },
|
|
182
186
|
]}
|
|
183
187
|
>
|
|
184
|
-
{
|
|
188
|
+
{item.icon && (
|
|
185
189
|
<Icon
|
|
186
|
-
name={
|
|
187
|
-
size={
|
|
188
|
-
color={
|
|
190
|
+
name={item.icon}
|
|
191
|
+
size={item.iconSize || 25}
|
|
192
|
+
color={item.color || theme.colors.surface}
|
|
189
193
|
/>
|
|
190
194
|
)}
|
|
191
|
-
<Text
|
|
192
|
-
|
|
193
|
-
>
|
|
194
|
-
{props.title}
|
|
195
|
+
<Text style={[textStyles, { color: item.color || theme.colors.surface }]}>
|
|
196
|
+
{item.title}
|
|
195
197
|
</Text>
|
|
196
198
|
</Pressable>
|
|
197
199
|
);
|
|
198
200
|
|
|
199
|
-
const isLeftSwipeHandler = !!leftSwipeHandlers.length;
|
|
200
|
-
const isRightSwipeHandler = !!rightSwipeHandlers.length;
|
|
201
|
-
|
|
202
201
|
const defaultLeftOpenValue = componentWidth ? componentWidth / 2 : 0;
|
|
203
202
|
const defaultRightOpenValue = componentWidth ? -componentWidth / 2 : 0;
|
|
204
203
|
|
|
@@ -212,47 +211,55 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
|
|
|
212
211
|
{/*@ts-ignore*/}
|
|
213
212
|
<SwipeRow
|
|
214
213
|
leftOpenValue={
|
|
215
|
-
|
|
214
|
+
isRightSwipeHandled ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
|
|
216
215
|
}
|
|
217
216
|
rightOpenValue={
|
|
218
|
-
|
|
217
|
+
isLeftSwipeHandled ? 0 : rightOpenValue || defaultRightOpenValue
|
|
219
218
|
}
|
|
220
219
|
leftActivationValue={
|
|
221
|
-
leftActivationValue ||
|
|
220
|
+
leftActivationValue || isRightSwipeHandled
|
|
222
221
|
? defaultLeftOpenValue * (swipeActivationPercentage / 100) //When swipe passes activation percentage then it should be considered activated (call onSwipe)
|
|
223
222
|
: defaultLeftOpenValue
|
|
224
223
|
}
|
|
225
224
|
rightActivationValue={
|
|
226
|
-
rightActivationValue ||
|
|
225
|
+
rightActivationValue || isLeftSwipeHandled
|
|
227
226
|
? defaultRightOpenValue * (swipeActivationPercentage / 100)
|
|
228
227
|
: defaultRightOpenValue
|
|
229
228
|
}
|
|
230
|
-
stopLeftSwipe={
|
|
231
|
-
stopRightSwipe={
|
|
229
|
+
stopLeftSwipe={stopRightSwipe || defaultLeftOpenValue}
|
|
230
|
+
stopRightSwipe={stopLeftSwipe || defaultRightOpenValue}
|
|
232
231
|
onLeftAction={
|
|
233
|
-
|
|
234
|
-
? () => leftSwipeHandlers[0].props.onSwipe?.()
|
|
235
|
-
: undefined
|
|
232
|
+
isRightSwipeHandled ? () => rightSwipe.onSwipeRight?.() : undefined
|
|
236
233
|
}
|
|
237
234
|
onRightAction={
|
|
238
|
-
|
|
239
|
-
? () => rightSwipeHandlers[0].props.onSwipe?.()
|
|
240
|
-
: undefined
|
|
235
|
+
isLeftSwipeHandled ? () => leftSwipe.onSwipeLeft?.() : undefined
|
|
241
236
|
}
|
|
237
|
+
swipeGestureBegan={onStartSwiping}
|
|
238
|
+
swipeGestureEnded={onStopSwiping}
|
|
242
239
|
closeOnRowPress={closeOnPress}
|
|
243
240
|
friction={friction}
|
|
244
241
|
{...rest}
|
|
245
242
|
>
|
|
246
243
|
<View style={styles.behindContainer}>
|
|
247
244
|
<View style={styles.behindContainerItem}>
|
|
248
|
-
{
|
|
249
|
-
|
|
250
|
-
|
|
245
|
+
{isRightSwipeHandled
|
|
246
|
+
? renderBehindItem(
|
|
247
|
+
rightSwipeToSwipeableItemBehindItem(rightSwipe),
|
|
248
|
+
0
|
|
249
|
+
)
|
|
250
|
+
: rightSwipeButtons.map((item, index) =>
|
|
251
|
+
renderBehindItem(item.props, index)
|
|
252
|
+
)}
|
|
251
253
|
</View>
|
|
252
254
|
<View style={styles.behindContainerItem}>
|
|
253
|
-
{
|
|
254
|
-
|
|
255
|
-
|
|
255
|
+
{isLeftSwipeHandled
|
|
256
|
+
? renderBehindItem(
|
|
257
|
+
leftSwipeToSwipeableItemBehindItem(leftSwipe),
|
|
258
|
+
0
|
|
259
|
+
)
|
|
260
|
+
: leftSwipeButtons.map((item, index) =>
|
|
261
|
+
renderBehindItem(item.props, index)
|
|
262
|
+
)}
|
|
256
263
|
</View>
|
|
257
264
|
</View>
|
|
258
265
|
<View
|
|
@@ -298,4 +305,4 @@ const styles = StyleSheet.create({
|
|
|
298
305
|
},
|
|
299
306
|
});
|
|
300
307
|
|
|
301
|
-
export default withTheme(
|
|
308
|
+
export default withTheme(SwipeableItem);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwipeableItemButton.js","sourceRoot":"","sources":["SwipeableItemButton.tsx"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,MAAM,mBAAmB,GAAuC,GAAG,EAAE;IACnE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { SwipeableItemBehindItem } from "./SwipeableItemCommon";
|
|
3
|
+
|
|
4
|
+
export type SwipeableItemButtonProps = Omit<SwipeableItemBehindItem, "onSwipe">;
|
|
5
|
+
|
|
6
|
+
//Renders nothing, acts as a wrapper be used by SwipeableView
|
|
7
|
+
const SwipeableItemButton: React.FC<SwipeableItemButtonProps> = () => {
|
|
8
|
+
return null;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default SwipeableItemButton;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { pick } from "lodash";
|
|
2
|
+
export function extractRightSwipeProps(object) {
|
|
3
|
+
return pick(object, [
|
|
4
|
+
"onSwipeRight",
|
|
5
|
+
"rightSwipeTitle",
|
|
6
|
+
"rightSwipeIcon",
|
|
7
|
+
"rightSwipeIconSize",
|
|
8
|
+
"rightSwipeBackgroundColor",
|
|
9
|
+
"rightSwipeColor",
|
|
10
|
+
]);
|
|
11
|
+
}
|
|
12
|
+
export function extractLeftSwipeProps(object) {
|
|
13
|
+
return pick(object, [
|
|
14
|
+
"onSwipeLeft",
|
|
15
|
+
"leftSwipeTitle",
|
|
16
|
+
"leftSwipeIcon",
|
|
17
|
+
"leftSwipeIconSize",
|
|
18
|
+
"leftSwipeBackgroundColor",
|
|
19
|
+
"leftSwipeColor",
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
export function rightSwipeToSwipeableItemBehindItem(swipe) {
|
|
23
|
+
return {
|
|
24
|
+
title: swipe.rightSwipeTitle || "",
|
|
25
|
+
revealSwipeDirection: "right",
|
|
26
|
+
onSwipe: swipe.onSwipeRight,
|
|
27
|
+
icon: swipe.rightSwipeIcon,
|
|
28
|
+
iconSize: swipe.rightSwipeIconSize,
|
|
29
|
+
backgroundColor: swipe.rightSwipeBackgroundColor,
|
|
30
|
+
color: swipe.rightSwipeColor,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function leftSwipeToSwipeableItemBehindItem(swipe) {
|
|
34
|
+
return {
|
|
35
|
+
title: swipe.leftSwipeTitle || "",
|
|
36
|
+
revealSwipeDirection: "left",
|
|
37
|
+
onSwipe: swipe.onSwipeLeft,
|
|
38
|
+
icon: swipe.leftSwipeIcon,
|
|
39
|
+
iconSize: swipe.leftSwipeIconSize,
|
|
40
|
+
backgroundColor: swipe.leftSwipeBackgroundColor,
|
|
41
|
+
color: swipe.leftSwipeColor,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=SwipeableItemCommon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwipeableItemCommon.js","sourceRoot":"","sources":["SwipeableItemCommon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA+B9B,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,IAAI,CAAC,MAAM,EAAE;QAClB,cAAc;QACd,iBAAiB;QACjB,gBAAgB;QAChB,oBAAoB;QACpB,2BAA2B;QAC3B,iBAAiB;KAClB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,IAAI,CAAC,MAAM,EAAE;QAClB,aAAa;QACb,gBAAgB;QAChB,eAAe;QACf,mBAAmB;QACnB,0BAA0B;QAC1B,gBAAgB;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,KAAsB;IAEtB,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE;QAClC,oBAAoB,EAAE,OAAO;QAC7B,OAAO,EAAE,KAAK,CAAC,YAAY;QAC3B,IAAI,EAAE,KAAK,CAAC,cAAc;QAC1B,QAAQ,EAAE,KAAK,CAAC,kBAAkB;QAClC,eAAe,EAAE,KAAK,CAAC,yBAAyB;QAChD,KAAK,EAAE,KAAK,CAAC,eAAe;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAAqB;IAErB,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE;QACjC,oBAAoB,EAAE,MAAM;QAC5B,OAAO,EAAE,KAAK,CAAC,WAAW;QAC1B,IAAI,EAAE,KAAK,CAAC,aAAa;QACzB,QAAQ,EAAE,KAAK,CAAC,iBAAiB;QACjC,eAAe,EAAE,KAAK,CAAC,wBAAwB;QAC/C,KAAK,EAAE,KAAK,CAAC,cAAc;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { pick } from "lodash";
|
|
2
|
+
|
|
3
|
+
export interface SwipeableItemBehindItem {
|
|
4
|
+
title: string;
|
|
5
|
+
revealSwipeDirection: "left" | "right";
|
|
6
|
+
onPress?: () => void;
|
|
7
|
+
onSwipe?: () => void;
|
|
8
|
+
icon?: string;
|
|
9
|
+
iconSize?: number;
|
|
10
|
+
backgroundColor?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface RightSwipeProps {
|
|
15
|
+
onSwipeRight?: () => void;
|
|
16
|
+
rightSwipeTitle?: string;
|
|
17
|
+
rightSwipeIcon?: string;
|
|
18
|
+
rightSwipeIconSize?: number;
|
|
19
|
+
rightSwipeBackgroundColor?: string;
|
|
20
|
+
rightSwipeColor?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface LeftSwipeProps {
|
|
24
|
+
onSwipeLeft?: () => void;
|
|
25
|
+
leftSwipeTitle?: string;
|
|
26
|
+
leftSwipeIcon?: string;
|
|
27
|
+
leftSwipeIconSize?: number;
|
|
28
|
+
leftSwipeBackgroundColor?: string;
|
|
29
|
+
leftSwipeColor?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function extractRightSwipeProps(object: object): RightSwipeProps {
|
|
33
|
+
return pick(object, [
|
|
34
|
+
"onSwipeRight",
|
|
35
|
+
"rightSwipeTitle",
|
|
36
|
+
"rightSwipeIcon",
|
|
37
|
+
"rightSwipeIconSize",
|
|
38
|
+
"rightSwipeBackgroundColor",
|
|
39
|
+
"rightSwipeColor",
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function extractLeftSwipeProps(object: object): LeftSwipeProps {
|
|
44
|
+
return pick(object, [
|
|
45
|
+
"onSwipeLeft",
|
|
46
|
+
"leftSwipeTitle",
|
|
47
|
+
"leftSwipeIcon",
|
|
48
|
+
"leftSwipeIconSize",
|
|
49
|
+
"leftSwipeBackgroundColor",
|
|
50
|
+
"leftSwipeColor",
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function rightSwipeToSwipeableItemBehindItem(
|
|
55
|
+
swipe: RightSwipeProps
|
|
56
|
+
): Omit<SwipeableItemBehindItem, "onPress"> {
|
|
57
|
+
return {
|
|
58
|
+
title: swipe.rightSwipeTitle || "",
|
|
59
|
+
revealSwipeDirection: "right",
|
|
60
|
+
onSwipe: swipe.onSwipeRight,
|
|
61
|
+
icon: swipe.rightSwipeIcon,
|
|
62
|
+
iconSize: swipe.rightSwipeIconSize,
|
|
63
|
+
backgroundColor: swipe.rightSwipeBackgroundColor,
|
|
64
|
+
color: swipe.rightSwipeColor,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function leftSwipeToSwipeableItemBehindItem(
|
|
69
|
+
swipe: LeftSwipeProps
|
|
70
|
+
): Omit<SwipeableItemBehindItem, "onPress"> {
|
|
71
|
+
return {
|
|
72
|
+
title: swipe.leftSwipeTitle || "",
|
|
73
|
+
revealSwipeDirection: "left",
|
|
74
|
+
onSwipe: swipe.onSwipeLeft,
|
|
75
|
+
icon: swipe.leftSwipeIcon,
|
|
76
|
+
iconSize: swipe.leftSwipeIconSize,
|
|
77
|
+
backgroundColor: swipe.leftSwipeBackgroundColor,
|
|
78
|
+
color: swipe.leftSwipeColor,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FlashList } from "@shopify/flash-list";
|
|
3
|
+
import { FlatList } from "react-native";
|
|
4
|
+
export const SwipeableListContext = React.createContext({
|
|
5
|
+
onStartSwiping: () => { },
|
|
6
|
+
onStopSwiping: () => { },
|
|
7
|
+
});
|
|
8
|
+
const SwipeableList = ({ disableScrollWhenSwiping = true, listComponent = "FlatList", ...rest }) => {
|
|
9
|
+
const [isSwiping, setIsSwiping] = React.useState(false);
|
|
10
|
+
const onStartSwiping = () => {
|
|
11
|
+
setIsSwiping(true);
|
|
12
|
+
};
|
|
13
|
+
const onStopSwiping = () => {
|
|
14
|
+
setIsSwiping(false);
|
|
15
|
+
};
|
|
16
|
+
rest.scrollEnabled = disableScrollWhenSwiping ? !isSwiping : true;
|
|
17
|
+
const renderListComponent = () => {
|
|
18
|
+
switch (listComponent) {
|
|
19
|
+
case "FlatList":
|
|
20
|
+
return React.createElement(FlatList, { ...rest });
|
|
21
|
+
case "FlashList":
|
|
22
|
+
return React.createElement(FlashList, { ...rest });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return (React.createElement(SwipeableListContext.Provider, { value: { onStartSwiping, onStopSwiping } },
|
|
26
|
+
React.createElement(React.Fragment, null, renderListComponent())));
|
|
27
|
+
};
|
|
28
|
+
export default SwipeableList;
|
|
29
|
+
//# sourceMappingURL=SwipeableList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwipeableList.js","sourceRoot":"","sources":["SwipeableList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAkB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAC;AAoBvD,MAAM,CAAC,MAAM,oBAAoB,GAC/B,KAAK,CAAC,aAAa,CAA2B;IAC5C,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;IACxB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;CACxB,CAAC,CAAC;AAEL,MAAM,aAAa,GAAG,CAAmB,EACvC,wBAAwB,GAAG,IAAI,EAC/B,aAAa,GAAG,UAAU,EAC1B,GAAG,IAAI,EACwD,EAAE,EAAE;IACnE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,IAAI,CAAC,aAAa,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAElE,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC/B,QAAQ,aAAa,EAAE;YACrB,KAAK,UAAU;gBACb,OAAO,oBAAC,QAAQ,OAAM,IAAyB,GAAI,CAAC;YACtD,KAAK,WAAW;gBACd,OAAO,oBAAC,SAAS,OAAM,IAA0B,GAAI,CAAC;SACzD;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE;QACrE,0CAAG,mBAAmB,EAAE,CAAI,CACE,CACjC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|