@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.
Files changed (59) hide show
  1. package/lib/src/components/SwipeableItem/SwipeableItem.d.ts +43 -0
  2. package/lib/src/components/SwipeableItem/SwipeableItem.js +114 -0
  3. package/lib/src/components/SwipeableItem/SwipeableItem.js.map +1 -0
  4. package/lib/src/components/SwipeableItem/SwipeableItemButton.d.ts +5 -0
  5. package/lib/src/components/SwipeableItem/SwipeableItemButton.js +6 -0
  6. package/lib/src/components/SwipeableItem/SwipeableItemButton.js.map +1 -0
  7. package/lib/src/components/SwipeableItem/SwipeableItemCommon.d.ts +30 -0
  8. package/lib/src/components/SwipeableItem/SwipeableItemCommon.js +44 -0
  9. package/lib/src/components/SwipeableItem/SwipeableItemCommon.js.map +1 -0
  10. package/lib/src/components/SwipeableItem/SwipeableList.d.ts +17 -0
  11. package/lib/src/components/SwipeableItem/SwipeableList.js +29 -0
  12. package/lib/src/components/SwipeableItem/SwipeableList.js.map +1 -0
  13. package/lib/src/components/SwipeableItem/index.d.ts +3 -0
  14. package/lib/src/components/SwipeableItem/index.js +4 -0
  15. package/lib/src/components/{SwipeableView → SwipeableItem}/index.js.map +1 -1
  16. package/lib/src/index.d.ts +1 -1
  17. package/lib/src/index.js +1 -1
  18. package/lib/src/index.js.map +1 -1
  19. package/lib/tsconfig.tsbuildinfo +1 -1
  20. package/package.json +3 -3
  21. package/src/components/SwipeableItem/SwipeableItem.js +114 -0
  22. package/src/components/SwipeableItem/SwipeableItem.js.map +1 -0
  23. package/src/components/{SwipeableView/SwipeableView.tsx → SwipeableItem/SwipeableItem.tsx} +100 -89
  24. package/src/components/SwipeableItem/SwipeableItemButton.js +6 -0
  25. package/src/components/SwipeableItem/SwipeableItemButton.js.map +1 -0
  26. package/src/components/SwipeableItem/SwipeableItemButton.tsx +11 -0
  27. package/src/components/SwipeableItem/SwipeableItemCommon.js +44 -0
  28. package/src/components/SwipeableItem/SwipeableItemCommon.js.map +1 -0
  29. package/src/components/SwipeableItem/SwipeableItemCommon.ts +80 -0
  30. package/src/components/SwipeableItem/SwipeableList.js +29 -0
  31. package/src/components/SwipeableItem/SwipeableList.js.map +1 -0
  32. package/src/components/SwipeableItem/SwipeableList.tsx +62 -0
  33. package/src/components/SwipeableItem/index.js +4 -0
  34. package/src/components/{SwipeableView → SwipeableItem}/index.js.map +1 -1
  35. package/src/components/SwipeableItem/index.tsx +3 -0
  36. package/src/index.js +1 -1
  37. package/src/index.js.map +1 -1
  38. package/src/index.tsx +4 -4
  39. package/lib/src/components/SwipeableView/SwipeableView.d.ts +0 -28
  40. package/lib/src/components/SwipeableView/SwipeableView.js +0 -119
  41. package/lib/src/components/SwipeableView/SwipeableView.js.map +0 -1
  42. package/lib/src/components/SwipeableView/SwipeableViewButton.d.ts +0 -12
  43. package/lib/src/components/SwipeableView/SwipeableViewButton.js +0 -6
  44. package/lib/src/components/SwipeableView/SwipeableViewButton.js.map +0 -1
  45. package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.d.ts +0 -12
  46. package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.js +0 -6
  47. package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.js.map +0 -1
  48. package/lib/src/components/SwipeableView/index.d.ts +0 -3
  49. package/lib/src/components/SwipeableView/index.js +0 -4
  50. package/src/components/SwipeableView/SwipeableView.js +0 -119
  51. package/src/components/SwipeableView/SwipeableView.js.map +0 -1
  52. package/src/components/SwipeableView/SwipeableViewButton.js +0 -6
  53. package/src/components/SwipeableView/SwipeableViewButton.js.map +0 -1
  54. package/src/components/SwipeableView/SwipeableViewButton.tsx +0 -18
  55. package/src/components/SwipeableView/SwipeableViewSwipeHandler.js +0 -6
  56. package/src/components/SwipeableView/SwipeableViewSwipeHandler.js.map +0 -1
  57. package/src/components/SwipeableView/SwipeableViewSwipeHandler.tsx +0 -20
  58. package/src/components/SwipeableView/index.js +0 -4
  59. 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.13",
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.13",
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": "6cc1db6c08bbb09546c4540c55c20be8ab46673b"
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 { SwipeableViewButtonProps } from "./SwipeableViewButton";
24
- import { SwipeableViewSwipeHandlerProps } from "./SwipeableViewSwipeHandler";
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 SwipeableViewProps extends IconSlot {
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
- const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
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 instanceOfSwipeableViewButtonProps = (
88
+ const instanceOfSwipeableItemButtonProps = (
64
89
  object: any
65
- ): object is SwipeableViewButtonProps => {
66
- return "title" in object && "side" in object && "onPress" in object;
90
+ ): object is SwipeableItemButtonProps => {
91
+ return "title" in object && "revealSwipeDirection" in object;
67
92
  };
68
93
 
69
- const instanceOfSwipeableViewSwipeHandlerProps = (
70
- object: any
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 leftButtons = React.useMemo(
127
+ const leftSwipeButtons = React.useMemo(
102
128
  () =>
103
129
  React.Children.toArray(children).filter(
104
130
  (child) =>
105
131
  React.isValidElement(child) &&
106
- instanceOfSwipeableViewButtonProps(child.props) &&
107
- child.props.side === "left"
108
- ) as React.ReactElement<SwipeableViewButtonProps>[],
132
+ instanceOfSwipeableItemButtonProps(child.props) &&
133
+ child.props.revealSwipeDirection === "left"
134
+ ) as React.ReactElement<SwipeableItemButtonProps>[],
109
135
  [children]
110
136
  );
111
137
 
112
- const rightButtons = React.useMemo(
138
+ const rightSwipeButtons = React.useMemo(
113
139
  () =>
114
140
  React.Children.toArray(children).filter(
115
141
  (child) =>
116
142
  React.isValidElement(child) &&
117
- instanceOfSwipeableViewButtonProps(child.props) &&
118
- child.props.side === "right"
119
- ) as React.ReactElement<SwipeableViewButtonProps>[],
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
- !instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
151
- !instanceOfSwipeableViewButtonProps(child.props)
154
+ !instanceOfSwipeableItemButtonProps(child.props)
152
155
  ),
153
156
  [children]
154
157
  );
155
158
 
156
- if (leftButtons.length > 2 || rightButtons.length > 2) {
157
- throw Error("Cannot have more than 2 buttons per side");
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 (leftSwipeHandlers.length > 1 || rightSwipeHandlers.length > 1) {
161
- throw Error("Cannot have more than 1 swiper handler per side");
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
- (leftButtons.length && leftSwipeHandlers.length) ||
166
- (rightButtons.length && rightSwipeHandlers.length)
170
+ (leftSwipeButtons.length && isLeftSwipeHandled) ||
171
+ (rightSwipeButtons.length && isRightSwipeHandled)
167
172
  ) {
168
- throw Error("Cannot combine swiper handler and buttons on the same side");
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 button/item. Used for both buttons and swipe handler
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={(props as any).onPress}
182
+ onPress={(item as any).onPress}
179
183
  style={[
180
184
  styles.buttonContainer,
181
- { backgroundColor: props.backgroundColor || theme.colors.primary },
185
+ { backgroundColor: item.backgroundColor || theme.colors.primary },
182
186
  ]}
183
187
  >
184
- {props.icon && (
188
+ {item.icon && (
185
189
  <Icon
186
- name={props.icon}
187
- size={props.iconSize || 25}
188
- color={props.color || theme.colors.surface}
190
+ name={item.icon}
191
+ size={item.iconSize || 25}
192
+ color={item.color || theme.colors.surface}
189
193
  />
190
194
  )}
191
- <Text
192
- style={[textStyles, { color: props.color || theme.colors.surface }]}
193
- >
194
- {props.title}
195
- </Text>
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
- isLeftSwipeHandler ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
218
+ isRightSwipeHandled ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
216
219
  }
217
220
  rightOpenValue={
218
- isRightSwipeHandler ? 0 : rightOpenValue || defaultRightOpenValue
221
+ isLeftSwipeHandled ? 0 : rightOpenValue || defaultRightOpenValue
219
222
  }
220
223
  leftActivationValue={
221
- leftActivationValue || isLeftSwipeHandler
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 || isRightSwipeHandler
229
+ rightActivationValue || isLeftSwipeHandled
227
230
  ? defaultRightOpenValue * (swipeActivationPercentage / 100)
228
231
  : defaultRightOpenValue
229
232
  }
230
- stopLeftSwipe={stopLeftSwipe || defaultLeftOpenValue}
231
- stopRightSwipe={stopRightSwipe || defaultRightOpenValue}
233
+ stopLeftSwipe={stopRightSwipe || defaultLeftOpenValue}
234
+ stopRightSwipe={stopLeftSwipe || defaultRightOpenValue}
232
235
  onLeftAction={
233
- isLeftSwipeHandler
234
- ? () => leftSwipeHandlers[0].props.onSwipe?.()
235
- : undefined
236
+ isRightSwipeHandled ? () => rightSwipe.onSwipedRight?.() : undefined
236
237
  }
237
238
  onRightAction={
238
- isRightSwipeHandler
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
- {(isLeftSwipeHandler ? leftSwipeHandlers : leftButtons).map(
249
- (item, index) => renderBehindItem(item.props, index)
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
- {(isRightSwipeHandler ? rightSwipeHandlers : rightButtons).map(
254
- (item, index) => renderBehindItem(item.props, index)
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(SwipeableView);
312
+ export default withTheme(SwipeableItem);
@@ -0,0 +1,6 @@
1
+ //Renders nothing, acts as a wrapper be used by SwipeableView
2
+ const SwipeableItemButton = () => {
3
+ return null;
4
+ };
5
+ export default SwipeableItemButton;
6
+ //# sourceMappingURL=SwipeableItemButton.js.map
@@ -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"}