@plusscommunities/pluss-core-app 4.0.4-auth.0 → 6.0.0-auth.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module/actions/FollowerActions.js +34 -0
- package/dist/module/actions/FollowerActions.js.map +1 -0
- package/dist/module/actions/MediaActions.js +29 -0
- package/dist/module/actions/MediaActions.js.map +1 -0
- package/dist/module/actions/ResidentActions.js +26 -0
- package/dist/module/actions/ResidentActions.js.map +1 -0
- package/dist/module/actions/UserActions.js +223 -0
- package/dist/module/actions/UserActions.js.map +1 -0
- package/dist/module/actions/UserSettingsActions.js +14 -0
- package/dist/module/actions/UserSettingsActions.js.map +1 -0
- package/dist/module/actions/index.js +6 -0
- package/dist/module/actions/index.js.map +1 -0
- package/dist/module/actions/types.js +17 -0
- package/dist/module/actions/types.js.map +1 -0
- package/dist/module/apis/analyticsActions.js +20 -0
- package/dist/module/apis/analyticsActions.js.map +1 -0
- package/dist/module/apis/contactActions.js +27 -0
- package/dist/module/apis/contactActions.js.map +1 -0
- package/dist/module/apis/eventActions.js +161 -0
- package/dist/module/apis/eventActions.js.map +1 -0
- package/dist/module/apis/fileActions.js +86 -0
- package/dist/module/apis/fileActions.js.map +1 -0
- package/dist/module/apis/followerActions.js +38 -0
- package/dist/module/apis/followerActions.js.map +1 -0
- package/dist/module/apis/index.js +12 -0
- package/dist/module/apis/index.js.map +1 -0
- package/dist/module/apis/notificationActions.js +60 -0
- package/dist/module/apis/notificationActions.js.map +1 -0
- package/dist/module/apis/profileActions.js +14 -0
- package/dist/module/apis/profileActions.js.map +1 -0
- package/dist/module/apis/reactionActions.js +76 -0
- package/dist/module/apis/reactionActions.js.map +1 -0
- package/dist/module/apis/stringActions.js +30 -0
- package/dist/module/apis/stringActions.js.map +1 -0
- package/dist/module/apis/typeActions.js +15 -0
- package/dist/module/apis/typeActions.js.map +1 -0
- package/dist/module/apis/userActions.js +104 -0
- package/dist/module/apis/userActions.js.map +1 -0
- package/dist/module/assets/icons/reactions/heart.png +0 -0
- package/dist/module/assets/icons/reactions/party.png +0 -0
- package/dist/module/assets/icons/reactions/sad.png +0 -0
- package/dist/module/assets/icons/reactions/smile.png +0 -0
- package/dist/module/colours.js +168 -0
- package/dist/module/colours.js.map +1 -0
- package/dist/module/components/AddButton.js +43 -0
- package/dist/module/components/AddButton.js.map +1 -0
- package/dist/module/components/AddToCalendarButton.js +225 -0
- package/dist/module/components/AddToCalendarButton.js.map +1 -0
- package/dist/module/components/Attachment.js +54 -0
- package/dist/module/components/Attachment.js.map +1 -0
- package/dist/module/components/AudienceSelectorLauncher.js +64 -0
- package/dist/module/components/AudienceSelectorLauncher.js.map +1 -0
- package/dist/module/components/AudienceSelectorPage.js +350 -0
- package/dist/module/components/AudienceSelectorPage.js.map +1 -0
- package/dist/module/components/AutoOffsetImage.js +186 -0
- package/dist/module/components/AutoOffsetImage.js.map +1 -0
- package/dist/module/components/BackButton.js +58 -0
- package/dist/module/components/BackButton.js.map +1 -0
- package/dist/module/components/CategoryTabs.js +154 -0
- package/dist/module/components/CategoryTabs.js.map +1 -0
- package/dist/module/components/CommentReply.js +328 -0
- package/dist/module/components/CommentReply.js.map +1 -0
- package/dist/module/components/CommentSection.js +822 -0
- package/dist/module/components/CommentSection.js.map +1 -0
- package/dist/module/components/ConfirmPopup.js +108 -0
- package/dist/module/components/ConfirmPopup.js.map +1 -0
- package/dist/module/components/ConfirmationPopup.js +72 -0
- package/dist/module/components/ConfirmationPopup.js.map +1 -0
- package/dist/module/components/DropDownItem.js +74 -0
- package/dist/module/components/DropDownItem.js.map +1 -0
- package/dist/module/components/DropDownMenu.js +41 -0
- package/dist/module/components/DropDownMenu.js.map +1 -0
- package/dist/module/components/EmptyStateMain.js +50 -0
- package/dist/module/components/EmptyStateMain.js.map +1 -0
- package/dist/module/components/EmptyStateWidget.js +47 -0
- package/dist/module/components/EmptyStateWidget.js.map +1 -0
- package/dist/module/components/FontScaleButton.js +36 -0
- package/dist/module/components/FontScaleButton.js.map +1 -0
- package/dist/module/components/FontScalePopup.js +75 -0
- package/dist/module/components/FontScalePopup.js.map +1 -0
- package/dist/module/components/FormCard.js +25 -0
- package/dist/module/components/FormCard.js.map +1 -0
- package/dist/module/components/FormCardSection.js +212 -0
- package/dist/module/components/FormCardSection.js.map +1 -0
- package/dist/module/components/FormCardSectionOptionLauncher.js +72 -0
- package/dist/module/components/FormCardSectionOptionLauncher.js.map +1 -0
- package/dist/module/components/FormattedText.js +131 -0
- package/dist/module/components/FormattedText.js.map +1 -0
- package/dist/module/components/GenericInput.js +148 -0
- package/dist/module/components/GenericInput.js.map +1 -0
- package/dist/module/components/GenericInputSection.js +158 -0
- package/dist/module/components/GenericInputSection.js.map +1 -0
- package/dist/module/components/Header.js +458 -0
- package/dist/module/components/Header.js.map +1 -0
- package/dist/module/components/ImagePopup.js +240 -0
- package/dist/module/components/ImagePopup.js.map +1 -0
- package/dist/module/components/ImageUploadProgress.js +68 -0
- package/dist/module/components/ImageUploadProgress.js.map +1 -0
- package/dist/module/components/ImageUploader.js +795 -0
- package/dist/module/components/ImageUploader.js.map +1 -0
- package/dist/module/components/InlineButton.js +65 -0
- package/dist/module/components/InlineButton.js.map +1 -0
- package/dist/module/components/Input.js +154 -0
- package/dist/module/components/Input.js.map +1 -0
- package/dist/module/components/LoadingCircles.js +220 -0
- package/dist/module/components/LoadingCircles.js.map +1 -0
- package/dist/module/components/LoadingIndicator.js +86 -0
- package/dist/module/components/LoadingIndicator.js.map +1 -0
- package/dist/module/components/LoadingStateWidget.js +46 -0
- package/dist/module/components/LoadingStateWidget.js.map +1 -0
- package/dist/module/components/MediaPlayer.js +418 -0
- package/dist/module/components/MediaPlayer.js.map +1 -0
- package/dist/module/components/MiddlePopup.js +43 -0
- package/dist/module/components/MiddlePopup.js.map +1 -0
- package/dist/module/components/PDFPopup.js +191 -0
- package/dist/module/components/PDFPopup.js.map +1 -0
- package/dist/module/components/PlussChat.js +986 -0
- package/dist/module/components/PlussChat.js.map +1 -0
- package/dist/module/components/PlussChatMessage.js +262 -0
- package/dist/module/components/PlussChatMessage.js.map +1 -0
- package/dist/module/components/PlussChatTime.js +58 -0
- package/dist/module/components/PlussChatTime.js.map +1 -0
- package/dist/module/components/Popup.js +125 -0
- package/dist/module/components/Popup.js.map +1 -0
- package/dist/module/components/PopupMenu.js +119 -0
- package/dist/module/components/PopupMenu.js.map +1 -0
- package/dist/module/components/PositionedImage.js +313 -0
- package/dist/module/components/PositionedImage.js.map +1 -0
- package/dist/module/components/ProfilePic.js +106 -0
- package/dist/module/components/ProfilePic.js.map +1 -0
- package/dist/module/components/RadioButton.js +77 -0
- package/dist/module/components/RadioButton.js.map +1 -0
- package/dist/module/components/Reaction.js +116 -0
- package/dist/module/components/Reaction.js.map +1 -0
- package/dist/module/components/Reactions.js +71 -0
- package/dist/module/components/Reactions.js.map +1 -0
- package/dist/module/components/SharingTools.js +154 -0
- package/dist/module/components/SharingTools.js.map +1 -0
- package/dist/module/components/Spinner.js +22 -0
- package/dist/module/components/Spinner.js.map +1 -0
- package/dist/module/components/StickyFooter.js +34 -0
- package/dist/module/components/StickyFooter.js.map +1 -0
- package/dist/module/components/TextStyle.js +45 -0
- package/dist/module/components/TextStyle.js.map +1 -0
- package/dist/module/components/Toggle.js +65 -0
- package/dist/module/components/Toggle.js.map +1 -0
- package/dist/module/components/TouchableSearchBar.js +67 -0
- package/dist/module/components/TouchableSearchBar.js.map +1 -0
- package/dist/module/components/UserListPopup.js +135 -0
- package/dist/module/components/UserListPopup.js.map +1 -0
- package/dist/module/components/UserListing.js +267 -0
- package/dist/module/components/UserListing.js.map +1 -0
- package/dist/module/components/VideoPopup.js +113 -0
- package/dist/module/components/VideoPopup.js.map +1 -0
- package/dist/module/components/WarningPopup.js +82 -0
- package/dist/module/components/WarningPopup.js.map +1 -0
- package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js +289 -0
- package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js.map +1 -0
- package/dist/module/components/expo-image-picker-multiple/ImageTile.js +116 -0
- package/dist/module/components/expo-image-picker-multiple/ImageTile.js.map +1 -0
- package/dist/module/components/index.js +55 -0
- package/dist/module/components/index.js.map +1 -0
- package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +385 -0
- package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js.map +1 -0
- package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js +387 -0
- package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js.map +1 -0
- package/dist/module/config.js +32 -0
- package/dist/module/config.js.map +1 -0
- package/dist/module/constants.js +19 -0
- package/dist/module/constants.js.map +1 -0
- package/dist/module/fonts/index.js +2 -0
- package/dist/module/fonts/index.js.map +1 -0
- package/dist/module/fonts/pluss60-icons.js +5 -0
- package/dist/module/fonts/pluss60-icons.js.map +1 -0
- package/dist/module/fonts/pluss60-icons.json +1097 -0
- package/dist/module/helper.js +397 -0
- package/dist/module/helper.js.map +1 -0
- package/dist/module/index.js +13 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/js/images/detectFaces.js +30 -0
- package/dist/module/js/images/detectFaces.js.map +1 -0
- package/dist/module/js/images/findLandmarkRange.js +93 -0
- package/dist/module/js/images/findLandmarkRange.js.map +1 -0
- package/dist/module/js/images/getScaledOffset.js +81 -0
- package/dist/module/js/images/getScaledOffset.js.map +1 -0
- package/dist/module/js/site/getSiteLevelFromState.js +29 -0
- package/dist/module/js/site/getSiteLevelFromState.js.map +1 -0
- package/dist/module/js/site/isTVEnabled.js +10 -0
- package/dist/module/js/site/isTVEnabled.js.map +1 -0
- package/dist/module/session.js +58 -0
- package/dist/module/session.js.map +1 -0
- package/dist/module/styles.js +67 -0
- package/dist/module/styles.js.map +1 -0
- package/package.json +20 -24
- package/src/js/images/detectFaces.js +8 -4
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { Platform, StatusBar, Dimensions } from 'react-native';
|
|
3
|
+
import Constants from 'expo-constants';
|
|
4
|
+
import Config from './config';
|
|
5
|
+
import { LINEGREY } from './colours';
|
|
6
|
+
import { getSessionTokenAWS } from './session';
|
|
7
|
+
|
|
8
|
+
// seperated files to export
|
|
9
|
+
import detectFaces from './js/images/detectFaces';
|
|
10
|
+
import findLandmarkRange from './js/images/findLandmarkRange';
|
|
11
|
+
import getScaledOffset from './js/images/getScaledOffset';
|
|
12
|
+
import getSiteLevelFromState from './js/site/getSiteLevelFromState';
|
|
13
|
+
import isTVEnabled from './js/site/isTVEnabled';
|
|
14
|
+
const TIMESTAMP_FORMAT = 'D MMM • h:mma';
|
|
15
|
+
const DATE_FORMAT = 'D MMM YYYY';
|
|
16
|
+
const getUrl = (baseAction, action, query) => {
|
|
17
|
+
const {
|
|
18
|
+
baseAPIUrl,
|
|
19
|
+
baseStage
|
|
20
|
+
} = Config.env;
|
|
21
|
+
let queryPart = '';
|
|
22
|
+
if (query) {
|
|
23
|
+
_.keys(query).forEach((key, index) => {
|
|
24
|
+
queryPart += `${index === 0 ? '?' : '&'}${key}=${encodeURIComponent(query[key])}`;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return `${baseAPIUrl}/${baseAction}-${baseStage}/${action}${queryPart}`;
|
|
28
|
+
};
|
|
29
|
+
const getAuthTokenHeader = () => {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
getSessionTokenAWS().then(idToken => {
|
|
32
|
+
resolve(`Bearer ${idToken}`);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const getShadowStyle = () => {
|
|
37
|
+
if (Platform.OS === 'ios') {
|
|
38
|
+
return {
|
|
39
|
+
shadowColor: '#000',
|
|
40
|
+
shadowOffset: {
|
|
41
|
+
width: 0,
|
|
42
|
+
height: 1
|
|
43
|
+
},
|
|
44
|
+
shadowOpacity: 0.1,
|
|
45
|
+
shadowRadius: 3,
|
|
46
|
+
backgroundColor: '#fff'
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
borderColor: LINEGREY,
|
|
51
|
+
backgroundColor: '#fff',
|
|
52
|
+
elevation: 8
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
const StatusBarHeight = size => {
|
|
56
|
+
return getStatusBarHeight() + size;
|
|
57
|
+
};
|
|
58
|
+
const getStatusBarHeight = () => {
|
|
59
|
+
return Platform.OS === 'ios' ? Constants.statusBarHeight : StatusBar.currentHeight;
|
|
60
|
+
};
|
|
61
|
+
const getSiteSettingFromState = (state, key, defaultValue) => {
|
|
62
|
+
if (state && state.user && state.user.siteSettings && !_.isUndefined(state.user.siteSettings[key])) {
|
|
63
|
+
return state.user.siteSettings[key];
|
|
64
|
+
}
|
|
65
|
+
return defaultValue || null;
|
|
66
|
+
};
|
|
67
|
+
const getValueOrDefault = (value, def) => {
|
|
68
|
+
return !_.isUndefined(value) ? value : def;
|
|
69
|
+
};
|
|
70
|
+
const getExtension = url => {
|
|
71
|
+
if (!url) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const fileSplit = url.split('.');
|
|
75
|
+
return fileSplit[fileSplit.length - 1].toLowerCase();
|
|
76
|
+
};
|
|
77
|
+
const getFileName = (url, noExtension) => {
|
|
78
|
+
if (!url) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const fileSplit = url.split('/');
|
|
82
|
+
const name = fileSplit[fileSplit.length - 1].toLowerCase();
|
|
83
|
+
if (!noExtension) {
|
|
84
|
+
return name;
|
|
85
|
+
}
|
|
86
|
+
return name.split('.')[0];
|
|
87
|
+
};
|
|
88
|
+
const isVideo = url => {
|
|
89
|
+
const extension = getExtension(url);
|
|
90
|
+
return ['mov', 'mp4'].includes(extension);
|
|
91
|
+
};
|
|
92
|
+
const isVideoUrl = url => {
|
|
93
|
+
const urlToCheck = getValidUrl(url);
|
|
94
|
+
if (isVideo(urlToCheck)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (isYoutube(urlToCheck)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
if (isVimeo(urlToCheck)) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
};
|
|
105
|
+
const isStockImage = url => {
|
|
106
|
+
return url.indexOf('https://pluss60-dev-uploads.s3.ap-southeast-2.amazonaws.com/uploads/library') !== -1;
|
|
107
|
+
};
|
|
108
|
+
const getThumb300 = url => {
|
|
109
|
+
if (!url) {
|
|
110
|
+
return url;
|
|
111
|
+
}
|
|
112
|
+
if (url.indexOf('https://plussprdstorage.blob.core.windows.net/') !== -1) {
|
|
113
|
+
return url.replace('https://plussprdstorage.blob.core.windows.net/', 'https://plusscdn.azureedge.net/');
|
|
114
|
+
}
|
|
115
|
+
if (url.indexOf('https://plusscdn.azureedge.net/') !== -1) {
|
|
116
|
+
return url.replace('/uploads/', '/uploads-thumb/').replace('/general/', '/general300/').replace('/uploads1400/', '/uploads-thumb/').replace('/general1400/', '/general300/');
|
|
117
|
+
}
|
|
118
|
+
if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {
|
|
119
|
+
const extension = getExtension(url);
|
|
120
|
+
let urlToUse = url;
|
|
121
|
+
if (extension !== 'jpg') {
|
|
122
|
+
urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;
|
|
123
|
+
}
|
|
124
|
+
return urlToUse.replace('/1400/', '/thumb300/').replace('/uploads/', '/thumb300/');
|
|
125
|
+
}
|
|
126
|
+
return url;
|
|
127
|
+
};
|
|
128
|
+
const get1400 = url => {
|
|
129
|
+
if (!url) {
|
|
130
|
+
return url;
|
|
131
|
+
}
|
|
132
|
+
if (url.indexOf('https://plussprdstorage.blob.core.windows.net/') !== -1) {
|
|
133
|
+
return url.replace('https://plussprdstorage.blob.core.windows.net/', 'https://plusscdn.azureedge.net/');
|
|
134
|
+
}
|
|
135
|
+
if (url.indexOf('https://plusscdn.azureedge.net/') !== -1) {
|
|
136
|
+
return url.replace('/uploads/', '/uploads1400/').replace('/general/', '/general1400/');
|
|
137
|
+
}
|
|
138
|
+
if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {
|
|
139
|
+
const extension = getExtension(url);
|
|
140
|
+
let urlToUse = url;
|
|
141
|
+
if (extension !== 'jpg') {
|
|
142
|
+
urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;
|
|
143
|
+
}
|
|
144
|
+
return urlToUse.replace('/uploads/', '/1400/');
|
|
145
|
+
}
|
|
146
|
+
return url;
|
|
147
|
+
};
|
|
148
|
+
const get300 = url => {
|
|
149
|
+
if (!url) {
|
|
150
|
+
return url;
|
|
151
|
+
}
|
|
152
|
+
if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {
|
|
153
|
+
const extension = getExtension(url);
|
|
154
|
+
let urlToUse = url;
|
|
155
|
+
if (extension !== 'jpg') {
|
|
156
|
+
urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;
|
|
157
|
+
}
|
|
158
|
+
return urlToUse.replace('/uploads/', '/300/').replace('/1400/', '/300/');
|
|
159
|
+
}
|
|
160
|
+
return url;
|
|
161
|
+
};
|
|
162
|
+
const getMimeType = url => {
|
|
163
|
+
const extension = getExtension(url);
|
|
164
|
+
switch (extension) {
|
|
165
|
+
case 'mov':
|
|
166
|
+
return 'video/quicktime';
|
|
167
|
+
case 'mp4':
|
|
168
|
+
return 'video/mp4';
|
|
169
|
+
default:
|
|
170
|
+
return 'image/jpeg';
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
const getCompressed = url => {
|
|
174
|
+
if (!url || typeof url !== 'string') return '';
|
|
175
|
+
return url.replace('/uploads/', '/compressed/');
|
|
176
|
+
};
|
|
177
|
+
const imageExists = url => {
|
|
178
|
+
return new Promise(resolve => {
|
|
179
|
+
fetch(url, {
|
|
180
|
+
method: 'HEAD',
|
|
181
|
+
cache: 'no-cache'
|
|
182
|
+
}).then(response => {
|
|
183
|
+
resolve(response.status === 200);
|
|
184
|
+
}).catch(() => {
|
|
185
|
+
resolve(false);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
const formatTime = (hours, minutes) => {
|
|
190
|
+
const period = hours >= 12 ? 'pm' : 'am';
|
|
191
|
+
|
|
192
|
+
// Convert 24-hour format to 12-hour format
|
|
193
|
+
const adjustedHours = hours > 12 ? hours - 12 : hours === 0 ? 12 : hours;
|
|
194
|
+
|
|
195
|
+
// Ensure minutes are two digits
|
|
196
|
+
const adjustedMinutes = String(minutes).padStart(2, '0');
|
|
197
|
+
return `${adjustedHours}:${adjustedMinutes}${period}`;
|
|
198
|
+
};
|
|
199
|
+
const minutesToString = (minutes, isTimeOfDay) => {
|
|
200
|
+
const hours = Math.floor(minutes / 60);
|
|
201
|
+
const remainingMinutes = minutes % 60;
|
|
202
|
+
if (isTimeOfDay) {
|
|
203
|
+
return formatTime(hours, remainingMinutes);
|
|
204
|
+
}
|
|
205
|
+
const hoursString = hours > 1 ? `${hours} hours` : `${hours} hour`;
|
|
206
|
+
const minutesString = remainingMinutes > 1 ? `${remainingMinutes} minutes` : `${remainingMinutes} minute`;
|
|
207
|
+
if (hours && remainingMinutes) {
|
|
208
|
+
return `${hoursString} ${minutesString}`;
|
|
209
|
+
}
|
|
210
|
+
if (hours) {
|
|
211
|
+
return hoursString;
|
|
212
|
+
}
|
|
213
|
+
if (remainingMinutes) {
|
|
214
|
+
return minutesString;
|
|
215
|
+
}
|
|
216
|
+
return '0 minutes';
|
|
217
|
+
};
|
|
218
|
+
const getPluralS = count => {
|
|
219
|
+
return count === 1 ? '' : 's';
|
|
220
|
+
};
|
|
221
|
+
const getPluralOptions = (count, singular, plural) => {
|
|
222
|
+
if (count === 1) {
|
|
223
|
+
return singular;
|
|
224
|
+
}
|
|
225
|
+
return plural;
|
|
226
|
+
};
|
|
227
|
+
const randomString = (name = '') => {
|
|
228
|
+
return `xxxxxxxx4xxxyxxxxxxxxxxxxx${name}`.replace(/[xy]/g, c => {
|
|
229
|
+
// eslint-disable-next-line
|
|
230
|
+
var r = Math.random() * 16 | 0,
|
|
231
|
+
v = c === 'x' ? r : r & 0x3 | 0x8;
|
|
232
|
+
return v.toString(16);
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
const generateImageName = (name, source) => {
|
|
236
|
+
let result = randomString(name);
|
|
237
|
+
if (source) {
|
|
238
|
+
result += `.${_.last(source.split('.'))}`;
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
};
|
|
242
|
+
const getSite = site => {
|
|
243
|
+
return site === 'plussSpace' || site === 'hq' ? Config.env.preferredSite : site;
|
|
244
|
+
};
|
|
245
|
+
const getTakeoverThumb = uri => {
|
|
246
|
+
const filename = uri.split('/').pop();
|
|
247
|
+
switch (filename) {
|
|
248
|
+
default:
|
|
249
|
+
return {
|
|
250
|
+
uri
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const getTakeoverImage = uri => {
|
|
255
|
+
const filename = uri.split('/').pop();
|
|
256
|
+
switch (filename) {
|
|
257
|
+
default:
|
|
258
|
+
return {
|
|
259
|
+
uri
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
const getImageSource = (uri, isThumb) => {
|
|
264
|
+
if (uri == null) return null;
|
|
265
|
+
if (isThumb) return getTakeoverThumb(uri);
|
|
266
|
+
return getTakeoverImage(uri);
|
|
267
|
+
};
|
|
268
|
+
const getFirstName = name => {
|
|
269
|
+
if (_.isEmpty(name)) {
|
|
270
|
+
return name;
|
|
271
|
+
}
|
|
272
|
+
return name.split(' ')[0];
|
|
273
|
+
};
|
|
274
|
+
const usersToSearchResult = (contacts, excludedUserIds) => {
|
|
275
|
+
let result = [];
|
|
276
|
+
contacts.forEach(user => {
|
|
277
|
+
result.push({
|
|
278
|
+
displayName: user.displayName,
|
|
279
|
+
id: user.objectID || user.id || user.ID || user.userId || user.Id,
|
|
280
|
+
profilePic: user.profilePic || user.photoURL || null,
|
|
281
|
+
unit: user.unit
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
result = _.reject(result, contact => {
|
|
285
|
+
return _.includes(excludedUserIds, contact.id);
|
|
286
|
+
});
|
|
287
|
+
return result;
|
|
288
|
+
};
|
|
289
|
+
const searchUsers = (source, term) => {
|
|
290
|
+
if (_.isEmpty(term)) {
|
|
291
|
+
return source;
|
|
292
|
+
}
|
|
293
|
+
return _.filter(source, user => {
|
|
294
|
+
const split = user.displayName.split(' ');
|
|
295
|
+
return _.some(split, part => {
|
|
296
|
+
return part.toLowerCase().indexOf(term.toLowerCase()) === 0;
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
};
|
|
300
|
+
const getTabSettingsFromState = state => {
|
|
301
|
+
const tabSettings = state.user && state.user.interface || getSiteSettingFromState(state, 'TabSettings', null);
|
|
302
|
+
return tabSettings;
|
|
303
|
+
};
|
|
304
|
+
const getEnabledTabsFromState = state => {
|
|
305
|
+
const tabSettings = getTabSettingsFromState(state);
|
|
306
|
+
return tabSettings ? tabSettings.filter(tab => tab.isEnabled) : [];
|
|
307
|
+
};
|
|
308
|
+
const getReactions = () => {
|
|
309
|
+
return [{
|
|
310
|
+
key: 'heart',
|
|
311
|
+
icon: require('./assets/icons/reactions/heart.png')
|
|
312
|
+
}, {
|
|
313
|
+
key: 'smile',
|
|
314
|
+
icon: require('./assets/icons/reactions/smile.png')
|
|
315
|
+
}, {
|
|
316
|
+
key: 'sad',
|
|
317
|
+
icon: require('./assets/icons/reactions/sad.png')
|
|
318
|
+
}, {
|
|
319
|
+
key: 'party',
|
|
320
|
+
icon: require('./assets/icons/reactions/party.png')
|
|
321
|
+
}];
|
|
322
|
+
};
|
|
323
|
+
const hasReacted = (reactions, userId) => {
|
|
324
|
+
return _.some(reactions, r => {
|
|
325
|
+
return !!r[userId];
|
|
326
|
+
});
|
|
327
|
+
};
|
|
328
|
+
const isTablet = () => {
|
|
329
|
+
return Dimensions.get('screen').width > 600;
|
|
330
|
+
};
|
|
331
|
+
const isVimeo = url => {
|
|
332
|
+
if (_.isEmpty(url)) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
if (url.indexOf('https://vimeo.com/') === 0) {
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
if (url.indexOf('https://player.vimeo.com/video/') === 0) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
const getVimeoEmbed = url => {
|
|
343
|
+
if (_.isEmpty(url)) {
|
|
344
|
+
return '';
|
|
345
|
+
}
|
|
346
|
+
if (url.indexOf('https://vimeo.com/') === 0) {
|
|
347
|
+
const vimeoId = 'lol'; //TODO
|
|
348
|
+
return `https://player.vimeo.com/video/${vimeoId}`;
|
|
349
|
+
}
|
|
350
|
+
return url; //TODO
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
const isYoutube = url => {
|
|
354
|
+
if (_.isUndefined(url) || _.isEmpty(url)) {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
|
|
358
|
+
const match = url.match(regExp);
|
|
359
|
+
if (match && match[2].length === 11) {
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
return false;
|
|
363
|
+
};
|
|
364
|
+
const getYoutubeEmbed = url => {
|
|
365
|
+
const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
|
|
366
|
+
const match = url.match(regExp);
|
|
367
|
+
return `https://www.youtube.com/embed/${match[2]}?autoplay=0`;
|
|
368
|
+
};
|
|
369
|
+
const getValidUrl = (url = '') => {
|
|
370
|
+
let newUrl = decodeURIComponent(url);
|
|
371
|
+
newUrl = newUrl.trim().replace(/\s/g, '');
|
|
372
|
+
if (/^(:\/\/)/.test(newUrl)) {
|
|
373
|
+
return `https${newUrl}`;
|
|
374
|
+
}
|
|
375
|
+
if (!/^(f|ht)tps?:\/\//i.test(newUrl)) {
|
|
376
|
+
return `https://${newUrl}`;
|
|
377
|
+
}
|
|
378
|
+
return newUrl;
|
|
379
|
+
};
|
|
380
|
+
const getUserPreview = user => {
|
|
381
|
+
return {
|
|
382
|
+
id: user.uid,
|
|
383
|
+
displayName: user.displayName,
|
|
384
|
+
profilePic: user.profilePic || null
|
|
385
|
+
};
|
|
386
|
+
};
|
|
387
|
+
const allowComments = canComment => {
|
|
388
|
+
if (canComment === false) {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
if (canComment === true) {
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
return Config.env.defaultAllowComments;
|
|
395
|
+
};
|
|
396
|
+
export { TIMESTAMP_FORMAT, DATE_FORMAT, getUrl, getAuthTokenHeader, getShadowStyle, StatusBarHeight, getStatusBarHeight, getSiteSettingFromState, getValueOrDefault, getExtension, getFileName, isVideo, get300, getThumb300, get1400, getMimeType, getCompressed, imageExists, getPluralS, getPluralOptions, formatTime, minutesToString, randomString, generateImageName, getSite, getImageSource, getFirstName, usersToSearchResult, searchUsers, getEnabledTabsFromState, getReactions, hasReacted, isTablet, isYoutube, getYoutubeEmbed, getValidUrl, getUserPreview, allowComments, isVideoUrl, detectFaces, findLandmarkRange, getScaledOffset, getSiteLevelFromState, isTVEnabled };
|
|
397
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_","Platform","StatusBar","Dimensions","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","randomString","c","r","random","v","toString","generateImageName","source","result","last","getSite","site","preferredSite","getTakeoverThumb","uri","filename","pop","getTakeoverImage","getImageSource","isThumb","getFirstName","isEmpty","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"],"sources":["helper.js"],"sourcesContent":["import _ from 'lodash';\nimport { Platform, StatusBar, Dimensions } from 'react-native';\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 const { baseAPIUrl, baseStage } = Config.env;\n let queryPart = '';\n if (query) {\n _.keys(query).forEach((key, index) => {\n queryPart += `${index === 0 ? '?' : '&'}${key}=${encodeURIComponent(query[key])}`;\n });\n }\n return `${baseAPIUrl}/${baseAction}-${baseStage}/${action}${queryPart}`;\n};\n\nconst getAuthTokenHeader = () => {\n return new Promise((resolve, reject) => {\n getSessionTokenAWS().then(idToken => {\n resolve(`Bearer ${idToken}`);\n });\n });\n};\n\nconst getShadowStyle = () => {\n if (Platform.OS === 'ios') {\n return {\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 1,\n },\n shadowOpacity: 0.1,\n shadowRadius: 3,\n backgroundColor: '#fff',\n };\n }\n return {\n borderColor: LINEGREY,\n backgroundColor: '#fff',\n elevation: 8,\n };\n};\n\nconst StatusBarHeight = size => {\n return getStatusBarHeight() + size;\n};\n\nconst getStatusBarHeight = () => {\n return Platform.OS === 'ios' ? Constants.statusBarHeight : StatusBar.currentHeight;\n};\n\nconst getSiteSettingFromState = (state, key, defaultValue) => {\n if (state && state.user && state.user.siteSettings && !_.isUndefined(state.user.siteSettings[key])) {\n return state.user.siteSettings[key];\n }\n return defaultValue || null;\n};\n\nconst getValueOrDefault = (value, def) => {\n return !_.isUndefined(value) ? value : def;\n};\n\nconst getExtension = url => {\n if (!url) {\n return null;\n }\n const fileSplit = url.split('.');\n return fileSplit[fileSplit.length - 1].toLowerCase();\n};\n\nconst getFileName = (url, noExtension) => {\n if (!url) {\n return null;\n }\n const fileSplit = url.split('/');\n const name = fileSplit[fileSplit.length - 1].toLowerCase();\n if (!noExtension) {\n return name;\n }\n return name.split('.')[0];\n};\n\nconst isVideo = url => {\n const extension = getExtension(url);\n return ['mov', 'mp4'].includes(extension);\n};\n\nconst isVideoUrl = url => {\n const urlToCheck = getValidUrl(url);\n if (isVideo(urlToCheck)) {\n return true;\n }\n if (isYoutube(urlToCheck)) {\n return true;\n }\n if (isVimeo(urlToCheck)) {\n return true;\n }\n return false;\n};\n\nconst isStockImage = url => {\n return url.indexOf('https://pluss60-dev-uploads.s3.ap-southeast-2.amazonaws.com/uploads/library') !== -1;\n};\n\nconst getThumb300 = url => {\n if (!url) {\n return url;\n }\n if (url.indexOf('https://plussprdstorage.blob.core.windows.net/') !== -1) {\n return url.replace('https://plussprdstorage.blob.core.windows.net/', 'https://plusscdn.azureedge.net/');\n }\n if (url.indexOf('https://plusscdn.azureedge.net/') !== -1) {\n return url\n .replace('/uploads/', '/uploads-thumb/')\n .replace('/general/', '/general300/')\n .replace('/uploads1400/', '/uploads-thumb/')\n .replace('/general1400/', '/general300/');\n }\n if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {\n const extension = getExtension(url);\n let urlToUse = url;\n if (extension !== 'jpg') {\n urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;\n }\n return urlToUse.replace('/1400/', '/thumb300/').replace('/uploads/', '/thumb300/');\n }\n return url;\n};\n\nconst get1400 = url => {\n if (!url) {\n return url;\n }\n if (url.indexOf('https://plussprdstorage.blob.core.windows.net/') !== -1) {\n return url.replace('https://plussprdstorage.blob.core.windows.net/', 'https://plusscdn.azureedge.net/');\n }\n if (url.indexOf('https://plusscdn.azureedge.net/') !== -1) {\n return url.replace('/uploads/', '/uploads1400/').replace('/general/', '/general1400/');\n }\n if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {\n const extension = getExtension(url);\n let urlToUse = url;\n if (extension !== 'jpg') {\n urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;\n }\n return urlToUse.replace('/uploads/', '/1400/');\n }\n return url;\n};\n\nconst get300 = url => {\n if (!url) {\n return url;\n }\n if (isStockImage(url) || url.indexOf(Config.env.baseUploadsUrl) !== -1) {\n const extension = getExtension(url);\n let urlToUse = url;\n if (extension !== 'jpg') {\n urlToUse = `${url.substring(0, url.length - extension.length)}jpg`;\n }\n return urlToUse.replace('/uploads/', '/300/').replace('/1400/', '/300/');\n }\n return url;\n};\n\nconst getMimeType = url => {\n const extension = getExtension(url);\n switch (extension) {\n case 'mov':\n return 'video/quicktime';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n};\n\nconst getCompressed = url => {\n if (!url || typeof url !== 'string') return '';\n return url.replace('/uploads/', '/compressed/');\n};\n\nconst imageExists = url => {\n return new Promise(resolve => {\n fetch(url, { method: 'HEAD', cache: 'no-cache' })\n .then(response => {\n resolve(response.status === 200);\n })\n .catch(() => {\n resolve(false);\n });\n });\n};\n\nconst formatTime = (hours, minutes) => {\n const period = hours >= 12 ? 'pm' : 'am';\n\n // Convert 24-hour format to 12-hour format\n const adjustedHours = hours > 12 ? hours - 12 : hours === 0 ? 12 : hours;\n\n // Ensure minutes are two digits\n const adjustedMinutes = String(minutes).padStart(2, '0');\n\n return `${adjustedHours}:${adjustedMinutes}${period}`;\n};\n\nconst minutesToString = (minutes, isTimeOfDay) => {\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n if (isTimeOfDay) {\n return formatTime(hours, remainingMinutes);\n }\n\n const hoursString = hours > 1 ? `${hours} hours` : `${hours} hour`;\n const minutesString = remainingMinutes > 1 ? `${remainingMinutes} minutes` : `${remainingMinutes} minute`;\n\n if (hours && remainingMinutes) {\n return `${hoursString} ${minutesString}`;\n }\n if (hours) {\n return hoursString;\n }\n if (remainingMinutes) {\n return minutesString;\n }\n return '0 minutes';\n};\n\nconst getPluralS = count => {\n return count === 1 ? '' : 's';\n};\n\nconst getPluralOptions = (count, singular, plural) => {\n if (count === 1) {\n return singular;\n }\n return plural;\n};\n\nconst randomString = (name = '') => {\n return `xxxxxxxx4xxxyxxxxxxxxxxxxx${name}`.replace(/[xy]/g, c => {\n // eslint-disable-next-line\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nconst generateImageName = (name, source) => {\n let result = randomString(name);\n if (source) {\n result += `.${_.last(source.split('.'))}`;\n }\n return result;\n};\n\nconst getSite = site => {\n return site === 'plussSpace' || site === 'hq' ? Config.env.preferredSite : site;\n};\n\nconst getTakeoverThumb = uri => {\n const filename = uri.split('/').pop();\n switch (filename) {\n default:\n return { uri };\n }\n};\n\nconst getTakeoverImage = uri => {\n const filename = uri.split('/').pop();\n switch (filename) {\n default:\n return { uri };\n }\n};\n\nconst getImageSource = (uri, isThumb) => {\n if (uri == null) return null;\n if (isThumb) return getTakeoverThumb(uri);\n return getTakeoverImage(uri);\n};\n\nconst getFirstName = name => {\n if (_.isEmpty(name)) {\n return name;\n }\n return name.split(' ')[0];\n};\n\nconst usersToSearchResult = (contacts, excludedUserIds) => {\n let result = [];\n contacts.forEach(user => {\n result.push({\n displayName: user.displayName,\n id: user.objectID || user.id || user.ID || user.userId || user.Id,\n profilePic: user.profilePic || user.photoURL || null,\n unit: user.unit,\n });\n });\n result = _.reject(result, contact => {\n return _.includes(excludedUserIds, contact.id);\n });\n return result;\n};\n\nconst searchUsers = (source, term) => {\n if (_.isEmpty(term)) {\n return source;\n }\n return _.filter(source, user => {\n const split = user.displayName.split(' ');\n return _.some(split, part => {\n return part.toLowerCase().indexOf(term.toLowerCase()) === 0;\n });\n });\n};\n\nconst getTabSettingsFromState = state => {\n const tabSettings = (state.user && state.user.interface) || getSiteSettingFromState(state, 'TabSettings', null);\n return tabSettings;\n};\n\nconst getEnabledTabsFromState = state => {\n const tabSettings = getTabSettingsFromState(state);\n return tabSettings ? tabSettings.filter(tab => tab.isEnabled) : [];\n};\n\nconst getReactions = () => {\n return [\n {\n key: 'heart',\n icon: require('./assets/icons/reactions/heart.png'),\n },\n {\n key: 'smile',\n icon: require('./assets/icons/reactions/smile.png'),\n },\n {\n key: 'sad',\n icon: require('./assets/icons/reactions/sad.png'),\n },\n {\n key: 'party',\n icon: require('./assets/icons/reactions/party.png'),\n },\n ];\n};\n\nconst hasReacted = (reactions, userId) => {\n return _.some(reactions, r => {\n return !!r[userId];\n });\n};\n\nconst isTablet = () => {\n return Dimensions.get('screen').width > 600;\n};\n\nconst isVimeo = url => {\n if (_.isEmpty(url)) {\n return false;\n }\n if (url.indexOf('https://vimeo.com/') === 0) {\n return true;\n }\n if (url.indexOf('https://player.vimeo.com/video/') === 0) {\n return true;\n }\n};\n\nconst getVimeoEmbed = url => {\n if (_.isEmpty(url)) {\n return '';\n }\n if (url.indexOf('https://vimeo.com/') === 0) {\n const vimeoId = 'lol'; //TODO\n return `https://player.vimeo.com/video/${vimeoId}`;\n }\n return url; //TODO\n};\n\nconst isYoutube = url => {\n if (_.isUndefined(url) || _.isEmpty(url)) {\n return false;\n }\n const regExp = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=|\\?v=)([^#\\&\\?]*).*/;\n const match = url.match(regExp);\n if (match && match[2].length === 11) {\n return true;\n }\n return false;\n};\n\nconst getYoutubeEmbed = url => {\n const regExp = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=|\\?v=)([^#\\&\\?]*).*/;\n const match = url.match(regExp);\n return `https://www.youtube.com/embed/${match[2]}?autoplay=0`;\n};\n\nconst getValidUrl = (url = '') => {\n let newUrl = decodeURIComponent(url);\n newUrl = newUrl.trim().replace(/\\s/g, '');\n\n if (/^(:\\/\\/)/.test(newUrl)) {\n return `https${newUrl}`;\n }\n if (!/^(f|ht)tps?:\\/\\//i.test(newUrl)) {\n return `https://${newUrl}`;\n }\n\n return newUrl;\n};\n\nconst getUserPreview = user => {\n return {\n id: user.uid,\n displayName: user.displayName,\n profilePic: user.profilePic || null,\n };\n};\n\nconst allowComments = canComment => {\n if (canComment === false) {\n return false;\n }\n if (canComment === true) {\n return true;\n }\n return Config.env.defaultAllowComments;\n};\n\nexport {\n TIMESTAMP_FORMAT,\n DATE_FORMAT,\n getUrl,\n getAuthTokenHeader,\n getShadowStyle,\n StatusBarHeight,\n getStatusBarHeight,\n getSiteSettingFromState,\n getValueOrDefault,\n getExtension,\n getFileName,\n isVideo,\n get300,\n getThumb300,\n get1400,\n getMimeType,\n getCompressed,\n imageExists,\n getPluralS,\n getPluralOptions,\n formatTime,\n minutesToString,\n randomString,\n generateImageName,\n getSite,\n getImageSource,\n getFirstName,\n usersToSearchResult,\n searchUsers,\n getEnabledTabsFromState,\n getReactions,\n hasReacted,\n isTablet,\n isYoutube,\n getYoutubeEmbed,\n getValidUrl,\n getUserPreview,\n allowComments,\n isVideoUrl,\n detectFaces,\n findLandmarkRange,\n getScaledOffset,\n getSiteLevelFromState,\n isTVEnabled,\n};\n"],"mappings":"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"}
|
|
@@ -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 Fonts from './fonts';
|
|
11
|
+
import * as Constants from './constants';
|
|
12
|
+
export { Config, Styles, Session, Helper, Colours, Actions, ActionTypes, Apis, Components, Fonts, Constants };
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Config","Styles","Session","Helper","Colours","Actions","ActionTypes","Apis","Components","Fonts","Constants"],"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 Fonts from './fonts';\nimport * as Constants from './constants';\n\nexport { Config, Styles, Session, Helper, Colours, Actions, ActionTypes, Apis, Components, Fonts, Constants };\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,KAAK,MAAM,SAAS;AAChC,OAAO,KAAKC,SAAS,MAAM,aAAa;AAExC,SAASV,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,WAAW,EAAEC,IAAI,EAAEC,UAAU,EAAEC,KAAK,EAAEC,SAAS"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { stringActions } from '../../apis';
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import * as FileSystem from 'expo-file-system';
|
|
4
|
+
// import * as FaceDetector from 'expo-face-detector';
|
|
5
|
+
|
|
6
|
+
const detectFaces = async remoteUrl => {
|
|
7
|
+
// deprecated
|
|
8
|
+
|
|
9
|
+
const parts = remoteUrl.split('/').splice(-2);
|
|
10
|
+
const mediaId = parts[0];
|
|
11
|
+
const extension = parts[1].split('.').splice(-1)[0];
|
|
12
|
+
const downloadPath = `${FileSystem.cacheDirectory}${mediaId}.${extension}`;
|
|
13
|
+
const {
|
|
14
|
+
uri: localUrl
|
|
15
|
+
} = await FileSystem.downloadAsync(remoteUrl, downloadPath);
|
|
16
|
+
|
|
17
|
+
// const faces = await FaceDetector.detectFacesAsync(localUrl, {
|
|
18
|
+
// mode: FaceDetector.FaceDetectorMode.accurate,
|
|
19
|
+
// });
|
|
20
|
+
|
|
21
|
+
const faces = null;
|
|
22
|
+
if (faces && faces.image && faces.image.uri) {
|
|
23
|
+
delete faces.image.uri;
|
|
24
|
+
}
|
|
25
|
+
faces.timestamp = moment().valueOf();
|
|
26
|
+
stringActions.setString('plussSpace', `imagefaces_${encodeURIComponent(remoteUrl)}`, faces);
|
|
27
|
+
return faces;
|
|
28
|
+
};
|
|
29
|
+
export default detectFaces;
|
|
30
|
+
//# sourceMappingURL=detectFaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["stringActions","moment","FileSystem","detectFaces","remoteUrl","parts","split","splice","mediaId","extension","downloadPath","cacheDirectory","uri","localUrl","downloadAsync","faces","image","timestamp","valueOf","setString","encodeURIComponent"],"sources":["detectFaces.js"],"sourcesContent":["import { stringActions } from '../../apis';\nimport moment from 'moment';\nimport * as FileSystem from 'expo-file-system';\n// import * as FaceDetector from 'expo-face-detector';\n\nconst detectFaces = async remoteUrl => {\n // deprecated\n\n const parts = remoteUrl.split('/').splice(-2);\n const mediaId = parts[0];\n const extension = parts[1].split('.').splice(-1)[0];\n\n const downloadPath = `${FileSystem.cacheDirectory}${mediaId}.${extension}`;\n\n const { uri: localUrl } = await FileSystem.downloadAsync(remoteUrl, downloadPath);\n\n // const faces = await FaceDetector.detectFacesAsync(localUrl, {\n // mode: FaceDetector.FaceDetectorMode.accurate,\n // });\n\n const faces = null;\n\n if (faces && faces.image && faces.image.uri) {\n delete faces.image.uri;\n }\n\n faces.timestamp = moment().valueOf();\n\n stringActions.setString('plussSpace', `imagefaces_${encodeURIComponent(remoteUrl)}`, faces);\n\n return faces;\n};\n\nexport default detectFaces;\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,YAAY;AAC1C,OAAOC,MAAM,MAAM,QAAQ;AAC3B,OAAO,KAAKC,UAAU,MAAM,kBAAkB;AAC9C;;AAEA,MAAMC,WAAW,GAAG,MAAMC,SAAS,IAAI;EACrC;;EAEA,MAAMC,KAAK,GAAGD,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;EAC7C,MAAMC,OAAO,GAAGH,KAAK,CAAC,CAAC,CAAC;EACxB,MAAMI,SAAS,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EAEnD,MAAMG,YAAY,GAAI,GAAER,UAAU,CAACS,cAAe,GAAEH,OAAQ,IAAGC,SAAU,EAAC;EAE1E,MAAM;IAAEG,GAAG,EAAEC;EAAS,CAAC,GAAG,MAAMX,UAAU,CAACY,aAAa,CAACV,SAAS,EAAEM,YAAY,CAAC;;EAEjF;EACA;EACA;;EAEA,MAAMK,KAAK,GAAG,IAAI;EAElB,IAAIA,KAAK,IAAIA,KAAK,CAACC,KAAK,IAAID,KAAK,CAACC,KAAK,CAACJ,GAAG,EAAE;IAC3C,OAAOG,KAAK,CAACC,KAAK,CAACJ,GAAG;EACxB;EAEAG,KAAK,CAACE,SAAS,GAAGhB,MAAM,CAAC,CAAC,CAACiB,OAAO,CAAC,CAAC;EAEpClB,aAAa,CAACmB,SAAS,CAAC,YAAY,EAAG,cAAaC,kBAAkB,CAAChB,SAAS,CAAE,EAAC,EAAEW,KAAK,CAAC;EAE3F,OAAOA,KAAK;AACd,CAAC;AAED,eAAeZ,WAAW"}
|
|
@@ -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 let cachedValues;\n if (options && options.cachedValues) {\n cachedValues = options.cachedValues;\n }\n try {\n const response = await stringActions.getString('plussSpace', `imagefaces_${encodeURIComponent(url)}`);\n cachedValues = response.data;\n } catch (e) {\n console.log('errored from cache');\n }\n if (\n !cachedValues ||\n !cachedValues.faces ||\n !cachedValues.image ||\n (_.isEmpty(cachedValues.faces) &&\n moment()\n .add(-1, 'w')\n .valueOf() > moment(cachedValues.timestamp).valueOf())\n ) {\n cachedValues = await detectFaces(url);\n }\n const { faces, image } = cachedValues;\n\n let landmarkStartX = null;\n let landmarkStartY = null;\n let landmarkEndX = null;\n let landmarkEndY = null;\n\n if (_.isEmpty(faces)) {\n landmarkStartX = image.width / 2;\n landmarkStartY = image.height / 2;\n landmarkEndX = image.width / 2;\n landmarkEndY = image.height / 2;\n } else {\n faces.forEach(face => {\n const { bounds } = face;\n\n if (!landmarkStartX || bounds.origin.x < landmarkStartX) {\n landmarkStartX = bounds.origin.x;\n }\n\n if (!landmarkStartY || bounds.origin.y < landmarkStartY) {\n landmarkStartY = bounds.origin.y;\n }\n\n const faceEndX = bounds.origin.x + bounds.size.width;\n if (!landmarkEndX || faceEndX > landmarkEndX) {\n landmarkEndX = faceEndX;\n }\n\n const faceEndY = bounds.origin.y + bounds.size.height;\n if (!landmarkEndY || faceEndX > landmarkEndY) {\n landmarkEndY = faceEndY;\n }\n });\n }\n\n let targetWidth = image.width;\n let targetHeight = image.height;\n\n if (options && options.targetWidth && options.targetHeight) {\n const { scaleFactor } = getScaledOffset(image.width, image.height, options.targetWidth, options.targetHeight);\n landmarkStartX *= scaleFactor;\n landmarkStartY *= scaleFactor;\n landmarkEndX *= scaleFactor;\n landmarkEndY *= scaleFactor;\n targetWidth = options.targetWidth;\n targetHeight = options.targetHeight;\n }\n\n if (landmarkStartX < 0) {\n landmarkStartX = 0;\n }\n if (landmarkStartY < 0) {\n landmarkStartY = 0;\n }\n if (landmarkEndX > targetWidth) {\n landmarkEndX = targetWidth;\n }\n if (landmarkEndY > targetHeight) {\n landmarkEndY = targetHeight;\n }\n\n return {\n start: {\n x: landmarkStartX,\n y: landmarkStartY,\n },\n end: {\n x: landmarkEndX,\n y: landmarkEndY,\n },\n height: image.height,\n width: image.width,\n };\n};\n\nexport default findLandmarkRange;\n"],"mappings":"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"}
|