@plusscommunities/pluss-core-app 8.0.0 → 8.0.1-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 +15 -15
  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 +43 -37
  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 +50 -50
  76. package/dist/module/components/DocumentUploader.js.map +1 -1
  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 +211 -73
  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 +116 -96
  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 +31 -31
  124. package/dist/module/components/MediaPlayer.js.map +1 -1
  125. package/dist/module/components/MiddlePopup.js +17 -11
  126. package/dist/module/components/MiddlePopup.js.map +1 -1
  127. package/dist/module/components/PDFPopup.js +52 -39
  128. package/dist/module/components/PDFPopup.js.map +1 -1
  129. package/dist/module/components/PlussChat.js +168 -149
  130. package/dist/module/components/PlussChat.js.map +1 -1
  131. package/dist/module/components/PlussChatMessage.js +42 -42
  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 +78 -43
  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 -58
  176. package/dist/module/components/index.js.map +1 -1
  177. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +94 -64
  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 +15 -10
  182. package/dist/module/config.js.map +1 -1
  183. package/dist/module/constants.js +3 -4
  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 +11 -10
  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 +6 -6
  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 +71 -68
  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 +96 -86
  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 +370 -309
  242. package/src/components/CommentSection.js +974 -781
  243. package/src/components/ConfirmPopup.js +141 -110
  244. package/src/components/ConfirmationPopup.js +80 -69
  245. package/src/components/DocumentUploader.js +245 -215
  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 -221
  262. package/src/components/ImageUploadProgress.js +49 -41
  263. package/src/components/ImageUploader.js +968 -797
  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 +62 -33
  271. package/src/components/PDFPopup.js +212 -159
  272. package/src/components/PlussChat.js +1224 -1025
  273. package/src/components/PlussChatMessage.js +329 -298
  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 +185 -134
  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 -58
  296. package/src/components/react-native-expo-image-cropper/ExpoImageManipulator.js +444 -359
  297. package/src/components/react-native-expo-image-cropper/ImageCropOverlay.js +420 -324
  298. package/src/config.js +26 -21
  299. package/src/constants.js +8 -10
  300. package/src/helper.js +469 -438
  301. package/src/index.js +24 -12
  302. package/src/js/images/detectFaces.js +28 -21
  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 +32 -32
  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 -7
  320. package/src/fonts/pluss60-icons.json +0 -1097
@@ -1,225 +1,255 @@
1
- import React, { Component } from 'react';
2
- import { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';
3
- import { Icon } from '@rneui/themed';
4
- // import * as DocumentPicker from 'expo-document-picker';
5
- import { connect } from 'react-redux';
6
- import Config from '../config';
7
- import { fileActions } from '../apis';
8
- import { getValueOrDefault } from '../helper';
9
- import { TEXT_DARK, getMainBrandingColourFromState } from '../colours';
10
-
11
- const DEFAULT_DOCUMENT_NAME = 'document';
1
+ import React, { Component } from "react";
2
+ import { Text } from "@plusscommunities/pluss-core-app/components";
3
+ import {
4
+ View,
5
+ TouchableOpacity,
6
+ StyleSheet,
7
+ ActivityIndicator,
8
+ } from "react-native";
9
+ import { Icon } from "@rneui/themed";
10
+ import * as DocumentPicker from "expo-document-picker";
11
+ import { connect } from "react-redux";
12
+ import Config from "../config";
13
+ import { fileActions } from "../apis";
14
+ import { getValueOrDefault } from "../helper";
15
+ import { TEXT_DARK, getMainBrandingColourFromState } from "../colours";
16
+
17
+ const DEFAULT_DOCUMENT_NAME = "document";
12
18
 
13
19
  class DocumentUploader extends Component {
14
- static defaultProps = {
15
- allowedTypes: ['application/pdf'],
16
- buttonTitle: 'Upload Document',
17
- buttonStyle: {},
18
- buttonTextStyle: {},
19
- onUploadStarted: () => {},
20
- onUploadSuccess: () => {},
21
- onUploadFailed: () => {},
22
- onUploadProgress: null,
23
- userId: null,
24
- fileName: null,
25
- disabled: false,
26
- };
27
-
28
- state = {
29
- isUploading: false,
30
- uploadProgress: 0,
31
- };
32
-
33
- pickDocument = async () => {
34
- const { allowedTypes, multiple } = this.props;
35
-
36
- // try {
37
- // const result = await DocumentPicker.getDocumentAsync({
38
- // type: allowedTypes,
39
- // copyToCacheDirectory: true,
40
- // multiple: multiple || false,
41
- // });
42
- // // console.log('pickDocument', JSON.stringify(result, null, 2));
43
-
44
- // if (!result.canceled) {
45
- // await this.handleDocumentPicked(result);
46
- // }
47
- // } catch (error) {
48
- // console.log('Document picker error:', error);
49
- // this.props.onUploadFailed(null, error.message);
50
- // }
51
- };
52
-
53
- handleDocumentPicked = async documentResult => {
54
- const { assets } = documentResult;
55
- const { userId } = this.props;
56
-
57
- try {
58
- this.setState({ isUploading: true, uploadProgress: 0 });
59
-
60
- // Process each asset in parallel
61
- const uploadPromises = assets.map(async asset => {
62
- const { name, uri, mimeType } = asset;
63
-
64
- let file, fileExt;
65
- if (name && name.includes('.')) {
66
- const lastDotIndex = name.lastIndexOf('.');
67
- file = name.substring(0, lastDotIndex);
68
- fileExt = name.substring(lastDotIndex + 1);
69
- } else {
70
- // Fallback: extract extension from mimeType
71
- file = name || 'document';
72
- if (mimeType) {
73
- const mimeTypeParts = mimeType.split('/');
74
- // Handle specific MIME type mappings
75
- if (mimeType === 'application/pdf') fileExt = 'pdf';
76
- else if (mimeType.startsWith('image/')) fileExt = mimeTypeParts[1];
77
- else if (mimeType.startsWith('text/')) fileExt = 'txt';
78
- else fileExt = mimeTypeParts[1] || 'pdf';
79
- } else {
80
- fileExt = 'pdf';
81
- }
82
- }
83
-
84
- // Generate a unique filename if not provided
85
- const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;
86
- const uploadUri = fileActions.getUploadUrl(userId, fileName);
87
- // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));
88
-
89
- try {
90
- // Notify parent component that upload has started for this file
91
- this.props.onUploadStarted(uploadUri, uri, file, fileExt.toUpperCase());
92
-
93
- const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {
94
- if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
95
- });
96
-
97
- const fileUrl = Config.env.baseUploadsUrl + res.key;
98
- this.props.onUploadSuccess(fileUrl, uploadUri);
99
- console.log('Upload success', fileUrl);
100
- return { success: true, url: fileUrl, uploadUri };
101
- } catch (error) {
102
- console.error(`Upload failed for ${name}:`, error);
103
- this.props.onUploadFailed(uploadUri, error.message);
104
- return { success: false, error, uploadUri };
105
- }
106
- });
107
-
108
- // Wait for all uploads to complete
109
- const results = await Promise.all(uploadPromises);
110
- return results;
111
- } catch (error) {
112
- console.error('Document upload error:', error);
113
- return [];
114
- } finally {
115
- this.setState({ isUploading: false, uploadProgress: 0 });
116
- }
117
- };
118
-
119
- renderUploadButton = () => {
120
- const { buttonTitle, buttonStyle, buttonTextStyle, disabled } = this.props;
121
- const { isUploading } = this.state;
122
- const mainColor = getMainBrandingColourFromState(this.props);
123
-
124
- return (
125
- <TouchableOpacity
126
- style={[styles.uploadButton, { borderColor: mainColor }, buttonStyle]}
127
- onPress={this.pickDocument}
128
- disabled={isUploading || disabled}
129
- activeOpacity={0.7}
130
- >
131
- <View style={styles.buttonContent}>
132
- {isUploading ? (
133
- <ActivityIndicator color={mainColor} />
134
- ) : (
135
- <Icon name="attachment" type="entypo" color={mainColor} size={18} style={styles.icon} />
136
- )}
137
- <Text style={[styles.buttonText, { color: mainColor }, buttonTextStyle]}>{buttonTitle}</Text>
138
- </View>
139
- </TouchableOpacity>
140
- );
141
- };
142
-
143
- renderProgress = () => {
144
- const { uploadProgress } = this.state;
145
- if (uploadProgress <= 0 || uploadProgress >= 1) return null;
146
-
147
- return (
148
- <View style={styles.progressContainer}>
149
- <View style={styles.progressBar}>
150
- <View style={[styles.progressFill, { width: `${uploadProgress * 100}%` }]} />
151
- </View>
152
- <Text style={styles.progressText}>{Math.round(uploadProgress * 100)}%</Text>
153
- </View>
154
- );
155
- };
156
-
157
- render() {
158
- return (
159
- <View style={styles.container}>
160
- {this.renderUploadButton()}
161
- {this.renderProgress()}
162
- </View>
163
- );
164
- }
20
+ static defaultProps = {
21
+ allowedTypes: ["application/pdf"],
22
+ buttonTitle: "Upload Document",
23
+ buttonStyle: {},
24
+ buttonTextStyle: {},
25
+ onUploadStarted: () => {},
26
+ onUploadSuccess: () => {},
27
+ onUploadFailed: () => {},
28
+ onUploadProgress: null,
29
+ userId: null,
30
+ fileName: null,
31
+ disabled: false,
32
+ };
33
+
34
+ state = {
35
+ isUploading: false,
36
+ uploadProgress: 0,
37
+ };
38
+
39
+ pickDocument = async () => {
40
+ const { allowedTypes, multiple } = this.props;
41
+
42
+ try {
43
+ const result = await DocumentPicker.getDocumentAsync({
44
+ type: allowedTypes,
45
+ copyToCacheDirectory: true,
46
+ multiple: multiple || false,
47
+ });
48
+ // console.log('pickDocument', JSON.stringify(result, null, 2));
49
+
50
+ if (!result.canceled) {
51
+ await this.handleDocumentPicked(result);
52
+ }
53
+ } catch (error) {
54
+ console.log("Document picker error:", error);
55
+ this.props.onUploadFailed(null, error.message);
56
+ }
57
+ };
58
+
59
+ handleDocumentPicked = async (documentResult) => {
60
+ const { assets } = documentResult;
61
+ const { userId } = this.props;
62
+
63
+ try {
64
+ this.setState({ isUploading: true, uploadProgress: 0 });
65
+
66
+ // Process each asset in parallel
67
+ const uploadPromises = assets.map(async (asset) => {
68
+ const { name, uri, mimeType } = asset;
69
+
70
+ let file, fileExt;
71
+ if (name && name.includes(".")) {
72
+ const lastDotIndex = name.lastIndexOf(".");
73
+ file = name.substring(0, lastDotIndex);
74
+ fileExt = name.substring(lastDotIndex + 1);
75
+ } else {
76
+ // Fallback: extract extension from mimeType
77
+ file = name || "document";
78
+ if (mimeType) {
79
+ const mimeTypeParts = mimeType.split("/");
80
+ // Handle specific MIME type mappings
81
+ if (mimeType === "application/pdf") fileExt = "pdf";
82
+ else if (mimeType.startsWith("image/")) fileExt = mimeTypeParts[1];
83
+ else if (mimeType.startsWith("text/")) fileExt = "txt";
84
+ else fileExt = mimeTypeParts[1] || "pdf";
85
+ } else {
86
+ fileExt = "pdf";
87
+ }
88
+ }
89
+
90
+ // Generate a unique filename if not provided
91
+ const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;
92
+ const uploadUri = fileActions.getUploadUrl(userId, fileName);
93
+ // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));
94
+
95
+ try {
96
+ // Notify parent component that upload has started for this file
97
+ this.props.onUploadStarted(
98
+ uploadUri,
99
+ uri,
100
+ file,
101
+ fileExt.toUpperCase(),
102
+ );
103
+
104
+ const res = await fileActions.uploadUserMediaWithProgress(
105
+ uri,
106
+ uploadUri,
107
+ (progress) => {
108
+ if (this.props.onUploadProgress)
109
+ this.props.onUploadProgress(progress);
110
+ },
111
+ );
112
+
113
+ const fileUrl = Config.env.baseUploadsUrl + res.key;
114
+ this.props.onUploadSuccess(fileUrl, uploadUri);
115
+ console.log("Upload success", fileUrl);
116
+ return { success: true, url: fileUrl, uploadUri };
117
+ } catch (error) {
118
+ console.error(`Upload failed for ${name}:`, error);
119
+ this.props.onUploadFailed(uploadUri, error.message);
120
+ return { success: false, error, uploadUri };
121
+ }
122
+ });
123
+
124
+ // Wait for all uploads to complete
125
+ const results = await Promise.all(uploadPromises);
126
+ return results;
127
+ } catch (error) {
128
+ console.error("Document upload error:", error);
129
+ return [];
130
+ } finally {
131
+ this.setState({ isUploading: false, uploadProgress: 0 });
132
+ }
133
+ };
134
+
135
+ renderUploadButton = () => {
136
+ const { buttonTitle, buttonStyle, buttonTextStyle, disabled } = this.props;
137
+ const { isUploading } = this.state;
138
+ const mainColor = getMainBrandingColourFromState(this.props);
139
+
140
+ return (
141
+ <TouchableOpacity
142
+ style={[styles.uploadButton, { borderColor: mainColor }, buttonStyle]}
143
+ onPress={this.pickDocument}
144
+ disabled={isUploading || disabled}
145
+ activeOpacity={0.7}
146
+ >
147
+ <View style={styles.buttonContent}>
148
+ {isUploading ? (
149
+ <ActivityIndicator color={mainColor} />
150
+ ) : (
151
+ <Icon
152
+ name="attachment"
153
+ type="entypo"
154
+ color={mainColor}
155
+ size={18}
156
+ style={styles.icon}
157
+ />
158
+ )}
159
+ <Text
160
+ style={[styles.buttonText, { color: mainColor }, buttonTextStyle]}
161
+ >
162
+ {buttonTitle}
163
+ </Text>
164
+ </View>
165
+ </TouchableOpacity>
166
+ );
167
+ };
168
+
169
+ renderProgress = () => {
170
+ const { uploadProgress } = this.state;
171
+ if (uploadProgress <= 0 || uploadProgress >= 1) return null;
172
+
173
+ return (
174
+ <View style={styles.progressContainer}>
175
+ <View style={styles.progressBar}>
176
+ <View
177
+ style={[styles.progressFill, { width: `${uploadProgress * 100}%` }]}
178
+ />
179
+ </View>
180
+ <Text style={styles.progressText}>
181
+ {Math.round(uploadProgress * 100)}%
182
+ </Text>
183
+ </View>
184
+ );
185
+ };
186
+
187
+ render() {
188
+ return (
189
+ <View style={styles.container}>
190
+ {this.renderUploadButton()}
191
+ {this.renderProgress()}
192
+ </View>
193
+ );
194
+ }
165
195
  }
166
196
 
167
197
  const styles = StyleSheet.create({
168
- container: {
169
- marginVertical: 10,
170
- },
171
- uploadButton: {
172
- flexDirection: 'row',
173
- alignItems: 'center',
174
- justifyContent: 'center',
175
- paddingVertical: 8,
176
- paddingHorizontal: 16,
177
- borderRadius: 6,
178
- backgroundColor: '#fff',
179
- borderWidth: 1,
180
- borderColor: '#007AFF',
181
- },
182
- buttonContent: {
183
- flexDirection: 'row',
184
- alignItems: 'center',
185
- },
186
- buttonText: {
187
- color: '#fff',
188
- fontSize: 16,
189
- fontWeight: '500',
190
- marginLeft: 8,
191
- },
192
- icon: {
193
- marginRight: 8,
194
- },
195
- progressContainer: {
196
- marginTop: 8,
197
- alignItems: 'center',
198
- },
199
- progressBar: {
200
- height: 4,
201
- width: '100%',
202
- backgroundColor: '#E0E0E0',
203
- borderRadius: 2,
204
- overflow: 'hidden',
205
- },
206
- progressFill: {
207
- height: '100%',
208
- backgroundColor: '#4CAF50',
209
- },
210
- progressText: {
211
- marginTop: 4,
212
- fontSize: 12,
213
- color: TEXT_DARK,
214
- },
198
+ container: {
199
+ marginVertical: 10,
200
+ },
201
+ uploadButton: {
202
+ flexDirection: "row",
203
+ alignItems: "center",
204
+ justifyContent: "center",
205
+ paddingVertical: 8,
206
+ paddingHorizontal: 16,
207
+ borderRadius: 6,
208
+ backgroundColor: "#fff",
209
+ borderWidth: 1,
210
+ borderColor: "#007AFF",
211
+ },
212
+ buttonContent: {
213
+ flexDirection: "row",
214
+ alignItems: "center",
215
+ },
216
+ buttonText: {
217
+ color: "#fff",
218
+ fontSize: 16,
219
+ fontWeight: "500",
220
+ marginLeft: 8,
221
+ },
222
+ icon: {
223
+ marginRight: 8,
224
+ },
225
+ progressContainer: {
226
+ marginTop: 8,
227
+ alignItems: "center",
228
+ },
229
+ progressBar: {
230
+ height: 4,
231
+ width: "100%",
232
+ backgroundColor: "#E0E0E0",
233
+ borderRadius: 2,
234
+ overflow: "hidden",
235
+ },
236
+ progressFill: {
237
+ height: "100%",
238
+ backgroundColor: "#4CAF50",
239
+ },
240
+ progressText: {
241
+ marginTop: 4,
242
+ fontSize: 12,
243
+ color: TEXT_DARK,
244
+ },
215
245
  });
216
246
 
217
- const mapStateToProps = state => {
218
- const { user } = state;
219
- return {
220
- user,
221
- colourBrandingMain: getMainBrandingColourFromState(state),
222
- };
247
+ const mapStateToProps = (state) => {
248
+ const { user } = state;
249
+ return {
250
+ user,
251
+ colourBrandingMain: getMainBrandingColourFromState(state),
252
+ };
223
253
  };
224
254
 
225
255
  export default connect(mapStateToProps)(DocumentUploader);
@@ -1,72 +1,82 @@
1
- import React, { Component } from 'react';
2
- import _ from 'lodash';
3
- import { Text, TouchableOpacity } from 'react-native';
4
- import { Icon } from '@rneui/themed';
5
- import { connect } from 'react-redux';
6
- import { TEXT_DARK, getMainBrandingColourFromState } from '../colours';
1
+ import React, { Component } from "react";
2
+ import _ from "lodash";
3
+ import { TouchableOpacity } from "react-native";
4
+ import { Text } from "./Text";
5
+ import { Icon } from "@rneui/themed";
6
+ import { connect } from "react-redux";
7
+ import { TEXT_DARK, getMainBrandingColourFromState } from "../colours";
7
8
 
8
9
  class DropDownItem extends Component {
9
- state = {};
10
+ state = {};
10
11
 
11
- renderIcon() {
12
- if (!_.isUndefined(this.props.icon)) {
13
- return (
14
- <Icon
15
- name={this.props.icon}
16
- type="font-awesome"
17
- style={styles.dropDownItem_Icon}
18
- iconStyle={[styles.dropDownItem_IconStyle, { fontSize: 16, color: this.props.colourBrandingMain }]}
19
- />
20
- );
21
- }
22
- return null;
23
- }
12
+ renderIcon() {
13
+ if (!_.isUndefined(this.props.icon)) {
14
+ return (
15
+ <Icon
16
+ name={this.props.icon}
17
+ type="font-awesome"
18
+ style={styles.dropDownItem_Icon}
19
+ iconStyle={[
20
+ styles.dropDownItem_IconStyle,
21
+ { fontSize: 16, color: this.props.colourBrandingMain },
22
+ ]}
23
+ />
24
+ );
25
+ }
26
+ return null;
27
+ }
24
28
 
25
- render() {
26
- return (
27
- <TouchableOpacity
28
- style={[styles.container, this.props.last && { marginBottom: 0 }, this.props.style]}
29
- onPress={this.props.onPress}
30
- activeOpacity={0.6}
31
- >
32
- {this.renderIcon()}
33
- <Text style={[styles.text, this.props.textStyle]}>{this.props.text}</Text>
34
- </TouchableOpacity>
35
- );
36
- }
29
+ render() {
30
+ return (
31
+ <TouchableOpacity
32
+ style={[
33
+ styles.container,
34
+ this.props.last && { marginBottom: 0 },
35
+ this.props.style,
36
+ ]}
37
+ onPress={this.props.onPress}
38
+ activeOpacity={0.6}
39
+ >
40
+ {this.renderIcon()}
41
+ <Text style={[styles.text, this.props.textStyle]}>
42
+ {this.props.text}
43
+ </Text>
44
+ </TouchableOpacity>
45
+ );
46
+ }
37
47
  }
38
48
 
39
49
  const styles = {
40
- container: {
41
- flexDirection: 'row',
42
- marginBottom: 12,
43
- minHeight: 18,
44
- width: '100%',
45
- position: 'relative',
46
- },
47
- text: {
48
- fontFamily: 'sf-medium',
49
- fontSize: 16,
50
- lineHeight: 18,
51
- color: TEXT_DARK,
52
- backgroundColor: 'transparent',
53
- },
54
- dropDownItem_Icon: {
55
- marginRight: 8,
56
- width: 18,
57
- alignSelf: 'center',
58
- },
59
- dropDownItem_IconStyle: {
60
- fontSize: 16,
61
- lineHeight: 18,
62
- textAlign: 'center',
63
- },
50
+ container: {
51
+ flexDirection: "row",
52
+ marginBottom: 12,
53
+ minHeight: 18,
54
+ width: "100%",
55
+ position: "relative",
56
+ },
57
+ text: {
58
+ fontFamily: "sf-medium",
59
+ fontSize: 16,
60
+ lineHeight: 18,
61
+ color: TEXT_DARK,
62
+ backgroundColor: "transparent",
63
+ },
64
+ dropDownItem_Icon: {
65
+ marginRight: 8,
66
+ width: 18,
67
+ alignSelf: "center",
68
+ },
69
+ dropDownItem_IconStyle: {
70
+ fontSize: 16,
71
+ lineHeight: 18,
72
+ textAlign: "center",
73
+ },
64
74
  };
65
75
 
66
- const mapStateToProps = state => {
67
- return {
68
- colourBrandingMain: getMainBrandingColourFromState(state),
69
- };
76
+ const mapStateToProps = (state) => {
77
+ return {
78
+ colourBrandingMain: getMainBrandingColourFromState(state),
79
+ };
70
80
  };
71
81
 
72
82
  const dropDownItem = connect(mapStateToProps, {})(DropDownItem);