@plusscommunities/pluss-core-app 4.0.4-auth.0 → 6.0.0-auth.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 (195) 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 +29 -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 +223 -0
  8. package/dist/module/actions/UserActions.js.map +1 -0
  9. package/dist/module/actions/UserSettingsActions.js +14 -0
  10. package/dist/module/actions/UserSettingsActions.js.map +1 -0
  11. package/dist/module/actions/index.js +6 -0
  12. package/dist/module/actions/index.js.map +1 -0
  13. package/dist/module/actions/types.js +17 -0
  14. package/dist/module/actions/types.js.map +1 -0
  15. package/dist/module/apis/analyticsActions.js +20 -0
  16. package/dist/module/apis/analyticsActions.js.map +1 -0
  17. package/dist/module/apis/contactActions.js +27 -0
  18. package/dist/module/apis/contactActions.js.map +1 -0
  19. package/dist/module/apis/eventActions.js +161 -0
  20. package/dist/module/apis/eventActions.js.map +1 -0
  21. package/dist/module/apis/fileActions.js +86 -0
  22. package/dist/module/apis/fileActions.js.map +1 -0
  23. package/dist/module/apis/followerActions.js +38 -0
  24. package/dist/module/apis/followerActions.js.map +1 -0
  25. package/dist/module/apis/index.js +12 -0
  26. package/dist/module/apis/index.js.map +1 -0
  27. package/dist/module/apis/notificationActions.js +60 -0
  28. package/dist/module/apis/notificationActions.js.map +1 -0
  29. package/dist/module/apis/profileActions.js +14 -0
  30. package/dist/module/apis/profileActions.js.map +1 -0
  31. package/dist/module/apis/reactionActions.js +76 -0
  32. package/dist/module/apis/reactionActions.js.map +1 -0
  33. package/dist/module/apis/stringActions.js +30 -0
  34. package/dist/module/apis/stringActions.js.map +1 -0
  35. package/dist/module/apis/typeActions.js +15 -0
  36. package/dist/module/apis/typeActions.js.map +1 -0
  37. package/dist/module/apis/userActions.js +104 -0
  38. package/dist/module/apis/userActions.js.map +1 -0
  39. package/dist/module/assets/icons/reactions/heart.png +0 -0
  40. package/dist/module/assets/icons/reactions/party.png +0 -0
  41. package/dist/module/assets/icons/reactions/sad.png +0 -0
  42. package/dist/module/assets/icons/reactions/smile.png +0 -0
  43. package/dist/module/colours.js +168 -0
  44. package/dist/module/colours.js.map +1 -0
  45. package/dist/module/components/AddButton.js +43 -0
  46. package/dist/module/components/AddButton.js.map +1 -0
  47. package/dist/module/components/AddToCalendarButton.js +225 -0
  48. package/dist/module/components/AddToCalendarButton.js.map +1 -0
  49. package/dist/module/components/Attachment.js +54 -0
  50. package/dist/module/components/Attachment.js.map +1 -0
  51. package/dist/module/components/AudienceSelectorLauncher.js +64 -0
  52. package/dist/module/components/AudienceSelectorLauncher.js.map +1 -0
  53. package/dist/module/components/AudienceSelectorPage.js +350 -0
  54. package/dist/module/components/AudienceSelectorPage.js.map +1 -0
  55. package/dist/module/components/AutoOffsetImage.js +186 -0
  56. package/dist/module/components/AutoOffsetImage.js.map +1 -0
  57. package/dist/module/components/BackButton.js +58 -0
  58. package/dist/module/components/BackButton.js.map +1 -0
  59. package/dist/module/components/CategoryTabs.js +154 -0
  60. package/dist/module/components/CategoryTabs.js.map +1 -0
  61. package/dist/module/components/CommentReply.js +328 -0
  62. package/dist/module/components/CommentReply.js.map +1 -0
  63. package/dist/module/components/CommentSection.js +822 -0
  64. package/dist/module/components/CommentSection.js.map +1 -0
  65. package/dist/module/components/ConfirmPopup.js +108 -0
  66. package/dist/module/components/ConfirmPopup.js.map +1 -0
  67. package/dist/module/components/ConfirmationPopup.js +72 -0
  68. package/dist/module/components/ConfirmationPopup.js.map +1 -0
  69. package/dist/module/components/DropDownItem.js +74 -0
  70. package/dist/module/components/DropDownItem.js.map +1 -0
  71. package/dist/module/components/DropDownMenu.js +41 -0
  72. package/dist/module/components/DropDownMenu.js.map +1 -0
  73. package/dist/module/components/EmptyStateMain.js +50 -0
  74. package/dist/module/components/EmptyStateMain.js.map +1 -0
  75. package/dist/module/components/EmptyStateWidget.js +47 -0
  76. package/dist/module/components/EmptyStateWidget.js.map +1 -0
  77. package/dist/module/components/FontScaleButton.js +36 -0
  78. package/dist/module/components/FontScaleButton.js.map +1 -0
  79. package/dist/module/components/FontScalePopup.js +75 -0
  80. package/dist/module/components/FontScalePopup.js.map +1 -0
  81. package/dist/module/components/FormCard.js +25 -0
  82. package/dist/module/components/FormCard.js.map +1 -0
  83. package/dist/module/components/FormCardSection.js +212 -0
  84. package/dist/module/components/FormCardSection.js.map +1 -0
  85. package/dist/module/components/FormCardSectionOptionLauncher.js +72 -0
  86. package/dist/module/components/FormCardSectionOptionLauncher.js.map +1 -0
  87. package/dist/module/components/FormattedText.js +131 -0
  88. package/dist/module/components/FormattedText.js.map +1 -0
  89. package/dist/module/components/GenericInput.js +148 -0
  90. package/dist/module/components/GenericInput.js.map +1 -0
  91. package/dist/module/components/GenericInputSection.js +158 -0
  92. package/dist/module/components/GenericInputSection.js.map +1 -0
  93. package/dist/module/components/Header.js +458 -0
  94. package/dist/module/components/Header.js.map +1 -0
  95. package/dist/module/components/ImagePopup.js +240 -0
  96. package/dist/module/components/ImagePopup.js.map +1 -0
  97. package/dist/module/components/ImageUploadProgress.js +68 -0
  98. package/dist/module/components/ImageUploadProgress.js.map +1 -0
  99. package/dist/module/components/ImageUploader.js +795 -0
  100. package/dist/module/components/ImageUploader.js.map +1 -0
  101. package/dist/module/components/InlineButton.js +65 -0
  102. package/dist/module/components/InlineButton.js.map +1 -0
  103. package/dist/module/components/Input.js +154 -0
  104. package/dist/module/components/Input.js.map +1 -0
  105. package/dist/module/components/LoadingCircles.js +220 -0
  106. package/dist/module/components/LoadingCircles.js.map +1 -0
  107. package/dist/module/components/LoadingIndicator.js +86 -0
  108. package/dist/module/components/LoadingIndicator.js.map +1 -0
  109. package/dist/module/components/LoadingStateWidget.js +46 -0
  110. package/dist/module/components/LoadingStateWidget.js.map +1 -0
  111. package/dist/module/components/MediaPlayer.js +418 -0
  112. package/dist/module/components/MediaPlayer.js.map +1 -0
  113. package/dist/module/components/MiddlePopup.js +43 -0
  114. package/dist/module/components/MiddlePopup.js.map +1 -0
  115. package/dist/module/components/PDFPopup.js +191 -0
  116. package/dist/module/components/PDFPopup.js.map +1 -0
  117. package/dist/module/components/PlussChat.js +986 -0
  118. package/dist/module/components/PlussChat.js.map +1 -0
  119. package/dist/module/components/PlussChatMessage.js +262 -0
  120. package/dist/module/components/PlussChatMessage.js.map +1 -0
  121. package/dist/module/components/PlussChatTime.js +58 -0
  122. package/dist/module/components/PlussChatTime.js.map +1 -0
  123. package/dist/module/components/Popup.js +125 -0
  124. package/dist/module/components/Popup.js.map +1 -0
  125. package/dist/module/components/PopupMenu.js +119 -0
  126. package/dist/module/components/PopupMenu.js.map +1 -0
  127. package/dist/module/components/PositionedImage.js +313 -0
  128. package/dist/module/components/PositionedImage.js.map +1 -0
  129. package/dist/module/components/ProfilePic.js +106 -0
  130. package/dist/module/components/ProfilePic.js.map +1 -0
  131. package/dist/module/components/RadioButton.js +77 -0
  132. package/dist/module/components/RadioButton.js.map +1 -0
  133. package/dist/module/components/Reaction.js +116 -0
  134. package/dist/module/components/Reaction.js.map +1 -0
  135. package/dist/module/components/Reactions.js +71 -0
  136. package/dist/module/components/Reactions.js.map +1 -0
  137. package/dist/module/components/SharingTools.js +154 -0
  138. package/dist/module/components/SharingTools.js.map +1 -0
  139. package/dist/module/components/Spinner.js +22 -0
  140. package/dist/module/components/Spinner.js.map +1 -0
  141. package/dist/module/components/StickyFooter.js +34 -0
  142. package/dist/module/components/StickyFooter.js.map +1 -0
  143. package/dist/module/components/TextStyle.js +45 -0
  144. package/dist/module/components/TextStyle.js.map +1 -0
  145. package/dist/module/components/Toggle.js +65 -0
  146. package/dist/module/components/Toggle.js.map +1 -0
  147. package/dist/module/components/TouchableSearchBar.js +67 -0
  148. package/dist/module/components/TouchableSearchBar.js.map +1 -0
  149. package/dist/module/components/UserListPopup.js +135 -0
  150. package/dist/module/components/UserListPopup.js.map +1 -0
  151. package/dist/module/components/UserListing.js +267 -0
  152. package/dist/module/components/UserListing.js.map +1 -0
  153. package/dist/module/components/VideoPopup.js +113 -0
  154. package/dist/module/components/VideoPopup.js.map +1 -0
  155. package/dist/module/components/WarningPopup.js +82 -0
  156. package/dist/module/components/WarningPopup.js.map +1 -0
  157. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js +289 -0
  158. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js.map +1 -0
  159. package/dist/module/components/expo-image-picker-multiple/ImageTile.js +116 -0
  160. package/dist/module/components/expo-image-picker-multiple/ImageTile.js.map +1 -0
  161. package/dist/module/components/index.js +55 -0
  162. package/dist/module/components/index.js.map +1 -0
  163. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +385 -0
  164. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js.map +1 -0
  165. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js +387 -0
  166. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js.map +1 -0
  167. package/dist/module/config.js +32 -0
  168. package/dist/module/config.js.map +1 -0
  169. package/dist/module/constants.js +19 -0
  170. package/dist/module/constants.js.map +1 -0
  171. package/dist/module/fonts/index.js +2 -0
  172. package/dist/module/fonts/index.js.map +1 -0
  173. package/dist/module/fonts/pluss60-icons.js +5 -0
  174. package/dist/module/fonts/pluss60-icons.js.map +1 -0
  175. package/dist/module/fonts/pluss60-icons.json +1097 -0
  176. package/dist/module/helper.js +397 -0
  177. package/dist/module/helper.js.map +1 -0
  178. package/dist/module/index.js +13 -0
  179. package/dist/module/index.js.map +1 -0
  180. package/dist/module/js/images/detectFaces.js +30 -0
  181. package/dist/module/js/images/detectFaces.js.map +1 -0
  182. package/dist/module/js/images/findLandmarkRange.js +93 -0
  183. package/dist/module/js/images/findLandmarkRange.js.map +1 -0
  184. package/dist/module/js/images/getScaledOffset.js +81 -0
  185. package/dist/module/js/images/getScaledOffset.js.map +1 -0
  186. package/dist/module/js/site/getSiteLevelFromState.js +29 -0
  187. package/dist/module/js/site/getSiteLevelFromState.js.map +1 -0
  188. package/dist/module/js/site/isTVEnabled.js +10 -0
  189. package/dist/module/js/site/isTVEnabled.js.map +1 -0
  190. package/dist/module/session.js +58 -0
  191. package/dist/module/session.js.map +1 -0
  192. package/dist/module/styles.js +67 -0
  193. package/dist/module/styles.js.map +1 -0
  194. package/package.json +20 -24
  195. package/src/js/images/detectFaces.js +8 -4
@@ -0,0 +1,795 @@
1
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
+ import React, { Component } from 'react';
5
+ import { View, ScrollView, TouchableOpacity, Text, Platform, Linking, Modal, Dimensions, StyleSheet, ImageBackground } from 'react-native';
6
+ import { connect } from 'react-redux';
7
+ import { Icon } from 'react-native-elements';
8
+ import _ from 'lodash';
9
+ import { Camera } from 'expo-camera';
10
+ import * as MediaLibrary from 'expo-media-library';
11
+ import * as ImageManipulator from 'expo-image-manipulator';
12
+ import * as ImagePicker from 'expo-image-picker';
13
+ import ImageBrowser from './expo-image-picker-multiple/ImageBrowser';
14
+ import ExpoImageManipulator from './react-native-expo-image-cropper/ExpoImageManipulator';
15
+ import Header from './Header';
16
+ import { Popup } from './Popup';
17
+ import { PopupMenu } from './PopupMenu';
18
+ import { InlineButton } from './InlineButton';
19
+ import { getValueOrDefault, getThumb300, isVideo } from '../helper';
20
+ import { getMainBrandingColourFromState, BOXGREY, INACTIVE_BUTTON, TEXT_BLUEGREY, TEXT_DARK, LINEGREY } from '../colours';
21
+ import Config from '../config';
22
+ import { fileActions } from '../apis';
23
+ import { stockImagesLoaded, imageLibraryLoaded } from '../actions';
24
+ const SCREEN_WIDTH = Dimensions.get('window').width;
25
+ const SCREEN_HEIGHT = Dimensions.get('window').height;
26
+ const DEFAULT_ASPECT = [1, 1];
27
+ const DEFAULT_ALLOWS_EDITING = true;
28
+ const DEFAULT_ALLOWS_IOS_CAMERA_EDITING = false;
29
+ const DEFAULT_EXIF = true;
30
+ const DEFULAT_IMAGE_TYPE = 'jpeg';
31
+ const DEFAULT_IMAGE_NAME = 'image';
32
+ const DEFAULT_VIDEO_NAME = 'video';
33
+ const DEFAULT_SIZE = {
34
+ width: 1400
35
+ };
36
+ const DEFAULT_COMPRESSION = 0.8;
37
+ class ImageUploader extends Component {
38
+ constructor(props) {
39
+ super(props);
40
+ _defineProperty(this, "loadLocalAlbums", async () => {
41
+ const hasPermission = await MediaLibrary.getPermissionsAsync();
42
+ if (!hasPermission.granted) return;
43
+ this.setState({
44
+ loadingLocalFolders: true
45
+ }, async () => {
46
+ try {
47
+ const localAlbums = await MediaLibrary.getAlbumsAsync({
48
+ includeSmartAlbums: true
49
+ });
50
+ this.setState({
51
+ loadingLocalFolders: false,
52
+ localAlbums: [{
53
+ title: 'All Photos',
54
+ id: ''
55
+ }, ...localAlbums]
56
+ });
57
+ } catch (error) {
58
+ console.log('loadLocalAlbums - error', error);
59
+ this.setState({
60
+ loadingLocalFolders: false
61
+ });
62
+ }
63
+ });
64
+ });
65
+ _defineProperty(this, "loadRemoteAlbums", () => {
66
+ this.setState({
67
+ loadingRemoteFolders: true
68
+ }, async () => {
69
+ try {
70
+ const stockImages = await fileActions.getStockPhotos();
71
+ this.props.stockImagesLoaded(stockImages);
72
+ const libraryRes = await fileActions.getMediaFolders(this.props.user.site);
73
+ this.props.imageLibraryLoaded(libraryRes.data);
74
+ } catch (error) {
75
+ console.log('loadRemoteAlbums - error', error);
76
+ } finally {
77
+ this.setState({
78
+ loadingRemoteFolders: false
79
+ });
80
+ }
81
+ });
82
+ });
83
+ _defineProperty(this, "retryUpload", async (mediaUri, uploadUri) => {
84
+ try {
85
+ const uri = isVideo(uploadUri) ? mediaUri : (await this.resizeImageAsync(mediaUri)).uri;
86
+ const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {
87
+ if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
88
+ });
89
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);
90
+ console.log('upload(retry) success', Config.env.baseUploadsUrl + res.key);
91
+ } catch (e) {
92
+ console.log('retryUpload error', e);
93
+ this.props.onUploadFailed(uploadUri);
94
+ }
95
+ });
96
+ _defineProperty(this, "resizeImageAsync", async uri => {
97
+ const actions = [{
98
+ resize: getValueOrDefault(this.props.size, DEFAULT_SIZE)
99
+ }];
100
+ const saveOptions = {
101
+ format: DEFULAT_IMAGE_TYPE,
102
+ compress: getValueOrDefault(this.props.quality, DEFAULT_COMPRESSION),
103
+ base64: true
104
+ };
105
+ return await ImageManipulator.manipulateAsync(uri, actions, saveOptions);
106
+ });
107
+ _defineProperty(this, "handleImagePicked", async imageUri => {
108
+ let uploadUri;
109
+ try {
110
+ const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;
111
+ this.hideUploadMenu();
112
+ const resized = await this.resizeImageAsync(imageUri);
113
+ const blob = await fileActions.imageToBlob(resized.uri);
114
+ const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);
115
+ uploadUri = presignedUriRes.key;
116
+ this.props.onUploadStarted(uploadUri, imageUri);
117
+ if (this.props.onlySelectImage) {
118
+ this.props.onImageSelected(resized, fileName);
119
+ return;
120
+ }
121
+ const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {
122
+ if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
123
+ });
124
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);
125
+ console.log('upload success', Config.env.baseUploadsUrl + uploadUri);
126
+ } catch (e) {
127
+ console.log('handleImagePicked error', e);
128
+ this.props.onUploadFailed(uploadUri);
129
+ }
130
+ });
131
+ _defineProperty(this, "handleMultiImagePicked", async imagesSelected => {
132
+ // Signal start of all images selected
133
+ const imagesUploaded = imagesSelected.map(image => {
134
+ const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;
135
+ const uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
136
+ return {
137
+ imageUri: image.uri,
138
+ uploadUri,
139
+ fileName
140
+ };
141
+ });
142
+ this.hideUploadMenu();
143
+
144
+ // Sequentially upload all imagesUploaded
145
+ for (let i = 0; i < imagesUploaded.length; i++) {
146
+ const image = imagesUploaded[i];
147
+ const {
148
+ imageUri,
149
+ uploadUri,
150
+ fileName
151
+ } = image;
152
+ try {
153
+ const resized = await this.resizeImageAsync(imageUri);
154
+ const blob = await fileActions.imageToBlob(resized.uri);
155
+ if (this.props.onlySelectImage) {
156
+ this.props.onImageSelected(resized, fileName);
157
+ return;
158
+ }
159
+ const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);
160
+ const uploadUri = presignedUriRes.key;
161
+ if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, imageUri);
162
+ const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {
163
+ if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
164
+ });
165
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);
166
+ console.log('upload success', Config.env.baseUploadsUrl + uploadUri);
167
+ } catch (e) {
168
+ console.log('handleMultiImagePicked error', e);
169
+ this.props.onUploadFailed(uploadUri);
170
+ }
171
+ }
172
+ });
173
+ _defineProperty(this, "handleVideoPicked", async uri => {
174
+ let uploadUri;
175
+ try {
176
+ const fileType = uri.substring(uri.lastIndexOf('.') + 1);
177
+ const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_VIDEO_NAME)}.${fileType}`;
178
+ uploadUri = await fileActions.getPresignedUrl(fileName);
179
+ this.props.onUploadStarted(uploadUri, uri);
180
+ this.hideUploadMenu();
181
+ const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {
182
+ if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
183
+ });
184
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);
185
+ console.log('upload success', Config.env.baseUploadsUrl + res.key);
186
+ } catch (e) {
187
+ console.log('handleVideoPicked error', e);
188
+ this.props.onUploadFailed(uploadUri);
189
+ }
190
+ });
191
+ _defineProperty(this, "askPermissionsAsync", async () => {
192
+ var _this$state$localAlbu;
193
+ const cameraPermission = await Camera.requestCameraPermissionsAsync();
194
+ const rollPermission = await MediaLibrary.requestPermissionsAsync();
195
+ if (cameraPermission.status !== 'granted' || rollPermission.status !== 'granted') {
196
+ this.showWarningPopup(cameraPermission.status !== 'granted', rollPermission.status !== 'granted');
197
+ return false;
198
+ }
199
+ if (((_this$state$localAlbu = this.state.localAlbums) === null || _this$state$localAlbu === void 0 ? void 0 : _this$state$localAlbu.length) <= 0) this.loadLocalAlbums();
200
+ return true;
201
+ });
202
+ _defineProperty(this, "isEditingEnabled", () => {
203
+ return false;
204
+ return !this.props.multiple && !this.props.allowVideo && getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_EDITING);
205
+ });
206
+ // NOTE: No longer used (replaced by openPhotos)
207
+ _defineProperty(this, "openCameraRoll", async () => {
208
+ if (!(await this.askPermissionsAsync())) return;
209
+ const result = await ImagePicker.launchImageLibraryAsync({
210
+ mediaTypes: ImagePicker.MediaTypeOptions.Images,
211
+ allowsEditing: this.isEditingEnabled(),
212
+ aspect: getValueOrDefault(this.props.aspect, DEFAULT_ASPECT),
213
+ exif: true,
214
+ base64: true
215
+ });
216
+ if (!result.cancelled) this.handleImagePicked(result.uri);
217
+ });
218
+ // NOTE: No longer used (replaced by openPhotos)
219
+ _defineProperty(this, "openVideoRoll", async () => {
220
+ if (!(await this.askPermissionsAsync())) return;
221
+ const result = await ImagePicker.launchImageLibraryAsync({
222
+ mediaTypes: ImagePicker.MediaTypeOptions.Videos,
223
+ allowsEditing: this.isEditingEnabled()
224
+ });
225
+ if (!result.cancelled) this.handleVideoPicked(result.uri);
226
+ });
227
+ _defineProperty(this, "openCamera", async () => {
228
+ if (!(await this.askPermissionsAsync())) return;
229
+ let editingAllowed = this.isEditingEnabled();
230
+ if (Platform.OS === 'ios') {
231
+ editingAllowed = getValueOrDefault(this.props.allowsEditingIOSCamera, getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_IOS_CAMERA_EDITING));
232
+ }
233
+ const result = await ImagePicker.launchCameraAsync({
234
+ allowsEditing: editingAllowed,
235
+ aspect: getValueOrDefault(this.props.aspect, DEFAULT_ASPECT),
236
+ exif: getValueOrDefault(this.props.exif, DEFAULT_EXIF)
237
+ });
238
+ if (!result.cancelled) this.handleImagePicked(result.uri);
239
+ });
240
+ _defineProperty(this, "openVideoCamera", async () => {
241
+ if (!(await this.askPermissionsAsync())) return;
242
+ const result = await ImagePicker.launchCameraAsync({
243
+ allowsEditing: this.isEditingEnabled(),
244
+ mediaTypes: ImagePicker.MediaTypeOptions.Videos
245
+ });
246
+ if (!result.cancelled) this.handleVideoPicked(result.uri);
247
+ });
248
+ _defineProperty(this, "openLibrary", async () => {
249
+ this.setState({
250
+ showUploadMenu: false,
251
+ showPhotos: true,
252
+ selected: [],
253
+ showRemote: true,
254
+ selectedAlbumId: ''
255
+ });
256
+ });
257
+ _defineProperty(this, "openPhotos", async () => {
258
+ if (!(await this.askPermissionsAsync())) return;
259
+ this.setState({
260
+ showUploadMenu: false,
261
+ showPhotos: true,
262
+ selected: [],
263
+ showRemote: false,
264
+ selectedAlbumId: ''
265
+ });
266
+ });
267
+ _defineProperty(this, "hidePhotos", () => {
268
+ this.setState({
269
+ showPhotos: false
270
+ });
271
+ });
272
+ _defineProperty(this, "openCropper", () => {
273
+ this.setState({
274
+ showPhotos: false,
275
+ showCropper: true
276
+ });
277
+ });
278
+ _defineProperty(this, "toggleCropper", () => {
279
+ this.setState({
280
+ showCropper: !this.state.showCropper
281
+ });
282
+ });
283
+ _defineProperty(this, "onSelectAlbum", () => {
284
+ this.setState({
285
+ showSelectAlbum: true
286
+ });
287
+ });
288
+ _defineProperty(this, "onSelectAlbumClosed", () => {
289
+ this.setState({
290
+ showSelectAlbum: false
291
+ });
292
+ });
293
+ _defineProperty(this, "onAlbumSelected", selectedAlbumId => {
294
+ this.setState({
295
+ showSelectAlbum: false,
296
+ selectedAlbumId
297
+ });
298
+ });
299
+ _defineProperty(this, "onSelectionChange", (selected, videoSelected, onAttach) => {
300
+ this.setState({
301
+ selected,
302
+ selectedType: videoSelected ? 'video' : 'image',
303
+ onAttach
304
+ });
305
+ });
306
+ _defineProperty(this, "onSelected", async callback => {
307
+ if (this.isEditingEnabled()) {
308
+ this.openCropper();
309
+ } else {
310
+ const mediaSelected = await callback;
311
+ // console.log('mediaSelected', mediaSelected);
312
+ if (this.state.showRemote) {
313
+ if (this.props.onLibrarySelected) {
314
+ mediaSelected.map(media => {
315
+ this.props.onLibrarySelected(media.uri);
316
+ });
317
+ }
318
+ } else {
319
+ if (mediaSelected[0].mediaType === MediaLibrary.MediaType.video) {
320
+ const uri = mediaSelected[0].localUri || mediaSelected[0].uri;
321
+ this.handleVideoPicked(uri);
322
+ } else {
323
+ this.handleMultiImagePicked(mediaSelected);
324
+ }
325
+ }
326
+ this.hidePhotos();
327
+ }
328
+ });
329
+ _defineProperty(this, "onRemoveImage", uri => {
330
+ const selected = [...this.state.selected];
331
+ const deleteIndex = selected.indexOf(uri);
332
+ selected.splice(deleteIndex, 1);
333
+ this.setState({
334
+ selected
335
+ });
336
+ });
337
+ _defineProperty(this, "buildOptions", () => {
338
+ const options = [{
339
+ text: 'Take photo',
340
+ onPress: this.openCamera
341
+ }];
342
+ if (this.props.allowVideo) options.push({
343
+ text: 'Record video',
344
+ onPress: this.openVideoCamera
345
+ });
346
+ options.push({
347
+ text: 'Camera Roll',
348
+ onPress: this.openPhotos
349
+ });
350
+ if (!this.props.hideLibrary) options.push({
351
+ text: 'Image Library',
352
+ onPress: this.openLibrary
353
+ });
354
+ return options;
355
+ });
356
+ _defineProperty(this, "renderSelectedComponent", selectedItemNumber => {
357
+ return /*#__PURE__*/React.createElement(View, {
358
+ style: styles.selectedItemContainer
359
+ }, /*#__PURE__*/React.createElement(View, {
360
+ style: [styles.selectedMarkerContainer, {
361
+ backgroundColor: this.props.colourBrandingMain
362
+ }]
363
+ }, this.props.multiple ? /*#__PURE__*/React.createElement(Text, {
364
+ style: styles.selectedItemText
365
+ }, selectedItemNumber) : /*#__PURE__*/React.createElement(Icon, {
366
+ name: "check",
367
+ type: "font-awesome",
368
+ iconStyle: styles.selectedItemIcon
369
+ })));
370
+ });
371
+ this.state = {
372
+ showUploadMenu: false,
373
+ warning: null,
374
+ showPhotos: false,
375
+ showRemote: false,
376
+ selected: [],
377
+ selectedType: '',
378
+ onAttach: null,
379
+ selectedAlbumId: '',
380
+ showSelectAlbum: false,
381
+ showCropper: false,
382
+ localAlbums: [],
383
+ loadingLocalFolders: false,
384
+ loadingRemoteFolders: false
385
+ };
386
+ }
387
+ componentDidMount() {
388
+ this.loadLocalAlbums();
389
+ this.loadRemoteAlbums();
390
+ }
391
+ showUploadMenu() {
392
+ this.setState({
393
+ showUploadMenu: true
394
+ });
395
+ }
396
+ hideUploadMenu() {
397
+ this.setState({
398
+ showUploadMenu: false
399
+ });
400
+ }
401
+ showWarningPopup(camera, roll) {
402
+ if (Platform.OS !== 'ios') {
403
+ return;
404
+ }
405
+ let innerWarning = '';
406
+ if (camera && roll) {
407
+ innerWarning = 'both your camera and photo library';
408
+ } else if (camera) {
409
+ innerWarning = 'your camera';
410
+ } else if (roll) {
411
+ innerWarning = 'your photo library';
412
+ } else {
413
+ // nothing to warn about
414
+ return;
415
+ }
416
+ this.setState({
417
+ warning: `You must grant access to ${innerWarning}. Tap Go to settings to change your permission settings.`
418
+ });
419
+ }
420
+ closeWarningPopup() {
421
+ this.setState({
422
+ warning: null
423
+ });
424
+ }
425
+ goToPermissionSettings() {
426
+ Linking.openURL('app-settings:');
427
+ this.setState({
428
+ warning: null
429
+ });
430
+ }
431
+ renderSelectionPreview() {
432
+ const {
433
+ selected,
434
+ showRemote
435
+ } = this.state;
436
+ return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(ScrollView, {
437
+ horizontal: true,
438
+ showsHorizontalScrollIndicator: false,
439
+ contentContainerStyle: styles.selectionPreviewContainer
440
+ }, selected && selected.map(uri => {
441
+ const imageUri = showRemote ? getThumb300(uri) : uri;
442
+ return /*#__PURE__*/React.createElement(View, {
443
+ key: uri,
444
+ style: styles.previewItemContainer
445
+ }, /*#__PURE__*/React.createElement(ImageBackground, {
446
+ style: styles.previewItemImage,
447
+ source: {
448
+ uri: imageUri
449
+ }
450
+ }), /*#__PURE__*/React.createElement(TouchableOpacity, {
451
+ style: styles.previewItemRemoveButton,
452
+ onPress: () => this.onRemoveImage(uri)
453
+ }, /*#__PURE__*/React.createElement(View, {
454
+ style: [styles.previewItemRemoveContainer, {
455
+ backgroundColor: this.props.colourBrandingMain
456
+ }]
457
+ }, /*#__PURE__*/React.createElement(Icon, {
458
+ name: "times",
459
+ type: "font-awesome",
460
+ iconStyle: styles.previewItemRemoveIcon
461
+ }))));
462
+ })));
463
+ }
464
+ renderSelectedAlbum() {
465
+ const {
466
+ localAlbums,
467
+ selectedAlbumId,
468
+ showRemote
469
+ } = this.state;
470
+ const selectedAlbum = (showRemote ? this.props.imageLibrary : localAlbums).find(album => album.id === selectedAlbumId);
471
+ const selectedAlbumText = selectedAlbum ? selectedAlbum.title : '';
472
+ return /*#__PURE__*/React.createElement(TouchableOpacity, {
473
+ onPress: this.onSelectAlbum
474
+ }, /*#__PURE__*/React.createElement(View, {
475
+ style: styles.selectAlbumButton
476
+ }, /*#__PURE__*/React.createElement(Text, {
477
+ style: styles.selectAlbumButtonText
478
+ }, selectedAlbumText), /*#__PURE__*/React.createElement(Icon, {
479
+ name: "angle-down",
480
+ type: "font-awesome",
481
+ iconStyle: styles.selectAlbumButtonIcon
482
+ })));
483
+ }
484
+ renderBrowser() {
485
+ const {
486
+ selected,
487
+ selectedAlbumId,
488
+ showRemote
489
+ } = this.state;
490
+ const {
491
+ imagesLimit,
492
+ multiple,
493
+ allowVideo,
494
+ imageLibrary
495
+ } = this.props;
496
+ const width = (SCREEN_WIDTH - 10 * 2) / 4;
497
+ return /*#__PURE__*/React.createElement(ImageBrowser, {
498
+ max: !multiple ? 1 : imagesLimit,
499
+ loadCount: 30,
500
+ onChange: this.onSelectionChange,
501
+ renderSelectedComponent: this.renderSelectedComponent,
502
+ callback: this.onSelected,
503
+ selected: selected,
504
+ allowVideo: allowVideo,
505
+ style: styles.browserContainer,
506
+ itemStyle: styles.itemContainer,
507
+ itemWidth: width,
508
+ itemHeight: width,
509
+ album: selectedAlbumId,
510
+ remoteAlbums: showRemote ? imageLibrary : null
511
+ });
512
+ }
513
+ renderAttachButton() {
514
+ const {
515
+ selected,
516
+ selectedType
517
+ } = this.state;
518
+ const canAttach = selected.length > 0 && !_.isEmpty(selectedType);
519
+ const attachText = `Attach ${canAttach ? selected.length : ''} ${canAttach ? selectedType : ''}${selected.length > 1 ? 's' : ''}`;
520
+ return /*#__PURE__*/React.createElement(View, {
521
+ style: styles.buttonContainer
522
+ }, /*#__PURE__*/React.createElement(InlineButton, {
523
+ color: canAttach ? this.props.colourBrandingMain : INACTIVE_BUTTON,
524
+ onPress: this.state.onAttach,
525
+ fillTouchable: true,
526
+ large: true,
527
+ disabled: !canAttach
528
+ }, attachText));
529
+ }
530
+ renderSelectAlbumPopup() {
531
+ const {
532
+ showSelectAlbum,
533
+ localAlbums,
534
+ showRemote
535
+ } = this.state;
536
+ if (!showSelectAlbum) return null;
537
+ return /*#__PURE__*/React.createElement(Modal, {
538
+ visible: true,
539
+ transparent: true,
540
+ animationType: "slide",
541
+ onRequestClose: this.onSelectAlbumClosed
542
+ }, /*#__PURE__*/React.createElement(View, {
543
+ style: styles.selectAlbumModal
544
+ }, /*#__PURE__*/React.createElement(View, {
545
+ style: styles.selectAlbumContainer
546
+ }, /*#__PURE__*/React.createElement(View, {
547
+ style: styles.selectAlbumTitleContainer
548
+ }, /*#__PURE__*/React.createElement(Text, {
549
+ style: styles.selectAlbumTitle
550
+ }, "Select Album")), /*#__PURE__*/React.createElement(ScrollView, null, (showRemote ? this.props.imageLibrary : localAlbums).map((album, index) => {
551
+ return /*#__PURE__*/React.createElement(TouchableOpacity, {
552
+ key: album.id,
553
+ onPress: () => this.onAlbumSelected(album.id)
554
+ }, /*#__PURE__*/React.createElement(View, {
555
+ style: [styles.albumOptionContainer, index === 0 && {
556
+ borderTopWidth: 0
557
+ }]
558
+ }, /*#__PURE__*/React.createElement(Text, {
559
+ style: styles.albumOptionText
560
+ }, album.title)));
561
+ })), /*#__PURE__*/React.createElement(TouchableOpacity, {
562
+ onPress: this.onSelectAlbumClosed
563
+ }, /*#__PURE__*/React.createElement(View, {
564
+ style: [styles.albumOptionContainer, {
565
+ marginHorizontal: 0
566
+ }]
567
+ }, /*#__PURE__*/React.createElement(Text, {
568
+ style: [styles.albumOptionText, {
569
+ color: this.props.colourBrandingMain
570
+ }]
571
+ }, "Cancel"))))));
572
+ }
573
+ renderPhotos() {
574
+ return /*#__PURE__*/React.createElement(Modal, {
575
+ visible: true,
576
+ transparent: true,
577
+ animationType: "slide",
578
+ onRequestClose: this.hidePhotos
579
+ }, /*#__PURE__*/React.createElement(Header, {
580
+ leftIcon: "angle-left",
581
+ onPressLeft: this.hidePhotos,
582
+ text: this.props.popupTitle || 'Attach image'
583
+ }), /*#__PURE__*/React.createElement(View, {
584
+ style: styles.contentContainer
585
+ }, this.renderSelectionPreview(), this.renderSelectedAlbum(), this.renderBrowser()), this.renderAttachButton(), this.renderSelectAlbumPopup());
586
+ }
587
+ render() {
588
+ const {
589
+ warning,
590
+ showUploadMenu,
591
+ showPhotos,
592
+ showCropper,
593
+ selected
594
+ } = this.state;
595
+ if (warning != null) {
596
+ return /*#__PURE__*/React.createElement(Popup, {
597
+ title: "Permissions missing",
598
+ text: warning,
599
+ options: [{
600
+ text: 'Go to settings',
601
+ action: this.goToPermissionSettings.bind(this),
602
+ bold: true
603
+ }, {
604
+ text: 'Ignore',
605
+ action: this.closeWarningPopup.bind(this)
606
+ }]
607
+ });
608
+ }
609
+ if (showUploadMenu) {
610
+ const options = this.buildOptions();
611
+ return /*#__PURE__*/React.createElement(PopupMenu, {
612
+ onClose: this.hideUploadMenu.bind(this),
613
+ options: options,
614
+ title: this.props.popupTitle,
615
+ cancelText: "Cancel"
616
+ });
617
+ }
618
+ if (showPhotos) return this.renderPhotos();
619
+ if (showCropper) {
620
+ return /*#__PURE__*/React.createElement(ExpoImageManipulator, {
621
+ photo: {
622
+ uri: selected[0]
623
+ },
624
+ onToggleModal: this.toggleCropper,
625
+ isVisible: showCropper,
626
+ onPictureChoosed: data => {
627
+ this.handleImagePicked(data.uri);
628
+ }
629
+ });
630
+ }
631
+ return null;
632
+ }
633
+ }
634
+ const styles = StyleSheet.create({
635
+ contentContainer: {
636
+ flex: 1,
637
+ backgroundColor: BOXGREY
638
+ },
639
+ browserContainer: {
640
+ padding: 10
641
+ },
642
+ itemContainer: {
643
+ padding: 4
644
+ },
645
+ selectedItemContainer: {
646
+ flex: 1,
647
+ backgroundColor: '#0008'
648
+ },
649
+ selectedMarkerContainer: {
650
+ position: 'absolute',
651
+ top: 6,
652
+ right: 6,
653
+ width: 20,
654
+ height: 20,
655
+ borderRadius: 10,
656
+ alignItems: 'center',
657
+ justifyContent: 'center'
658
+ },
659
+ selectedItemText: {
660
+ fontFamily: 'sf-semibold',
661
+ fontSize: 12,
662
+ color: '#fff',
663
+ marginBottom: 1
664
+ },
665
+ selectedItemIcon: {
666
+ fontSize: 12,
667
+ color: '#fff',
668
+ marginBottom: 1
669
+ },
670
+ buttonContainer: {
671
+ alignItems: 'center',
672
+ justifyContent: 'center',
673
+ height: 60,
674
+ paddingHorizontal: 14,
675
+ backgroundColor: '#fff'
676
+ },
677
+ selectAlbumButton: {
678
+ paddingTop: 13,
679
+ paddingHorizontal: 14,
680
+ flexDirection: 'row',
681
+ alignItems: 'center'
682
+ },
683
+ selectAlbumButtonText: {
684
+ fontFamily: 'sf-medium',
685
+ fontSize: 14,
686
+ color: TEXT_BLUEGREY,
687
+ marginRight: 6
688
+ },
689
+ selectAlbumButtonIcon: {
690
+ fontSize: 20,
691
+ color: TEXT_BLUEGREY
692
+ },
693
+ selectAlbumModal: {
694
+ position: 'absolute',
695
+ bottom: 0,
696
+ left: 0,
697
+ right: 0,
698
+ top: 0,
699
+ backgroundColor: 'rgba(0,0,0,0.5)',
700
+ zIndex: 1000
701
+ },
702
+ selectAlbumContainer: {
703
+ position: 'absolute',
704
+ bottom: 0,
705
+ left: 0,
706
+ right: 0,
707
+ backgroundColor: '#fff',
708
+ borderTopLeftRadius: 12,
709
+ borderTopRightRadius: 12,
710
+ maxHeight: SCREEN_HEIGHT / 2
711
+ },
712
+ selectAlbumTitleContainer: {
713
+ padding: 16,
714
+ borderColor: LINEGREY,
715
+ borderBottomWidth: 1
716
+ },
717
+ selectAlbumTitle: {
718
+ fontFamily: 'sf-semibold',
719
+ fontSize: 16,
720
+ textAlign: 'center',
721
+ color: TEXT_DARK
722
+ },
723
+ albumOptionContainer: {
724
+ marginHorizontal: 16,
725
+ paddingVertical: 16,
726
+ borderColor: LINEGREY,
727
+ borderTopWidth: 1
728
+ },
729
+ albumOptionText: {
730
+ fontFamily: 'sf-regular',
731
+ fontSize: 16,
732
+ textAlign: 'center',
733
+ color: TEXT_DARK
734
+ },
735
+ selectionPreviewContainer: {
736
+ paddingTop: 14,
737
+ paddingRight: 2,
738
+ paddingLeft: 14
739
+ },
740
+ previewItemContainer: {
741
+ marginRight: 12
742
+ },
743
+ previewItemImage: {
744
+ width: 50,
745
+ height: 50,
746
+ alignItems: 'center',
747
+ justifyContent: 'center',
748
+ borderRadius: 4,
749
+ overflow: 'hidden'
750
+ },
751
+ previewItemRemoveButton: {
752
+ position: 'absolute',
753
+ top: -8,
754
+ right: -8
755
+ },
756
+ previewItemRemoveContainer: {
757
+ justifyContent: 'center',
758
+ alignItems: 'center',
759
+ borderRadius: 10,
760
+ width: 20,
761
+ height: 20,
762
+ borderWidth: 2,
763
+ borderColor: '#fff'
764
+ },
765
+ previewItemRemoveIcon: {
766
+ fontSize: 10,
767
+ color: '#fff',
768
+ marginBottom: 1
769
+ }
770
+ });
771
+ const mapStateToProps = state => {
772
+ const {
773
+ user,
774
+ media
775
+ } = state;
776
+ const imageLibrary = media.imageLibrary.filter(folder => !folder.Public).map(album => {
777
+ return {
778
+ title: album.Name,
779
+ id: album.RowId || '',
780
+ images: album.RowId ? album.Images : media.stockImages
781
+ };
782
+ });
783
+ return {
784
+ user,
785
+ imageLibrary,
786
+ colourBrandingMain: getMainBrandingColourFromState(state)
787
+ };
788
+ };
789
+ export default connect(mapStateToProps, {
790
+ stockImagesLoaded,
791
+ imageLibraryLoaded
792
+ }, null, {
793
+ forwardRef: true
794
+ })(ImageUploader);
795
+ //# sourceMappingURL=ImageUploader.js.map