Guest User

Untitled

a guest
Dec 13th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.07 KB | None | 0 0
  1. import React from 'react';
  2. import Interactable, { IDragEvent, INativeDragEvent } from 'react-native-interactable';
  3. import { StyleSheet, TouchableOpacity, View, FlatList, GestureResponderEvent } from 'react-native';
  4.  
  5. export type InteractableListItemRefType = React.Component<Interactable.IInteractableView, {}, any> | null | undefined;
  6.  
  7. export interface ICommonProps {
  8. onPress?: (event: GestureResponderEvent) => void | null,
  9. rightButtons: Array<React.ReactElement<any>>,
  10. leftButtons: Array<React.ReactElement<any>>,
  11. rightSideWidth: number | 100,
  12. leftSideWidth: number | 100,
  13. };
  14.  
  15. export interface IInteractableFlatListProps extends ICommonProps {
  16. renderItem: (item: any) => React.ReactElement<any>,
  17. keyExtractor: (item: any) => string,
  18. initialNumToRender?: number | 10,
  19. containerStyle?: object | {},
  20. inverted?: boolean | false,
  21. extraData?: object | {},
  22. data: Array<any>,
  23. };
  24.  
  25. export interface IInteractableListItemProps extends ICommonProps {
  26. onSwipeStart: (event: Interactable.INativeDragEvent, node: InteractableListItemRefType) => void,
  27. onSwipeStop: (event: Interactable.INativeDragEvent, node: InteractableListItemRefType) => void,
  28. };
  29.  
  30.  
  31. const styles = StyleSheet.create({
  32. container: {
  33. flex: 1
  34. },
  35. buttons: {
  36. position: 'absolute',
  37. flexDirection: 'row',
  38. height: 70
  39. }
  40. });
  41.  
  42. export default class InteractableRow extends React.Component<IInteractableListItemProps> {
  43.  
  44. private interactableRef: InteractableListItemRefType
  45. private setInteractableRef = (ref: InteractableListItemRefType) => {
  46. this.interactableRef = ref;
  47. }
  48.  
  49. private onDrag = (event: IDragEvent) => {
  50. const { onSwipeStart, onSwipeStop } = this.props;
  51. if (event.nativeEvent.state === 'start') {
  52. return onSwipeStart(event.nativeEvent, this.interactableRef);
  53. } else if (event.nativeEvent.state === 'end') {
  54. return onSwipeStop(event.nativeEvent, this.interactableRef);
  55. };
  56. }
  57.  
  58. recenter() {
  59. if (this.interactableRef) {
  60. const localInteractableRef = this.interactableRef as any;
  61. localInteractableRef.snapTo({ x: 0 });
  62. };
  63. }
  64.  
  65. render() {
  66. const {
  67. leftButtons,
  68. leftSideWidth,
  69. rightButtons,
  70. rightSideWidth,
  71. onPress,
  72. children
  73. } = this.props;
  74. const leftButtonStyle = {
  75. width: leftSideWidth,
  76. left: 0
  77. };
  78. const rightButtonStyle = {
  79. width: rightSideWidth,
  80. right: 0
  81. };
  82. const snapPoints = [
  83. { x: leftSideWidth },
  84. { x: 0 },
  85. { x: -rightSideWidth }
  86. ];
  87. const boundaries = {
  88. right: leftSideWidth,
  89. left: -rightSideWidth,
  90. bounce: 0
  91. };
  92. const leftButtonsCollection = leftButtons.map((button: React.ReactElement<any>) => React.cloneElement(button));
  93. const rightButtonsCollection = rightButtons.map((button: React.ReactElement<any>) => React.cloneElement(button));
  94. return (
  95. <TouchableOpacity
  96. style={styles.container}
  97. activeOpacity={0.7}
  98. onPress={onPress}
  99. >
  100. <View style={[styles.buttons, leftButtonStyle]}>
  101. {leftButtonsCollection}
  102. </View>
  103. <View style={[styles.buttons, rightButtonStyle]}>
  104. {rightButtonsCollection}
  105. </View>
  106. <Interactable.View
  107. ref={this.setInteractableRef}
  108. onDrag={this.onDrag}
  109. horizontalOnly={true}
  110. snapPoints={snapPoints}
  111. boundaries={boundaries}
  112. >
  113. {children}
  114. </Interactable.View>
  115. </TouchableOpacity>
  116. )
  117. }
  118. };
  119.  
  120. export default class InteractableFlatList extends React.Component<IInteractableFlatListProps> {
  121.  
  122. private interactableRowRef: InteractableListItemRefType
  123.  
  124. interactableRowRecenter = () => {
  125. if (this.interactableRowRef) {
  126. const localInteractableRowRef = this.interactableRowRef as any;
  127. localInteractableRowRef.recenter();
  128. };
  129. }
  130.  
  131. onSwipeStart = (event: INativeDragEvent, interactableRowRef: InteractableListItemRefType) => {
  132. if (this.interactableRowRef && this.interactableRowRef !== interactableRowRef) {
  133. this.interactableRowRecenter();
  134. };
  135. this.interactableRowRef = interactableRowRef;
  136. }
  137.  
  138. onSwipeStop = (event: INativeDragEvent, interactableRowRef: InteractableListItemRefType) => {
  139. // to do nothing
  140. }
  141.  
  142. onScrollBeginDrag = () => {
  143. if (this.interactableRowRef) {
  144. this.interactableRowRecenter();
  145. };
  146. }
  147.  
  148. renderItem(record: { item: object }) {
  149. const {
  150. leftSideWidth,
  151. rightSideWidth,
  152. leftButtons,
  153. rightButtons,
  154. renderItem,
  155. onPress,
  156. } = this.props;
  157. return (
  158. <InteractableRow
  159. leftButtons={leftButtons}
  160. rightButtons={rightButtons}
  161. leftSideWidth={leftSideWidth}
  162. rightSideWidth={rightSideWidth}
  163. onSwipeStart={this.onSwipeStart}
  164. onSwipeStop={this.onSwipeStop}
  165. onPress={onPress}
  166. >
  167. {renderItem(record.item)}
  168. </InteractableRow>
  169. )
  170. }
  171.  
  172. render() {
  173. const {
  174. initialNumToRender,
  175. containerStyle,
  176. keyExtractor,
  177. extraData,
  178. inverted,
  179. data,
  180. } = this.props;
  181. return (
  182. <FlatList
  183. style={[containerStyle]}
  184. keyExtractor={keyExtractor}
  185. onScrollBeginDrag={this.onScrollBeginDrag}
  186. initialNumToRender={initialNumToRender}
  187. renderItem={this.renderItem}
  188. extraData={extraData}
  189. inverted={inverted}
  190. data={data}
  191. />
  192. )
  193. }
  194. };
Add Comment
Please, Sign In to add comment