@plusscommunities/pluss-core-app 8.0.29 → 8.0.31

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 (210) 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 +93 -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 +13 -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/settingActions.js +22 -0
  34. package/dist/module/apis/settingActions.js.map +1 -0
  35. package/dist/module/apis/stringActions.js +30 -0
  36. package/dist/module/apis/stringActions.js.map +1 -0
  37. package/dist/module/apis/typeActions.js +15 -0
  38. package/dist/module/apis/typeActions.js.map +1 -0
  39. package/dist/module/apis/userActions.js +104 -0
  40. package/dist/module/apis/userActions.js.map +1 -0
  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/assets/icons/reactions/heart.png +0 -0
  48. package/dist/module/assets/icons/reactions/party.png +0 -0
  49. package/dist/module/assets/icons/reactions/sad.png +0 -0
  50. package/dist/module/assets/icons/reactions/smile.png +0 -0
  51. package/dist/module/colours.js +165 -0
  52. package/dist/module/colours.js.map +1 -0
  53. package/dist/module/components/AddButton.js +43 -0
  54. package/dist/module/components/AddButton.js.map +1 -0
  55. package/dist/module/components/AddToCalendarButton.js +225 -0
  56. package/dist/module/components/AddToCalendarButton.js.map +1 -0
  57. package/dist/module/components/Attachment.js +55 -0
  58. package/dist/module/components/Attachment.js.map +1 -0
  59. package/dist/module/components/AudienceSelectorLauncher.js +64 -0
  60. package/dist/module/components/AudienceSelectorLauncher.js.map +1 -0
  61. package/dist/module/components/AudienceSelectorPage.js +351 -0
  62. package/dist/module/components/AudienceSelectorPage.js.map +1 -0
  63. package/dist/module/components/AutoOffsetImage.js +184 -0
  64. package/dist/module/components/AutoOffsetImage.js.map +1 -0
  65. package/dist/module/components/BackButton.js +58 -0
  66. package/dist/module/components/BackButton.js.map +1 -0
  67. package/dist/module/components/CalendarPopup.js +126 -0
  68. package/dist/module/components/CalendarPopup.js.map +1 -0
  69. package/dist/module/components/CategoryTabs.js +155 -0
  70. package/dist/module/components/CategoryTabs.js.map +1 -0
  71. package/dist/module/components/CommentReply.js +334 -0
  72. package/dist/module/components/CommentReply.js.map +1 -0
  73. package/dist/module/components/CommentSection.js +823 -0
  74. package/dist/module/components/CommentSection.js.map +1 -0
  75. package/dist/module/components/ConfirmPopup.js +109 -0
  76. package/dist/module/components/ConfirmPopup.js.map +1 -0
  77. package/dist/module/components/ConfirmationPopup.js +72 -0
  78. package/dist/module/components/ConfirmationPopup.js.map +1 -0
  79. package/dist/module/components/DocumentUploader.js +253 -0
  80. package/dist/module/components/DocumentUploader.js.map +1 -0
  81. package/dist/module/components/DropDownItem.js +75 -0
  82. package/dist/module/components/DropDownItem.js.map +1 -0
  83. package/dist/module/components/DropDownMenu.js +41 -0
  84. package/dist/module/components/DropDownMenu.js.map +1 -0
  85. package/dist/module/components/EmptyStateMain.js +51 -0
  86. package/dist/module/components/EmptyStateMain.js.map +1 -0
  87. package/dist/module/components/EmptyStateWidget.js +48 -0
  88. package/dist/module/components/EmptyStateWidget.js.map +1 -0
  89. package/dist/module/components/FontScaleButton.js +37 -0
  90. package/dist/module/components/FontScaleButton.js.map +1 -0
  91. package/dist/module/components/FontScalePopup.js +76 -0
  92. package/dist/module/components/FontScalePopup.js.map +1 -0
  93. package/dist/module/components/Forbidden.js +58 -0
  94. package/dist/module/components/Forbidden.js.map +1 -0
  95. package/dist/module/components/FormCard.js +25 -0
  96. package/dist/module/components/FormCard.js.map +1 -0
  97. package/dist/module/components/FormCardSection.js +214 -0
  98. package/dist/module/components/FormCardSection.js.map +1 -0
  99. package/dist/module/components/FormCardSectionOptionLauncher.js +73 -0
  100. package/dist/module/components/FormCardSectionOptionLauncher.js.map +1 -0
  101. package/dist/module/components/FormattedText.js +133 -0
  102. package/dist/module/components/FormattedText.js.map +1 -0
  103. package/dist/module/components/GenericInput.js +151 -0
  104. package/dist/module/components/GenericInput.js.map +1 -0
  105. package/dist/module/components/GenericInputSection.js +173 -0
  106. package/dist/module/components/GenericInputSection.js.map +1 -0
  107. package/dist/module/components/Header.js +459 -0
  108. package/dist/module/components/Header.js.map +1 -0
  109. package/dist/module/components/Icon.js +109 -0
  110. package/dist/module/components/Icon.js.map +1 -0
  111. package/dist/module/components/ImagePopup.js +400 -0
  112. package/dist/module/components/ImagePopup.js.map +1 -0
  113. package/dist/module/components/ImageUploadProgress.js +69 -0
  114. package/dist/module/components/ImageUploadProgress.js.map +1 -0
  115. package/dist/module/components/ImageUploader.js +831 -0
  116. package/dist/module/components/ImageUploader.js.map +1 -0
  117. package/dist/module/components/InlineButton.js +66 -0
  118. package/dist/module/components/InlineButton.js.map +1 -0
  119. package/dist/module/components/Input.js +156 -0
  120. package/dist/module/components/Input.js.map +1 -0
  121. package/dist/module/components/LoadingCircles.js +219 -0
  122. package/dist/module/components/LoadingCircles.js.map +1 -0
  123. package/dist/module/components/LoadingIndicator.js +86 -0
  124. package/dist/module/components/LoadingIndicator.js.map +1 -0
  125. package/dist/module/components/LoadingStateWidget.js +46 -0
  126. package/dist/module/components/LoadingStateWidget.js.map +1 -0
  127. package/dist/module/components/MediaPlayer.js +407 -0
  128. package/dist/module/components/MediaPlayer.js.map +1 -0
  129. package/dist/module/components/MiddlePopup.js +49 -0
  130. package/dist/module/components/MiddlePopup.js.map +1 -0
  131. package/dist/module/components/PDFPopup.js +296 -0
  132. package/dist/module/components/PDFPopup.js.map +1 -0
  133. package/dist/module/components/PlussChat.js +1078 -0
  134. package/dist/module/components/PlussChat.js.map +1 -0
  135. package/dist/module/components/PlussChatMessage.js +299 -0
  136. package/dist/module/components/PlussChatMessage.js.map +1 -0
  137. package/dist/module/components/PlussChatTime.js +59 -0
  138. package/dist/module/components/PlussChatTime.js.map +1 -0
  139. package/dist/module/components/Popup.js +126 -0
  140. package/dist/module/components/Popup.js.map +1 -0
  141. package/dist/module/components/PopupMenu.js +120 -0
  142. package/dist/module/components/PopupMenu.js.map +1 -0
  143. package/dist/module/components/PositionedImage.js +313 -0
  144. package/dist/module/components/PositionedImage.js.map +1 -0
  145. package/dist/module/components/ProfilePic.js +105 -0
  146. package/dist/module/components/ProfilePic.js.map +1 -0
  147. package/dist/module/components/RadioButton.js +78 -0
  148. package/dist/module/components/RadioButton.js.map +1 -0
  149. package/dist/module/components/Reaction.js +117 -0
  150. package/dist/module/components/Reaction.js.map +1 -0
  151. package/dist/module/components/Reactions.js +71 -0
  152. package/dist/module/components/Reactions.js.map +1 -0
  153. package/dist/module/components/SharingTools.js +189 -0
  154. package/dist/module/components/SharingTools.js.map +1 -0
  155. package/dist/module/components/Spinner.js +22 -0
  156. package/dist/module/components/Spinner.js.map +1 -0
  157. package/dist/module/components/StickyFooter.js +34 -0
  158. package/dist/module/components/StickyFooter.js.map +1 -0
  159. package/dist/module/components/Text.js +57 -0
  160. package/dist/module/components/Text.js.map +1 -0
  161. package/dist/module/components/TickIcon.js +24 -0
  162. package/dist/module/components/TickIcon.js.map +1 -0
  163. package/dist/module/components/Toggle.js +66 -0
  164. package/dist/module/components/Toggle.js.map +1 -0
  165. package/dist/module/components/TouchableSearchBar.js +68 -0
  166. package/dist/module/components/TouchableSearchBar.js.map +1 -0
  167. package/dist/module/components/UserListPopup.js +136 -0
  168. package/dist/module/components/UserListPopup.js.map +1 -0
  169. package/dist/module/components/UserListing.js +268 -0
  170. package/dist/module/components/UserListing.js.map +1 -0
  171. package/dist/module/components/VideoPopup.js +113 -0
  172. package/dist/module/components/VideoPopup.js.map +1 -0
  173. package/dist/module/components/WarningPopup.js +85 -0
  174. package/dist/module/components/WarningPopup.js.map +1 -0
  175. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js +289 -0
  176. package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js.map +1 -0
  177. package/dist/module/components/expo-image-picker-multiple/ImageTile.js +117 -0
  178. package/dist/module/components/expo-image-picker-multiple/ImageTile.js.map +1 -0
  179. package/dist/module/components/index.js +60 -0
  180. package/dist/module/components/index.js.map +1 -0
  181. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +422 -0
  182. package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js.map +1 -0
  183. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js +387 -0
  184. package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js.map +1 -0
  185. package/dist/module/config.js +27 -0
  186. package/dist/module/config.js.map +1 -0
  187. package/dist/module/constants.js +18 -0
  188. package/dist/module/constants.js.map +1 -0
  189. package/dist/module/helper.js +424 -0
  190. package/dist/module/helper.js.map +1 -0
  191. package/dist/module/index.js +13 -0
  192. package/dist/module/index.js.map +1 -0
  193. package/dist/module/js/images/detectFaces.js +31 -0
  194. package/dist/module/js/images/detectFaces.js.map +1 -0
  195. package/dist/module/js/images/findLandmarkRange.js +93 -0
  196. package/dist/module/js/images/findLandmarkRange.js.map +1 -0
  197. package/dist/module/js/images/getScaledOffset.js +81 -0
  198. package/dist/module/js/images/getScaledOffset.js.map +1 -0
  199. package/dist/module/js/site/getSiteLevelFromState.js +29 -0
  200. package/dist/module/js/site/getSiteLevelFromState.js.map +1 -0
  201. package/dist/module/js/site/isTVEnabled.js +10 -0
  202. package/dist/module/js/site/isTVEnabled.js.map +1 -0
  203. package/dist/module/session.js +58 -0
  204. package/dist/module/session.js.map +1 -0
  205. package/dist/module/styles.js +67 -0
  206. package/dist/module/styles.js.map +1 -0
  207. package/dist/module/withNavigationFocus.js +30 -0
  208. package/dist/module/withNavigationFocus.js.map +1 -0
  209. package/package.json +1 -1
  210. package/src/components/PDFPopup.js +130 -35
@@ -0,0 +1,424 @@
1
+ import _ from "lodash";
2
+ import React from "react";
3
+ import { Platform, StatusBar, Dimensions } from "react-native";
4
+ import { Text } from "./components";
5
+ import Constants from "expo-constants";
6
+ import Config from "./config";
7
+ import { LINEGREY } from "./colours";
8
+ import { getSessionTokenAWS } from "./session";
9
+
10
+ // seperated files to export
11
+ import detectFaces from "./js/images/detectFaces";
12
+ import findLandmarkRange from "./js/images/findLandmarkRange";
13
+ import getScaledOffset from "./js/images/getScaledOffset";
14
+ import getSiteLevelFromState from "./js/site/getSiteLevelFromState";
15
+ import isTVEnabled from "./js/site/isTVEnabled";
16
+ const TIMESTAMP_FORMAT = "D MMM • h:mma";
17
+ const DATE_FORMAT = "D MMM YYYY";
18
+ const getUrl = (baseAction, action, query) => {
19
+ const {
20
+ baseAPIUrl,
21
+ baseStage
22
+ } = Config.env;
23
+ let queryPart = "";
24
+ if (query) {
25
+ _.keys(query).forEach((key, index) => {
26
+ queryPart += `${index === 0 ? "?" : "&"}${key}=${encodeURIComponent(query[key])}`;
27
+ });
28
+ }
29
+ return `${baseAPIUrl}/${baseAction}-${baseStage}/${action}${queryPart}`;
30
+ };
31
+ const getAuthTokenHeader = () => {
32
+ return new Promise((resolve, reject) => {
33
+ getSessionTokenAWS().then(idToken => {
34
+ resolve(`Bearer ${idToken}`);
35
+ });
36
+ });
37
+ };
38
+ const getShadowStyle = () => {
39
+ if (Platform.OS === "ios") {
40
+ return {
41
+ shadowColor: "#000",
42
+ shadowOffset: {
43
+ width: 0,
44
+ height: 1
45
+ },
46
+ shadowOpacity: 0.1,
47
+ shadowRadius: 3,
48
+ backgroundColor: "#fff"
49
+ };
50
+ }
51
+ return {
52
+ borderColor: LINEGREY,
53
+ backgroundColor: "#fff",
54
+ elevation: 8
55
+ };
56
+ };
57
+ const StatusBarHeight = size => {
58
+ return getStatusBarHeight() + size;
59
+ };
60
+ const getStatusBarHeight = () => {
61
+ return Platform.OS === "ios" ? Constants.statusBarHeight : StatusBar.currentHeight;
62
+ };
63
+ const getSiteSettingFromState = (state, key, defaultValue) => {
64
+ if (state && state.user && state.user.siteSettings && !_.isUndefined(state.user.siteSettings[key])) {
65
+ return state.user.siteSettings[key];
66
+ }
67
+ return defaultValue || null;
68
+ };
69
+ const getValueOrDefault = (value, def) => {
70
+ return !_.isUndefined(value) ? value : def;
71
+ };
72
+ const getExtension = url => {
73
+ if (!url) {
74
+ return null;
75
+ }
76
+ const fileSplit = url.split(".");
77
+ return fileSplit[fileSplit.length - 1].toLowerCase();
78
+ };
79
+ const getFileName = (url, noExtension) => {
80
+ if (!url) {
81
+ return null;
82
+ }
83
+ const fileSplit = url.split("/");
84
+ const name = fileSplit[fileSplit.length - 1].toLowerCase();
85
+ if (!noExtension) {
86
+ return name;
87
+ }
88
+ return name.split(".")[0];
89
+ };
90
+ const isVideo = url => {
91
+ const extension = getExtension(url);
92
+ return ["mov", "mp4"].includes(extension);
93
+ };
94
+ const isVideoUrl = url => {
95
+ const urlToCheck = getValidUrl(url);
96
+ if (isVideo(urlToCheck)) {
97
+ return true;
98
+ }
99
+ if (isYoutube(urlToCheck)) {
100
+ return true;
101
+ }
102
+ if (isVimeo(urlToCheck)) {
103
+ return true;
104
+ }
105
+ return false;
106
+ };
107
+ const isStockImage = url => {
108
+ return url.indexOf("https://pluss60-dev-uploads.s3.ap-southeast-2.amazonaws.com/uploads/library") !== -1;
109
+ };
110
+ const getThumb300 = url => {
111
+ if (!url) {
112
+ return url;
113
+ }
114
+ if (isVideo(url)) {
115
+ return "https://pluss60-demo-uploads.s3.ap-southeast-2.amazonaws.com/uploads/users/ap-southeast-2:97769b56-25ec-41c0-a73c-6c2c4140f629/public/9d0bbec64614b1ed654a03f7e7/movie.jpg";
116
+ }
117
+ if (url.indexOf("https://plussprdstorage.blob.core.windows.net/") !== -1) {
118
+ return url.replace("https://plussprdstorage.blob.core.windows.net/", "https://plusscdn.azureedge.net/");
119
+ }
120
+ if (url.indexOf("https://plusscdn.azureedge.net/") !== -1) {
121
+ return url.replace("/uploads/", "/uploads-thumb/").replace("/general/", "/general300/").replace("/uploads1400/", "/uploads-thumb/").replace("/general1400/", "/general300/");
122
+ }
123
+ if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {
124
+ const extension = getExtension(url);
125
+ let urlToUse = url;
126
+ if (extension !== "jpg") {
127
+ urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;
128
+ }
129
+ return urlToUse.replace("/1400/", "/thumb300/").replace("/uploads/", "/thumb300/");
130
+ }
131
+ return url;
132
+ };
133
+ const get1400 = url => {
134
+ if (!url) {
135
+ return url;
136
+ }
137
+ if (url.indexOf("https://plussprdstorage.blob.core.windows.net/") !== -1) {
138
+ return url.replace("https://plussprdstorage.blob.core.windows.net/", "https://plusscdn.azureedge.net/");
139
+ }
140
+ if (url.indexOf("https://plusscdn.azureedge.net/") !== -1) {
141
+ return url.replace("/uploads/", "/uploads1400/").replace("/general/", "/general1400/");
142
+ }
143
+ if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {
144
+ const extension = getExtension(url);
145
+ let urlToUse = url;
146
+ if (extension !== "jpg") {
147
+ urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;
148
+ }
149
+ return urlToUse.replace("/uploads/", "/1400/");
150
+ }
151
+ return url;
152
+ };
153
+ const get300 = url => {
154
+ if (!url) {
155
+ return url;
156
+ }
157
+ if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {
158
+ const extension = getExtension(url);
159
+ let urlToUse = url;
160
+ if (extension !== "jpg") {
161
+ urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;
162
+ }
163
+ return urlToUse.replace("/uploads/", "/300/").replace("/1400/", "/300/");
164
+ }
165
+ return url;
166
+ };
167
+ const getMimeType = url => {
168
+ const extension = getExtension(url);
169
+ switch (extension) {
170
+ case "mov":
171
+ return "video/quicktime";
172
+ case "mp4":
173
+ return "video/mp4";
174
+ default:
175
+ return "image/jpeg";
176
+ }
177
+ };
178
+ const getCompressed = url => {
179
+ if (!url || typeof url !== "string") return "";
180
+ return url.replace("/uploads/", "/compressed/");
181
+ };
182
+ const imageExists = url => {
183
+ return new Promise(resolve => {
184
+ fetch(url, {
185
+ method: "HEAD",
186
+ cache: "no-cache"
187
+ }).then(response => {
188
+ resolve(response.status === 200);
189
+ }).catch(() => {
190
+ resolve(false);
191
+ });
192
+ });
193
+ };
194
+ const formatTime = (hours, minutes) => {
195
+ const period = hours >= 12 ? "pm" : "am";
196
+
197
+ // Convert 24-hour format to 12-hour format
198
+ const adjustedHours = hours > 12 ? hours - 12 : hours === 0 ? 12 : hours;
199
+
200
+ // Ensure minutes are two digits
201
+ const adjustedMinutes = String(minutes).padStart(2, "0");
202
+ return `${adjustedHours}:${adjustedMinutes}${period}`;
203
+ };
204
+ const minutesToString = (minutes, isTimeOfDay) => {
205
+ const hours = Math.floor(minutes / 60);
206
+ const remainingMinutes = minutes % 60;
207
+ if (isTimeOfDay) {
208
+ return formatTime(hours, remainingMinutes);
209
+ }
210
+ const hoursString = hours > 1 ? `${hours} hours` : `${hours} hour`;
211
+ const minutesString = remainingMinutes > 1 ? `${remainingMinutes} minutes` : `${remainingMinutes} minute`;
212
+ if (hours && remainingMinutes) {
213
+ return `${hoursString} ${minutesString}`;
214
+ }
215
+ if (hours) {
216
+ return hoursString;
217
+ }
218
+ if (remainingMinutes) {
219
+ return minutesString;
220
+ }
221
+ return "0 minutes";
222
+ };
223
+ const getPluralS = count => {
224
+ return count === 1 ? "" : "s";
225
+ };
226
+ const getPluralOptions = (count, singular, plural) => {
227
+ if (count === 1) {
228
+ return singular;
229
+ }
230
+ return plural;
231
+ };
232
+ const isEmail = email => {
233
+ if (_.isEmpty(email)) {
234
+ return false;
235
+ }
236
+ const atpos = email.indexOf("@");
237
+ const dotpos = email.lastIndexOf(".");
238
+ if (atpos < 1 || dotpos < atpos + 2 || dotpos + 2 >= email.length) {
239
+ return false;
240
+ }
241
+ return true;
242
+ };
243
+ const randomString = (name = "") => {
244
+ return `xxxxxxxx4xxxyxxxxxxxxxxxxx${name}`.replace(/[xy]/g, c => {
245
+ // eslint-disable-next-line
246
+ var r = Math.random() * 16 | 0,
247
+ v = c === "x" ? r : r & 0x3 | 0x8;
248
+ return v.toString(16);
249
+ });
250
+ };
251
+ const generateImageName = (name, source) => {
252
+ let result = randomString(name);
253
+ if (source) {
254
+ result += `.${_.last(source.split("."))}`;
255
+ }
256
+ return result;
257
+ };
258
+ const getSite = site => {
259
+ return site === "plussSpace" || site === "hq" ? Config.env.preferredSite : site;
260
+ };
261
+ const getTakeoverThumb = uri => {
262
+ const filename = uri.split("/").pop();
263
+ switch (filename) {
264
+ default:
265
+ return {
266
+ uri
267
+ };
268
+ }
269
+ };
270
+ const getTakeoverImage = uri => {
271
+ const filename = uri.split("/").pop();
272
+ switch (filename) {
273
+ default:
274
+ return {
275
+ uri
276
+ };
277
+ }
278
+ };
279
+ const getImageSource = (uri, isThumb) => {
280
+ if (uri == null) return null;
281
+ if (isThumb) return getTakeoverThumb(uri);
282
+ return getTakeoverImage(uri);
283
+ };
284
+ const getFirstName = name => {
285
+ if (_.isEmpty(name)) {
286
+ return name;
287
+ }
288
+ return name.split(" ")[0];
289
+ };
290
+ const usersToSearchResult = (contacts, excludedUserIds) => {
291
+ let result = [];
292
+ contacts.forEach(user => {
293
+ result.push({
294
+ displayName: user.displayName,
295
+ id: user.objectID || user.id || user.ID || user.userId || user.Id,
296
+ profilePic: user.profilePic || user.photoURL || null,
297
+ unit: user.unit
298
+ });
299
+ });
300
+ result = _.reject(result, contact => {
301
+ return _.includes(excludedUserIds, contact.id);
302
+ });
303
+ return result;
304
+ };
305
+ const searchUsers = (source, term) => {
306
+ if (_.isEmpty(term)) {
307
+ return source;
308
+ }
309
+ return _.filter(source, user => {
310
+ const split = user.displayName.split(" ");
311
+ return _.some(split, part => {
312
+ return part.toLowerCase().indexOf(term.toLowerCase()) === 0;
313
+ });
314
+ });
315
+ };
316
+ const getTabSettingsFromState = state => {
317
+ const tabSettings = state.user && state.user.interface || getSiteSettingFromState(state, "TabSettings", null);
318
+ return tabSettings;
319
+ };
320
+ const getEnabledTabsFromState = state => {
321
+ const tabSettings = getTabSettingsFromState(state);
322
+ return tabSettings ? tabSettings.filter(tab => tab.isEnabled) : [];
323
+ };
324
+ const getReactions = () => {
325
+ return [{
326
+ key: "heart",
327
+ icon: require("./assets/icons/reactions/heart.png")
328
+ }, {
329
+ key: "smile",
330
+ icon: require("./assets/icons/reactions/smile.png")
331
+ }, {
332
+ key: "sad",
333
+ icon: require("./assets/icons/reactions/sad.png")
334
+ }, {
335
+ key: "party",
336
+ icon: require("./assets/icons/reactions/party.png")
337
+ }];
338
+ };
339
+ const hasReacted = (reactions, userId) => {
340
+ return _.some(reactions, r => {
341
+ return !!r[userId];
342
+ });
343
+ };
344
+ const isTablet = () => {
345
+ return Dimensions.get("screen").width > 600;
346
+ };
347
+ const isVimeo = url => {
348
+ if (_.isEmpty(url)) {
349
+ return false;
350
+ }
351
+ if (url.indexOf("https://vimeo.com/") === 0) {
352
+ return true;
353
+ }
354
+ if (url.indexOf("https://player.vimeo.com/video/") === 0) {
355
+ return true;
356
+ }
357
+ };
358
+ const getVimeoEmbed = url => {
359
+ if (_.isEmpty(url)) {
360
+ return "";
361
+ }
362
+ if (url.indexOf("https://vimeo.com/") === 0) {
363
+ const vimeoId = "lol"; //TODO
364
+ return `https://player.vimeo.com/video/${vimeoId}`;
365
+ }
366
+ return url; //TODO
367
+ };
368
+ const isYoutube = url => {
369
+ if (_.isUndefined(url) || _.isEmpty(url)) {
370
+ return false;
371
+ }
372
+ const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
373
+ const match = url.match(regExp);
374
+ if (match && match[2].length === 11) {
375
+ return true;
376
+ }
377
+ return false;
378
+ };
379
+ const getYoutubeEmbed = url => {
380
+ const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
381
+ const match = url.match(regExp);
382
+ return `https://www.youtube.com/embed/${match[2]}?autoplay=0`;
383
+ };
384
+ const getValidUrl = (url = "") => {
385
+ let newUrl = decodeURIComponent(url);
386
+ newUrl = newUrl.trim().replace(/\s/g, "");
387
+ if (/^(:\/\/)/.test(newUrl)) {
388
+ return `https${newUrl}`;
389
+ }
390
+ if (!/^(f|ht)tps?:\/\//i.test(newUrl)) {
391
+ return `https://${newUrl}`;
392
+ }
393
+ return newUrl;
394
+ };
395
+ const getUserPreview = user => {
396
+ return {
397
+ id: user.uid,
398
+ displayName: user.displayName,
399
+ profilePic: user.profilePic || null
400
+ };
401
+ };
402
+ const allowComments = canComment => {
403
+ if (canComment === false) {
404
+ return false;
405
+ }
406
+ if (canComment === true) {
407
+ return true;
408
+ }
409
+ return Config.env.defaultAllowComments;
410
+ };
411
+ const toParagraphed = (text, style) => {
412
+ if (!text) {
413
+ return text;
414
+ }
415
+ const textSplit = text.split("\n");
416
+ return _.map(textSplit, (t, i) => {
417
+ return /*#__PURE__*/React.createElement(Text, {
418
+ key: `paragraph_${i}`,
419
+ style: style
420
+ }, t);
421
+ });
422
+ };
423
+ export { TIMESTAMP_FORMAT, DATE_FORMAT, getUrl, getAuthTokenHeader, getShadowStyle, StatusBarHeight, getStatusBarHeight, getSiteSettingFromState, getValueOrDefault, getExtension, getFileName, isVideo, get300, getThumb300, get1400, getMimeType, getCompressed, imageExists, getPluralS, getPluralOptions, isEmail, formatTime, minutesToString, randomString, generateImageName, getSite, getImageSource, getFirstName, usersToSearchResult, searchUsers, getEnabledTabsFromState, getReactions, hasReacted, isTablet, isYoutube, getYoutubeEmbed, getValidUrl, getUserPreview, allowComments, toParagraphed, isVideoUrl, detectFaces, findLandmarkRange, getScaledOffset, getSiteLevelFromState, isTVEnabled };
424
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_","React","Platform","StatusBar","Dimensions","Text","Constants","Config","LINEGREY","getSessionTokenAWS","detectFaces","findLandmarkRange","getScaledOffset","getSiteLevelFromState","isTVEnabled","TIMESTAMP_FORMAT","DATE_FORMAT","getUrl","baseAction","action","query","baseAPIUrl","baseStage","env","queryPart","keys","forEach","key","index","encodeURIComponent","getAuthTokenHeader","Promise","resolve","reject","then","idToken","getShadowStyle","OS","shadowColor","shadowOffset","width","height","shadowOpacity","shadowRadius","backgroundColor","borderColor","elevation","StatusBarHeight","size","getStatusBarHeight","statusBarHeight","currentHeight","getSiteSettingFromState","state","defaultValue","user","siteSettings","isUndefined","getValueOrDefault","value","def","getExtension","url","fileSplit","split","length","toLowerCase","getFileName","noExtension","name","isVideo","extension","includes","isVideoUrl","urlToCheck","getValidUrl","isYoutube","isVimeo","isStockImage","indexOf","getThumb300","replace","baseUploadsUrl","urlToUse","substring","get1400","get300","getMimeType","getCompressed","imageExists","fetch","method","cache","response","status","catch","formatTime","hours","minutes","period","adjustedHours","adjustedMinutes","String","padStart","minutesToString","isTimeOfDay","Math","floor","remainingMinutes","hoursString","minutesString","getPluralS","count","getPluralOptions","singular","plural","isEmail","email","isEmpty","atpos","dotpos","lastIndexOf","randomString","c","r","random","v","toString","generateImageName","source","result","last","getSite","site","preferredSite","getTakeoverThumb","uri","filename","pop","getTakeoverImage","getImageSource","isThumb","getFirstName","usersToSearchResult","contacts","excludedUserIds","push","displayName","id","objectID","ID","userId","Id","profilePic","photoURL","unit","contact","searchUsers","term","filter","some","part","getTabSettingsFromState","tabSettings","interface","getEnabledTabsFromState","tab","isEnabled","getReactions","icon","require","hasReacted","reactions","isTablet","get","getVimeoEmbed","vimeoId","regExp","match","getYoutubeEmbed","newUrl","decodeURIComponent","trim","test","getUserPreview","uid","allowComments","canComment","defaultAllowComments","toParagraphed","text","style","textSplit","map","t","i","createElement"],"sources":["helper.js"],"sourcesContent":["import _ from \"lodash\";\nimport React from \"react\";\nimport { Platform, StatusBar, Dimensions } from \"react-native\";\nimport { Text } from \"./components\";\nimport Constants from \"expo-constants\";\nimport Config from \"./config\";\nimport { LINEGREY } from \"./colours\";\nimport { getSessionTokenAWS } from \"./session\";\n\n// seperated files to export\nimport detectFaces from \"./js/images/detectFaces\";\nimport findLandmarkRange from \"./js/images/findLandmarkRange\";\nimport getScaledOffset from \"./js/images/getScaledOffset\";\n\nimport getSiteLevelFromState from \"./js/site/getSiteLevelFromState\";\nimport isTVEnabled from \"./js/site/isTVEnabled\";\n\nconst TIMESTAMP_FORMAT = \"D MMM • h:mma\";\nconst DATE_FORMAT = \"D MMM YYYY\";\n\nconst getUrl = (baseAction, action, query) => {\n\tconst { baseAPIUrl, baseStage } = Config.env;\n\tlet queryPart = \"\";\n\tif (query) {\n\t\t_.keys(query).forEach((key, index) => {\n\t\t\tqueryPart += `${index === 0 ? \"?\" : \"&\"}${key}=${encodeURIComponent(query[key])}`;\n\t\t});\n\t}\n\treturn `${baseAPIUrl}/${baseAction}-${baseStage}/${action}${queryPart}`;\n};\n\nconst getAuthTokenHeader = () => {\n\treturn new Promise((resolve, reject) => {\n\t\tgetSessionTokenAWS().then((idToken) => {\n\t\t\tresolve(`Bearer ${idToken}`);\n\t\t});\n\t});\n};\n\nconst getShadowStyle = () => {\n\tif (Platform.OS === \"ios\") {\n\t\treturn {\n\t\t\tshadowColor: \"#000\",\n\t\t\tshadowOffset: {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 1,\n\t\t\t},\n\t\t\tshadowOpacity: 0.1,\n\t\t\tshadowRadius: 3,\n\t\t\tbackgroundColor: \"#fff\",\n\t\t};\n\t}\n\treturn {\n\t\tborderColor: LINEGREY,\n\t\tbackgroundColor: \"#fff\",\n\t\televation: 8,\n\t};\n};\n\nconst StatusBarHeight = (size) => {\n\treturn getStatusBarHeight() + size;\n};\n\nconst getStatusBarHeight = () => {\n\treturn Platform.OS === \"ios\"\n\t\t? Constants.statusBarHeight\n\t\t: StatusBar.currentHeight;\n};\n\nconst getSiteSettingFromState = (state, key, defaultValue) => {\n\tif (\n\t\tstate &&\n\t\tstate.user &&\n\t\tstate.user.siteSettings &&\n\t\t!_.isUndefined(state.user.siteSettings[key])\n\t) {\n\t\treturn state.user.siteSettings[key];\n\t}\n\treturn defaultValue || null;\n};\n\nconst getValueOrDefault = (value, def) => {\n\treturn !_.isUndefined(value) ? value : def;\n};\n\nconst getExtension = (url) => {\n\tif (!url) {\n\t\treturn null;\n\t}\n\tconst fileSplit = url.split(\".\");\n\treturn fileSplit[fileSplit.length - 1].toLowerCase();\n};\n\nconst getFileName = (url, noExtension) => {\n\tif (!url) {\n\t\treturn null;\n\t}\n\tconst fileSplit = url.split(\"/\");\n\tconst name = fileSplit[fileSplit.length - 1].toLowerCase();\n\tif (!noExtension) {\n\t\treturn name;\n\t}\n\treturn name.split(\".\")[0];\n};\n\nconst isVideo = (url) => {\n\tconst extension = getExtension(url);\n\treturn [\"mov\", \"mp4\"].includes(extension);\n};\n\nconst isVideoUrl = (url) => {\n\tconst urlToCheck = getValidUrl(url);\n\tif (isVideo(urlToCheck)) {\n\t\treturn true;\n\t}\n\tif (isYoutube(urlToCheck)) {\n\t\treturn true;\n\t}\n\tif (isVimeo(urlToCheck)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nconst isStockImage = (url) => {\n\treturn (\n\t\turl.indexOf(\n\t\t\t\"https://pluss60-dev-uploads.s3.ap-southeast-2.amazonaws.com/uploads/library\",\n\t\t) !== -1\n\t);\n};\n\nconst getThumb300 = (url) => {\n\tif (!url) {\n\t\treturn url;\n\t}\n\tif (isVideo(url)) {\n\t\treturn \"https://pluss60-demo-uploads.s3.ap-southeast-2.amazonaws.com/uploads/users/ap-southeast-2:97769b56-25ec-41c0-a73c-6c2c4140f629/public/9d0bbec64614b1ed654a03f7e7/movie.jpg\";\n\t}\n\tif (url.indexOf(\"https://plussprdstorage.blob.core.windows.net/\") !== -1) {\n\t\treturn url.replace(\n\t\t\t\"https://plussprdstorage.blob.core.windows.net/\",\n\t\t\t\"https://plusscdn.azureedge.net/\",\n\t\t);\n\t}\n\tif (url.indexOf(\"https://plusscdn.azureedge.net/\") !== -1) {\n\t\treturn url\n\t\t\t.replace(\"/uploads/\", \"/uploads-thumb/\")\n\t\t\t.replace(\"/general/\", \"/general300/\")\n\t\t\t.replace(\"/uploads1400/\", \"/uploads-thumb/\")\n\t\t\t.replace(\"/general1400/\", \"/general300/\");\n\t}\n\tif (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {\n\t\tconst extension = getExtension(url);\n\t\tlet urlToUse = url;\n\t\tif (extension !== \"jpg\") {\n\t\t\turlToUse = `${url.substring(0, url.length - extension.length)}jpg`;\n\t\t}\n\t\treturn urlToUse\n\t\t\t.replace(\"/1400/\", \"/thumb300/\")\n\t\t\t.replace(\"/uploads/\", \"/thumb300/\");\n\t}\n\treturn url;\n};\n\nconst get1400 = (url) => {\n\tif (!url) {\n\t\treturn url;\n\t}\n\tif (url.indexOf(\"https://plussprdstorage.blob.core.windows.net/\") !== -1) {\n\t\treturn url.replace(\n\t\t\t\"https://plussprdstorage.blob.core.windows.net/\",\n\t\t\t\"https://plusscdn.azureedge.net/\",\n\t\t);\n\t}\n\tif (url.indexOf(\"https://plusscdn.azureedge.net/\") !== -1) {\n\t\treturn url\n\t\t\t.replace(\"/uploads/\", \"/uploads1400/\")\n\t\t\t.replace(\"/general/\", \"/general1400/\");\n\t}\n\tif (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {\n\t\tconst extension = getExtension(url);\n\t\tlet urlToUse = url;\n\t\tif (extension !== \"jpg\") {\n\t\t\turlToUse = `${url.substring(0, url.length - extension.length)}jpg`;\n\t\t}\n\t\treturn urlToUse.replace(\"/uploads/\", \"/1400/\");\n\t}\n\treturn url;\n};\n\nconst get300 = (url) => {\n\tif (!url) {\n\t\treturn url;\n\t}\n\tif (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {\n\t\tconst extension = getExtension(url);\n\t\tlet urlToUse = url;\n\t\tif (extension !== \"jpg\") {\n\t\t\turlToUse = `${url.substring(0, url.length - extension.length)}jpg`;\n\t\t}\n\t\treturn urlToUse.replace(\"/uploads/\", \"/300/\").replace(\"/1400/\", \"/300/\");\n\t}\n\treturn url;\n};\n\nconst getMimeType = (url) => {\n\tconst extension = getExtension(url);\n\tswitch (extension) {\n\t\tcase \"mov\":\n\t\t\treturn \"video/quicktime\";\n\t\tcase \"mp4\":\n\t\t\treturn \"video/mp4\";\n\t\tdefault:\n\t\t\treturn \"image/jpeg\";\n\t}\n};\n\nconst getCompressed = (url) => {\n\tif (!url || typeof url !== \"string\") return \"\";\n\treturn url.replace(\"/uploads/\", \"/compressed/\");\n};\n\nconst imageExists = (url) => {\n\treturn new Promise((resolve) => {\n\t\tfetch(url, { method: \"HEAD\", cache: \"no-cache\" })\n\t\t\t.then((response) => {\n\t\t\t\tresolve(response.status === 200);\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tresolve(false);\n\t\t\t});\n\t});\n};\n\nconst formatTime = (hours, minutes) => {\n\tconst period = hours >= 12 ? \"pm\" : \"am\";\n\n\t// Convert 24-hour format to 12-hour format\n\tconst adjustedHours = hours > 12 ? hours - 12 : hours === 0 ? 12 : hours;\n\n\t// Ensure minutes are two digits\n\tconst adjustedMinutes = String(minutes).padStart(2, \"0\");\n\n\treturn `${adjustedHours}:${adjustedMinutes}${period}`;\n};\n\nconst minutesToString = (minutes, isTimeOfDay) => {\n\tconst hours = Math.floor(minutes / 60);\n\tconst remainingMinutes = minutes % 60;\n\n\tif (isTimeOfDay) {\n\t\treturn formatTime(hours, remainingMinutes);\n\t}\n\n\tconst hoursString = hours > 1 ? `${hours} hours` : `${hours} hour`;\n\tconst minutesString =\n\t\tremainingMinutes > 1\n\t\t\t? `${remainingMinutes} minutes`\n\t\t\t: `${remainingMinutes} minute`;\n\n\tif (hours && remainingMinutes) {\n\t\treturn `${hoursString} ${minutesString}`;\n\t}\n\tif (hours) {\n\t\treturn hoursString;\n\t}\n\tif (remainingMinutes) {\n\t\treturn minutesString;\n\t}\n\treturn \"0 minutes\";\n};\n\nconst getPluralS = (count) => {\n\treturn count === 1 ? \"\" : \"s\";\n};\n\nconst getPluralOptions = (count, singular, plural) => {\n\tif (count === 1) {\n\t\treturn singular;\n\t}\n\treturn plural;\n};\n\nconst isEmail = (email) => {\n\tif (_.isEmpty(email)) {\n\t\treturn false;\n\t}\n\tconst atpos = email.indexOf(\"@\");\n\tconst dotpos = email.lastIndexOf(\".\");\n\tif (atpos < 1 || dotpos < atpos + 2 || dotpos + 2 >= email.length) {\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nconst randomString = (name = \"\") => {\n\treturn `xxxxxxxx4xxxyxxxxxxxxxxxxx${name}`.replace(/[xy]/g, (c) => {\n\t\t// eslint-disable-next-line\n\t\tvar r = (Math.random() * 16) | 0,\n\t\t\tv = c === \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n};\n\nconst generateImageName = (name, source) => {\n\tlet result = randomString(name);\n\tif (source) {\n\t\tresult += `.${_.last(source.split(\".\"))}`;\n\t}\n\treturn result;\n};\n\nconst getSite = (site) => {\n\treturn site === \"plussSpace\" || site === \"hq\"\n\t\t? Config.env.preferredSite\n\t\t: site;\n};\n\nconst getTakeoverThumb = (uri) => {\n\tconst filename = uri.split(\"/\").pop();\n\tswitch (filename) {\n\t\tdefault:\n\t\t\treturn { uri };\n\t}\n};\n\nconst getTakeoverImage = (uri) => {\n\tconst filename = uri.split(\"/\").pop();\n\tswitch (filename) {\n\t\tdefault:\n\t\t\treturn { uri };\n\t}\n};\n\nconst getImageSource = (uri, isThumb) => {\n\tif (uri == null) return null;\n\tif (isThumb) return getTakeoverThumb(uri);\n\treturn getTakeoverImage(uri);\n};\n\nconst getFirstName = (name) => {\n\tif (_.isEmpty(name)) {\n\t\treturn name;\n\t}\n\treturn name.split(\" \")[0];\n};\n\nconst usersToSearchResult = (contacts, excludedUserIds) => {\n\tlet result = [];\n\tcontacts.forEach((user) => {\n\t\tresult.push({\n\t\t\tdisplayName: user.displayName,\n\t\t\tid: user.objectID || user.id || user.ID || user.userId || user.Id,\n\t\t\tprofilePic: user.profilePic || user.photoURL || null,\n\t\t\tunit: user.unit,\n\t\t});\n\t});\n\tresult = _.reject(result, (contact) => {\n\t\treturn _.includes(excludedUserIds, contact.id);\n\t});\n\treturn result;\n};\n\nconst searchUsers = (source, term) => {\n\tif (_.isEmpty(term)) {\n\t\treturn source;\n\t}\n\treturn _.filter(source, (user) => {\n\t\tconst split = user.displayName.split(\" \");\n\t\treturn _.some(split, (part) => {\n\t\t\treturn part.toLowerCase().indexOf(term.toLowerCase()) === 0;\n\t\t});\n\t});\n};\n\nconst getTabSettingsFromState = (state) => {\n\tconst tabSettings =\n\t\t(state.user && state.user.interface) ||\n\t\tgetSiteSettingFromState(state, \"TabSettings\", null);\n\treturn tabSettings;\n};\n\nconst getEnabledTabsFromState = (state) => {\n\tconst tabSettings = getTabSettingsFromState(state);\n\treturn tabSettings ? tabSettings.filter((tab) => tab.isEnabled) : [];\n};\n\nconst getReactions = () => {\n\treturn [\n\t\t{\n\t\t\tkey: \"heart\",\n\t\t\ticon: require(\"./assets/icons/reactions/heart.png\"),\n\t\t},\n\t\t{\n\t\t\tkey: \"smile\",\n\t\t\ticon: require(\"./assets/icons/reactions/smile.png\"),\n\t\t},\n\t\t{\n\t\t\tkey: \"sad\",\n\t\t\ticon: require(\"./assets/icons/reactions/sad.png\"),\n\t\t},\n\t\t{\n\t\t\tkey: \"party\",\n\t\t\ticon: require(\"./assets/icons/reactions/party.png\"),\n\t\t},\n\t];\n};\n\nconst hasReacted = (reactions, userId) => {\n\treturn _.some(reactions, (r) => {\n\t\treturn !!r[userId];\n\t});\n};\n\nconst isTablet = () => {\n\treturn Dimensions.get(\"screen\").width > 600;\n};\n\nconst isVimeo = (url) => {\n\tif (_.isEmpty(url)) {\n\t\treturn false;\n\t}\n\tif (url.indexOf(\"https://vimeo.com/\") === 0) {\n\t\treturn true;\n\t}\n\tif (url.indexOf(\"https://player.vimeo.com/video/\") === 0) {\n\t\treturn true;\n\t}\n};\n\nconst getVimeoEmbed = (url) => {\n\tif (_.isEmpty(url)) {\n\t\treturn \"\";\n\t}\n\tif (url.indexOf(\"https://vimeo.com/\") === 0) {\n\t\tconst vimeoId = \"lol\"; //TODO\n\t\treturn `https://player.vimeo.com/video/${vimeoId}`;\n\t}\n\treturn url; //TODO\n};\n\nconst isYoutube = (url) => {\n\tif (_.isUndefined(url) || _.isEmpty(url)) {\n\t\treturn false;\n\t}\n\tconst regExp =\n\t\t/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=|\\?v=)([^#\\&\\?]*).*/;\n\tconst match = url.match(regExp);\n\tif (match && match[2].length === 11) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nconst getYoutubeEmbed = (url) => {\n\tconst regExp =\n\t\t/^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=|\\?v=)([^#\\&\\?]*).*/;\n\tconst match = url.match(regExp);\n\treturn `https://www.youtube.com/embed/${match[2]}?autoplay=0`;\n};\n\nconst getValidUrl = (url = \"\") => {\n\tlet newUrl = decodeURIComponent(url);\n\tnewUrl = newUrl.trim().replace(/\\s/g, \"\");\n\n\tif (/^(:\\/\\/)/.test(newUrl)) {\n\t\treturn `https${newUrl}`;\n\t}\n\tif (!/^(f|ht)tps?:\\/\\//i.test(newUrl)) {\n\t\treturn `https://${newUrl}`;\n\t}\n\n\treturn newUrl;\n};\n\nconst getUserPreview = (user) => {\n\treturn {\n\t\tid: user.uid,\n\t\tdisplayName: user.displayName,\n\t\tprofilePic: user.profilePic || null,\n\t};\n};\n\nconst allowComments = (canComment) => {\n\tif (canComment === false) {\n\t\treturn false;\n\t}\n\tif (canComment === true) {\n\t\treturn true;\n\t}\n\treturn Config.env.defaultAllowComments;\n};\n\nconst toParagraphed = (text, style) => {\n\tif (!text) {\n\t\treturn text;\n\t}\n\tconst textSplit = text.split(\"\\n\");\n\treturn _.map(textSplit, (t, i) => {\n\t\treturn (\n\t\t\t<Text key={`paragraph_${i}`} style={style}>\n\t\t\t\t{t}\n\t\t\t</Text>\n\t\t);\n\t});\n};\n\nexport {\n\tTIMESTAMP_FORMAT,\n\tDATE_FORMAT,\n\tgetUrl,\n\tgetAuthTokenHeader,\n\tgetShadowStyle,\n\tStatusBarHeight,\n\tgetStatusBarHeight,\n\tgetSiteSettingFromState,\n\tgetValueOrDefault,\n\tgetExtension,\n\tgetFileName,\n\tisVideo,\n\tget300,\n\tgetThumb300,\n\tget1400,\n\tgetMimeType,\n\tgetCompressed,\n\timageExists,\n\tgetPluralS,\n\tgetPluralOptions,\n\tisEmail,\n\tformatTime,\n\tminutesToString,\n\trandomString,\n\tgenerateImageName,\n\tgetSite,\n\tgetImageSource,\n\tgetFirstName,\n\tusersToSearchResult,\n\tsearchUsers,\n\tgetEnabledTabsFromState,\n\tgetReactions,\n\thasReacted,\n\tisTablet,\n\tisYoutube,\n\tgetYoutubeEmbed,\n\tgetValidUrl,\n\tgetUserPreview,\n\tallowComments,\n\ttoParagraphed,\n\tisVideoUrl,\n\tdetectFaces,\n\tfindLandmarkRange,\n\tgetScaledOffset,\n\tgetSiteLevelFromState,\n\tisTVEnabled,\n};\n"],"mappings":"AAAA,OAAOA,CAAC,MAAM,QAAQ;AACtB,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,EAAEC,SAAS,EAAEC,UAAU,QAAQ,cAAc;AAC9D,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,SAAS,MAAM,gBAAgB;AACtC,OAAOC,MAAM,MAAM,UAAU;AAC7B,SAASC,QAAQ,QAAQ,WAAW;AACpC,SAASC,kBAAkB,QAAQ,WAAW;;AAE9C;AACA,OAAOC,WAAW,MAAM,yBAAyB;AACjD,OAAOC,iBAAiB,MAAM,+BAA+B;AAC7D,OAAOC,eAAe,MAAM,6BAA6B;AAEzD,OAAOC,qBAAqB,MAAM,iCAAiC;AACnE,OAAOC,WAAW,MAAM,uBAAuB;AAE/C,MAAMC,gBAAgB,GAAG,eAAe;AACxC,MAAMC,WAAW,GAAG,YAAY;AAEhC,MAAMC,MAAM,GAAGA,CAACC,UAAU,EAAEC,MAAM,EAAEC,KAAK,KAAK;EAC7C,MAAM;IAAEC,UAAU;IAAEC;EAAU,CAAC,GAAGf,MAAM,CAACgB,GAAG;EAC5C,IAAIC,SAAS,GAAG,EAAE;EAClB,IAAIJ,KAAK,EAAE;IACVpB,CAAC,CAACyB,IAAI,CAACL,KAAK,CAAC,CAACM,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;MACrCJ,SAAS,IAAI,GAAGI,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGD,GAAG,IAAIE,kBAAkB,CAACT,KAAK,CAACO,GAAG,CAAC,CAAC,EAAE;IAClF,CAAC,CAAC;EACH;EACA,OAAO,GAAGN,UAAU,IAAIH,UAAU,IAAII,SAAS,IAAIH,MAAM,GAAGK,SAAS,EAAE;AACxE,CAAC;AAED,MAAMM,kBAAkB,GAAGA,CAAA,KAAM;EAChC,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACvCxB,kBAAkB,CAAC,CAAC,CAACyB,IAAI,CAAEC,OAAO,IAAK;MACtCH,OAAO,CAAC,UAAUG,OAAO,EAAE,CAAC;IAC7B,CAAC,CAAC;EACH,CAAC,CAAC;AACH,CAAC;AAED,MAAMC,cAAc,GAAGA,CAAA,KAAM;EAC5B,IAAIlC,QAAQ,CAACmC,EAAE,KAAK,KAAK,EAAE;IAC1B,OAAO;MACNC,WAAW,EAAE,MAAM;MACnBC,YAAY,EAAE;QACbC,KAAK,EAAE,CAAC;QACRC,MAAM,EAAE;MACT,CAAC;MACDC,aAAa,EAAE,GAAG;MAClBC,YAAY,EAAE,CAAC;MACfC,eAAe,EAAE;IAClB,CAAC;EACF;EACA,OAAO;IACNC,WAAW,EAAErC,QAAQ;IACrBoC,eAAe,EAAE,MAAM;IACvBE,SAAS,EAAE;EACZ,CAAC;AACF,CAAC;AAED,MAAMC,eAAe,GAAIC,IAAI,IAAK;EACjC,OAAOC,kBAAkB,CAAC,CAAC,GAAGD,IAAI;AACnC,CAAC;AAED,MAAMC,kBAAkB,GAAGA,CAAA,KAAM;EAChC,OAAO/C,QAAQ,CAACmC,EAAE,KAAK,KAAK,GACzB/B,SAAS,CAAC4C,eAAe,GACzB/C,SAAS,CAACgD,aAAa;AAC3B,CAAC;AAED,MAAMC,uBAAuB,GAAGA,CAACC,KAAK,EAAE1B,GAAG,EAAE2B,YAAY,KAAK;EAC7D,IACCD,KAAK,IACLA,KAAK,CAACE,IAAI,IACVF,KAAK,CAACE,IAAI,CAACC,YAAY,IACvB,CAACxD,CAAC,CAACyD,WAAW,CAACJ,KAAK,CAACE,IAAI,CAACC,YAAY,CAAC7B,GAAG,CAAC,CAAC,EAC3C;IACD,OAAO0B,KAAK,CAACE,IAAI,CAACC,YAAY,CAAC7B,GAAG,CAAC;EACpC;EACA,OAAO2B,YAAY,IAAI,IAAI;AAC5B,CAAC;AAED,MAAMI,iBAAiB,GAAGA,CAACC,KAAK,EAAEC,GAAG,KAAK;EACzC,OAAO,CAAC5D,CAAC,CAACyD,WAAW,CAACE,KAAK,CAAC,GAAGA,KAAK,GAAGC,GAAG;AAC3C,CAAC;AAED,MAAMC,YAAY,GAAIC,GAAG,IAAK;EAC7B,IAAI,CAACA,GAAG,EAAE;IACT,OAAO,IAAI;EACZ;EACA,MAAMC,SAAS,GAAGD,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC;EAChC,OAAOD,SAAS,CAACA,SAAS,CAACE,MAAM,GAAG,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;AACrD,CAAC;AAED,MAAMC,WAAW,GAAGA,CAACL,GAAG,EAAEM,WAAW,KAAK;EACzC,IAAI,CAACN,GAAG,EAAE;IACT,OAAO,IAAI;EACZ;EACA,MAAMC,SAAS,GAAGD,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC;EAChC,MAAMK,IAAI,GAAGN,SAAS,CAACA,SAAS,CAACE,MAAM,GAAG,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAC1D,IAAI,CAACE,WAAW,EAAE;IACjB,OAAOC,IAAI;EACZ;EACA,OAAOA,IAAI,CAACL,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAMM,OAAO,GAAIR,GAAG,IAAK;EACxB,MAAMS,SAAS,GAAGV,YAAY,CAACC,GAAG,CAAC;EACnC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAACU,QAAQ,CAACD,SAAS,CAAC;AAC1C,CAAC;AAED,MAAME,UAAU,GAAIX,GAAG,IAAK;EAC3B,MAAMY,UAAU,GAAGC,WAAW,CAACb,GAAG,CAAC;EACnC,IAAIQ,OAAO,CAACI,UAAU,CAAC,EAAE;IACxB,OAAO,IAAI;EACZ;EACA,IAAIE,SAAS,CAACF,UAAU,CAAC,EAAE;IAC1B,OAAO,IAAI;EACZ;EACA,IAAIG,OAAO,CAACH,UAAU,CAAC,EAAE;IACxB,OAAO,IAAI;EACZ;EACA,OAAO,KAAK;AACb,CAAC;AAED,MAAMI,YAAY,GAAIhB,GAAG,IAAK;EAC7B,OACCA,GAAG,CAACiB,OAAO,CACV,6EACD,CAAC,KAAK,CAAC,CAAC;AAEV,CAAC;AAED,MAAMC,WAAW,GAAIlB,GAAG,IAAK;EAC5B,IAAI,CAACA,GAAG,EAAE;IACT,OAAOA,GAAG;EACX;EACA,IAAIQ,OAAO,CAACR,GAAG,CAAC,EAAE;IACjB,OAAO,4KAA4K;EACpL;EACA,IAAIA,GAAG,CAACiB,OAAO,CAAC,gDAAgD,CAAC,KAAK,CAAC,CAAC,EAAE;IACzE,OAAOjB,GAAG,CAACmB,OAAO,CACjB,gDAAgD,EAChD,iCACD,CAAC;EACF;EACA,IAAInB,GAAG,CAACiB,OAAO,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC,EAAE;IAC1D,OAAOjB,GAAG,CACRmB,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACvCA,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CACpCA,OAAO,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAC3CA,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC;EAC3C;EACA,IAAIH,YAAY,CAAChB,GAAG,CAAC,IAAIA,GAAG,CAACiB,OAAO,CAACxE,MAAM,CAACgB,GAAG,CAAC2D,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE;IACvE,MAAMX,SAAS,GAAGV,YAAY,CAACC,GAAG,CAAC;IACnC,IAAIqB,QAAQ,GAAGrB,GAAG;IAClB,IAAIS,SAAS,KAAK,KAAK,EAAE;MACxBY,QAAQ,GAAG,GAAGrB,GAAG,CAACsB,SAAS,CAAC,CAAC,EAAEtB,GAAG,CAACG,MAAM,GAAGM,SAAS,CAACN,MAAM,CAAC,KAAK;IACnE;IACA,OAAOkB,QAAQ,CACbF,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAC/BA,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC;EACrC;EACA,OAAOnB,GAAG;AACX,CAAC;AAED,MAAMuB,OAAO,GAAIvB,GAAG,IAAK;EACxB,IAAI,CAACA,GAAG,EAAE;IACT,OAAOA,GAAG;EACX;EACA,IAAIA,GAAG,CAACiB,OAAO,CAAC,gDAAgD,CAAC,KAAK,CAAC,CAAC,EAAE;IACzE,OAAOjB,GAAG,CAACmB,OAAO,CACjB,gDAAgD,EAChD,iCACD,CAAC;EACF;EACA,IAAInB,GAAG,CAACiB,OAAO,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC,EAAE;IAC1D,OAAOjB,GAAG,CACRmB,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CACrCA,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC;EACxC;EACA,IAAIH,YAAY,CAAChB,GAAG,CAAC,IAAIA,GAAG,CAACiB,OAAO,CAACxE,MAAM,CAACgB,GAAG,CAAC2D,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE;IACvE,MAAMX,SAAS,GAAGV,YAAY,CAACC,GAAG,CAAC;IACnC,IAAIqB,QAAQ,GAAGrB,GAAG;IAClB,IAAIS,SAAS,KAAK,KAAK,EAAE;MACxBY,QAAQ,GAAG,GAAGrB,GAAG,CAACsB,SAAS,CAAC,CAAC,EAAEtB,GAAG,CAACG,MAAM,GAAGM,SAAS,CAACN,MAAM,CAAC,KAAK;IACnE;IACA,OAAOkB,QAAQ,CAACF,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;EAC/C;EACA,OAAOnB,GAAG;AACX,CAAC;AAED,MAAMwB,MAAM,GAAIxB,GAAG,IAAK;EACvB,IAAI,CAACA,GAAG,EAAE;IACT,OAAOA,GAAG;EACX;EACA,IAAIgB,YAAY,CAAChB,GAAG,CAAC,IAAIA,GAAG,CAACiB,OAAO,CAACxE,MAAM,CAACgB,GAAG,CAAC2D,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE;IACvE,MAAMX,SAAS,GAAGV,YAAY,CAACC,GAAG,CAAC;IACnC,IAAIqB,QAAQ,GAAGrB,GAAG;IAClB,IAAIS,SAAS,KAAK,KAAK,EAAE;MACxBY,QAAQ,GAAG,GAAGrB,GAAG,CAACsB,SAAS,CAAC,CAAC,EAAEtB,GAAG,CAACG,MAAM,GAAGM,SAAS,CAACN,MAAM,CAAC,KAAK;IACnE;IACA,OAAOkB,QAAQ,CAACF,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;EACzE;EACA,OAAOnB,GAAG;AACX,CAAC;AAED,MAAMyB,WAAW,GAAIzB,GAAG,IAAK;EAC5B,MAAMS,SAAS,GAAGV,YAAY,CAACC,GAAG,CAAC;EACnC,QAAQS,SAAS;IAChB,KAAK,KAAK;MACT,OAAO,iBAAiB;IACzB,KAAK,KAAK;MACT,OAAO,WAAW;IACnB;MACC,OAAO,YAAY;EACrB;AACD,CAAC;AAED,MAAMiB,aAAa,GAAI1B,GAAG,IAAK;EAC9B,IAAI,CAACA,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAE,OAAO,EAAE;EAC9C,OAAOA,GAAG,CAACmB,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;AAChD,CAAC;AAED,MAAMQ,WAAW,GAAI3B,GAAG,IAAK;EAC5B,OAAO,IAAI/B,OAAO,CAAEC,OAAO,IAAK;IAC/B0D,KAAK,CAAC5B,GAAG,EAAE;MAAE6B,MAAM,EAAE,MAAM;MAAEC,KAAK,EAAE;IAAW,CAAC,CAAC,CAC/C1D,IAAI,CAAE2D,QAAQ,IAAK;MACnB7D,OAAO,CAAC6D,QAAQ,CAACC,MAAM,KAAK,GAAG,CAAC;IACjC,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM;MACZ/D,OAAO,CAAC,KAAK,CAAC;IACf,CAAC,CAAC;EACJ,CAAC,CAAC;AACH,CAAC;AAED,MAAMgE,UAAU,GAAGA,CAACC,KAAK,EAAEC,OAAO,KAAK;EACtC,MAAMC,MAAM,GAAGF,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;;EAExC;EACA,MAAMG,aAAa,GAAGH,KAAK,GAAG,EAAE,GAAGA,KAAK,GAAG,EAAE,GAAGA,KAAK,KAAK,CAAC,GAAG,EAAE,GAAGA,KAAK;;EAExE;EACA,MAAMI,eAAe,GAAGC,MAAM,CAACJ,OAAO,CAAC,CAACK,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAExD,OAAO,GAAGH,aAAa,IAAIC,eAAe,GAAGF,MAAM,EAAE;AACtD,CAAC;AAED,MAAMK,eAAe,GAAGA,CAACN,OAAO,EAAEO,WAAW,KAAK;EACjD,MAAMR,KAAK,GAAGS,IAAI,CAACC,KAAK,CAACT,OAAO,GAAG,EAAE,CAAC;EACtC,MAAMU,gBAAgB,GAAGV,OAAO,GAAG,EAAE;EAErC,IAAIO,WAAW,EAAE;IAChB,OAAOT,UAAU,CAACC,KAAK,EAAEW,gBAAgB,CAAC;EAC3C;EAEA,MAAMC,WAAW,GAAGZ,KAAK,GAAG,CAAC,GAAG,GAAGA,KAAK,QAAQ,GAAG,GAAGA,KAAK,OAAO;EAClE,MAAMa,aAAa,GAClBF,gBAAgB,GAAG,CAAC,GACjB,GAAGA,gBAAgB,UAAU,GAC7B,GAAGA,gBAAgB,SAAS;EAEhC,IAAIX,KAAK,IAAIW,gBAAgB,EAAE;IAC9B,OAAO,GAAGC,WAAW,IAAIC,aAAa,EAAE;EACzC;EACA,IAAIb,KAAK,EAAE;IACV,OAAOY,WAAW;EACnB;EACA,IAAID,gBAAgB,EAAE;IACrB,OAAOE,aAAa;EACrB;EACA,OAAO,WAAW;AACnB,CAAC;AAED,MAAMC,UAAU,GAAIC,KAAK,IAAK;EAC7B,OAAOA,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG;AAC9B,CAAC;AAED,MAAMC,gBAAgB,GAAGA,CAACD,KAAK,EAAEE,QAAQ,EAAEC,MAAM,KAAK;EACrD,IAAIH,KAAK,KAAK,CAAC,EAAE;IAChB,OAAOE,QAAQ;EAChB;EACA,OAAOC,MAAM;AACd,CAAC;AAED,MAAMC,OAAO,GAAIC,KAAK,IAAK;EAC1B,IAAIrH,CAAC,CAACsH,OAAO,CAACD,KAAK,CAAC,EAAE;IACrB,OAAO,KAAK;EACb;EACA,MAAME,KAAK,GAAGF,KAAK,CAACtC,OAAO,CAAC,GAAG,CAAC;EAChC,MAAMyC,MAAM,GAAGH,KAAK,CAACI,WAAW,CAAC,GAAG,CAAC;EACrC,IAAIF,KAAK,GAAG,CAAC,IAAIC,MAAM,GAAGD,KAAK,GAAG,CAAC,IAAIC,MAAM,GAAG,CAAC,IAAIH,KAAK,CAACpD,MAAM,EAAE;IAClE,OAAO,KAAK;EACb;EACA,OAAO,IAAI;AACZ,CAAC;AAED,MAAMyD,YAAY,GAAGA,CAACrD,IAAI,GAAG,EAAE,KAAK;EACnC,OAAO,6BAA6BA,IAAI,EAAE,CAACY,OAAO,CAAC,OAAO,EAAG0C,CAAC,IAAK;IAClE;IACA,IAAIC,CAAC,GAAIlB,IAAI,CAACmB,MAAM,CAAC,CAAC,GAAG,EAAE,GAAI,CAAC;MAC/BC,CAAC,GAAGH,CAAC,KAAK,GAAG,GAAGC,CAAC,GAAIA,CAAC,GAAG,GAAG,GAAI,GAAG;IACpC,OAAOE,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC;EACtB,CAAC,CAAC;AACH,CAAC;AAED,MAAMC,iBAAiB,GAAGA,CAAC3D,IAAI,EAAE4D,MAAM,KAAK;EAC3C,IAAIC,MAAM,GAAGR,YAAY,CAACrD,IAAI,CAAC;EAC/B,IAAI4D,MAAM,EAAE;IACXC,MAAM,IAAI,IAAIlI,CAAC,CAACmI,IAAI,CAACF,MAAM,CAACjE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;EAC1C;EACA,OAAOkE,MAAM;AACd,CAAC;AAED,MAAME,OAAO,GAAIC,IAAI,IAAK;EACzB,OAAOA,IAAI,KAAK,YAAY,IAAIA,IAAI,KAAK,IAAI,GAC1C9H,MAAM,CAACgB,GAAG,CAAC+G,aAAa,GACxBD,IAAI;AACR,CAAC;AAED,MAAME,gBAAgB,GAAIC,GAAG,IAAK;EACjC,MAAMC,QAAQ,GAAGD,GAAG,CAACxE,KAAK,CAAC,GAAG,CAAC,CAAC0E,GAAG,CAAC,CAAC;EACrC,QAAQD,QAAQ;IACf;MACC,OAAO;QAAED;MAAI,CAAC;EAChB;AACD,CAAC;AAED,MAAMG,gBAAgB,GAAIH,GAAG,IAAK;EACjC,MAAMC,QAAQ,GAAGD,GAAG,CAACxE,KAAK,CAAC,GAAG,CAAC,CAAC0E,GAAG,CAAC,CAAC;EACrC,QAAQD,QAAQ;IACf;MACC,OAAO;QAAED;MAAI,CAAC;EAChB;AACD,CAAC;AAED,MAAMI,cAAc,GAAGA,CAACJ,GAAG,EAAEK,OAAO,KAAK;EACxC,IAAIL,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI;EAC5B,IAAIK,OAAO,EAAE,OAAON,gBAAgB,CAACC,GAAG,CAAC;EACzC,OAAOG,gBAAgB,CAACH,GAAG,CAAC;AAC7B,CAAC;AAED,MAAMM,YAAY,GAAIzE,IAAI,IAAK;EAC9B,IAAIrE,CAAC,CAACsH,OAAO,CAACjD,IAAI,CAAC,EAAE;IACpB,OAAOA,IAAI;EACZ;EACA,OAAOA,IAAI,CAACL,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM+E,mBAAmB,GAAGA,CAACC,QAAQ,EAAEC,eAAe,KAAK;EAC1D,IAAIf,MAAM,GAAG,EAAE;EACfc,QAAQ,CAACtH,OAAO,CAAE6B,IAAI,IAAK;IAC1B2E,MAAM,CAACgB,IAAI,CAAC;MACXC,WAAW,EAAE5F,IAAI,CAAC4F,WAAW;MAC7BC,EAAE,EAAE7F,IAAI,CAAC8F,QAAQ,IAAI9F,IAAI,CAAC6F,EAAE,IAAI7F,IAAI,CAAC+F,EAAE,IAAI/F,IAAI,CAACgG,MAAM,IAAIhG,IAAI,CAACiG,EAAE;MACjEC,UAAU,EAAElG,IAAI,CAACkG,UAAU,IAAIlG,IAAI,CAACmG,QAAQ,IAAI,IAAI;MACpDC,IAAI,EAAEpG,IAAI,CAACoG;IACZ,CAAC,CAAC;EACH,CAAC,CAAC;EACFzB,MAAM,GAAGlI,CAAC,CAACiC,MAAM,CAACiG,MAAM,EAAG0B,OAAO,IAAK;IACtC,OAAO5J,CAAC,CAACwE,QAAQ,CAACyE,eAAe,EAAEW,OAAO,CAACR,EAAE,CAAC;EAC/C,CAAC,CAAC;EACF,OAAOlB,MAAM;AACd,CAAC;AAED,MAAM2B,WAAW,GAAGA,CAAC5B,MAAM,EAAE6B,IAAI,KAAK;EACrC,IAAI9J,CAAC,CAACsH,OAAO,CAACwC,IAAI,CAAC,EAAE;IACpB,OAAO7B,MAAM;EACd;EACA,OAAOjI,CAAC,CAAC+J,MAAM,CAAC9B,MAAM,EAAG1E,IAAI,IAAK;IACjC,MAAMS,KAAK,GAAGT,IAAI,CAAC4F,WAAW,CAACnF,KAAK,CAAC,GAAG,CAAC;IACzC,OAAOhE,CAAC,CAACgK,IAAI,CAAChG,KAAK,EAAGiG,IAAI,IAAK;MAC9B,OAAOA,IAAI,CAAC/F,WAAW,CAAC,CAAC,CAACa,OAAO,CAAC+E,IAAI,CAAC5F,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,CAAC,CAAC;EACH,CAAC,CAAC;AACH,CAAC;AAED,MAAMgG,uBAAuB,GAAI7G,KAAK,IAAK;EAC1C,MAAM8G,WAAW,GACf9G,KAAK,CAACE,IAAI,IAAIF,KAAK,CAACE,IAAI,CAAC6G,SAAS,IACnChH,uBAAuB,CAACC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC;EACpD,OAAO8G,WAAW;AACnB,CAAC;AAED,MAAME,uBAAuB,GAAIhH,KAAK,IAAK;EAC1C,MAAM8G,WAAW,GAAGD,uBAAuB,CAAC7G,KAAK,CAAC;EAClD,OAAO8G,WAAW,GAAGA,WAAW,CAACJ,MAAM,CAAEO,GAAG,IAAKA,GAAG,CAACC,SAAS,CAAC,GAAG,EAAE;AACrE,CAAC;AAED,MAAMC,YAAY,GAAGA,CAAA,KAAM;EAC1B,OAAO,CACN;IACC7I,GAAG,EAAE,OAAO;IACZ8I,IAAI,EAAEC,OAAO,CAAC,oCAAoC;EACnD,CAAC,EACD;IACC/I,GAAG,EAAE,OAAO;IACZ8I,IAAI,EAAEC,OAAO,CAAC,oCAAoC;EACnD,CAAC,EACD;IACC/I,GAAG,EAAE,KAAK;IACV8I,IAAI,EAAEC,OAAO,CAAC,kCAAkC;EACjD,CAAC,EACD;IACC/I,GAAG,EAAE,OAAO;IACZ8I,IAAI,EAAEC,OAAO,CAAC,oCAAoC;EACnD,CAAC,CACD;AACF,CAAC;AAED,MAAMC,UAAU,GAAGA,CAACC,SAAS,EAAErB,MAAM,KAAK;EACzC,OAAOvJ,CAAC,CAACgK,IAAI,CAACY,SAAS,EAAGhD,CAAC,IAAK;IAC/B,OAAO,CAAC,CAACA,CAAC,CAAC2B,MAAM,CAAC;EACnB,CAAC,CAAC;AACH,CAAC;AAED,MAAMsB,QAAQ,GAAGA,CAAA,KAAM;EACtB,OAAOzK,UAAU,CAAC0K,GAAG,CAAC,QAAQ,CAAC,CAACtI,KAAK,GAAG,GAAG;AAC5C,CAAC;AAED,MAAMqC,OAAO,GAAIf,GAAG,IAAK;EACxB,IAAI9D,CAAC,CAACsH,OAAO,CAACxD,GAAG,CAAC,EAAE;IACnB,OAAO,KAAK;EACb;EACA,IAAIA,GAAG,CAACiB,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE;IAC5C,OAAO,IAAI;EACZ;EACA,IAAIjB,GAAG,CAACiB,OAAO,CAAC,iCAAiC,CAAC,KAAK,CAAC,EAAE;IACzD,OAAO,IAAI;EACZ;AACD,CAAC;AAED,MAAMgG,aAAa,GAAIjH,GAAG,IAAK;EAC9B,IAAI9D,CAAC,CAACsH,OAAO,CAACxD,GAAG,CAAC,EAAE;IACnB,OAAO,EAAE;EACV;EACA,IAAIA,GAAG,CAACiB,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE;IAC5C,MAAMiG,OAAO,GAAG,KAAK,CAAC,CAAC;IACvB,OAAO,kCAAkCA,OAAO,EAAE;EACnD;EACA,OAAOlH,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAMc,SAAS,GAAId,GAAG,IAAK;EAC1B,IAAI9D,CAAC,CAACyD,WAAW,CAACK,GAAG,CAAC,IAAI9D,CAAC,CAACsH,OAAO,CAACxD,GAAG,CAAC,EAAE;IACzC,OAAO,KAAK;EACb;EACA,MAAMmH,MAAM,GACX,sEAAsE;EACvE,MAAMC,KAAK,GAAGpH,GAAG,CAACoH,KAAK,CAACD,MAAM,CAAC;EAC/B,IAAIC,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC,CAACjH,MAAM,KAAK,EAAE,EAAE;IACpC,OAAO,IAAI;EACZ;EACA,OAAO,KAAK;AACb,CAAC;AAED,MAAMkH,eAAe,GAAIrH,GAAG,IAAK;EAChC,MAAMmH,MAAM,GACX,sEAAsE;EACvE,MAAMC,KAAK,GAAGpH,GAAG,CAACoH,KAAK,CAACD,MAAM,CAAC;EAC/B,OAAO,iCAAiCC,KAAK,CAAC,CAAC,CAAC,aAAa;AAC9D,CAAC;AAED,MAAMvG,WAAW,GAAGA,CAACb,GAAG,GAAG,EAAE,KAAK;EACjC,IAAIsH,MAAM,GAAGC,kBAAkB,CAACvH,GAAG,CAAC;EACpCsH,MAAM,GAAGA,MAAM,CAACE,IAAI,CAAC,CAAC,CAACrG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EAEzC,IAAI,UAAU,CAACsG,IAAI,CAACH,MAAM,CAAC,EAAE;IAC5B,OAAO,QAAQA,MAAM,EAAE;EACxB;EACA,IAAI,CAAC,mBAAmB,CAACG,IAAI,CAACH,MAAM,CAAC,EAAE;IACtC,OAAO,WAAWA,MAAM,EAAE;EAC3B;EAEA,OAAOA,MAAM;AACd,CAAC;AAED,MAAMI,cAAc,GAAIjI,IAAI,IAAK;EAChC,OAAO;IACN6F,EAAE,EAAE7F,IAAI,CAACkI,GAAG;IACZtC,WAAW,EAAE5F,IAAI,CAAC4F,WAAW;IAC7BM,UAAU,EAAElG,IAAI,CAACkG,UAAU,IAAI;EAChC,CAAC;AACF,CAAC;AAED,MAAMiC,aAAa,GAAIC,UAAU,IAAK;EACrC,IAAIA,UAAU,KAAK,KAAK,EAAE;IACzB,OAAO,KAAK;EACb;EACA,IAAIA,UAAU,KAAK,IAAI,EAAE;IACxB,OAAO,IAAI;EACZ;EACA,OAAOpL,MAAM,CAACgB,GAAG,CAACqK,oBAAoB;AACvC,CAAC;AAED,MAAMC,aAAa,GAAGA,CAACC,IAAI,EAAEC,KAAK,KAAK;EACtC,IAAI,CAACD,IAAI,EAAE;IACV,OAAOA,IAAI;EACZ;EACA,MAAME,SAAS,GAAGF,IAAI,CAAC9H,KAAK,CAAC,IAAI,CAAC;EAClC,OAAOhE,CAAC,CAACiM,GAAG,CAACD,SAAS,EAAE,CAACE,CAAC,EAAEC,CAAC,KAAK;IACjC,oBACClM,KAAA,CAAAmM,aAAA,CAAC/L,IAAI;MAACsB,GAAG,EAAE,aAAawK,CAAC,EAAG;MAACJ,KAAK,EAAEA;IAAM,GACxCG,CACI,CAAC;EAET,CAAC,CAAC;AACH,CAAC;AAED,SACCnL,gBAAgB,EAChBC,WAAW,EACXC,MAAM,EACNa,kBAAkB,EAClBM,cAAc,EACdW,eAAe,EACfE,kBAAkB,EAClBG,uBAAuB,EACvBM,iBAAiB,EACjBG,YAAY,EACZM,WAAW,EACXG,OAAO,EACPgB,MAAM,EACNN,WAAW,EACXK,OAAO,EACPE,WAAW,EACXC,aAAa,EACbC,WAAW,EACXsB,UAAU,EACVE,gBAAgB,EAChBG,OAAO,EACPpB,UAAU,EACVQ,eAAe,EACfkB,YAAY,EACZM,iBAAiB,EACjBI,OAAO,EACPQ,cAAc,EACdE,YAAY,EACZC,mBAAmB,EACnBc,WAAW,EACXQ,uBAAuB,EACvBG,YAAY,EACZG,UAAU,EACVE,QAAQ,EACRjG,SAAS,EACTuG,eAAe,EACfxG,WAAW,EACX6G,cAAc,EACdE,aAAa,EACbG,aAAa,EACbpH,UAAU,EACV/D,WAAW,EACXC,iBAAiB,EACjBC,eAAe,EACfC,qBAAqB,EACrBC,WAAW","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ import Config from "./config";
2
+ import Styles from "./styles";
3
+ import * as Session from "./session";
4
+ import * as Helper from "./helper";
5
+ import * as Colours from "./colours";
6
+ import * as Actions from "./actions";
7
+ import * as ActionTypes from "./actions/types";
8
+ import * as Apis from "./apis";
9
+ import * as Components from "./components";
10
+ import * as Constants from "./constants";
11
+ import { withNavigationFocus } from "./withNavigationFocus";
12
+ export { Config, Styles, Session, Helper, Colours, Actions, ActionTypes, Apis, Components, Constants, withNavigationFocus };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Config","Styles","Session","Helper","Colours","Actions","ActionTypes","Apis","Components","Constants","withNavigationFocus"],"sources":["index.js"],"sourcesContent":["import Config from \"./config\";\nimport Styles from \"./styles\";\nimport * as Session from \"./session\";\nimport * as Helper from \"./helper\";\nimport * as Colours from \"./colours\";\nimport * as Actions from \"./actions\";\nimport * as ActionTypes from \"./actions/types\";\nimport * as Apis from \"./apis\";\nimport * as Components from \"./components\";\nimport * as Constants from \"./constants\";\nimport { withNavigationFocus } from \"./withNavigationFocus\";\n\nexport {\n\tConfig,\n\tStyles,\n\tSession,\n\tHelper,\n\tColours,\n\tActions,\n\tActionTypes,\n\tApis,\n\tComponents,\n\tConstants,\n\twithNavigationFocus,\n};\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,UAAU;AAC7B,OAAOC,MAAM,MAAM,UAAU;AAC7B,OAAO,KAAKC,OAAO,MAAM,WAAW;AACpC,OAAO,KAAKC,MAAM,MAAM,UAAU;AAClC,OAAO,KAAKC,OAAO,MAAM,WAAW;AACpC,OAAO,KAAKC,OAAO,MAAM,WAAW;AACpC,OAAO,KAAKC,WAAW,MAAM,iBAAiB;AAC9C,OAAO,KAAKC,IAAI,MAAM,QAAQ;AAC9B,OAAO,KAAKC,UAAU,MAAM,cAAc;AAC1C,OAAO,KAAKC,SAAS,MAAM,aAAa;AACxC,SAASC,mBAAmB,QAAQ,uBAAuB;AAE3D,SACCV,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,OAAO,EACPC,WAAW,EACXC,IAAI,EACJC,UAAU,EACVC,SAAS,EACTC,mBAAmB","ignoreList":[]}
@@ -0,0 +1,31 @@
1
+ import { stringActions } from "../../apis";
2
+ import moment from "moment";
3
+ import { File, Paths } from "expo-file-system";
4
+ // import * as FaceDetector from 'expo-face-detector';
5
+
6
+ const detectFaces = async remoteUrl => {
7
+ var _parts$;
8
+ // deprecated
9
+
10
+ const parts = remoteUrl.split("/").splice(-2);
11
+ const mediaId = parts[0];
12
+ const extension = ((_parts$ = parts[1]) === null || _parts$ === void 0 ? void 0 : _parts$.split(".").splice(-1)[0]) || "jpg";
13
+ const file = await File.downloadFileAsync(remoteUrl, new File(Paths.cache, `${mediaId}.${extension}`), {
14
+ idempotent: true
15
+ });
16
+ const localUrl = file.uri;
17
+
18
+ // const faces = await FaceDetector.detectFacesAsync(localUrl, {
19
+ // mode: FaceDetector.FaceDetectorMode.accurate,
20
+ // });
21
+
22
+ const faces = null;
23
+ if (faces && faces.image && faces.image.uri) {
24
+ delete faces.image.uri;
25
+ }
26
+ faces.timestamp = moment().valueOf();
27
+ stringActions.setString("plussSpace", `imagefaces_${encodeURIComponent(remoteUrl)}`, faces);
28
+ return faces;
29
+ };
30
+ export default detectFaces;
31
+ //# sourceMappingURL=detectFaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["stringActions","moment","File","Paths","detectFaces","remoteUrl","_parts$","parts","split","splice","mediaId","extension","file","downloadFileAsync","cache","idempotent","localUrl","uri","faces","image","timestamp","valueOf","setString","encodeURIComponent"],"sources":["detectFaces.js"],"sourcesContent":["import { stringActions } from \"../../apis\";\nimport moment from \"moment\";\nimport { File, Paths } from \"expo-file-system\";\n// import * as FaceDetector from 'expo-face-detector';\n\nconst detectFaces = async (remoteUrl) => {\n\t// deprecated\n\n\tconst parts = remoteUrl.split(\"/\").splice(-2);\n\tconst mediaId = parts[0];\n\tconst extension = parts[1]?.split(\".\").splice(-1)[0] || \"jpg\";\n\n\tconst file = await File.downloadFileAsync(\n\t\tremoteUrl,\n\t\tnew File(Paths.cache, `${mediaId}.${extension}`),\n\t\t{ idempotent: true },\n\t);\n\tconst localUrl = file.uri;\n\n\t// const faces = await FaceDetector.detectFacesAsync(localUrl, {\n\t// mode: FaceDetector.FaceDetectorMode.accurate,\n\t// });\n\n\tconst faces = null;\n\n\tif (faces && faces.image && faces.image.uri) {\n\t\tdelete faces.image.uri;\n\t}\n\n\tfaces.timestamp = moment().valueOf();\n\n\tstringActions.setString(\n\t\t\"plussSpace\",\n\t\t`imagefaces_${encodeURIComponent(remoteUrl)}`,\n\t\tfaces,\n\t);\n\n\treturn faces;\n};\n\nexport default detectFaces;\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,YAAY;AAC1C,OAAOC,MAAM,MAAM,QAAQ;AAC3B,SAASC,IAAI,EAAEC,KAAK,QAAQ,kBAAkB;AAC9C;;AAEA,MAAMC,WAAW,GAAG,MAAOC,SAAS,IAAK;EAAA,IAAAC,OAAA;EACxC;;EAEA,MAAMC,KAAK,GAAGF,SAAS,CAACG,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;EAC7C,MAAMC,OAAO,GAAGH,KAAK,CAAC,CAAC,CAAC;EACxB,MAAMI,SAAS,GAAG,EAAAL,OAAA,GAAAC,KAAK,CAAC,CAAC,CAAC,cAAAD,OAAA,uBAARA,OAAA,CAAUE,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAI,KAAK;EAE7D,MAAMG,IAAI,GAAG,MAAMV,IAAI,CAACW,iBAAiB,CACxCR,SAAS,EACT,IAAIH,IAAI,CAACC,KAAK,CAACW,KAAK,EAAE,GAAGJ,OAAO,IAAIC,SAAS,EAAE,CAAC,EAChD;IAAEI,UAAU,EAAE;EAAK,CACpB,CAAC;EACD,MAAMC,QAAQ,GAAGJ,IAAI,CAACK,GAAG;;EAEzB;EACA;EACA;;EAEA,MAAMC,KAAK,GAAG,IAAI;EAElB,IAAIA,KAAK,IAAIA,KAAK,CAACC,KAAK,IAAID,KAAK,CAACC,KAAK,CAACF,GAAG,EAAE;IAC5C,OAAOC,KAAK,CAACC,KAAK,CAACF,GAAG;EACvB;EAEAC,KAAK,CAACE,SAAS,GAAGnB,MAAM,CAAC,CAAC,CAACoB,OAAO,CAAC,CAAC;EAEpCrB,aAAa,CAACsB,SAAS,CACtB,YAAY,EACZ,cAAcC,kBAAkB,CAAClB,SAAS,CAAC,EAAE,EAC7Ca,KACD,CAAC;EAED,OAAOA,KAAK;AACb,CAAC;AAED,eAAed,WAAW","ignoreList":[]}
@@ -0,0 +1,93 @@
1
+ import _ from "lodash";
2
+ import moment from "moment";
3
+ import { stringActions } from "../../apis";
4
+ import detectFaces from "./detectFaces";
5
+ import getScaledOffset from "./getScaledOffset";
6
+ const findLandmarkRange = async (url, options) => {
7
+ let cachedValues;
8
+ if (options && options.cachedValues) {
9
+ cachedValues = options.cachedValues;
10
+ }
11
+ try {
12
+ const response = await stringActions.getString("plussSpace", `imagefaces_${encodeURIComponent(url)}`);
13
+ cachedValues = response.data;
14
+ } catch (e) {
15
+ console.log("errored from cache");
16
+ }
17
+ if (!cachedValues || !cachedValues.faces || !cachedValues.image || _.isEmpty(cachedValues.faces) && moment().add(-1, "w").valueOf() > moment(cachedValues.timestamp).valueOf()) {
18
+ cachedValues = await detectFaces(url);
19
+ }
20
+ const {
21
+ faces,
22
+ image
23
+ } = cachedValues;
24
+ let landmarkStartX = null;
25
+ let landmarkStartY = null;
26
+ let landmarkEndX = null;
27
+ let landmarkEndY = null;
28
+ if (_.isEmpty(faces)) {
29
+ landmarkStartX = image.width / 2;
30
+ landmarkStartY = image.height / 2;
31
+ landmarkEndX = image.width / 2;
32
+ landmarkEndY = image.height / 2;
33
+ } else {
34
+ faces.forEach(face => {
35
+ const {
36
+ bounds
37
+ } = face;
38
+ if (!landmarkStartX || bounds.origin.x < landmarkStartX) {
39
+ landmarkStartX = bounds.origin.x;
40
+ }
41
+ if (!landmarkStartY || bounds.origin.y < landmarkStartY) {
42
+ landmarkStartY = bounds.origin.y;
43
+ }
44
+ const faceEndX = bounds.origin.x + bounds.size.width;
45
+ if (!landmarkEndX || faceEndX > landmarkEndX) {
46
+ landmarkEndX = faceEndX;
47
+ }
48
+ const faceEndY = bounds.origin.y + bounds.size.height;
49
+ if (!landmarkEndY || faceEndX > landmarkEndY) {
50
+ landmarkEndY = faceEndY;
51
+ }
52
+ });
53
+ }
54
+ let targetWidth = image.width;
55
+ let targetHeight = image.height;
56
+ if (options && options.targetWidth && options.targetHeight) {
57
+ const {
58
+ scaleFactor
59
+ } = getScaledOffset(image.width, image.height, options.targetWidth, options.targetHeight);
60
+ landmarkStartX *= scaleFactor;
61
+ landmarkStartY *= scaleFactor;
62
+ landmarkEndX *= scaleFactor;
63
+ landmarkEndY *= scaleFactor;
64
+ targetWidth = options.targetWidth;
65
+ targetHeight = options.targetHeight;
66
+ }
67
+ if (landmarkStartX < 0) {
68
+ landmarkStartX = 0;
69
+ }
70
+ if (landmarkStartY < 0) {
71
+ landmarkStartY = 0;
72
+ }
73
+ if (landmarkEndX > targetWidth) {
74
+ landmarkEndX = targetWidth;
75
+ }
76
+ if (landmarkEndY > targetHeight) {
77
+ landmarkEndY = targetHeight;
78
+ }
79
+ return {
80
+ start: {
81
+ x: landmarkStartX,
82
+ y: landmarkStartY
83
+ },
84
+ end: {
85
+ x: landmarkEndX,
86
+ y: landmarkEndY
87
+ },
88
+ height: image.height,
89
+ width: image.width
90
+ };
91
+ };
92
+ export default findLandmarkRange;
93
+ //# sourceMappingURL=findLandmarkRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_","moment","stringActions","detectFaces","getScaledOffset","findLandmarkRange","url","options","cachedValues","response","getString","encodeURIComponent","data","e","console","log","faces","image","isEmpty","add","valueOf","timestamp","landmarkStartX","landmarkStartY","landmarkEndX","landmarkEndY","width","height","forEach","face","bounds","origin","x","y","faceEndX","size","faceEndY","targetWidth","targetHeight","scaleFactor","start","end"],"sources":["findLandmarkRange.js"],"sourcesContent":["import _ from \"lodash\";\nimport moment from \"moment\";\nimport { stringActions } from \"../../apis\";\nimport detectFaces from \"./detectFaces\";\nimport getScaledOffset from \"./getScaledOffset\";\n\nconst findLandmarkRange = async (url, options) => {\n\tlet cachedValues;\n\tif (options && options.cachedValues) {\n\t\tcachedValues = options.cachedValues;\n\t}\n\ttry {\n\t\tconst response = await stringActions.getString(\n\t\t\t\"plussSpace\",\n\t\t\t`imagefaces_${encodeURIComponent(url)}`,\n\t\t);\n\t\tcachedValues = response.data;\n\t} catch (e) {\n\t\tconsole.log(\"errored from cache\");\n\t}\n\tif (\n\t\t!cachedValues ||\n\t\t!cachedValues.faces ||\n\t\t!cachedValues.image ||\n\t\t(_.isEmpty(cachedValues.faces) &&\n\t\t\tmoment().add(-1, \"w\").valueOf() >\n\t\t\t\tmoment(cachedValues.timestamp).valueOf())\n\t) {\n\t\tcachedValues = await detectFaces(url);\n\t}\n\tconst { faces, image } = cachedValues;\n\n\tlet landmarkStartX = null;\n\tlet landmarkStartY = null;\n\tlet landmarkEndX = null;\n\tlet landmarkEndY = null;\n\n\tif (_.isEmpty(faces)) {\n\t\tlandmarkStartX = image.width / 2;\n\t\tlandmarkStartY = image.height / 2;\n\t\tlandmarkEndX = image.width / 2;\n\t\tlandmarkEndY = image.height / 2;\n\t} else {\n\t\tfaces.forEach((face) => {\n\t\t\tconst { bounds } = face;\n\n\t\t\tif (!landmarkStartX || bounds.origin.x < landmarkStartX) {\n\t\t\t\tlandmarkStartX = bounds.origin.x;\n\t\t\t}\n\n\t\t\tif (!landmarkStartY || bounds.origin.y < landmarkStartY) {\n\t\t\t\tlandmarkStartY = bounds.origin.y;\n\t\t\t}\n\n\t\t\tconst faceEndX = bounds.origin.x + bounds.size.width;\n\t\t\tif (!landmarkEndX || faceEndX > landmarkEndX) {\n\t\t\t\tlandmarkEndX = faceEndX;\n\t\t\t}\n\n\t\t\tconst faceEndY = bounds.origin.y + bounds.size.height;\n\t\t\tif (!landmarkEndY || faceEndX > landmarkEndY) {\n\t\t\t\tlandmarkEndY = faceEndY;\n\t\t\t}\n\t\t});\n\t}\n\n\tlet targetWidth = image.width;\n\tlet targetHeight = image.height;\n\n\tif (options && options.targetWidth && options.targetHeight) {\n\t\tconst { scaleFactor } = getScaledOffset(\n\t\t\timage.width,\n\t\t\timage.height,\n\t\t\toptions.targetWidth,\n\t\t\toptions.targetHeight,\n\t\t);\n\t\tlandmarkStartX *= scaleFactor;\n\t\tlandmarkStartY *= scaleFactor;\n\t\tlandmarkEndX *= scaleFactor;\n\t\tlandmarkEndY *= scaleFactor;\n\t\ttargetWidth = options.targetWidth;\n\t\ttargetHeight = options.targetHeight;\n\t}\n\n\tif (landmarkStartX < 0) {\n\t\tlandmarkStartX = 0;\n\t}\n\tif (landmarkStartY < 0) {\n\t\tlandmarkStartY = 0;\n\t}\n\tif (landmarkEndX > targetWidth) {\n\t\tlandmarkEndX = targetWidth;\n\t}\n\tif (landmarkEndY > targetHeight) {\n\t\tlandmarkEndY = targetHeight;\n\t}\n\n\treturn {\n\t\tstart: {\n\t\t\tx: landmarkStartX,\n\t\t\ty: landmarkStartY,\n\t\t},\n\t\tend: {\n\t\t\tx: landmarkEndX,\n\t\t\ty: landmarkEndY,\n\t\t},\n\t\theight: image.height,\n\t\twidth: image.width,\n\t};\n};\n\nexport default findLandmarkRange;\n"],"mappings":"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","ignoreList":[]}