@plusscommunities/pluss-core-app 1.4.9 → 1.5.0

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 (183) hide show
  1. package/dist/module/actions/FollowerActions.js +34 -0
  2. package/dist/module/actions/FollowerActions.js.map +1 -0
  3. package/dist/module/actions/MediaActions.js +20 -0
  4. package/dist/module/actions/MediaActions.js.map +1 -0
  5. package/dist/module/actions/ResidentActions.js +26 -0
  6. package/dist/module/actions/ResidentActions.js.map +1 -0
  7. package/dist/module/actions/UserActions.js +214 -0
  8. package/dist/module/actions/UserActions.js.map +1 -0
  9. package/dist/module/actions/index.js +5 -0
  10. package/dist/module/actions/index.js.map +1 -0
  11. package/dist/module/actions/types.js +14 -0
  12. package/dist/module/actions/types.js.map +1 -0
  13. package/dist/module/apis/analyticsActions.js +20 -0
  14. package/dist/module/apis/analyticsActions.js.map +1 -0
  15. package/dist/module/apis/contactActions.js +27 -0
  16. package/dist/module/apis/contactActions.js.map +1 -0
  17. package/dist/module/apis/eventActions.js +163 -0
  18. package/dist/module/apis/eventActions.js.map +1 -0
  19. package/dist/module/apis/fileActions.js +96 -0
  20. package/dist/module/apis/fileActions.js.map +1 -0
  21. package/dist/module/apis/followerActions.js +38 -0
  22. package/dist/module/apis/followerActions.js.map +1 -0
  23. package/dist/module/apis/index.js +11 -0
  24. package/dist/module/apis/index.js.map +1 -0
  25. package/dist/module/apis/notificationActions.js +60 -0
  26. package/dist/module/apis/notificationActions.js.map +1 -0
  27. package/dist/module/apis/profileActions.js +14 -0
  28. package/dist/module/apis/profileActions.js.map +1 -0
  29. package/dist/module/apis/reactionActions.js +78 -0
  30. package/dist/module/apis/reactionActions.js.map +1 -0
  31. package/dist/module/apis/typeActions.js +15 -0
  32. package/dist/module/apis/typeActions.js.map +1 -0
  33. package/dist/module/apis/userActions.js +104 -0
  34. package/dist/module/apis/userActions.js.map +1 -0
  35. package/{assets → dist/module/assets}/icons/reactions/heart.png +0 -0
  36. package/{assets → dist/module/assets}/icons/reactions/party.png +0 -0
  37. package/{assets → dist/module/assets}/icons/reactions/sad.png +0 -0
  38. package/{assets → dist/module/assets}/icons/reactions/smile.png +0 -0
  39. package/dist/module/colours.js +149 -0
  40. package/dist/module/colours.js.map +1 -0
  41. package/dist/module/components/AddButton.js +45 -0
  42. package/dist/module/components/AddButton.js.map +1 -0
  43. package/dist/module/components/Attachment.js +59 -0
  44. package/dist/module/components/Attachment.js.map +1 -0
  45. package/dist/module/components/AudienceSelectorLauncher.js +70 -0
  46. package/dist/module/components/AudienceSelectorLauncher.js.map +1 -0
  47. package/dist/module/components/AudienceSelectorPage.js +376 -0
  48. package/dist/module/components/AudienceSelectorPage.js.map +1 -0
  49. package/dist/module/components/BackButton.js +62 -0
  50. package/dist/module/components/BackButton.js.map +1 -0
  51. package/dist/module/components/CategoryTabs.js +171 -0
  52. package/dist/module/components/CategoryTabs.js.map +1 -0
  53. package/dist/module/components/CommentReply.js +363 -0
  54. package/dist/module/components/CommentReply.js.map +1 -0
  55. package/dist/module/components/CommentSection.js +785 -0
  56. package/dist/module/components/CommentSection.js.map +1 -0
  57. package/dist/module/components/ConfirmPopup.js +85 -0
  58. package/dist/module/components/ConfirmPopup.js.map +1 -0
  59. package/dist/module/components/ConfirmationPopup.js +77 -0
  60. package/dist/module/components/ConfirmationPopup.js.map +1 -0
  61. package/dist/module/components/DropDownItem.js +82 -0
  62. package/dist/module/components/DropDownItem.js.map +1 -0
  63. package/dist/module/components/DropDownMenu.js +46 -0
  64. package/dist/module/components/DropDownMenu.js.map +1 -0
  65. package/dist/module/components/EmptyStateMain.js +50 -0
  66. package/dist/module/components/EmptyStateMain.js.map +1 -0
  67. package/dist/module/components/EmptyStateWidget.js +52 -0
  68. package/dist/module/components/EmptyStateWidget.js.map +1 -0
  69. package/dist/module/components/FontScaleButton.js +37 -0
  70. package/dist/module/components/FontScaleButton.js.map +1 -0
  71. package/dist/module/components/FontScalePopup.js +77 -0
  72. package/dist/module/components/FontScalePopup.js.map +1 -0
  73. package/dist/module/components/FormCard.js +28 -0
  74. package/dist/module/components/FormCard.js.map +1 -0
  75. package/dist/module/components/FormCardSection.js +240 -0
  76. package/dist/module/components/FormCardSection.js.map +1 -0
  77. package/dist/module/components/FormCardSectionOptionLauncher.js +77 -0
  78. package/dist/module/components/FormCardSectionOptionLauncher.js.map +1 -0
  79. package/dist/module/components/FormattedText.js +145 -0
  80. package/dist/module/components/FormattedText.js.map +1 -0
  81. package/dist/module/components/GenericInput.js +161 -0
  82. package/dist/module/components/GenericInput.js.map +1 -0
  83. package/dist/module/components/GenericInputSection.js +174 -0
  84. package/dist/module/components/GenericInputSection.js.map +1 -0
  85. package/dist/module/components/Header.js +491 -0
  86. package/dist/module/components/Header.js.map +1 -0
  87. package/dist/module/components/ImagePopup.js +257 -0
  88. package/dist/module/components/ImagePopup.js.map +1 -0
  89. package/dist/module/components/ImageUploadProgress.js +72 -0
  90. package/dist/module/components/ImageUploadProgress.js.map +1 -0
  91. package/dist/module/components/ImageUploader.js +850 -0
  92. package/dist/module/components/ImageUploader.js.map +1 -0
  93. package/dist/module/components/InlineButton.js +72 -0
  94. package/dist/module/components/InlineButton.js.map +1 -0
  95. package/dist/module/components/Input.js +164 -0
  96. package/dist/module/components/Input.js.map +1 -0
  97. package/dist/module/components/LoadingCircles.js +224 -0
  98. package/dist/module/components/LoadingCircles.js.map +1 -0
  99. package/dist/module/components/LoadingIndicator.js +95 -0
  100. package/dist/module/components/LoadingIndicator.js.map +1 -0
  101. package/dist/module/components/LoadingStateWidget.js +51 -0
  102. package/dist/module/components/LoadingStateWidget.js.map +1 -0
  103. package/dist/module/components/MediaPlayer.js +440 -0
  104. package/dist/module/components/MediaPlayer.js.map +1 -0
  105. package/dist/module/components/MiddlePopup.js +46 -0
  106. package/dist/module/components/MiddlePopup.js.map +1 -0
  107. package/dist/module/components/PDFPopup.js +188 -0
  108. package/dist/module/components/PDFPopup.js.map +1 -0
  109. package/dist/module/components/PlussChat.js +997 -0
  110. package/dist/module/components/PlussChat.js.map +1 -0
  111. package/dist/module/components/PlussChatMessage.js +204 -0
  112. package/dist/module/components/PlussChatMessage.js.map +1 -0
  113. package/dist/module/components/PlussChatTime.js +66 -0
  114. package/dist/module/components/PlussChatTime.js.map +1 -0
  115. package/dist/module/components/Popup.js +138 -0
  116. package/dist/module/components/Popup.js.map +1 -0
  117. package/dist/module/components/PopupMenu.js +128 -0
  118. package/dist/module/components/PopupMenu.js.map +1 -0
  119. package/dist/module/components/PositionedImage.js +333 -0
  120. package/dist/module/components/PositionedImage.js.map +1 -0
  121. package/dist/module/components/ProfilePic.js +119 -0
  122. package/dist/module/components/ProfilePic.js.map +1 -0
  123. package/dist/module/components/RadioButton.js +84 -0
  124. package/dist/module/components/RadioButton.js.map +1 -0
  125. package/dist/module/components/Reaction.js +129 -0
  126. package/dist/module/components/Reaction.js.map +1 -0
  127. package/dist/module/components/Reactions.js +84 -0
  128. package/dist/module/components/Reactions.js.map +1 -0
  129. package/dist/module/components/SharingTools.js +162 -0
  130. package/dist/module/components/SharingTools.js.map +1 -0
  131. package/dist/module/components/Spinner.js +25 -0
  132. package/dist/module/components/Spinner.js.map +1 -0
  133. package/dist/module/components/StickyFooter.js +37 -0
  134. package/dist/module/components/StickyFooter.js.map +1 -0
  135. package/dist/module/components/TextStyle.js +34 -0
  136. package/dist/module/components/TextStyle.js.map +1 -0
  137. package/dist/module/components/Toggle.js +70 -0
  138. package/dist/module/components/Toggle.js.map +1 -0
  139. package/dist/module/components/TouchableSearchBar.js +73 -0
  140. package/dist/module/components/TouchableSearchBar.js.map +1 -0
  141. package/dist/module/components/UserListPopup.js +146 -0
  142. package/dist/module/components/UserListPopup.js.map +1 -0
  143. package/dist/module/components/UserListing.js +291 -0
  144. package/dist/module/components/UserListing.js.map +1 -0
  145. package/dist/module/components/VideoPopup.js +123 -0
  146. package/dist/module/components/VideoPopup.js.map +1 -0
  147. package/dist/module/components/WarningPopup.js +87 -0
  148. package/dist/module/components/WarningPopup.js.map +1 -0
  149. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js +325 -0
  150. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js.map +1 -0
  151. package/dist/module/components/expo-image-picker-multiple/ImageTile.js +123 -0
  152. package/dist/module/components/expo-image-picker-multiple/ImageTile.js.map +1 -0
  153. package/dist/module/components/index.js +53 -0
  154. package/dist/module/components/index.js.map +1 -0
  155. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +416 -0
  156. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js.map +1 -0
  157. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js +405 -0
  158. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js.map +1 -0
  159. package/dist/module/config.js +27 -0
  160. package/dist/module/config.js.map +1 -0
  161. package/dist/module/constants.js +16 -0
  162. package/dist/module/constants.js.map +1 -0
  163. package/dist/module/fonts/index.js +2 -0
  164. package/dist/module/fonts/index.js.map +1 -0
  165. package/dist/module/fonts/pluss60-icons.js +5 -0
  166. package/dist/module/fonts/pluss60-icons.js.map +1 -0
  167. package/dist/module/fonts/pluss60-icons.json +1097 -0
  168. package/dist/module/helper.js +436 -0
  169. package/dist/module/helper.js.map +1 -0
  170. package/dist/module/index.js +13 -0
  171. package/dist/module/index.js.map +1 -0
  172. package/dist/module/session.js +54 -0
  173. package/dist/module/session.js.map +1 -0
  174. package/dist/module/styles.js +67 -0
  175. package/dist/module/styles.js.map +1 -0
  176. package/package.json +22 -5
  177. package/src/assets/icons/reactions/heart.png +0 -0
  178. package/src/assets/icons/reactions/party.png +0 -0
  179. package/src/assets/icons/reactions/sad.png +0 -0
  180. package/src/assets/icons/reactions/smile.png +0 -0
  181. package/src/components/CommentReply.js +0 -2
  182. package/src/constants.js +4 -4
  183. package/src/helper.js +4 -4
@@ -0,0 +1,123 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
3
+ import React, { Component } from 'react';
4
+ import { Platform, View, Modal, TouchableOpacity, StyleSheet } from 'react-native';
5
+ import * as ScreenOrientation from 'expo-screen-orientation';
6
+ import { StatusBarHeight, getCompressed, imageExists } from '../helper';
7
+ import { Pl60Icon } from '../fonts';
8
+ import { SharingTools } from './SharingTools';
9
+ import { MediaPlayer } from './MediaPlayer';
10
+
11
+ class VideoPopup extends Component {
12
+ constructor(props) {
13
+ super(props);
14
+
15
+ _defineProperty(this, "UNSAFE_componentWillMount", async () => {
16
+ this.checkCompressed(this.props.uri);
17
+ await ScreenOrientation.lockAsync(Platform.OS === 'ios' ? ScreenOrientation.OrientationLock.DEFAULT : ScreenOrientation.OrientationLock.ALL);
18
+ });
19
+
20
+ _defineProperty(this, "componentWillUnmount", async () => {
21
+ await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP);
22
+ });
23
+
24
+ _defineProperty(this, "checkCompressed", url => {
25
+ const compressedUri = getCompressed(url);
26
+ imageExists(compressedUri).then(compressedExists => {
27
+ this.setState({
28
+ uri: compressedExists ? compressedUri : url
29
+ });
30
+ });
31
+ });
32
+
33
+ this.state = {
34
+ uri: '',
35
+ isFullScreen: false
36
+ };
37
+ }
38
+
39
+ UNSAFE_componentWillReceiveProps(nextProps) {
40
+ if (this.props.uri === nextProps.uri) return;
41
+ this.checkCompressed(nextProps.uri);
42
+ }
43
+
44
+ renderClose() {
45
+ return /*#__PURE__*/React.createElement(TouchableOpacity, {
46
+ style: styles.menuIconContainer,
47
+ onPress: this.props.onClose,
48
+ activeOpacity: 0.6
49
+ }, /*#__PURE__*/React.createElement(Pl60Icon, {
50
+ name: "close",
51
+ style: styles.menuIcon
52
+ }));
53
+ }
54
+
55
+ renderPlayer() {
56
+ const {
57
+ uri
58
+ } = this.state;
59
+ if (!uri) return null;
60
+ return /*#__PURE__*/React.createElement(View, {
61
+ style: styles.playerContainer
62
+ }, /*#__PURE__*/React.createElement(MediaPlayer, {
63
+ source: uri,
64
+ useVideoPlayer: true,
65
+ autoPlay: true,
66
+ orientationChanged: isFullScreen => this.setState({
67
+ isFullScreen
68
+ })
69
+ }));
70
+ }
71
+
72
+ render() {
73
+ const {
74
+ isFullScreen
75
+ } = this.state;
76
+ const {
77
+ visible,
78
+ onClose,
79
+ animationType,
80
+ style
81
+ } = this.props;
82
+ return /*#__PURE__*/React.createElement(Modal, {
83
+ visible: visible,
84
+ animationType: animationType || 'fade',
85
+ onRequestClose: onClose,
86
+ style: [styles.container, style],
87
+ supportedOrientations: ['portrait', 'landscape']
88
+ }, this.renderPlayer(), !isFullScreen && this.renderClose(), !isFullScreen && /*#__PURE__*/React.createElement(SharingTools, {
89
+ uri: this.props.uri
90
+ }));
91
+ }
92
+
93
+ }
94
+
95
+ const styles = StyleSheet.create({
96
+ container: {
97
+ backgroundColor: '#000'
98
+ },
99
+ menuIconContainer: {
100
+ position: 'absolute',
101
+ top: StatusBarHeight(0),
102
+ right: 0,
103
+ width: 55,
104
+ height: 55,
105
+ zIndex: 3
106
+ },
107
+ menuIcon: {
108
+ fontSize: 25,
109
+ padding: 15,
110
+ width: 55,
111
+ textAlign: 'center',
112
+ color: '#fff',
113
+ zIndex: 3
114
+ },
115
+ playerContainer: {
116
+ flex: 1,
117
+ backgroundColor: '#000',
118
+ alignItems: 'center',
119
+ justifyContent: 'center'
120
+ }
121
+ });
122
+ export { VideoPopup };
123
+ //# sourceMappingURL=VideoPopup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["VideoPopup.js"],"names":["React","Component","Platform","View","Modal","TouchableOpacity","StyleSheet","ScreenOrientation","StatusBarHeight","getCompressed","imageExists","Pl60Icon","SharingTools","MediaPlayer","VideoPopup","constructor","props","checkCompressed","uri","lockAsync","OS","OrientationLock","DEFAULT","ALL","PORTRAIT_UP","url","compressedUri","then","compressedExists","setState","state","isFullScreen","UNSAFE_componentWillReceiveProps","nextProps","renderClose","styles","menuIconContainer","onClose","menuIcon","renderPlayer","playerContainer","render","visible","animationType","style","container","create","backgroundColor","position","top","right","width","height","zIndex","fontSize","padding","textAlign","color","flex","alignItems","justifyContent"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { Platform, View, Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport * as ScreenOrientation from 'expo-screen-orientation';\nimport { StatusBarHeight, getCompressed, imageExists } from '../helper';\nimport { Pl60Icon } from '../fonts';\nimport { SharingTools } from './SharingTools';\nimport { MediaPlayer } from './MediaPlayer';\n\nclass VideoPopup extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n uri: '',\n isFullScreen: false,\n };\n }\n\n UNSAFE_componentWillMount = async () => {\n this.checkCompressed(this.props.uri);\n await ScreenOrientation.lockAsync(\n Platform.OS === 'ios' ? ScreenOrientation.OrientationLock.DEFAULT : ScreenOrientation.OrientationLock.ALL,\n );\n };\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (this.props.uri === nextProps.uri) return;\n this.checkCompressed(nextProps.uri);\n }\n\n componentWillUnmount = async () => {\n await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP);\n };\n\n checkCompressed = url => {\n const compressedUri = getCompressed(url);\n imageExists(compressedUri).then(compressedExists => {\n this.setState({ uri: compressedExists ? compressedUri : url });\n });\n };\n\n renderClose() {\n return (\n <TouchableOpacity style={styles.menuIconContainer} onPress={this.props.onClose} activeOpacity={0.6}>\n <Pl60Icon name=\"close\" style={styles.menuIcon} />\n </TouchableOpacity>\n );\n }\n\n renderPlayer() {\n const { uri } = this.state;\n if (!uri) return null;\n\n return (\n <View style={styles.playerContainer}>\n <MediaPlayer\n source={uri}\n useVideoPlayer={true}\n autoPlay={true}\n orientationChanged={isFullScreen => this.setState({ isFullScreen })}\n />\n </View>\n );\n }\n\n render() {\n const { isFullScreen } = this.state;\n const { visible, onClose, animationType, style } = this.props;\n\n return (\n <Modal\n visible={visible}\n animationType={animationType || 'fade'}\n onRequestClose={onClose}\n style={[styles.container, style]}\n supportedOrientations={['portrait', 'landscape']}\n >\n {this.renderPlayer()}\n {!isFullScreen && this.renderClose()}\n {!isFullScreen && <SharingTools uri={this.props.uri} />}\n </Modal>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: '#000',\n },\n menuIconContainer: {\n position: 'absolute',\n top: StatusBarHeight(0),\n right: 0,\n width: 55,\n height: 55,\n zIndex: 3,\n },\n menuIcon: {\n fontSize: 25,\n padding: 15,\n width: 55,\n textAlign: 'center',\n color: '#fff',\n zIndex: 3,\n },\n playerContainer: {\n flex: 1,\n backgroundColor: '#000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nexport { VideoPopup };\n"]}
@@ -0,0 +1,87 @@
1
+ import React, { PureComponent } from 'react';
2
+ import _ from 'lodash';
3
+ import { View, Text, Dimensions } from 'react-native';
4
+ import { connect } from 'react-redux';
5
+ import { Pl60Icon } from '../fonts';
6
+ import { COLOUR_GREEN, TEXT_DARK, getMainBrandingColourFromState } from '../colours';
7
+ import { MiddlePopup } from './MiddlePopup';
8
+ import { InlineButton } from './InlineButton';
9
+ const SCREEN_WIDTH = Dimensions.get('window').width;
10
+
11
+ class WarningPopup extends PureComponent {
12
+ render() {
13
+ return /*#__PURE__*/React.createElement(MiddlePopup, {
14
+ visible: this.props.visible,
15
+ onClose: this.props.onClose,
16
+ style: styles.popup
17
+ }, this.props.isSuccess && /*#__PURE__*/React.createElement(Pl60Icon, {
18
+ style: styles.icon,
19
+ name: "circleoutlined"
20
+ }), /*#__PURE__*/React.createElement(Text, {
21
+ style: styles.text
22
+ }, this.props.confirmText), /*#__PURE__*/React.createElement(View, {
23
+ style: {
24
+ marginTop: 16,
25
+ paddingHorizontal: 24
26
+ }
27
+ }, /*#__PURE__*/React.createElement(Text, {
28
+ style: [styles.infoText, this.props.infoTextStyle]
29
+ }, this.props.infoText)), /*#__PURE__*/React.createElement(InlineButton, {
30
+ onPress: this.props.onClose,
31
+ color: this.props.ctaButton ? this.props.colourBrandingMain : '#fff',
32
+ style: styles.button,
33
+ textStyle: [styles.closeText, {
34
+ color: this.props.ctaButton ? '#fff' : this.props.colourBrandingMain
35
+ }],
36
+ large: true
37
+ }, !_.isUndefined(this.props.buttonText) ? this.props.buttonText : 'Close'));
38
+ }
39
+
40
+ }
41
+
42
+ const styles = {
43
+ popup: {
44
+ width: 'auto',
45
+ maxWidth: SCREEN_WIDTH - 34,
46
+ paddingVertical: 16
47
+ },
48
+ icon: {
49
+ marginTop: 20,
50
+ paddingBottom: 16,
51
+ fontSize: 52,
52
+ color: COLOUR_GREEN
53
+ },
54
+ text: {
55
+ fontFamily: 'sf-bold',
56
+ fontSize: 24,
57
+ lineHeight: 24,
58
+ color: TEXT_DARK,
59
+ textAlign: 'center',
60
+ marginTop: 8
61
+ },
62
+ infoText: {
63
+ fontFamily: 'sf-regular',
64
+ fontSize: 16,
65
+ lineHeight: 22,
66
+ color: TEXT_DARK,
67
+ textAlign: 'left'
68
+ },
69
+ button: {
70
+ width: 130,
71
+ marginTop: 20
72
+ },
73
+ closeText: {
74
+ fontFamily: 'sf-medium',
75
+ fontSize: 15
76
+ }
77
+ };
78
+
79
+ const mapStateToProps = state => {
80
+ return {
81
+ colourBrandingMain: getMainBrandingColourFromState(state)
82
+ };
83
+ };
84
+
85
+ const warningPopup = connect(mapStateToProps, {})(WarningPopup);
86
+ export { warningPopup as WarningPopup };
87
+ //# sourceMappingURL=WarningPopup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["WarningPopup.js"],"names":["React","PureComponent","_","View","Text","Dimensions","connect","Pl60Icon","COLOUR_GREEN","TEXT_DARK","getMainBrandingColourFromState","MiddlePopup","InlineButton","SCREEN_WIDTH","get","width","WarningPopup","render","props","visible","onClose","styles","popup","isSuccess","icon","text","confirmText","marginTop","paddingHorizontal","infoText","infoTextStyle","ctaButton","colourBrandingMain","button","closeText","color","isUndefined","buttonText","maxWidth","paddingVertical","paddingBottom","fontSize","fontFamily","lineHeight","textAlign","mapStateToProps","state","warningPopup"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport _ from 'lodash';\nimport { View, Text, Dimensions } from 'react-native';\nimport { connect } from 'react-redux';\nimport { Pl60Icon } from '../fonts';\nimport { COLOUR_GREEN, TEXT_DARK, getMainBrandingColourFromState } from '../colours';\nimport { MiddlePopup } from './MiddlePopup';\nimport { InlineButton } from './InlineButton';\n\nconst SCREEN_WIDTH = Dimensions.get('window').width;\n\nclass WarningPopup extends PureComponent {\n render() {\n return (\n <MiddlePopup visible={this.props.visible} onClose={this.props.onClose} style={styles.popup}>\n {this.props.isSuccess && <Pl60Icon style={styles.icon} name=\"circleoutlined\" />}\n <Text style={styles.text}>{this.props.confirmText}</Text>\n <View style={{ marginTop: 16, paddingHorizontal: 24 }}>\n <Text style={[styles.infoText, this.props.infoTextStyle]}>{this.props.infoText}</Text>\n </View>\n <InlineButton\n onPress={this.props.onClose}\n color={this.props.ctaButton ? this.props.colourBrandingMain : '#fff'}\n style={styles.button}\n textStyle={[styles.closeText, { color: this.props.ctaButton ? '#fff' : this.props.colourBrandingMain }]}\n large\n >\n {!_.isUndefined(this.props.buttonText) ? this.props.buttonText : 'Close'}\n </InlineButton>\n </MiddlePopup>\n );\n }\n}\n\nconst styles = {\n popup: {\n width: 'auto',\n maxWidth: SCREEN_WIDTH - 34,\n paddingVertical: 16,\n },\n icon: {\n marginTop: 20,\n paddingBottom: 16,\n fontSize: 52,\n color: COLOUR_GREEN,\n },\n text: {\n fontFamily: 'sf-bold',\n fontSize: 24,\n lineHeight: 24,\n color: TEXT_DARK,\n textAlign: 'center',\n marginTop: 8,\n },\n infoText: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n lineHeight: 22,\n color: TEXT_DARK,\n textAlign: 'left',\n },\n button: {\n width: 130,\n marginTop: 20,\n },\n closeText: {\n fontFamily: 'sf-medium',\n fontSize: 15,\n },\n};\n\nconst mapStateToProps = state => {\n return {\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nconst warningPopup = connect(mapStateToProps, {})(WarningPopup);\nexport { warningPopup as WarningPopup };\n"]}
@@ -0,0 +1,325 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
3
+ import React from 'react';
4
+ import { StyleSheet, View, FlatList, Dimensions, ActivityIndicator, Platform } from 'react-native';
5
+ import _ from 'lodash';
6
+ import * as ScreenOrientation from 'expo-screen-orientation';
7
+ import * as MediaLibrary from 'expo-media-library';
8
+ import { Camera } from 'expo-camera';
9
+ import { isVideo } from '../../helper';
10
+ import ImageTile from './ImageTile';
11
+ const {
12
+ width
13
+ } = Dimensions.get('window');
14
+ const defaultSelectionLimit = 10;
15
+ const defaultLoadCount = 50;
16
+ export default class ImageBrowser extends React.Component {
17
+ constructor(props) {
18
+ var _this;
19
+
20
+ super(props);
21
+ _this = this;
22
+
23
+ _defineProperty(this, "isLocal", () => {
24
+ return _.isNil(this.props.remoteAlbums);
25
+ });
26
+
27
+ _defineProperty(this, "getPermissionsAsync", async () => {
28
+ const {
29
+ status: camera
30
+ } = await Camera.requestCameraPermissionsAsync();
31
+ const {
32
+ status: cameraRoll
33
+ } = await MediaLibrary.requestPermissionsAsync();
34
+ this.setState({
35
+ hasCameraPermission: camera === 'granted',
36
+ hasCameraRollPermission: cameraRoll === 'granted'
37
+ });
38
+ });
39
+
40
+ _defineProperty(this, "onOrientationChange", _ref => {
41
+ let {
42
+ orientationInfo
43
+ } = _ref;
44
+ ScreenOrientation.removeOrientationChangeListeners();
45
+ ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
46
+ const numColumns = this.getNumColumns(orientationInfo.orientation);
47
+ this.setState({
48
+ numColumns
49
+ });
50
+ });
51
+
52
+ _defineProperty(this, "getNumColumns", orientation => orientation === ScreenOrientation.Orientation.PORTRAIT_UP || orientation === ScreenOrientation.Orientation.PORTRAIT_DOWN ? 4 : 7);
53
+
54
+ _defineProperty(this, "isVideoSelected", () => {
55
+ return this.state.selected.find(uri => {
56
+ const photo = this.state.photos.find(photo => photo.uri === uri);
57
+ return photo && photo.mediaType === MediaLibrary.MediaType.video;
58
+ });
59
+ });
60
+
61
+ _defineProperty(this, "checkSelection", item => {
62
+ let videoSelected = this.isVideoSelected();
63
+ let newSelected = [...this.state.selected]; // Check video/photo selection
64
+
65
+ if (item.mediaType === MediaLibrary.MediaType.video) {
66
+ if (videoSelected && videoSelected !== item.uri) {
67
+ // If different video is already selected, reset
68
+ videoSelected = null;
69
+ newSelected = [];
70
+ } else if (!videoSelected && newSelected.length > 0) {
71
+ // If photos selected, don't allow selecting video
72
+ videoSelected = null;
73
+ newSelected = [];
74
+ } // Toggle video selected
75
+
76
+
77
+ videoSelected = videoSelected !== item.uri ? item.uri : null;
78
+ } else if (videoSelected) {
79
+ // If video selected, reset
80
+ videoSelected = null;
81
+ newSelected = [];
82
+ } // Check multiple selection
83
+
84
+
85
+ const selectionLimit = this.props.max || defaultSelectionLimit;
86
+
87
+ if (selectionLimit && selectionLimit > 1) {
88
+ // Limit selection
89
+ if (newSelected.length === selectionLimit && newSelected.indexOf(item.uri) === -1) return {
90
+ isFull: true
91
+ };
92
+ } else {
93
+ // Force single selection
94
+ if (newSelected.length > 0 && newSelected[0] !== item.uri) newSelected = [];
95
+ }
96
+
97
+ return {
98
+ newSelected,
99
+ videoSelected
100
+ };
101
+ });
102
+
103
+ _defineProperty(this, "selectImage", item => {
104
+ const {
105
+ newSelected,
106
+ videoSelected,
107
+ isFull
108
+ } = this.checkSelection(item);
109
+ if (isFull) return;
110
+
111
+ if (newSelected.indexOf(item.uri) === -1) {
112
+ newSelected.push(item.uri);
113
+ } else {
114
+ const deleteIndex = newSelected.indexOf(item.uri);
115
+ newSelected.splice(deleteIndex, 1);
116
+ }
117
+
118
+ if (newSelected.length > this.props.max) return;
119
+ if (!newSelected) newSelected = [];
120
+ this.setState({
121
+ selected: newSelected
122
+ });
123
+ this.props.onChange(newSelected, videoSelected, () => this.prepareCallback());
124
+ });
125
+
126
+ _defineProperty(this, "getPhotos", function () {
127
+ let reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
128
+ const {
129
+ remoteAlbums,
130
+ allowVideo,
131
+ loadCount,
132
+ album
133
+ } = _this.props;
134
+
135
+ if (_this.isLocal()) {
136
+ // Retrieve local photos
137
+ const mediaType = [MediaLibrary.MediaType.photo];
138
+ if (allowVideo) mediaType.push(MediaLibrary.MediaType.video);
139
+ const params = {
140
+ first: loadCount || defaultLoadCount,
141
+ mediaType,
142
+ album: album || undefined,
143
+ sortBy: [Platform.OS === 'android' ? 'modificationTime' : 'creationTime']
144
+ };
145
+
146
+ if (reset) {
147
+ _this.setState({
148
+ photos: [],
149
+ after: null,
150
+ hasNextPage: true
151
+ });
152
+ } else {
153
+ if (_this.state.after) params.after = _this.state.after;
154
+ if (!_this.state.hasNextPage) return;
155
+ }
156
+
157
+ MediaLibrary.getAssetsAsync(params).then(_this.processPhotos);
158
+ } else {
159
+ var _selectedAlbum$images;
160
+
161
+ // Use remote albums
162
+ const selectedAlbum = remoteAlbums.find(item => item.id === album);
163
+
164
+ if (selectedAlbum && ((_selectedAlbum$images = selectedAlbum.images) === null || _selectedAlbum$images === void 0 ? void 0 : _selectedAlbum$images.length) > 0) {
165
+ const ordered = _.orderBy(selectedAlbum.images, 'date', 'desc');
166
+
167
+ _this.setState({
168
+ photos: ordered.map(image => {
169
+ return {
170
+ uri: image.uri,
171
+ mediaType: isVideo(image.uri) ? MediaLibrary.MediaType.video : MediaLibrary.MediaType.photo
172
+ };
173
+ }),
174
+ isEmpty: false
175
+ });
176
+ } else {
177
+ _this.setState({
178
+ photos: [],
179
+ isEmpty: true
180
+ });
181
+ }
182
+ }
183
+ });
184
+
185
+ _defineProperty(this, "processPhotos", data => {
186
+ if (data.totalCount) {
187
+ if (this.state.after === data.endCursor) return;
188
+ const uris = data.assets;
189
+ this.setState({
190
+ photos: [...this.state.photos, ...uris],
191
+ after: data.endCursor,
192
+ hasNextPage: data.hasNextPage
193
+ });
194
+ } else {
195
+ this.setState({
196
+ isEmpty: true
197
+ });
198
+ }
199
+ });
200
+
201
+ _defineProperty(this, "getItemLayout", (data, index) => {
202
+ const length = this.props.itemWidth || width / 4;
203
+ return {
204
+ length,
205
+ offset: length * index,
206
+ index
207
+ };
208
+ });
209
+
210
+ _defineProperty(this, "renderImageTile", _ref2 => {
211
+ let {
212
+ item,
213
+ index
214
+ } = _ref2;
215
+ if (!item) return null;
216
+ const selectedIndex = this.state.selected.indexOf(item.uri);
217
+ const selected = selectedIndex !== -1;
218
+ return /*#__PURE__*/React.createElement(ImageTile, {
219
+ selectedItemNumber: selectedIndex + 1,
220
+ item: item,
221
+ index: index,
222
+ selected: selected,
223
+ selectImage: this.selectImage,
224
+ renderSelectedComponent: this.props.renderSelectedComponent,
225
+ style: this.props.itemStyle,
226
+ width: this.props.itemWidth,
227
+ height: this.props.itemHeight,
228
+ isRemote: !this.isLocal()
229
+ });
230
+ });
231
+
232
+ _defineProperty(this, "renderPreloader", () => this.props.preloaderComponent || /*#__PURE__*/React.createElement(ActivityIndicator, {
233
+ size: "large"
234
+ }));
235
+
236
+ _defineProperty(this, "renderEmptyState", () => this.props.emptyStateComponent || null);
237
+
238
+ this.state = {
239
+ hasCameraPermission: null,
240
+ hasCameraRollPermission: null,
241
+ numColumns: null,
242
+ photos: [],
243
+ selected: [],
244
+ isEmpty: false,
245
+ after: null,
246
+ hasNextPage: true
247
+ };
248
+ }
249
+
250
+ async componentDidMount() {
251
+ if (this.isLocal()) await this.getPermissionsAsync();
252
+ ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
253
+ const orientation = await ScreenOrientation.getOrientationAsync();
254
+ const numColumns = this.getNumColumns(orientation);
255
+ this.setState({
256
+ numColumns
257
+ }, () => {
258
+ this.getPhotos();
259
+ });
260
+ }
261
+
262
+ componentDidUpdate(prevProps) {
263
+ if (prevProps.album !== this.props.album) this.getPhotos(true);
264
+
265
+ if (!_.isEqual(prevProps.selected, this.props.selected)) {
266
+ this.setState({
267
+ selected: this.props.selected
268
+ });
269
+ }
270
+ }
271
+
272
+ prepareCallback() {
273
+ const {
274
+ selected,
275
+ photos
276
+ } = this.state;
277
+ const selectedPhotos = selected.map(uri => photos.find(p => p.uri === uri));
278
+
279
+ if (this.isLocal()) {
280
+ const assetsInfo = Promise.all(selectedPhotos.map(p => MediaLibrary.getAssetInfoAsync(p)));
281
+ this.props.callback(assetsInfo);
282
+ } else {
283
+ // No need to retrieve local assets
284
+ this.props.callback(selectedPhotos);
285
+ }
286
+ }
287
+
288
+ renderImages() {
289
+ return /*#__PURE__*/React.createElement(FlatList, {
290
+ data: this.state.photos,
291
+ numColumns: this.state.numColumns,
292
+ key: this.state.numColumns,
293
+ renderItem: this.renderImageTile,
294
+ keyExtractor: (_, index) => index,
295
+ onEndReached: () => {
296
+ if (this.isLocal()) this.getPhotos();
297
+ },
298
+ onEndReachedThreshold: 0.5,
299
+ ListEmptyComponent: this.state.isEmpty ? this.renderEmptyState() : this.renderPreloader(),
300
+ initialNumToRender: 24,
301
+ getItemLayout: this.getItemLayout
302
+ });
303
+ }
304
+
305
+ render() {
306
+ const {
307
+ hasCameraPermission
308
+ } = this.state;
309
+
310
+ if (this.isLocal() && !hasCameraPermission) {
311
+ return this.props.noCameraPermissionComponent || null;
312
+ }
313
+
314
+ return /*#__PURE__*/React.createElement(View, {
315
+ style: [styles.container, this.props.style]
316
+ }, this.renderImages());
317
+ }
318
+
319
+ }
320
+ const styles = StyleSheet.create({
321
+ container: {
322
+ flex: 1
323
+ }
324
+ });
325
+ //# sourceMappingURL=ImageBrowser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ImageBrowser.js"],"names":["React","StyleSheet","View","FlatList","Dimensions","ActivityIndicator","Platform","_","ScreenOrientation","MediaLibrary","Camera","isVideo","ImageTile","width","get","defaultSelectionLimit","defaultLoadCount","ImageBrowser","Component","constructor","props","isNil","remoteAlbums","status","camera","requestCameraPermissionsAsync","cameraRoll","requestPermissionsAsync","setState","hasCameraPermission","hasCameraRollPermission","orientationInfo","removeOrientationChangeListeners","addOrientationChangeListener","onOrientationChange","numColumns","getNumColumns","orientation","Orientation","PORTRAIT_UP","PORTRAIT_DOWN","state","selected","find","uri","photo","photos","mediaType","MediaType","video","item","videoSelected","isVideoSelected","newSelected","length","selectionLimit","max","indexOf","isFull","checkSelection","push","deleteIndex","splice","onChange","prepareCallback","reset","allowVideo","loadCount","album","isLocal","params","first","undefined","sortBy","OS","after","hasNextPage","getAssetsAsync","then","processPhotos","selectedAlbum","id","images","ordered","orderBy","map","image","isEmpty","data","totalCount","endCursor","uris","assets","index","itemWidth","offset","selectedIndex","selectImage","renderSelectedComponent","itemStyle","itemHeight","preloaderComponent","emptyStateComponent","componentDidMount","getPermissionsAsync","getOrientationAsync","getPhotos","componentDidUpdate","prevProps","isEqual","selectedPhotos","p","assetsInfo","Promise","all","getAssetInfoAsync","callback","renderImages","renderImageTile","renderEmptyState","renderPreloader","getItemLayout","render","noCameraPermissionComponent","styles","container","style","create","flex"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleSheet, View, FlatList, Dimensions, ActivityIndicator, Platform } from 'react-native';\nimport _ from 'lodash';\nimport * as ScreenOrientation from 'expo-screen-orientation';\nimport * as MediaLibrary from 'expo-media-library';\nimport { Camera } from 'expo-camera';\nimport { isVideo } from '../../helper';\nimport ImageTile from './ImageTile';\n\nconst { width } = Dimensions.get('window');\nconst defaultSelectionLimit = 10;\nconst defaultLoadCount = 50;\n\nexport default class ImageBrowser extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n hasCameraPermission: null,\n hasCameraRollPermission: null,\n numColumns: null,\n photos: [],\n selected: [],\n isEmpty: false,\n after: null,\n hasNextPage: true,\n };\n }\n\n async componentDidMount() {\n if (this.isLocal()) await this.getPermissionsAsync();\n\n ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);\n const orientation = await ScreenOrientation.getOrientationAsync();\n const numColumns = this.getNumColumns(orientation);\n this.setState({ numColumns }, () => {\n this.getPhotos();\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.album !== this.props.album) this.getPhotos(true);\n if (!_.isEqual(prevProps.selected, this.props.selected)) {\n this.setState({ selected: this.props.selected });\n }\n }\n\n isLocal = () => {\n return _.isNil(this.props.remoteAlbums);\n };\n\n getPermissionsAsync = async () => {\n const { status: camera } = await Camera.requestCameraPermissionsAsync();\n const { status: cameraRoll } = await MediaLibrary.requestPermissionsAsync();\n this.setState({\n hasCameraPermission: camera === 'granted',\n hasCameraRollPermission: cameraRoll === 'granted',\n });\n };\n\n onOrientationChange = ({ orientationInfo }) => {\n ScreenOrientation.removeOrientationChangeListeners();\n ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);\n const numColumns = this.getNumColumns(orientationInfo.orientation);\n this.setState({ numColumns });\n };\n\n getNumColumns = orientation =>\n orientation === ScreenOrientation.Orientation.PORTRAIT_UP || orientation === ScreenOrientation.Orientation.PORTRAIT_DOWN ? 4 : 7;\n\n isVideoSelected = () => {\n return this.state.selected.find(uri => {\n const photo = this.state.photos.find(photo => photo.uri === uri);\n return photo && photo.mediaType === MediaLibrary.MediaType.video;\n });\n };\n\n checkSelection = item => {\n let videoSelected = this.isVideoSelected();\n let newSelected = [...this.state.selected];\n\n // Check video/photo selection\n if (item.mediaType === MediaLibrary.MediaType.video) {\n if (videoSelected && videoSelected !== item.uri) {\n // If different video is already selected, reset\n videoSelected = null;\n newSelected = [];\n } else if (!videoSelected && newSelected.length > 0) {\n // If photos selected, don't allow selecting video\n videoSelected = null;\n newSelected = [];\n }\n // Toggle video selected\n videoSelected = videoSelected !== item.uri ? item.uri : null;\n } else if (videoSelected) {\n // If video selected, reset\n videoSelected = null;\n newSelected = [];\n }\n\n // Check multiple selection\n const selectionLimit = this.props.max || defaultSelectionLimit;\n if (selectionLimit && selectionLimit > 1) {\n // Limit selection\n if (newSelected.length === selectionLimit && newSelected.indexOf(item.uri) === -1) return { isFull: true };\n } else {\n // Force single selection\n if (newSelected.length > 0 && newSelected[0] !== item.uri) newSelected = [];\n }\n\n return { newSelected, videoSelected };\n };\n\n selectImage = item => {\n const { newSelected, videoSelected, isFull } = this.checkSelection(item);\n if (isFull) return;\n\n if (newSelected.indexOf(item.uri) === -1) {\n newSelected.push(item.uri);\n } else {\n const deleteIndex = newSelected.indexOf(item.uri);\n newSelected.splice(deleteIndex, 1);\n }\n if (newSelected.length > this.props.max) return;\n if (!newSelected) newSelected = [];\n this.setState({ selected: newSelected });\n this.props.onChange(newSelected, videoSelected, () => this.prepareCallback());\n };\n\n getPhotos = (reset = false) => {\n const { remoteAlbums, allowVideo, loadCount, album } = this.props;\n\n if (this.isLocal()) {\n // Retrieve local photos\n const mediaType = [MediaLibrary.MediaType.photo];\n if (allowVideo) mediaType.push(MediaLibrary.MediaType.video);\n\n const params = {\n first: loadCount || defaultLoadCount,\n mediaType,\n album: album || undefined,\n sortBy: [Platform.OS === 'android' ? 'modificationTime' : 'creationTime'],\n };\n if (reset) {\n this.setState({ photos: [], after: null, hasNextPage: true });\n } else {\n if (this.state.after) params.after = this.state.after;\n if (!this.state.hasNextPage) return;\n }\n MediaLibrary.getAssetsAsync(params).then(this.processPhotos);\n } else {\n // Use remote albums\n const selectedAlbum = remoteAlbums.find(item => item.id === album);\n if (selectedAlbum && selectedAlbum.images?.length > 0) {\n const ordered = _.orderBy(selectedAlbum.images, 'date', 'desc');\n this.setState({\n photos: ordered.map(image => {\n return {\n uri: image.uri,\n mediaType: isVideo(image.uri) ? MediaLibrary.MediaType.video : MediaLibrary.MediaType.photo,\n };\n }),\n isEmpty: false,\n });\n } else {\n this.setState({ photos: [], isEmpty: true });\n }\n }\n };\n\n processPhotos = data => {\n if (data.totalCount) {\n if (this.state.after === data.endCursor) return;\n const uris = data.assets;\n this.setState({\n photos: [...this.state.photos, ...uris],\n after: data.endCursor,\n hasNextPage: data.hasNextPage,\n });\n } else {\n this.setState({ isEmpty: true });\n }\n };\n\n getItemLayout = (data, index) => {\n const length = this.props.itemWidth || width / 4;\n return { length, offset: length * index, index };\n };\n\n prepareCallback() {\n const { selected, photos } = this.state;\n const selectedPhotos = selected.map(uri => photos.find(p => p.uri === uri));\n if (this.isLocal()) {\n const assetsInfo = Promise.all(selectedPhotos.map(p => MediaLibrary.getAssetInfoAsync(p)));\n this.props.callback(assetsInfo);\n } else {\n // No need to retrieve local assets\n this.props.callback(selectedPhotos);\n }\n }\n\n renderImageTile = ({ item, index }) => {\n if (!item) return null;\n\n const selectedIndex = this.state.selected.indexOf(item.uri);\n const selected = selectedIndex !== -1;\n\n return (\n <ImageTile\n selectedItemNumber={selectedIndex + 1}\n item={item}\n index={index}\n selected={selected}\n selectImage={this.selectImage}\n renderSelectedComponent={this.props.renderSelectedComponent}\n style={this.props.itemStyle}\n width={this.props.itemWidth}\n height={this.props.itemHeight}\n isRemote={!this.isLocal()}\n />\n );\n };\n\n renderPreloader = () => this.props.preloaderComponent || <ActivityIndicator size=\"large\" />;\n\n renderEmptyState = () => this.props.emptyStateComponent || null;\n\n renderImages() {\n return (\n <FlatList\n data={this.state.photos}\n numColumns={this.state.numColumns}\n key={this.state.numColumns}\n renderItem={this.renderImageTile}\n keyExtractor={(_, index) => index}\n onEndReached={() => {\n if (this.isLocal()) this.getPhotos();\n }}\n onEndReachedThreshold={0.5}\n ListEmptyComponent={this.state.isEmpty ? this.renderEmptyState() : this.renderPreloader()}\n initialNumToRender={24}\n getItemLayout={this.getItemLayout}\n />\n );\n }\n\n render() {\n const { hasCameraPermission } = this.state;\n\n if (this.isLocal() && !hasCameraPermission) {\n return this.props.noCameraPermissionComponent || null;\n }\n\n return <View style={[styles.container, this.props.style]}>{this.renderImages()}</View>;\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n"]}