@draftbit/core 47.2.13 → 47.2.14-41b571.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 (56) hide show
  1. package/lib/src/components/{SwipeableView/SwipeableView.d.ts → SwipeableItem/SwipeableItem.d.ts} +5 -3
  2. package/{src/components/SwipeableView/SwipeableView.js → lib/src/components/SwipeableItem/SwipeableItem.js} +36 -41
  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/{lib/src/components/SwipeableView/SwipeableView.js → src/components/SwipeableItem/SwipeableItem.js} +36 -41
  22. package/src/components/SwipeableItem/SwipeableItem.js.map +1 -0
  23. package/src/components/{SwipeableView/SwipeableView.tsx → SwipeableItem/SwipeableItem.tsx} +75 -82
  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.js.map +0 -1
  40. package/lib/src/components/SwipeableView/SwipeableViewButton.d.ts +0 -12
  41. package/lib/src/components/SwipeableView/SwipeableViewButton.js +0 -6
  42. package/lib/src/components/SwipeableView/SwipeableViewButton.js.map +0 -1
  43. package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.d.ts +0 -12
  44. package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.js +0 -6
  45. package/lib/src/components/SwipeableView/SwipeableViewSwipeHandler.js.map +0 -1
  46. package/lib/src/components/SwipeableView/index.d.ts +0 -3
  47. package/lib/src/components/SwipeableView/index.js +0 -4
  48. package/src/components/SwipeableView/SwipeableView.js.map +0 -1
  49. package/src/components/SwipeableView/SwipeableViewButton.js +0 -6
  50. package/src/components/SwipeableView/SwipeableViewButton.js.map +0 -1
  51. package/src/components/SwipeableView/SwipeableViewButton.tsx +0 -18
  52. package/src/components/SwipeableView/SwipeableViewSwipeHandler.js +0 -6
  53. package/src/components/SwipeableView/SwipeableViewSwipeHandler.js.map +0 -1
  54. package/src/components/SwipeableView/SwipeableViewSwipeHandler.tsx +0 -20
  55. package/src/components/SwipeableView/index.js +0 -4
  56. 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-41b571.2+41b571b",
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-41b571.2+41b571b",
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": "41b571bd00c60e1c6ad2634cb069cdba1b3e2d5f"
81
81
  }
@@ -4,13 +4,16 @@ import Pressable from "../Pressable";
4
4
  import { extractBorderAndMarginStyles, extractEffectStyles, extractFlexItemStyles, extractPositionStyles, extractSizeStyles, extractStyles, } from "../../utilities";
5
5
  import { SwipeRow } from "react-native-swipe-list-view";
6
6
  import { withTheme } from "../../theming";
7
- const SwipeableView = ({ theme, style, children, Icon, closeOnPress, leftOpenValue, rightOpenValue, leftActivationValue, rightActivationValue, swipeActivationPercentage = 80, stopLeftSwipe, stopRightSwipe, friction = 20, ...rest }) => {
8
- const instanceOfSwipeableViewButtonProps = (object) => {
9
- return "title" in object && "side" in object && "onPress" in object;
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 && "side" in object;
10
12
  };
11
- const instanceOfSwipeableViewSwipeHandlerProps = (object) => {
12
- return "title" in object && "side" in object && "onSwipe" in object;
13
+ const isEmptyObject = (object) => {
14
+ return Object.keys(object).length === 0;
13
15
  };
16
+ const { onStartSwiping, onStopSwiping } = React.useContext(SwipeableListContext);
14
17
  const { viewStyles, textStyles } = extractStyles(style);
15
18
  const { borderStyles, marginStyles } = extractBorderAndMarginStyles(viewStyles);
16
19
  const sizeStyles = extractSizeStyles(viewStyles);
@@ -30,57 +33,49 @@ const SwipeableView = ({ theme, style, children, Icon, closeOnPress, leftOpenVal
30
33
  ]);
31
34
  const [componentWidth, setComponentWidth] = React.useState(null);
32
35
  const leftButtons = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
33
- instanceOfSwipeableViewButtonProps(child.props) &&
36
+ instanceOfSwipeableItemButtonProps(child.props) &&
34
37
  child.props.side === "left"), [children]);
35
38
  const rightButtons = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
36
- instanceOfSwipeableViewButtonProps(child.props) &&
37
- child.props.side === "right"), [children]);
38
- const leftSwipeHandlers = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
39
- instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
40
- child.props.side === "left"), [children]);
41
- const rightSwipeHandlers = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
42
- instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
39
+ instanceOfSwipeableItemButtonProps(child.props) &&
43
40
  child.props.side === "right"), [children]);
44
41
  const remainingChildren = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child) &&
45
- !instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
46
- !instanceOfSwipeableViewButtonProps(child.props)), [children]);
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
47
  if (leftButtons.length > 2 || rightButtons.length > 2) {
48
- throw Error("Cannot have more than 2 buttons per side");
49
- }
50
- if (leftSwipeHandlers.length > 1 || rightSwipeHandlers.length > 1) {
51
- throw Error("Cannot have more than 1 swiper handler per side");
48
+ throw Error("Cannot have more than 2 SwipeableItemButton(s) per side");
52
49
  }
53
- if ((leftButtons.length && leftSwipeHandlers.length) ||
54
- (rightButtons.length && rightSwipeHandlers.length)) {
55
- throw Error("Cannot combine swiper handler and buttons on the same side");
50
+ if ((leftButtons.length && isLeftSwipeHandled) ||
51
+ (rightButtons.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).");
56
53
  }
57
- //Renders a single button/item. Used for both buttons and swipe handler
58
- const renderBehindItem = (props, index) => (React.createElement(Pressable, { key: index.toString(), onPress: props.onPress, style: [
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: [
59
56
  styles.buttonContainer,
60
- { backgroundColor: props.backgroundColor || theme.colors.primary },
57
+ { backgroundColor: item.backgroundColor || theme.colors.primary },
61
58
  ] },
62
- props.icon && (React.createElement(Icon, { name: props.icon, size: props.iconSize || 25, color: props.color || theme.colors.surface })),
63
- React.createElement(Text, { style: [textStyles, { color: props.color || theme.colors.surface }] }, props.title)));
64
- const isLeftSwipeHandler = !!leftSwipeHandlers.length;
65
- const isRightSwipeHandler = !!rightSwipeHandlers.length;
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)));
66
61
  const defaultLeftOpenValue = componentWidth ? componentWidth / 2 : 0;
67
62
  const defaultRightOpenValue = componentWidth ? -componentWidth / 2 : 0;
68
63
  return (React.createElement(View, { onLayout: (event) => {
69
64
  setComponentWidth(event.nativeEvent.layout.width);
70
65
  }, style: [styles.parentContainer, parentContainerStyles] },
71
- React.createElement(SwipeRow, { leftOpenValue: isLeftSwipeHandler ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
72
- , rightOpenValue: isRightSwipeHandler ? 0 : rightOpenValue || defaultRightOpenValue, leftActivationValue: leftActivationValue || isLeftSwipeHandler
66
+ React.createElement(SwipeRow, { leftOpenValue: isLeftSwipeHandled ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
67
+ , rightOpenValue: isRightSwipeHandled ? 0 : rightOpenValue || defaultRightOpenValue, leftActivationValue: leftActivationValue || isLeftSwipeHandled
73
68
  ? defaultLeftOpenValue * (swipeActivationPercentage / 100) //When swipe passes activation percentage then it should be considered activated (call onSwipe)
74
- : defaultLeftOpenValue, rightActivationValue: rightActivationValue || isRightSwipeHandler
69
+ : defaultLeftOpenValue, rightActivationValue: rightActivationValue || isRightSwipeHandled
75
70
  ? defaultRightOpenValue * (swipeActivationPercentage / 100)
76
- : defaultRightOpenValue, stopLeftSwipe: stopLeftSwipe || defaultLeftOpenValue, stopRightSwipe: stopRightSwipe || defaultRightOpenValue, onLeftAction: isLeftSwipeHandler
77
- ? () => { var _a, _b; return (_b = (_a = leftSwipeHandlers[0].props).onSwipe) === null || _b === void 0 ? void 0 : _b.call(_a); }
78
- : undefined, onRightAction: isRightSwipeHandler
79
- ? () => { var _a, _b; return (_b = (_a = rightSwipeHandlers[0].props).onSwipe) === null || _b === void 0 ? void 0 : _b.call(_a); }
80
- : undefined, closeOnRowPress: closeOnPress, friction: friction, ...rest },
71
+ : defaultRightOpenValue, stopLeftSwipe: stopLeftSwipe || defaultLeftOpenValue, stopRightSwipe: stopRightSwipe || defaultRightOpenValue, onLeftAction: isLeftSwipeHandled ? () => { var _a; return (_a = leftSwipe.onLeftSwipe) === null || _a === void 0 ? void 0 : _a.call(leftSwipe); } : undefined, onRightAction: isRightSwipeHandled ? () => { var _a; return (_a = rightSwipe.onRightSwipe) === null || _a === void 0 ? void 0 : _a.call(rightSwipe); } : undefined, swipeGestureBegan: onStartSwiping, swipeGestureEnded: onStopSwiping, closeOnRowPress: closeOnPress, friction: friction, ...rest },
81
72
  React.createElement(View, { style: styles.behindContainer },
82
- React.createElement(View, { style: styles.behindContainerItem }, (isLeftSwipeHandler ? leftSwipeHandlers : leftButtons).map((item, index) => renderBehindItem(item.props, index))),
83
- React.createElement(View, { style: styles.behindContainerItem }, (isRightSwipeHandler ? rightSwipeHandlers : rightButtons).map((item, index) => renderBehindItem(item.props, index)))),
73
+ React.createElement(View, { style: styles.behindContainerItem }, isLeftSwipeHandled
74
+ ? renderBehindItem(leftSwipeToSwipeableItemBehindItem(leftSwipe), 0)
75
+ : leftButtons.map((item, index) => renderBehindItem(item.props, index))),
76
+ React.createElement(View, { style: styles.behindContainerItem }, isRightSwipeHandled
77
+ ? renderBehindItem(rightSwipeToSwipeableItemBehindItem(rightSwipe), 0)
78
+ : rightButtons.map((item, index) => renderBehindItem(item.props, index)))),
84
79
  React.createElement(View, { style: [
85
80
  styles.surfaceContainer,
86
81
  {
@@ -115,5 +110,5 @@ const styles = StyleSheet.create({
115
110
  overflow: "hidden",
116
111
  },
117
112
  });
118
- export default withTheme(SwipeableView);
119
- //# sourceMappingURL=SwipeableView.js.map
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,19 @@ 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";
25
34
 
26
- export interface SwipeableViewProps extends IconSlot {
35
+ export interface SwipeableItemProps extends IconSlot {
27
36
  closeOnPress?: boolean;
28
37
  leftOpenValue?: number;
29
38
  rightOpenValue?: number;
@@ -44,7 +53,9 @@ export interface SwipeableViewProps extends IconSlot {
44
53
  theme: Theme;
45
54
  }
46
55
 
47
- const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
56
+ type Props = SwipeableItemProps & RightSwipeProps & LeftSwipeProps;
57
+
58
+ const SwipeableItem: React.FC<React.PropsWithChildren<Props>> = ({
48
59
  theme,
49
60
  style,
50
61
  children,
@@ -60,18 +71,19 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
60
71
  friction = 20,
61
72
  ...rest
62
73
  }) => {
63
- const instanceOfSwipeableViewButtonProps = (
74
+ const instanceOfSwipeableItemButtonProps = (
64
75
  object: any
65
- ): object is SwipeableViewButtonProps => {
66
- return "title" in object && "side" in object && "onPress" in object;
76
+ ): object is SwipeableItemButtonProps => {
77
+ return "title" in object && "side" in object;
67
78
  };
68
79
 
69
- const instanceOfSwipeableViewSwipeHandlerProps = (
70
- object: any
71
- ): object is SwipeableViewSwipeHandlerProps => {
72
- return "title" in object && "side" in object && "onSwipe" in object;
80
+ const isEmptyObject = (object: object) => {
81
+ return Object.keys(object).length === 0;
73
82
  };
74
83
 
84
+ const { onStartSwiping, onStopSwiping } =
85
+ React.useContext(SwipeableListContext);
86
+
75
87
  const { viewStyles, textStyles } = extractStyles(style);
76
88
 
77
89
  const { borderStyles, marginStyles } =
@@ -103,9 +115,9 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
103
115
  React.Children.toArray(children).filter(
104
116
  (child) =>
105
117
  React.isValidElement(child) &&
106
- instanceOfSwipeableViewButtonProps(child.props) &&
118
+ instanceOfSwipeableItemButtonProps(child.props) &&
107
119
  child.props.side === "left"
108
- ) as React.ReactElement<SwipeableViewButtonProps>[],
120
+ ) as React.ReactElement<SwipeableItemButtonProps>[],
109
121
  [children]
110
122
  );
111
123
 
@@ -114,31 +126,9 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
114
126
  React.Children.toArray(children).filter(
115
127
  (child) =>
116
128
  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) &&
129
+ instanceOfSwipeableItemButtonProps(child.props) &&
140
130
  child.props.side === "right"
141
- ) as React.ReactElement<SwipeableViewSwipeHandlerProps>[],
131
+ ) as React.ReactElement<SwipeableItemButtonProps>[],
142
132
  [children]
143
133
  );
144
134
 
@@ -147,58 +137,53 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
147
137
  React.Children.toArray(children).filter(
148
138
  (child) =>
149
139
  React.isValidElement(child) &&
150
- !instanceOfSwipeableViewSwipeHandlerProps(child.props) &&
151
- !instanceOfSwipeableViewButtonProps(child.props)
140
+ !instanceOfSwipeableItemButtonProps(child.props)
152
141
  ),
153
142
  [children]
154
143
  );
155
144
 
156
- if (leftButtons.length > 2 || rightButtons.length > 2) {
157
- throw Error("Cannot have more than 2 buttons per side");
158
- }
145
+ const leftSwipe = extractLeftSwipeProps(rest);
146
+ const rightSwipe = extractRightSwipeProps(rest);
147
+
148
+ const isLeftSwipeHandled = !isEmptyObject(leftSwipe);
149
+ const isRightSwipeHandled = !isEmptyObject(rightSwipe);
159
150
 
160
- if (leftSwipeHandlers.length > 1 || rightSwipeHandlers.length > 1) {
161
- throw Error("Cannot have more than 1 swiper handler per side");
151
+ if (leftButtons.length > 2 || rightButtons.length > 2) {
152
+ throw Error("Cannot have more than 2 SwipeableItemButton(s) per side");
162
153
  }
163
154
 
164
155
  if (
165
- (leftButtons.length && leftSwipeHandlers.length) ||
166
- (rightButtons.length && rightSwipeHandlers.length)
156
+ (leftButtons.length && isLeftSwipeHandled) ||
157
+ (rightButtons.length && isRightSwipeHandled)
167
158
  ) {
168
- throw Error("Cannot combine swiper handler and buttons on the same side");
159
+ throw Error(
160
+ "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)."
161
+ );
169
162
  }
170
163
 
171
- //Renders a single button/item. Used for both buttons and swipe handler
172
- const renderBehindItem = (
173
- props: SwipeableViewSwipeHandlerProps | SwipeableViewButtonProps,
174
- index: number
175
- ) => (
164
+ //Renders a single 'behind' item. Used for both buttons and swipe handler
165
+ const renderBehindItem = (item: SwipeableItemBehindItem, index: number) => (
176
166
  <Pressable
177
167
  key={index.toString()}
178
- onPress={(props as any).onPress}
168
+ onPress={(item as any).onPress}
179
169
  style={[
180
170
  styles.buttonContainer,
181
- { backgroundColor: props.backgroundColor || theme.colors.primary },
171
+ { backgroundColor: item.backgroundColor || theme.colors.primary },
182
172
  ]}
183
173
  >
184
- {props.icon && (
174
+ {item.icon && (
185
175
  <Icon
186
- name={props.icon}
187
- size={props.iconSize || 25}
188
- color={props.color || theme.colors.surface}
176
+ name={item.icon}
177
+ size={item.iconSize || 25}
178
+ color={item.color || theme.colors.surface}
189
179
  />
190
180
  )}
191
- <Text
192
- style={[textStyles, { color: props.color || theme.colors.surface }]}
193
- >
194
- {props.title}
181
+ <Text style={[textStyles, { color: item.color || theme.colors.surface }]}>
182
+ {item.title}
195
183
  </Text>
196
184
  </Pressable>
197
185
  );
198
186
 
199
- const isLeftSwipeHandler = !!leftSwipeHandlers.length;
200
- const isRightSwipeHandler = !!rightSwipeHandlers.length;
201
-
202
187
  const defaultLeftOpenValue = componentWidth ? componentWidth / 2 : 0;
203
188
  const defaultRightOpenValue = componentWidth ? -componentWidth / 2 : 0;
204
189
 
@@ -212,47 +197,55 @@ const SwipeableView: React.FC<React.PropsWithChildren<SwipeableViewProps>> = ({
212
197
  {/*@ts-ignore*/}
213
198
  <SwipeRow
214
199
  leftOpenValue={
215
- isLeftSwipeHandler ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
200
+ isLeftSwipeHandled ? 0 : leftOpenValue || defaultLeftOpenValue //If in swiping mode, don't keep open
216
201
  }
217
202
  rightOpenValue={
218
- isRightSwipeHandler ? 0 : rightOpenValue || defaultRightOpenValue
203
+ isRightSwipeHandled ? 0 : rightOpenValue || defaultRightOpenValue
219
204
  }
220
205
  leftActivationValue={
221
- leftActivationValue || isLeftSwipeHandler
206
+ leftActivationValue || isLeftSwipeHandled
222
207
  ? defaultLeftOpenValue * (swipeActivationPercentage / 100) //When swipe passes activation percentage then it should be considered activated (call onSwipe)
223
208
  : defaultLeftOpenValue
224
209
  }
225
210
  rightActivationValue={
226
- rightActivationValue || isRightSwipeHandler
211
+ rightActivationValue || isRightSwipeHandled
227
212
  ? defaultRightOpenValue * (swipeActivationPercentage / 100)
228
213
  : defaultRightOpenValue
229
214
  }
230
215
  stopLeftSwipe={stopLeftSwipe || defaultLeftOpenValue}
231
216
  stopRightSwipe={stopRightSwipe || defaultRightOpenValue}
232
217
  onLeftAction={
233
- isLeftSwipeHandler
234
- ? () => leftSwipeHandlers[0].props.onSwipe?.()
235
- : undefined
218
+ isLeftSwipeHandled ? () => leftSwipe.onLeftSwipe?.() : undefined
236
219
  }
237
220
  onRightAction={
238
- isRightSwipeHandler
239
- ? () => rightSwipeHandlers[0].props.onSwipe?.()
240
- : undefined
221
+ isRightSwipeHandled ? () => rightSwipe.onRightSwipe?.() : undefined
241
222
  }
223
+ swipeGestureBegan={onStartSwiping}
224
+ swipeGestureEnded={onStopSwiping}
242
225
  closeOnRowPress={closeOnPress}
243
226
  friction={friction}
244
227
  {...rest}
245
228
  >
246
229
  <View style={styles.behindContainer}>
247
230
  <View style={styles.behindContainerItem}>
248
- {(isLeftSwipeHandler ? leftSwipeHandlers : leftButtons).map(
249
- (item, index) => renderBehindItem(item.props, index)
250
- )}
231
+ {isLeftSwipeHandled
232
+ ? renderBehindItem(
233
+ leftSwipeToSwipeableItemBehindItem(leftSwipe),
234
+ 0
235
+ )
236
+ : leftButtons.map((item, index) =>
237
+ renderBehindItem(item.props, index)
238
+ )}
251
239
  </View>
252
240
  <View style={styles.behindContainerItem}>
253
- {(isRightSwipeHandler ? rightSwipeHandlers : rightButtons).map(
254
- (item, index) => renderBehindItem(item.props, index)
255
- )}
241
+ {isRightSwipeHandled
242
+ ? renderBehindItem(
243
+ rightSwipeToSwipeableItemBehindItem(rightSwipe),
244
+ 0
245
+ )
246
+ : rightButtons.map((item, index) =>
247
+ renderBehindItem(item.props, index)
248
+ )}
256
249
  </View>
257
250
  </View>
258
251
  <View
@@ -298,4 +291,4 @@ const styles = StyleSheet.create({
298
291
  },
299
292
  });
300
293
 
301
- export default withTheme(SwipeableView);
294
+ 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
+ "onRightSwipe",
5
+ "rightSwipeTitle",
6
+ "rightSwipeIcon",
7
+ "rightSwipeIconSize",
8
+ "rightSwipeBackgroundColor",
9
+ "rightSwipeColor",
10
+ ]);
11
+ }
12
+ export function extractLeftSwipeProps(object) {
13
+ return pick(object, [
14
+ "onLeftSwipe",
15
+ "leftSwipeTitle",
16
+ "leftSwipeIcon",
17
+ "leftSwipeIconSize",
18
+ "leftSwipeBackgroundColor",
19
+ "leftSwipeColor",
20
+ ]);
21
+ }
22
+ export function rightSwipeToSwipeableItemBehindItem(swipe) {
23
+ return {
24
+ title: swipe.rightSwipeTitle || "",
25
+ side: "right",
26
+ onSwipe: swipe.onRightSwipe,
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
+ side: "left",
37
+ onSwipe: swipe.onLeftSwipe,
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,IAAI,EAAE,OAAO;QACb,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,IAAI,EAAE,MAAM;QACZ,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
+ side: "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
+ onRightSwipe?: () => void;
16
+ rightSwipeTitle?: string;
17
+ rightSwipeIcon?: string;
18
+ rightSwipeIconSize?: number;
19
+ rightSwipeBackgroundColor?: string;
20
+ rightSwipeColor?: string;
21
+ }
22
+
23
+ export interface LeftSwipeProps {
24
+ onLeftSwipe?: () => 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
+ "onRightSwipe",
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
+ "onLeftSwipe",
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
+ side: "right",
60
+ onSwipe: swipe.onRightSwipe,
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
+ side: "left",
74
+ onSwipe: swipe.onLeftSwipe,
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"}