@draftbit/core 47.2.13 → 47.2.14-5888e0.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} +100 -89
- 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-5888e0.2+5888e0c",
|
|
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-5888e0.2+5888e0c",
|
|
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": "5888e0c8318382a4d4cce263f420f2da5e6ae7fe"
|
|
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 swipe direction 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
|
+
item.title && (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.onSwipedRight) === null || _a === void 0 ? void 0 : _a.call(rightSwipe); } : undefined, onRightAction: isLeftSwipeHandled ? () => { var _a; return (_a = leftSwipe.onSwipedLeft) === 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":"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"}
|
|
@@ -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
|
|
127
|
+
const leftSwipeButtons = React.useMemo(
|
|
102
128
|
() =>
|
|
103
129
|
React.Children.toArray(children).filter(
|
|
104
130
|
(child) =>
|
|
105
131
|
React.isValidElement(child) &&
|
|
106
|
-
|
|
107
|
-
child.props.
|
|
108
|
-
) as React.ReactElement<
|
|
132
|
+
instanceOfSwipeableItemButtonProps(child.props) &&
|
|
133
|
+
child.props.revealSwipeDirection === "left"
|
|
134
|
+
) as React.ReactElement<SwipeableItemButtonProps>[],
|
|
109
135
|
[children]
|
|
110
136
|
);
|
|
111
137
|
|
|
112
|
-
const
|
|
138
|
+
const rightSwipeButtons = React.useMemo(
|
|
113
139
|
() =>
|
|
114
140
|
React.Children.toArray(children).filter(
|
|
115
141
|
(child) =>
|
|
116
142
|
React.isValidElement(child) &&
|
|
117
|
-
|
|
118
|
-
child.props.
|
|
119
|
-
) as React.ReactElement<
|
|
120
|
-
[children]
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
const leftSwipeHandlers = React.useMemo(
|
|
124
|
-
() =>
|
|
125
|
-
React.Children.toArray(children).filter(
|
|
126
|
-
(child) =>
|
|
127
|
-
React.isValidElement(child) &&
|
|
128
|
-
instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
|
|
129
|
-
child.props.side === "left"
|
|
130
|
-
) as React.ReactElement<SwipeableViewSwipeHandlerProps>[],
|
|
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,57 @@ 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 swipe direction 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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
{item.title && (
|
|
196
|
+
<Text
|
|
197
|
+
style={[textStyles, { color: item.color || theme.colors.surface }]}
|
|
198
|
+
>
|
|
199
|
+
{item.title}
|
|
200
|
+
</Text>
|
|
201
|
+
)}
|
|
196
202
|
</Pressable>
|
|
197
203
|
);
|
|
198
204
|
|
|
199
|
-
const isLeftSwipeHandler = !!leftSwipeHandlers.length;
|
|
200
|
-
const isRightSwipeHandler = !!rightSwipeHandlers.length;
|
|
201
|
-
|
|
202
205
|
const defaultLeftOpenValue = componentWidth ? componentWidth / 2 : 0;
|
|
203
206
|
const defaultRightOpenValue = componentWidth ? -componentWidth / 2 : 0;
|
|
204
207
|
|
|
@@ -212,47 +215,55 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
|
|
|
212
215
|
{/*@ts-ignore*/}
|
|
213
216
|
<SwipeRow
|
|
214
217
|
leftOpenValue={
|
|
215
|
-
|
|
218
|
+
isRightSwipeHandled ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
|
|
216
219
|
}
|
|
217
220
|
rightOpenValue={
|
|
218
|
-
|
|
221
|
+
isLeftSwipeHandled ? 0 : rightOpenValue || defaultRightOpenValue
|
|
219
222
|
}
|
|
220
223
|
leftActivationValue={
|
|
221
|
-
leftActivationValue ||
|
|
224
|
+
leftActivationValue || isRightSwipeHandled
|
|
222
225
|
? defaultLeftOpenValue * (swipeActivationPercentage / 100) //When swipe passes activation percentage then it should be considered activated (call onSwipe)
|
|
223
226
|
: defaultLeftOpenValue
|
|
224
227
|
}
|
|
225
228
|
rightActivationValue={
|
|
226
|
-
rightActivationValue ||
|
|
229
|
+
rightActivationValue || isLeftSwipeHandled
|
|
227
230
|
? defaultRightOpenValue * (swipeActivationPercentage / 100)
|
|
228
231
|
: defaultRightOpenValue
|
|
229
232
|
}
|
|
230
|
-
stopLeftSwipe={
|
|
231
|
-
stopRightSwipe={
|
|
233
|
+
stopLeftSwipe={stopRightSwipe || defaultLeftOpenValue}
|
|
234
|
+
stopRightSwipe={stopLeftSwipe || defaultRightOpenValue}
|
|
232
235
|
onLeftAction={
|
|
233
|
-
|
|
234
|
-
? () => leftSwipeHandlers[0].props.onSwipe?.()
|
|
235
|
-
: undefined
|
|
236
|
+
isRightSwipeHandled ? () => rightSwipe.onSwipedRight?.() : undefined
|
|
236
237
|
}
|
|
237
238
|
onRightAction={
|
|
238
|
-
|
|
239
|
-
? () => rightSwipeHandlers[0].props.onSwipe?.()
|
|
240
|
-
: undefined
|
|
239
|
+
isLeftSwipeHandled ? () => leftSwipe.onSwipedLeft?.() : undefined
|
|
241
240
|
}
|
|
241
|
+
swipeGestureBegan={onStartSwiping}
|
|
242
|
+
swipeGestureEnded={onStopSwiping}
|
|
242
243
|
closeOnRowPress={closeOnPress}
|
|
243
244
|
friction={friction}
|
|
244
245
|
{...rest}
|
|
245
246
|
>
|
|
246
247
|
<View style={styles.behindContainer}>
|
|
247
248
|
<View style={styles.behindContainerItem}>
|
|
248
|
-
{
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
{isRightSwipeHandled
|
|
250
|
+
? renderBehindItem(
|
|
251
|
+
rightSwipeToSwipeableItemBehindItem(rightSwipe),
|
|
252
|
+
0
|
|
253
|
+
)
|
|
254
|
+
: rightSwipeButtons.map((item, index) =>
|
|
255
|
+
renderBehindItem(item.props, index)
|
|
256
|
+
)}
|
|
251
257
|
</View>
|
|
252
258
|
<View style={styles.behindContainerItem}>
|
|
253
|
-
{
|
|
254
|
-
|
|
255
|
-
|
|
259
|
+
{isLeftSwipeHandled
|
|
260
|
+
? renderBehindItem(
|
|
261
|
+
leftSwipeToSwipeableItemBehindItem(leftSwipe),
|
|
262
|
+
0
|
|
263
|
+
)
|
|
264
|
+
: leftSwipeButtons.map((item, index) =>
|
|
265
|
+
renderBehindItem(item.props, index)
|
|
266
|
+
)}
|
|
256
267
|
</View>
|
|
257
268
|
</View>
|
|
258
269
|
<View
|
|
@@ -298,4 +309,4 @@ const styles = StyleSheet.create({
|
|
|
298
309
|
},
|
|
299
310
|
});
|
|
300
311
|
|
|
301
|
-
export default withTheme(
|
|
312
|
+
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
|
+
"onSwipedRight",
|
|
5
|
+
"rightSwipeTitle",
|
|
6
|
+
"rightSwipeIcon",
|
|
7
|
+
"rightSwipeIconSize",
|
|
8
|
+
"rightSwipeBackgroundColor",
|
|
9
|
+
"rightSwipeColor",
|
|
10
|
+
]);
|
|
11
|
+
}
|
|
12
|
+
export function extractLeftSwipeProps(object) {
|
|
13
|
+
return pick(object, [
|
|
14
|
+
"onSwipedLeft",
|
|
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.onSwipedRight,
|
|
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.onSwipedLeft,
|
|
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,eAAe;QACf,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,cAAc;QACd,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,aAAa;QAC5B,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,YAAY;QAC3B,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
|
+
onSwipedRight?: () => void;
|
|
16
|
+
rightSwipeTitle?: string;
|
|
17
|
+
rightSwipeIcon?: string;
|
|
18
|
+
rightSwipeIconSize?: number;
|
|
19
|
+
rightSwipeBackgroundColor?: string;
|
|
20
|
+
rightSwipeColor?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface LeftSwipeProps {
|
|
24
|
+
onSwipedLeft?: () => 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
|
+
"onSwipedRight",
|
|
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
|
+
"onSwipedLeft",
|
|
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.onSwipedRight,
|
|
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.onSwipedLeft,
|
|
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"}
|