@plusscommunities/pluss-core-app 6.1.7 → 6.1.8-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 (320) hide show
  1. package/dist/module/actions/FollowerActions.js +4 -4
  2. package/dist/module/actions/FollowerActions.js.map +1 -1
  3. package/dist/module/actions/MediaActions.js +1 -1
  4. package/dist/module/actions/MediaActions.js.map +1 -1
  5. package/dist/module/actions/ResidentActions.js +1 -1
  6. package/dist/module/actions/ResidentActions.js.map +1 -1
  7. package/dist/module/actions/UserActions.js +1 -1
  8. package/dist/module/actions/UserActions.js.map +1 -1
  9. package/dist/module/actions/UserSettingsActions.js +1 -1
  10. package/dist/module/actions/UserSettingsActions.js.map +1 -1
  11. package/dist/module/actions/index.js +5 -5
  12. package/dist/module/actions/index.js.map +1 -1
  13. package/dist/module/actions/types.js +16 -16
  14. package/dist/module/actions/types.js.map +1 -1
  15. package/dist/module/apis/analyticsActions.js +5 -5
  16. package/dist/module/apis/analyticsActions.js.map +1 -1
  17. package/dist/module/apis/contactActions.js +6 -6
  18. package/dist/module/apis/contactActions.js.map +1 -1
  19. package/dist/module/apis/eventActions.js +28 -28
  20. package/dist/module/apis/eventActions.js.map +1 -1
  21. package/dist/module/apis/fileActions.js +21 -28
  22. package/dist/module/apis/fileActions.js.map +1 -1
  23. package/dist/module/apis/followerActions.js +8 -8
  24. package/dist/module/apis/followerActions.js.map +1 -1
  25. package/dist/module/apis/index.js +12 -12
  26. package/dist/module/apis/index.js.map +1 -1
  27. package/dist/module/apis/notificationActions.js +17 -17
  28. package/dist/module/apis/notificationActions.js.map +1 -1
  29. package/dist/module/apis/profileActions.js +4 -4
  30. package/dist/module/apis/profileActions.js.map +1 -1
  31. package/dist/module/apis/reactionActions.js +15 -15
  32. package/dist/module/apis/reactionActions.js.map +1 -1
  33. package/dist/module/apis/settingActions.js +6 -6
  34. package/dist/module/apis/settingActions.js.map +1 -1
  35. package/dist/module/apis/stringActions.js +8 -8
  36. package/dist/module/apis/stringActions.js.map +1 -1
  37. package/dist/module/apis/typeActions.js +4 -4
  38. package/dist/module/apis/typeActions.js.map +1 -1
  39. package/dist/module/apis/userActions.js +8 -8
  40. package/dist/module/apis/userActions.js.map +1 -1
  41. package/dist/module/assets/icons/fontawesome/fa-brands-400.ttf +0 -0
  42. package/dist/module/assets/icons/fontawesome/fa-light-300.ttf +0 -0
  43. package/dist/module/assets/icons/fontawesome/fa-regular-400.ttf +0 -0
  44. package/dist/module/assets/icons/fontawesome/fa-solid-900.ttf +0 -0
  45. package/dist/module/assets/icons/fontawesome/fa-thin-100.ttf +0 -0
  46. package/dist/module/assets/icons/fontawesome/fa7-glyphmap.json +4205 -0
  47. package/dist/module/colours.js +26 -29
  48. package/dist/module/colours.js.map +1 -1
  49. package/dist/module/components/AddButton.js +8 -8
  50. package/dist/module/components/AddButton.js.map +1 -1
  51. package/dist/module/components/AddToCalendarButton.js +30 -29
  52. package/dist/module/components/AddToCalendarButton.js.map +1 -1
  53. package/dist/module/components/Attachment.js +10 -9
  54. package/dist/module/components/Attachment.js.map +1 -1
  55. package/dist/module/components/AudienceSelectorLauncher.js +11 -11
  56. package/dist/module/components/AudienceSelectorLauncher.js.map +1 -1
  57. package/dist/module/components/AudienceSelectorPage.js +45 -44
  58. package/dist/module/components/AudienceSelectorPage.js.map +1 -1
  59. package/dist/module/components/AutoOffsetImage.js +13 -13
  60. package/dist/module/components/AutoOffsetImage.js.map +1 -1
  61. package/dist/module/components/BackButton.js +10 -10
  62. package/dist/module/components/BackButton.js.map +1 -1
  63. package/dist/module/components/CalendarPopup.js +21 -21
  64. package/dist/module/components/CalendarPopup.js.map +1 -1
  65. package/dist/module/components/CategoryTabs.js +30 -29
  66. package/dist/module/components/CategoryTabs.js.map +1 -1
  67. package/dist/module/components/CommentReply.js +36 -34
  68. package/dist/module/components/CommentReply.js.map +1 -1
  69. package/dist/module/components/CommentSection.js +74 -74
  70. package/dist/module/components/CommentSection.js.map +1 -1
  71. package/dist/module/components/ConfirmPopup.js +21 -20
  72. package/dist/module/components/ConfirmPopup.js.map +1 -1
  73. package/dist/module/components/ConfirmationPopup.js +11 -11
  74. package/dist/module/components/ConfirmationPopup.js.map +1 -1
  75. package/dist/module/components/DocumentUploader.js +253 -0
  76. package/dist/module/components/DocumentUploader.js.map +1 -0
  77. package/dist/module/components/DropDownItem.js +14 -13
  78. package/dist/module/components/DropDownItem.js.map +1 -1
  79. package/dist/module/components/DropDownMenu.js +5 -5
  80. package/dist/module/components/DropDownMenu.js.map +1 -1
  81. package/dist/module/components/EmptyStateMain.js +10 -9
  82. package/dist/module/components/EmptyStateMain.js.map +1 -1
  83. package/dist/module/components/EmptyStateWidget.js +7 -6
  84. package/dist/module/components/EmptyStateWidget.js.map +1 -1
  85. package/dist/module/components/FontScaleButton.js +5 -4
  86. package/dist/module/components/FontScaleButton.js.map +1 -1
  87. package/dist/module/components/FontScalePopup.js +11 -10
  88. package/dist/module/components/FontScalePopup.js.map +1 -1
  89. package/dist/module/components/Forbidden.js +13 -13
  90. package/dist/module/components/Forbidden.js.map +1 -1
  91. package/dist/module/components/FormCard.js +4 -4
  92. package/dist/module/components/FormCard.js.map +1 -1
  93. package/dist/module/components/FormCardSection.js +20 -18
  94. package/dist/module/components/FormCardSection.js.map +1 -1
  95. package/dist/module/components/FormCardSectionOptionLauncher.js +13 -12
  96. package/dist/module/components/FormCardSectionOptionLauncher.js.map +1 -1
  97. package/dist/module/components/FormattedText.js +18 -16
  98. package/dist/module/components/FormattedText.js.map +1 -1
  99. package/dist/module/components/GenericInput.js +24 -21
  100. package/dist/module/components/GenericInput.js.map +1 -1
  101. package/dist/module/components/GenericInputSection.js +27 -26
  102. package/dist/module/components/GenericInputSection.js.map +1 -1
  103. package/dist/module/components/Header.js +70 -69
  104. package/dist/module/components/Header.js.map +1 -1
  105. package/dist/module/components/Icon.js +109 -0
  106. package/dist/module/components/Icon.js.map +1 -0
  107. package/dist/module/components/ImagePopup.js +237 -77
  108. package/dist/module/components/ImagePopup.js.map +1 -1
  109. package/dist/module/components/ImageUploadProgress.js +10 -9
  110. package/dist/module/components/ImageUploadProgress.js.map +1 -1
  111. package/dist/module/components/ImageUploader.js +22 -13
  112. package/dist/module/components/ImageUploader.js.map +1 -1
  113. package/dist/module/components/InlineButton.js +9 -8
  114. package/dist/module/components/InlineButton.js.map +1 -1
  115. package/dist/module/components/Input.js +28 -26
  116. package/dist/module/components/Input.js.map +1 -1
  117. package/dist/module/components/LoadingCircles.js +20 -20
  118. package/dist/module/components/LoadingCircles.js.map +1 -1
  119. package/dist/module/components/LoadingIndicator.js +11 -11
  120. package/dist/module/components/LoadingIndicator.js.map +1 -1
  121. package/dist/module/components/LoadingStateWidget.js +5 -5
  122. package/dist/module/components/LoadingStateWidget.js.map +1 -1
  123. package/dist/module/components/MediaPlayer.js +32 -32
  124. package/dist/module/components/MediaPlayer.js.map +1 -1
  125. package/dist/module/components/MiddlePopup.js +9 -9
  126. package/dist/module/components/MiddlePopup.js.map +1 -1
  127. package/dist/module/components/PDFPopup.js +36 -36
  128. package/dist/module/components/PDFPopup.js.map +1 -1
  129. package/dist/module/components/PlussChat.js +234 -146
  130. package/dist/module/components/PlussChat.js.map +1 -1
  131. package/dist/module/components/PlussChatMessage.js +75 -38
  132. package/dist/module/components/PlussChatMessage.js.map +1 -1
  133. package/dist/module/components/PlussChatTime.js +18 -17
  134. package/dist/module/components/PlussChatTime.js.map +1 -1
  135. package/dist/module/components/Popup.js +20 -19
  136. package/dist/module/components/Popup.js.map +1 -1
  137. package/dist/module/components/PopupMenu.js +15 -14
  138. package/dist/module/components/PopupMenu.js.map +1 -1
  139. package/dist/module/components/PositionedImage.js +20 -20
  140. package/dist/module/components/PositionedImage.js.map +1 -1
  141. package/dist/module/components/ProfilePic.js +10 -10
  142. package/dist/module/components/ProfilePic.js.map +1 -1
  143. package/dist/module/components/RadioButton.js +10 -9
  144. package/dist/module/components/RadioButton.js.map +1 -1
  145. package/dist/module/components/Reaction.js +18 -17
  146. package/dist/module/components/Reaction.js.map +1 -1
  147. package/dist/module/components/Reactions.js +7 -7
  148. package/dist/module/components/Reactions.js.map +1 -1
  149. package/dist/module/components/SharingTools.js +29 -28
  150. package/dist/module/components/SharingTools.js.map +1 -1
  151. package/dist/module/components/Spinner.js +5 -5
  152. package/dist/module/components/Spinner.js.map +1 -1
  153. package/dist/module/components/StickyFooter.js +6 -6
  154. package/dist/module/components/StickyFooter.js.map +1 -1
  155. package/dist/module/components/Text.js +57 -0
  156. package/dist/module/components/Text.js.map +1 -0
  157. package/dist/module/components/TickIcon.js +6 -6
  158. package/dist/module/components/TickIcon.js.map +1 -1
  159. package/dist/module/components/Toggle.js +10 -9
  160. package/dist/module/components/Toggle.js.map +1 -1
  161. package/dist/module/components/TouchableSearchBar.js +18 -17
  162. package/dist/module/components/TouchableSearchBar.js.map +1 -1
  163. package/dist/module/components/UserListPopup.js +20 -19
  164. package/dist/module/components/UserListPopup.js.map +1 -1
  165. package/dist/module/components/UserListing.js +41 -40
  166. package/dist/module/components/UserListing.js.map +1 -1
  167. package/dist/module/components/VideoPopup.js +20 -20
  168. package/dist/module/components/VideoPopup.js.map +1 -1
  169. package/dist/module/components/WarningPopup.js +21 -20
  170. package/dist/module/components/WarningPopup.js.map +1 -1
  171. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js +13 -13
  172. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js.map +1 -1
  173. package/dist/module/components/expo-image-picker-multiple/ImageTile.js +24 -23
  174. package/dist/module/components/expo-image-picker-multiple/ImageTile.js.map +1 -1
  175. package/dist/module/components/index.js +59 -57
  176. package/dist/module/components/index.js.map +1 -1
  177. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +90 -58
  178. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js.map +1 -1
  179. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js +64 -64
  180. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js.map +1 -1
  181. package/dist/module/config.js +6 -1
  182. package/dist/module/config.js.map +1 -1
  183. package/dist/module/constants.js +3 -3
  184. package/dist/module/constants.js.map +1 -1
  185. package/dist/module/helper.js +83 -82
  186. package/dist/module/helper.js.map +1 -1
  187. package/dist/module/index.js +12 -12
  188. package/dist/module/index.js.map +1 -1
  189. package/dist/module/js/images/detectFaces.js +6 -6
  190. package/dist/module/js/images/detectFaces.js.map +1 -1
  191. package/dist/module/js/images/findLandmarkRange.js +8 -8
  192. package/dist/module/js/images/findLandmarkRange.js.map +1 -1
  193. package/dist/module/js/images/getScaledOffset.js.map +1 -1
  194. package/dist/module/js/site/getSiteLevelFromState.js +2 -2
  195. package/dist/module/js/site/getSiteLevelFromState.js.map +1 -1
  196. package/dist/module/js/site/isTVEnabled.js +2 -2
  197. package/dist/module/js/site/isTVEnabled.js.map +1 -1
  198. package/dist/module/session.js +2 -2
  199. package/dist/module/session.js.map +1 -1
  200. package/dist/module/styles.js +17 -17
  201. package/dist/module/styles.js.map +1 -1
  202. package/dist/module/withNavigationFocus.js +30 -0
  203. package/dist/module/withNavigationFocus.js.map +1 -0
  204. package/package.json +4 -1
  205. package/src/actions/FollowerActions.js +36 -32
  206. package/src/actions/MediaActions.js +25 -20
  207. package/src/actions/ResidentActions.js +26 -21
  208. package/src/actions/UserActions.js +22 -22
  209. package/src/actions/UserSettingsActions.js +11 -11
  210. package/src/actions/index.js +5 -5
  211. package/src/actions/types.js +16 -16
  212. package/src/apis/analyticsActions.js +17 -17
  213. package/src/apis/contactActions.js +20 -20
  214. package/src/apis/eventActions.js +153 -144
  215. package/src/apis/fileActions.js +19 -27
  216. package/src/apis/followerActions.js +29 -29
  217. package/src/apis/index.js +12 -12
  218. package/src/apis/notificationActions.js +44 -44
  219. package/src/apis/profileActions.js +8 -8
  220. package/src/apis/reactionActions.js +81 -73
  221. package/src/apis/settingActions.js +15 -15
  222. package/src/apis/stringActions.js +29 -25
  223. package/src/apis/typeActions.js +10 -10
  224. package/src/apis/userActions.js +93 -93
  225. package/src/assets/icons/fontawesome/fa-brands-400.ttf +0 -0
  226. package/src/assets/icons/fontawesome/fa-light-300.ttf +0 -0
  227. package/src/assets/icons/fontawesome/fa-regular-400.ttf +0 -0
  228. package/src/assets/icons/fontawesome/fa-solid-900.ttf +0 -0
  229. package/src/assets/icons/fontawesome/fa-thin-100.ttf +0 -0
  230. package/src/assets/icons/fontawesome/fa7-glyphmap.json +4205 -0
  231. package/src/colours.js +116 -96
  232. package/src/components/AddButton.js +32 -27
  233. package/src/components/AddToCalendarButton.js +236 -202
  234. package/src/components/Attachment.js +59 -36
  235. package/src/components/AudienceSelectorLauncher.js +52 -48
  236. package/src/components/AudienceSelectorPage.js +353 -311
  237. package/src/components/AutoOffsetImage.js +237 -196
  238. package/src/components/BackButton.js +57 -41
  239. package/src/components/CalendarPopup.js +127 -97
  240. package/src/components/CategoryTabs.js +208 -163
  241. package/src/components/CommentReply.js +363 -309
  242. package/src/components/CommentSection.js +974 -782
  243. package/src/components/ConfirmPopup.js +141 -110
  244. package/src/components/ConfirmationPopup.js +80 -69
  245. package/src/components/DocumentUploader.js +255 -0
  246. package/src/components/DropDownItem.js +70 -60
  247. package/src/components/DropDownMenu.js +31 -27
  248. package/src/components/EmptyStateMain.js +51 -44
  249. package/src/components/EmptyStateWidget.js +47 -38
  250. package/src/components/FontScaleButton.js +29 -25
  251. package/src/components/FontScalePopup.js +67 -56
  252. package/src/components/Forbidden.js +48 -46
  253. package/src/components/FormCard.js +21 -17
  254. package/src/components/FormCardSection.js +284 -233
  255. package/src/components/FormCardSectionOptionLauncher.js +72 -46
  256. package/src/components/FormattedText.js +128 -111
  257. package/src/components/GenericInput.js +168 -136
  258. package/src/components/GenericInputSection.js +209 -161
  259. package/src/components/Header.js +620 -474
  260. package/src/components/Icon.js +119 -0
  261. package/src/components/ImagePopup.js +425 -206
  262. package/src/components/ImageUploadProgress.js +49 -41
  263. package/src/components/ImageUploader.js +23 -13
  264. package/src/components/InlineButton.js +79 -69
  265. package/src/components/Input.js +190 -156
  266. package/src/components/LoadingCircles.js +233 -233
  267. package/src/components/LoadingIndicator.js +87 -76
  268. package/src/components/LoadingStateWidget.js +47 -37
  269. package/src/components/MediaPlayer.js +416 -387
  270. package/src/components/MiddlePopup.js +50 -32
  271. package/src/components/PDFPopup.js +198 -159
  272. package/src/components/PlussChat.js +1271 -986
  273. package/src/components/PlussChatMessage.js +330 -262
  274. package/src/components/PlussChatTime.js +57 -53
  275. package/src/components/Popup.js +138 -116
  276. package/src/components/PopupMenu.js +140 -110
  277. package/src/components/PositionedImage.js +281 -237
  278. package/src/components/ProfilePic.js +122 -113
  279. package/src/components/RadioButton.js +76 -52
  280. package/src/components/Reaction.js +134 -96
  281. package/src/components/Reactions.js +65 -63
  282. package/src/components/SharingTools.js +136 -122
  283. package/src/components/Spinner.js +13 -13
  284. package/src/components/StickyFooter.js +36 -26
  285. package/src/components/Text.js +62 -0
  286. package/src/components/TickIcon.js +20 -20
  287. package/src/components/Toggle.js +74 -73
  288. package/src/components/TouchableSearchBar.js +68 -50
  289. package/src/components/UserListPopup.js +161 -124
  290. package/src/components/UserListing.js +273 -238
  291. package/src/components/VideoPopup.js +110 -96
  292. package/src/components/WarningPopup.js +92 -71
  293. package/src/components/expo-image-picker-multiple/ImageBrowser.js +288 -256
  294. package/src/components/expo-image-picker-multiple/ImageTile.js +108 -84
  295. package/src/components/index.js +59 -57
  296. package/src/components/react-native-expo-image-cropper/ExpoImageManipulator.js +442 -358
  297. package/src/components/react-native-expo-image-cropper/ImageCropOverlay.js +420 -324
  298. package/src/config.js +5 -0
  299. package/src/constants.js +8 -8
  300. package/src/helper.js +469 -438
  301. package/src/index.js +24 -12
  302. package/src/js/images/detectFaces.js +27 -20
  303. package/src/js/images/findLandmarkRange.js +97 -90
  304. package/src/js/images/getScaledOffset.js +80 -75
  305. package/src/js/site/getSiteLevelFromState.js +26 -26
  306. package/src/js/site/isTVEnabled.js +10 -10
  307. package/src/session.js +2 -2
  308. package/src/styles.js +61 -61
  309. package/src/withNavigationFocus.js +28 -0
  310. package/dist/module/components/TextStyle.js +0 -45
  311. package/dist/module/components/TextStyle.js.map +0 -1
  312. package/dist/module/fonts/index.js +0 -2
  313. package/dist/module/fonts/index.js.map +0 -1
  314. package/dist/module/fonts/pluss60-icons.js +0 -5
  315. package/dist/module/fonts/pluss60-icons.js.map +0 -1
  316. package/dist/module/fonts/pluss60-icons.json +0 -1097
  317. package/src/components/TextStyle.js +0 -48
  318. package/src/fonts/index.js +0 -1
  319. package/src/fonts/pluss60-icons.js +0 -6
  320. package/src/fonts/pluss60-icons.json +0 -1097
@@ -1,264 +1,296 @@
1
- import React from 'react';
2
- import { StyleSheet, View, FlatList, Dimensions, ActivityIndicator, Platform } from 'react-native';
3
- import _ from 'lodash';
4
- import * as ScreenOrientation from 'expo-screen-orientation';
5
- import * as MediaLibrary from 'expo-media-library';
6
- import { Camera } from 'expo-camera';
7
- import { isVideo } from '../../helper';
8
- import ImageTile from './ImageTile';
9
-
10
- const { width } = Dimensions.get('window');
1
+ import React from "react";
2
+ import {
3
+ StyleSheet,
4
+ View,
5
+ FlatList,
6
+ Dimensions,
7
+ ActivityIndicator,
8
+ Platform,
9
+ } from "react-native";
10
+ import _ from "lodash";
11
+ import * as ScreenOrientation from "expo-screen-orientation";
12
+ import * as MediaLibrary from "expo-media-library";
13
+ import { Camera } from "expo-camera";
14
+ import { isVideo } from "../../helper";
15
+ import ImageTile from "./ImageTile";
16
+
17
+ const { width } = Dimensions.get("window");
11
18
  const defaultSelectionLimit = 10;
12
19
  const defaultLoadCount = 50;
13
20
 
14
21
  export default class ImageBrowser extends React.Component {
15
- constructor(props) {
16
- super(props);
17
- this.state = {
18
- hasCameraPermission: null,
19
- hasCameraRollPermission: null,
20
- numColumns: null,
21
- photos: [],
22
- selected: [],
23
- isEmpty: false,
24
- after: null,
25
- hasNextPage: true,
26
- };
27
- }
28
-
29
- async componentDidMount() {
30
- if (this.isLocal()) await this.getPermissionsAsync();
31
-
32
- ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
33
- const orientation = await ScreenOrientation.getOrientationAsync();
34
- const numColumns = this.getNumColumns(orientation);
35
- this.setState({ numColumns }, () => {
36
- this.getPhotos();
37
- });
38
- }
39
-
40
- componentDidUpdate(prevProps) {
41
- if (prevProps.album !== this.props.album) this.getPhotos(true);
42
- if (!_.isEqual(prevProps.selected, this.props.selected)) {
43
- this.setState({ selected: this.props.selected });
44
- }
45
- }
46
-
47
- isLocal = () => {
48
- return _.isNil(this.props.remoteAlbums);
49
- };
50
-
51
- getPermissionsAsync = async () => {
52
- const { status: camera } = await Camera.requestCameraPermissionsAsync();
53
- const { status: cameraRoll } = await MediaLibrary.requestPermissionsAsync();
54
- this.setState({
55
- hasCameraPermission: camera === 'granted',
56
- hasCameraRollPermission: cameraRoll === 'granted',
57
- });
58
- };
59
-
60
- onOrientationChange = ({ orientationInfo }) => {
61
- ScreenOrientation.removeOrientationChangeListeners();
62
- ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
63
- const numColumns = this.getNumColumns(orientationInfo.orientation);
64
- this.setState({ numColumns });
65
- };
66
-
67
- getNumColumns = orientation =>
68
- orientation === ScreenOrientation.Orientation.PORTRAIT_UP || orientation === ScreenOrientation.Orientation.PORTRAIT_DOWN ? 4 : 7;
69
-
70
- isVideoSelected = () => {
71
- return this.state.selected.find(uri => {
72
- const photo = this.state.photos.find(photo => photo.uri === uri);
73
- return photo && photo.mediaType === MediaLibrary.MediaType.video;
74
- });
75
- };
76
-
77
- checkSelection = item => {
78
- let videoSelected = this.isVideoSelected();
79
- let newSelected = [...this.state.selected];
80
-
81
- // Check video/photo selection
82
- if (item.mediaType === MediaLibrary.MediaType.video) {
83
- if (videoSelected && videoSelected !== item.uri) {
84
- // If different video is already selected, reset
85
- videoSelected = null;
86
- newSelected = [];
87
- } else if (!videoSelected && newSelected.length > 0) {
88
- // If photos selected, don't allow selecting video
89
- videoSelected = null;
90
- newSelected = [];
91
- }
92
- // Toggle video selected
93
- videoSelected = videoSelected !== item.uri ? item.uri : null;
94
- } else if (videoSelected) {
95
- // If video selected, reset
96
- videoSelected = null;
97
- newSelected = [];
98
- }
99
-
100
- // Check multiple selection
101
- const selectionLimit = this.props.max || defaultSelectionLimit;
102
- if (selectionLimit && selectionLimit > 1) {
103
- // Limit selection
104
- if (newSelected.length === selectionLimit && newSelected.indexOf(item.uri) === -1) return { isFull: true };
105
- } else {
106
- // Force single selection
107
- if (newSelected.length > 0 && newSelected[0] !== item.uri) newSelected = [];
108
- }
109
-
110
- return { newSelected, videoSelected };
111
- };
112
-
113
- selectImage = item => {
114
- const { newSelected, videoSelected, isFull } = this.checkSelection(item);
115
- if (isFull) return;
116
-
117
- if (newSelected.indexOf(item.uri) === -1) {
118
- newSelected.push(item.uri);
119
- } else {
120
- const deleteIndex = newSelected.indexOf(item.uri);
121
- newSelected.splice(deleteIndex, 1);
122
- }
123
- if (newSelected.length > this.props.max) return;
124
- if (!newSelected) newSelected = [];
125
- this.setState({ selected: newSelected });
126
- this.props.onChange(newSelected, videoSelected, () => this.prepareCallback());
127
- };
128
-
129
- getPhotos = (reset = false) => {
130
- const { remoteAlbums, allowVideo, loadCount, album } = this.props;
131
-
132
- if (this.isLocal()) {
133
- // Retrieve local photos
134
- const mediaType = [MediaLibrary.MediaType.photo];
135
- if (allowVideo) mediaType.push(MediaLibrary.MediaType.video);
136
-
137
- const params = {
138
- first: loadCount || defaultLoadCount,
139
- mediaType,
140
- album: album || undefined,
141
- sortBy: [Platform.OS === 'android' ? 'modificationTime' : 'creationTime'],
142
- };
143
- if (reset) {
144
- this.setState({ photos: [], after: null, hasNextPage: true });
145
- } else {
146
- if (this.state.after) params.after = this.state.after;
147
- if (!this.state.hasNextPage) return;
148
- }
149
- MediaLibrary.getAssetsAsync(params).then(this.processPhotos);
150
- } else {
151
- // Use remote albums
152
- const selectedAlbum = remoteAlbums.find(item => item.id === album);
153
- if (selectedAlbum && selectedAlbum.images?.length > 0) {
154
- const ordered = _.orderBy(selectedAlbum.images, 'date', 'desc');
155
- this.setState({
156
- photos: ordered.map(image => {
157
- return {
158
- uri: image.uri,
159
- mediaType: isVideo(image.uri) ? MediaLibrary.MediaType.video : MediaLibrary.MediaType.photo,
160
- };
161
- }),
162
- isEmpty: false,
163
- });
164
- } else {
165
- this.setState({ photos: [], isEmpty: true });
166
- }
167
- }
168
- };
169
-
170
- processPhotos = data => {
171
- if (data.totalCount) {
172
- if (this.state.after === data.endCursor) return;
173
- const uris = data.assets;
174
- this.setState({
175
- photos: [...this.state.photos, ...uris],
176
- after: data.endCursor,
177
- hasNextPage: data.hasNextPage,
178
- });
179
- } else {
180
- this.setState({ isEmpty: true });
181
- }
182
- };
183
-
184
- getItemLayout = (data, index) => {
185
- const length = this.props.itemWidth || width / 4;
186
- return { length, offset: length * index, index };
187
- };
188
-
189
- prepareCallback() {
190
- const { selected, photos } = this.state;
191
- const selectedPhotos = selected.map(uri => photos.find(p => p.uri === uri));
192
- if (this.isLocal()) {
193
- const assetsInfo = Promise.all(selectedPhotos.map(p => MediaLibrary.getAssetInfoAsync(p)));
194
- this.props.callback(assetsInfo);
195
- } else {
196
- // No need to retrieve local assets
197
- this.props.callback(selectedPhotos);
198
- }
199
- }
200
-
201
- renderImageTile = ({ item, index }) => {
202
- if (!item) return null;
203
-
204
- const selectedIndex = this.state.selected.indexOf(item.uri);
205
- const selected = selectedIndex !== -1;
206
-
207
- return (
208
- <ImageTile
209
- selectedItemNumber={selectedIndex + 1}
210
- item={item}
211
- index={index}
212
- selected={selected}
213
- selectImage={this.selectImage}
214
- renderSelectedComponent={this.props.renderSelectedComponent}
215
- style={this.props.itemStyle}
216
- width={this.props.itemWidth}
217
- height={this.props.itemHeight}
218
- isRemote={!this.isLocal()}
219
- />
220
- );
221
- };
222
-
223
- renderPreloader = () => this.props.preloaderComponent || <ActivityIndicator size="large" />;
224
-
225
- renderEmptyState = () => this.props.emptyStateComponent || null;
226
-
227
- renderImages() {
228
- if (_.isEmpty(this.state.photos) && !this.state.isEmpty) {
229
- return null;
230
- }
231
- return (
232
- <FlatList
233
- data={this.state.photos}
234
- numColumns={this.state.numColumns}
235
- key={this.state.numColumns}
236
- renderItem={this.renderImageTile}
237
- keyExtractor={(_, index) => index}
238
- onEndReached={() => {
239
- if (this.isLocal()) this.getPhotos();
240
- }}
241
- onEndReachedThreshold={0.5}
242
- ListEmptyComponent={this.state.isEmpty ? this.renderEmptyState() : this.renderPreloader()}
243
- initialNumToRender={24}
244
- getItemLayout={this.getItemLayout}
245
- />
246
- );
247
- }
248
-
249
- render() {
250
- const { hasCameraPermission } = this.state;
251
-
252
- if (this.isLocal() && !hasCameraPermission) {
253
- return this.props.noCameraPermissionComponent || null;
254
- }
255
-
256
- return <View style={[styles.container, this.props.style]}>{this.renderImages()}</View>;
257
- }
22
+ constructor(props) {
23
+ super(props);
24
+ this.state = {
25
+ hasCameraPermission: null,
26
+ hasCameraRollPermission: null,
27
+ numColumns: null,
28
+ photos: [],
29
+ selected: [],
30
+ isEmpty: false,
31
+ after: null,
32
+ hasNextPage: true,
33
+ };
34
+ }
35
+
36
+ async componentDidMount() {
37
+ if (this.isLocal()) await this.getPermissionsAsync();
38
+
39
+ ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
40
+ const orientation = await ScreenOrientation.getOrientationAsync();
41
+ const numColumns = this.getNumColumns(orientation);
42
+ this.setState({ numColumns }, () => {
43
+ this.getPhotos();
44
+ });
45
+ }
46
+
47
+ componentDidUpdate(prevProps) {
48
+ if (prevProps.album !== this.props.album) this.getPhotos(true);
49
+ if (!_.isEqual(prevProps.selected, this.props.selected)) {
50
+ this.setState({ selected: this.props.selected });
51
+ }
52
+ }
53
+
54
+ isLocal = () => {
55
+ return _.isNil(this.props.remoteAlbums);
56
+ };
57
+
58
+ getPermissionsAsync = async () => {
59
+ const { status: camera } = await Camera.requestCameraPermissionsAsync();
60
+ const { status: cameraRoll } = await MediaLibrary.requestPermissionsAsync();
61
+ this.setState({
62
+ hasCameraPermission: camera === "granted",
63
+ hasCameraRollPermission: cameraRoll === "granted",
64
+ });
65
+ };
66
+
67
+ onOrientationChange = ({ orientationInfo }) => {
68
+ ScreenOrientation.removeOrientationChangeListeners();
69
+ ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
70
+ const numColumns = this.getNumColumns(orientationInfo.orientation);
71
+ this.setState({ numColumns });
72
+ };
73
+
74
+ getNumColumns = (orientation) =>
75
+ orientation === ScreenOrientation.Orientation.PORTRAIT_UP ||
76
+ orientation === ScreenOrientation.Orientation.PORTRAIT_DOWN
77
+ ? 4
78
+ : 7;
79
+
80
+ isVideoSelected = () => {
81
+ return this.state.selected.find((uri) => {
82
+ const photo = this.state.photos.find((photo) => photo.uri === uri);
83
+ return photo && photo.mediaType === MediaLibrary.MediaType.video;
84
+ });
85
+ };
86
+
87
+ checkSelection = (item) => {
88
+ let videoSelected = this.isVideoSelected();
89
+ let newSelected = [...this.state.selected];
90
+
91
+ // Check video/photo selection
92
+ if (item.mediaType === MediaLibrary.MediaType.video) {
93
+ if (videoSelected && videoSelected !== item.uri) {
94
+ // If different video is already selected, reset
95
+ videoSelected = null;
96
+ newSelected = [];
97
+ } else if (!videoSelected && newSelected.length > 0) {
98
+ // If photos selected, don't allow selecting video
99
+ videoSelected = null;
100
+ newSelected = [];
101
+ }
102
+ // Toggle video selected
103
+ videoSelected = videoSelected !== item.uri ? item.uri : null;
104
+ } else if (videoSelected) {
105
+ // If video selected, reset
106
+ videoSelected = null;
107
+ newSelected = [];
108
+ }
109
+
110
+ // Check multiple selection
111
+ const selectionLimit = this.props.max || defaultSelectionLimit;
112
+ if (selectionLimit && selectionLimit > 1) {
113
+ // Limit selection
114
+ if (
115
+ newSelected.length === selectionLimit &&
116
+ newSelected.indexOf(item.uri) === -1
117
+ )
118
+ return { isFull: true };
119
+ } else {
120
+ // Force single selection
121
+ if (newSelected.length > 0 && newSelected[0] !== item.uri)
122
+ newSelected = [];
123
+ }
124
+
125
+ return { newSelected, videoSelected };
126
+ };
127
+
128
+ selectImage = (item) => {
129
+ const { newSelected, videoSelected, isFull } = this.checkSelection(item);
130
+ if (isFull) return;
131
+
132
+ if (newSelected.indexOf(item.uri) === -1) {
133
+ newSelected.push(item.uri);
134
+ } else {
135
+ const deleteIndex = newSelected.indexOf(item.uri);
136
+ newSelected.splice(deleteIndex, 1);
137
+ }
138
+ if (newSelected.length > this.props.max) return;
139
+ if (!newSelected) newSelected = [];
140
+ this.setState({ selected: newSelected });
141
+ this.props.onChange(newSelected, videoSelected, () =>
142
+ this.prepareCallback(),
143
+ );
144
+ };
145
+
146
+ getPhotos = (reset = false) => {
147
+ const { remoteAlbums, allowVideo, loadCount, album } = this.props;
148
+
149
+ if (this.isLocal()) {
150
+ // Retrieve local photos
151
+ const mediaType = [MediaLibrary.MediaType.photo];
152
+ if (allowVideo) mediaType.push(MediaLibrary.MediaType.video);
153
+
154
+ const params = {
155
+ first: loadCount || defaultLoadCount,
156
+ mediaType,
157
+ album: album || undefined,
158
+ sortBy: [
159
+ Platform.OS === "android" ? "modificationTime" : "creationTime",
160
+ ],
161
+ };
162
+ if (reset) {
163
+ this.setState({ photos: [], after: null, hasNextPage: true });
164
+ } else {
165
+ if (this.state.after) params.after = this.state.after;
166
+ if (!this.state.hasNextPage) return;
167
+ }
168
+ MediaLibrary.getAssetsAsync(params).then(this.processPhotos);
169
+ } else {
170
+ // Use remote albums
171
+ const selectedAlbum = remoteAlbums.find((item) => item.id === album);
172
+ if (selectedAlbum && selectedAlbum.images?.length > 0) {
173
+ const ordered = _.orderBy(selectedAlbum.images, "date", "desc");
174
+ this.setState({
175
+ photos: ordered.map((image) => {
176
+ return {
177
+ uri: image.uri,
178
+ mediaType: isVideo(image.uri)
179
+ ? MediaLibrary.MediaType.video
180
+ : MediaLibrary.MediaType.photo,
181
+ };
182
+ }),
183
+ isEmpty: false,
184
+ });
185
+ } else {
186
+ this.setState({ photos: [], isEmpty: true });
187
+ }
188
+ }
189
+ };
190
+
191
+ processPhotos = (data) => {
192
+ if (data.totalCount) {
193
+ if (this.state.after === data.endCursor) return;
194
+ const uris = data.assets;
195
+ this.setState({
196
+ photos: [...this.state.photos, ...uris],
197
+ after: data.endCursor,
198
+ hasNextPage: data.hasNextPage,
199
+ });
200
+ } else {
201
+ this.setState({ isEmpty: true });
202
+ }
203
+ };
204
+
205
+ getItemLayout = (data, index) => {
206
+ const length = this.props.itemWidth || width / 4;
207
+ return { length, offset: length * index, index };
208
+ };
209
+
210
+ prepareCallback() {
211
+ const { selected, photos } = this.state;
212
+ const selectedPhotos = selected.map((uri) =>
213
+ photos.find((p) => p.uri === uri),
214
+ );
215
+ if (this.isLocal()) {
216
+ const assetsInfo = Promise.all(
217
+ selectedPhotos.map((p) => MediaLibrary.getAssetInfoAsync(p)),
218
+ );
219
+ this.props.callback(assetsInfo);
220
+ } else {
221
+ // No need to retrieve local assets
222
+ this.props.callback(selectedPhotos);
223
+ }
224
+ }
225
+
226
+ renderImageTile = ({ item, index }) => {
227
+ if (!item) return null;
228
+
229
+ const selectedIndex = this.state.selected.indexOf(item.uri);
230
+ const selected = selectedIndex !== -1;
231
+
232
+ return (
233
+ <ImageTile
234
+ selectedItemNumber={selectedIndex + 1}
235
+ item={item}
236
+ index={index}
237
+ selected={selected}
238
+ selectImage={this.selectImage}
239
+ renderSelectedComponent={this.props.renderSelectedComponent}
240
+ style={this.props.itemStyle}
241
+ width={this.props.itemWidth}
242
+ height={this.props.itemHeight}
243
+ isRemote={!this.isLocal()}
244
+ />
245
+ );
246
+ };
247
+
248
+ renderPreloader = () =>
249
+ this.props.preloaderComponent || <ActivityIndicator size="large" />;
250
+
251
+ renderEmptyState = () => this.props.emptyStateComponent || null;
252
+
253
+ renderImages() {
254
+ if (_.isEmpty(this.state.photos) && !this.state.isEmpty) {
255
+ return null;
256
+ }
257
+ return (
258
+ <FlatList
259
+ data={this.state.photos}
260
+ numColumns={this.state.numColumns}
261
+ key={this.state.numColumns}
262
+ renderItem={this.renderImageTile}
263
+ keyExtractor={(_, index) => index}
264
+ onEndReached={() => {
265
+ if (this.isLocal()) this.getPhotos();
266
+ }}
267
+ onEndReachedThreshold={0.5}
268
+ ListEmptyComponent={
269
+ this.state.isEmpty ? this.renderEmptyState() : this.renderPreloader()
270
+ }
271
+ initialNumToRender={24}
272
+ getItemLayout={this.getItemLayout}
273
+ />
274
+ );
275
+ }
276
+
277
+ render() {
278
+ const { hasCameraPermission } = this.state;
279
+
280
+ if (this.isLocal() && !hasCameraPermission) {
281
+ return this.props.noCameraPermissionComponent || null;
282
+ }
283
+
284
+ return (
285
+ <View style={[styles.container, this.props.style]}>
286
+ {this.renderImages()}
287
+ </View>
288
+ );
289
+ }
258
290
  }
259
291
 
260
292
  const styles = StyleSheet.create({
261
- container: {
262
- flex: 1,
263
- },
293
+ container: {
294
+ flex: 1,
295
+ },
264
296
  });