@plusscommunities/pluss-core-app 4.0.3 → 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.
@@ -1,49 +1,42 @@
1
- import mime from 'mime-types';
2
- import { Storage } from 'aws-amplify';
1
+ import Axios from 'axios';
3
2
  import { getUrl, generateImageName, randomString } from '../helper';
4
3
  import { authedFunction } from '../session';
5
- import Config from '../config';
6
4
  export const fileActions = {
5
+ getPresignedUrl: async (filename, contentType) => {
6
+ // const newFilename = filename.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();
7
+ const signedUrlRes = await authedFunction({
8
+ method: 'GET',
9
+ url: getUrl('media', 'get/presignedurl', {
10
+ filename,
11
+ contentType
12
+ })
13
+ });
14
+ return signedUrlRes.data;
15
+ },
7
16
  getUploadUrl: (userId, fileName) => {
8
17
  const newFilename = fileName.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();
9
18
  return `uploads/users/${userId}/public/${randomString()}/${newFilename}`;
10
19
  },
11
- uploadUserMediaWithProgress: async (imageUri, url, progressCallback = null) => {
12
- const blob = await fileActions.imageToBlob(imageUri);
13
- return fileActions.uploadBlobAWS(Config.env.awsUploadsBucket, url, blob, '', progressCallback);
20
+ uploadUserMediaWithProgress: async (blob, url, progressCallback = null) => {
21
+ return fileActions.uploadBlobAWS(url, blob, progressCallback);
14
22
  },
15
- // uploadUserMedia: async (userId, image, fileName) => {
16
- // const blob = await fileActions.imageToBlob(image.uri);
17
- // const url = fileActions.getUploadUrl(userId, fileName);
18
- // return fileActions.uploadBlobAWS(Config.env.awsUploadsBucket, url, blob);
19
- // },
20
- // uploadSignatureImage: async (image, name) => {
21
- // const blob = await fileActions.imageToBlob(image);
22
- // const newImageName = generateImageName(name, 'signature.png');
23
- // return fileActions.uploadBlobAWS(Config.env.awsStorageBucket, newImageName, blob, 'images/');
24
- // },
25
23
  imageToBlob: async imageUri => {
26
24
  const response = await fetch(imageUri);
27
25
  return response.blob();
28
26
  },
29
- uploadBlobAWS: (bucket, uri, blob, prefix = '', progressCallback = null) => {
30
- const imageName = prefix ? uri.replace(/^.*[\\/]/, '') : uri;
31
- const fileType = mime.lookup(uri);
32
- const access = {
33
- level: 'public',
34
- bucket,
35
- contentType: fileType,
36
- customPrefix: {
37
- public: ''
27
+ uploadBlobAWS: async (uri, blob, progressCallback = null) => {
28
+ return Axios.put(uri, blob, {
29
+ headers: {
30
+ 'Content-Type': blob.type
38
31
  },
39
- progressCallback: progress => progressCallback && progressCallback({
32
+ transformRequest: d => d,
33
+ onUploadProgress: progress => progressCallback && progressCallback({
40
34
  uri,
41
35
  loaded: progress.loaded,
42
36
  total: progress.total,
43
37
  percentage: `${Math.floor(progress.loaded / progress.total * 100)}%`
44
38
  })
45
- };
46
- return Storage.put(`${prefix}${imageName}`, blob, access);
39
+ });
47
40
  },
48
41
  getStockPhotos: async () => {
49
42
  const response = await authedFunction({
@@ -1 +1 @@
1
- {"version":3,"names":["mime","Storage","getUrl","generateImageName","randomString","authedFunction","Config","fileActions","getUploadUrl","userId","fileName","newFilename","replace","toLowerCase","uploadUserMediaWithProgress","imageUri","url","progressCallback","blob","imageToBlob","uploadBlobAWS","env","awsUploadsBucket","response","fetch","bucket","uri","prefix","imageName","fileType","lookup","access","level","contentType","customPrefix","public","progress","loaded","total","percentage","Math","floor","put","getStockPhotos","method","images","data","map","image","getMediaFolders","site","query"],"sources":["fileActions.js"],"sourcesContent":["import mime from 'mime-types';\nimport { Storage } from 'aws-amplify';\nimport { getUrl, generateImageName, randomString } from '../helper';\nimport { authedFunction } from '../session';\nimport Config from '../config';\n\nexport const fileActions = {\n getUploadUrl: (userId, fileName) => {\n const newFilename = fileName.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();\n return `uploads/users/${userId}/public/${randomString()}/${newFilename}`;\n },\n uploadUserMediaWithProgress: async (imageUri, url, progressCallback = null) => {\n const blob = await fileActions.imageToBlob(imageUri);\n return fileActions.uploadBlobAWS(Config.env.awsUploadsBucket, url, blob, '', progressCallback);\n },\n // uploadUserMedia: async (userId, image, fileName) => {\n // const blob = await fileActions.imageToBlob(image.uri);\n // const url = fileActions.getUploadUrl(userId, fileName);\n // return fileActions.uploadBlobAWS(Config.env.awsUploadsBucket, url, blob);\n // },\n // uploadSignatureImage: async (image, name) => {\n // const blob = await fileActions.imageToBlob(image);\n // const newImageName = generateImageName(name, 'signature.png');\n // return fileActions.uploadBlobAWS(Config.env.awsStorageBucket, newImageName, blob, 'images/');\n // },\n imageToBlob: async imageUri => {\n const response = await fetch(imageUri);\n return response.blob();\n },\n uploadBlobAWS: (bucket, uri, blob, prefix = '', progressCallback = null) => {\n const imageName = prefix ? uri.replace(/^.*[\\\\/]/, '') : uri;\n const fileType = mime.lookup(uri);\n const access = {\n level: 'public',\n bucket,\n contentType: fileType,\n customPrefix: { public: '' },\n progressCallback: progress =>\n progressCallback &&\n progressCallback({\n uri,\n loaded: progress.loaded,\n total: progress.total,\n percentage: `${Math.floor((progress.loaded / progress.total) * 100)}%`,\n }),\n };\n return Storage.put(`${prefix}${imageName}`, blob, access);\n },\n getStockPhotos: async () => {\n const response = await authedFunction({\n method: 'GET',\n url: 'https://pluss60.pluss60-api.com/media-demo/library',\n });\n // Convert to images object\n const images = response.data.map(image => {\n return { uri: image };\n });\n return images;\n },\n getMediaFolders: site => {\n const query = { site };\n return authedFunction({\n method: 'GET',\n url: getUrl('media', 'folders', query),\n });\n },\n // addMediaFolder: (site, name, images) => {\n // return authedFunction({\n // method: 'POST',\n // url: getUrl('media', 'addFolder'),\n // data: {\n // site,\n // name,\n // images,\n // },\n // });\n // },\n // addImagesToFolder: (id, site, images) => {\n // return authedFunction({\n // method: 'POST',\n // url: getUrl('media', 'addImages'),\n // data: {\n // id,\n // site,\n // images,\n // },\n // });\n // },\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["Axios","getUrl","generateImageName","randomString","authedFunction","fileActions","getPresignedUrl","filename","contentType","signedUrlRes","method","url","data","getUploadUrl","userId","fileName","newFilename","replace","toLowerCase","uploadUserMediaWithProgress","blob","progressCallback","uploadBlobAWS","imageToBlob","imageUri","response","fetch","uri","put","headers","type","transformRequest","d","onUploadProgress","progress","loaded","total","percentage","Math","floor","getStockPhotos","images","map","image","getMediaFolders","site","query"],"sources":["fileActions.js"],"sourcesContent":["import Axios from 'axios';\nimport { getUrl, generateImageName, randomString } from '../helper';\nimport { authedFunction } from '../session';\n\nexport const fileActions = {\n getPresignedUrl: async (filename, contentType) => {\n // const newFilename = filename.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();\n const signedUrlRes = await authedFunction({\n method: 'GET',\n url: getUrl('media', 'get/presignedurl', { filename, contentType }),\n });\n return signedUrlRes.data;\n },\n getUploadUrl: (userId, fileName) => {\n const newFilename = fileName.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();\n return `uploads/users/${userId}/public/${randomString()}/${newFilename}`;\n },\n uploadUserMediaWithProgress: async (blob, url, progressCallback = null) => {\n return fileActions.uploadBlobAWS(url, blob, progressCallback);\n },\n imageToBlob: async imageUri => {\n const response = await fetch(imageUri);\n return response.blob();\n },\n uploadBlobAWS: async (uri, blob, progressCallback = null) => {\n return Axios.put(uri, blob, {\n headers: {\n 'Content-Type': blob.type,\n },\n transformRequest: d => d,\n onUploadProgress: progress =>\n progressCallback &&\n progressCallback({\n uri,\n loaded: progress.loaded,\n total: progress.total,\n percentage: `${Math.floor((progress.loaded / progress.total) * 100)}%`,\n }),\n });\n },\n getStockPhotos: async () => {\n const response = await authedFunction({\n method: 'GET',\n url: 'https://pluss60.pluss60-api.com/media-demo/library',\n });\n // Convert to images object\n const images = response.data.map(image => {\n return { uri: image };\n });\n return images;\n },\n getMediaFolders: site => {\n const query = { site };\n return authedFunction({\n method: 'GET',\n url: getUrl('media', 'folders', query),\n });\n },\n // addMediaFolder: (site, name, images) => {\n // return authedFunction({\n // method: 'POST',\n // url: getUrl('media', 'addFolder'),\n // data: {\n // site,\n // name,\n // images,\n // },\n // });\n // },\n // addImagesToFolder: (id, site, images) => {\n // return authedFunction({\n // method: 'POST',\n // url: getUrl('media', 'addImages'),\n // data: {\n // id,\n // site,\n // images,\n // },\n // });\n // },\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,iBAAiB,EAAEC,YAAY,QAAQ,WAAW;AACnE,SAASC,cAAc,QAAQ,YAAY;AAE3C,OAAO,MAAMC,WAAW,GAAG;EACzBC,eAAe,EAAE,MAAAA,CAAOC,QAAQ,EAAEC,WAAW,KAAK;IAChD;IACA,MAAMC,YAAY,GAAG,MAAML,cAAc,CAAC;MACxCM,MAAM,EAAE,KAAK;MACbC,GAAG,EAAEV,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE;QAAEM,QAAQ;QAAEC;MAAY,CAAC;IACpE,CAAC,CAAC;IACF,OAAOC,YAAY,CAACG,IAAI;EAC1B,CAAC;EACDC,YAAY,EAAEA,CAACC,MAAM,EAAEC,QAAQ,KAAK;IAClC,MAAMC,WAAW,GAAGD,QAAQ,CAACE,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAACC,WAAW,CAAC,CAAC;IACxE,OAAQ,iBAAgBJ,MAAO,WAAUX,YAAY,CAAC,CAAE,IAAGa,WAAY,EAAC;EAC1E,CAAC;EACDG,2BAA2B,EAAE,MAAAA,CAAOC,IAAI,EAAET,GAAG,EAAEU,gBAAgB,GAAG,IAAI,KAAK;IACzE,OAAOhB,WAAW,CAACiB,aAAa,CAACX,GAAG,EAAES,IAAI,EAAEC,gBAAgB,CAAC;EAC/D,CAAC;EACDE,WAAW,EAAE,MAAMC,QAAQ,IAAI;IAC7B,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACF,QAAQ,CAAC;IACtC,OAAOC,QAAQ,CAACL,IAAI,CAAC,CAAC;EACxB,CAAC;EACDE,aAAa,EAAE,MAAAA,CAAOK,GAAG,EAAEP,IAAI,EAAEC,gBAAgB,GAAG,IAAI,KAAK;IAC3D,OAAOrB,KAAK,CAAC4B,GAAG,CAACD,GAAG,EAAEP,IAAI,EAAE;MAC1BS,OAAO,EAAE;QACP,cAAc,EAAET,IAAI,CAACU;MACvB,CAAC;MACDC,gBAAgB,EAAEC,CAAC,IAAIA,CAAC;MACxBC,gBAAgB,EAAEC,QAAQ,IACxBb,gBAAgB,IAChBA,gBAAgB,CAAC;QACfM,GAAG;QACHQ,MAAM,EAAED,QAAQ,CAACC,MAAM;QACvBC,KAAK,EAAEF,QAAQ,CAACE,KAAK;QACrBC,UAAU,EAAG,GAAEC,IAAI,CAACC,KAAK,CAAEL,QAAQ,CAACC,MAAM,GAAGD,QAAQ,CAACE,KAAK,GAAI,GAAG,CAAE;MACtE,CAAC;IACL,CAAC,CAAC;EACJ,CAAC;EACDI,cAAc,EAAE,MAAAA,CAAA,KAAY;IAC1B,MAAMf,QAAQ,GAAG,MAAMrB,cAAc,CAAC;MACpCM,MAAM,EAAE,KAAK;MACbC,GAAG,EAAE;IACP,CAAC,CAAC;IACF;IACA,MAAM8B,MAAM,GAAGhB,QAAQ,CAACb,IAAI,CAAC8B,GAAG,CAACC,KAAK,IAAI;MACxC,OAAO;QAAEhB,GAAG,EAAEgB;MAAM,CAAC;IACvB,CAAC,CAAC;IACF,OAAOF,MAAM;EACf,CAAC;EACDG,eAAe,EAAEC,IAAI,IAAI;IACvB,MAAMC,KAAK,GAAG;MAAED;IAAK,CAAC;IACtB,OAAOzC,cAAc,CAAC;MACpBM,MAAM,EAAE,KAAK;MACbC,GAAG,EAAEV,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE6C,KAAK;IACvC,CAAC,CAAC;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC"}
@@ -108,19 +108,21 @@ class ImageUploader extends Component {
108
108
  let uploadUri;
109
109
  try {
110
110
  const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;
111
- uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
112
- this.props.onUploadStarted(uploadUri, imageUri);
113
111
  this.hideUploadMenu();
114
112
  const resized = await this.resizeImageAsync(imageUri);
113
+ const blob = await fileActions.imageToBlob(resized.uri);
114
+ const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);
115
+ uploadUri = presignedUriRes.key;
116
+ this.props.onUploadStarted(uploadUri, imageUri);
115
117
  if (this.props.onlySelectImage) {
116
118
  this.props.onImageSelected(resized, fileName);
117
119
  return;
118
120
  }
119
- const res = await fileActions.uploadUserMediaWithProgress(resized.uri, uploadUri, progress => {
121
+ const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {
120
122
  if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
121
123
  });
122
- this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);
123
- console.log('upload success', Config.env.baseUploadsUrl + res.key);
124
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);
125
+ console.log('upload success', Config.env.baseUploadsUrl + uploadUri);
124
126
  } catch (e) {
125
127
  console.log('handleImagePicked error', e);
126
128
  this.props.onUploadFailed(uploadUri);
@@ -131,7 +133,6 @@ class ImageUploader extends Component {
131
133
  const imagesUploaded = imagesSelected.map(image => {
132
134
  const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;
133
135
  const uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
134
- if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, image.uri);
135
136
  return {
136
137
  imageUri: image.uri,
137
138
  uploadUri,
@@ -150,15 +151,19 @@ class ImageUploader extends Component {
150
151
  } = image;
151
152
  try {
152
153
  const resized = await this.resizeImageAsync(imageUri);
154
+ const blob = await fileActions.imageToBlob(resized.uri);
153
155
  if (this.props.onlySelectImage) {
154
156
  this.props.onImageSelected(resized, fileName);
155
157
  return;
156
158
  }
157
- const res = await fileActions.uploadUserMediaWithProgress(resized.uri, uploadUri, progress => {
159
+ const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);
160
+ const uploadUri = presignedUriRes.key;
161
+ if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, imageUri);
162
+ const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {
158
163
  if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
159
164
  });
160
- this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);
161
- console.log('upload success', Config.env.baseUploadsUrl + res.key);
165
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);
166
+ console.log('upload success', Config.env.baseUploadsUrl + uploadUri);
162
167
  } catch (e) {
163
168
  console.log('handleMultiImagePicked error', e);
164
169
  this.props.onUploadFailed(uploadUri);
@@ -170,7 +175,7 @@ class ImageUploader extends Component {
170
175
  try {
171
176
  const fileType = uri.substring(uri.lastIndexOf('.') + 1);
172
177
  const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_VIDEO_NAME)}.${fileType}`;
173
- uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
178
+ uploadUri = await fileActions.getPresignedUrl(fileName);
174
179
  this.props.onUploadStarted(uploadUri, uri);
175
180
  this.hideUploadMenu();
176
181
  const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {
@@ -195,6 +200,7 @@ class ImageUploader extends Component {
195
200
  return true;
196
201
  });
197
202
  _defineProperty(this, "isEditingEnabled", () => {
203
+ return false;
198
204
  return !this.props.multiple && !this.props.allowVideo && getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_EDITING);
199
205
  });
200
206
  // NOTE: No longer used (replaced by openPhotos)
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","View","ScrollView","TouchableOpacity","Text","Platform","Linking","Modal","Dimensions","StyleSheet","ImageBackground","connect","Icon","_","Camera","MediaLibrary","ImageManipulator","ImagePicker","ImageBrowser","ExpoImageManipulator","Header","Popup","PopupMenu","InlineButton","getValueOrDefault","getThumb300","isVideo","getMainBrandingColourFromState","BOXGREY","INACTIVE_BUTTON","TEXT_BLUEGREY","TEXT_DARK","LINEGREY","Config","fileActions","stockImagesLoaded","imageLibraryLoaded","SCREEN_WIDTH","get","width","SCREEN_HEIGHT","height","DEFAULT_ASPECT","DEFAULT_ALLOWS_EDITING","DEFAULT_ALLOWS_IOS_CAMERA_EDITING","DEFAULT_EXIF","DEFULAT_IMAGE_TYPE","DEFAULT_IMAGE_NAME","DEFAULT_VIDEO_NAME","DEFAULT_SIZE","DEFAULT_COMPRESSION","ImageUploader","constructor","props","_defineProperty","hasPermission","getPermissionsAsync","granted","setState","loadingLocalFolders","localAlbums","getAlbumsAsync","includeSmartAlbums","title","id","error","console","log","loadingRemoteFolders","stockImages","getStockPhotos","libraryRes","getMediaFolders","user","site","data","mediaUri","uploadUri","uri","resizeImageAsync","res","uploadUserMediaWithProgress","progress","onUploadProgress","onUploadSuccess","env","baseUploadsUrl","key","e","onUploadFailed","actions","resize","size","saveOptions","format","compress","quality","base64","manipulateAsync","imageUri","fileName","getUploadUrl","userId","onUploadStarted","hideUploadMenu","resized","onlySelectImage","onImageSelected","imagesSelected","imagesUploaded","map","image","i","length","fileType","substring","lastIndexOf","_this$state$localAlbu","cameraPermission","requestCameraPermissionsAsync","rollPermission","requestPermissionsAsync","status","showWarningPopup","state","loadLocalAlbums","multiple","allowVideo","allowsEditing","askPermissionsAsync","result","launchImageLibraryAsync","mediaTypes","MediaTypeOptions","Images","isEditingEnabled","aspect","exif","cancelled","handleImagePicked","Videos","handleVideoPicked","editingAllowed","OS","allowsEditingIOSCamera","launchCameraAsync","showUploadMenu","showPhotos","selected","showRemote","selectedAlbumId","showCropper","showSelectAlbum","videoSelected","onAttach","selectedType","callback","openCropper","mediaSelected","onLibrarySelected","media","mediaType","MediaType","video","localUri","handleMultiImagePicked","hidePhotos","deleteIndex","indexOf","splice","options","text","onPress","openCamera","push","openVideoCamera","openPhotos","hideLibrary","openLibrary","selectedItemNumber","createElement","style","styles","selectedItemContainer","selectedMarkerContainer","backgroundColor","colourBrandingMain","selectedItemText","name","type","iconStyle","selectedItemIcon","warning","componentDidMount","loadRemoteAlbums","camera","roll","innerWarning","closeWarningPopup","goToPermissionSettings","openURL","renderSelectionPreview","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","selectionPreviewContainer","previewItemContainer","previewItemImage","source","previewItemRemoveButton","onRemoveImage","previewItemRemoveContainer","previewItemRemoveIcon","renderSelectedAlbum","selectedAlbum","imageLibrary","find","album","selectedAlbumText","onSelectAlbum","selectAlbumButton","selectAlbumButtonText","selectAlbumButtonIcon","renderBrowser","imagesLimit","max","loadCount","onChange","onSelectionChange","renderSelectedComponent","onSelected","browserContainer","itemStyle","itemContainer","itemWidth","itemHeight","remoteAlbums","renderAttachButton","canAttach","isEmpty","attachText","buttonContainer","color","fillTouchable","large","disabled","renderSelectAlbumPopup","visible","transparent","animationType","onRequestClose","onSelectAlbumClosed","selectAlbumModal","selectAlbumContainer","selectAlbumTitleContainer","selectAlbumTitle","index","onAlbumSelected","albumOptionContainer","borderTopWidth","albumOptionText","marginHorizontal","renderPhotos","leftIcon","onPressLeft","popupTitle","contentContainer","render","action","bind","bold","buildOptions","onClose","cancelText","photo","onToggleModal","toggleCropper","isVisible","onPictureChoosed","create","flex","padding","position","top","right","borderRadius","alignItems","justifyContent","fontFamily","fontSize","marginBottom","paddingHorizontal","paddingTop","flexDirection","marginRight","bottom","left","zIndex","borderTopLeftRadius","borderTopRightRadius","maxHeight","borderColor","borderBottomWidth","textAlign","paddingVertical","paddingRight","paddingLeft","overflow","borderWidth","mapStateToProps","filter","folder","Public","Name","RowId","images","forwardRef"],"sources":["ImageUploader.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, ScrollView, TouchableOpacity, Text, Platform, Linking, Modal, Dimensions, StyleSheet, ImageBackground } from 'react-native';\nimport { connect } from 'react-redux';\nimport { Icon } from 'react-native-elements';\nimport _ from 'lodash';\nimport { Camera } from 'expo-camera';\nimport * as MediaLibrary from 'expo-media-library';\nimport * as ImageManipulator from 'expo-image-manipulator';\nimport * as ImagePicker from 'expo-image-picker';\nimport ImageBrowser from './expo-image-picker-multiple/ImageBrowser';\nimport ExpoImageManipulator from './react-native-expo-image-cropper/ExpoImageManipulator';\nimport Header from './Header';\nimport { Popup } from './Popup';\nimport { PopupMenu } from './PopupMenu';\nimport { InlineButton } from './InlineButton';\nimport { getValueOrDefault, getThumb300, isVideo } from '../helper';\nimport { getMainBrandingColourFromState, BOXGREY, INACTIVE_BUTTON, TEXT_BLUEGREY, TEXT_DARK, LINEGREY } from '../colours';\nimport Config from '../config';\nimport { fileActions } from '../apis';\nimport { stockImagesLoaded, imageLibraryLoaded } from '../actions';\n\nconst SCREEN_WIDTH = Dimensions.get('window').width;\nconst SCREEN_HEIGHT = Dimensions.get('window').height;\nconst DEFAULT_ASPECT = [1, 1];\nconst DEFAULT_ALLOWS_EDITING = true;\nconst DEFAULT_ALLOWS_IOS_CAMERA_EDITING = false;\nconst DEFAULT_EXIF = true;\nconst DEFULAT_IMAGE_TYPE = 'jpeg';\nconst DEFAULT_IMAGE_NAME = 'image';\nconst DEFAULT_VIDEO_NAME = 'video';\nconst DEFAULT_SIZE = {\n width: 1400,\n};\nconst DEFAULT_COMPRESSION = 0.8;\n\nclass ImageUploader extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n showUploadMenu: false,\n warning: null,\n showPhotos: false,\n showRemote: false,\n selected: [],\n selectedType: '',\n onAttach: null,\n selectedAlbumId: '',\n showSelectAlbum: false,\n showCropper: false,\n localAlbums: [],\n loadingLocalFolders: false,\n loadingRemoteFolders: false,\n };\n }\n\n componentDidMount() {\n this.loadLocalAlbums();\n this.loadRemoteAlbums();\n }\n\n loadLocalAlbums = async () => {\n const hasPermission = await MediaLibrary.getPermissionsAsync();\n if (!hasPermission.granted) return;\n\n this.setState({ loadingLocalFolders: true }, async () => {\n try {\n const localAlbums = await MediaLibrary.getAlbumsAsync({ includeSmartAlbums: true });\n this.setState({\n loadingLocalFolders: false,\n localAlbums: [\n {\n title: 'All Photos',\n id: '',\n },\n ...localAlbums,\n ],\n });\n } catch (error) {\n console.log('loadLocalAlbums - error', error);\n this.setState({ loadingLocalFolders: false });\n }\n });\n };\n\n loadRemoteAlbums = () => {\n this.setState({ loadingRemoteFolders: true }, async () => {\n try {\n const stockImages = await fileActions.getStockPhotos();\n this.props.stockImagesLoaded(stockImages);\n const libraryRes = await fileActions.getMediaFolders(this.props.user.site);\n this.props.imageLibraryLoaded(libraryRes.data);\n } catch (error) {\n console.log('loadRemoteAlbums - error', error);\n } finally {\n this.setState({ loadingRemoteFolders: false });\n }\n });\n };\n\n showUploadMenu() {\n this.setState({\n showUploadMenu: true,\n });\n }\n\n hideUploadMenu() {\n this.setState({\n showUploadMenu: false,\n });\n }\n\n retryUpload = async (mediaUri, uploadUri) => {\n try {\n const uri = isVideo(uploadUri) ? mediaUri : (await this.resizeImageAsync(mediaUri)).uri;\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);\n console.log('upload(retry) success', Config.env.baseUploadsUrl + res.key);\n } catch (e) {\n console.log('retryUpload error', e);\n this.props.onUploadFailed(uploadUri);\n }\n };\n\n resizeImageAsync = async uri => {\n const actions = [\n {\n resize: getValueOrDefault(this.props.size, DEFAULT_SIZE),\n },\n ];\n const saveOptions = {\n format: DEFULAT_IMAGE_TYPE,\n compress: getValueOrDefault(this.props.quality, DEFAULT_COMPRESSION),\n base64: true,\n };\n return await ImageManipulator.manipulateAsync(uri, actions, saveOptions);\n };\n\n handleImagePicked = async imageUri => {\n let uploadUri;\n try {\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;\n uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);\n\n this.props.onUploadStarted(uploadUri, imageUri);\n this.hideUploadMenu();\n\n const resized = await this.resizeImageAsync(imageUri);\n if (this.props.onlySelectImage) {\n this.props.onImageSelected(resized, fileName);\n return;\n }\n\n const res = await fileActions.uploadUserMediaWithProgress(resized.uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);\n console.log('upload success', Config.env.baseUploadsUrl + res.key);\n } catch (e) {\n console.log('handleImagePicked error', e);\n this.props.onUploadFailed(uploadUri);\n }\n };\n\n handleMultiImagePicked = async imagesSelected => {\n // Signal start of all images selected\n const imagesUploaded = imagesSelected.map(image => {\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;\n const uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);\n if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, image.uri);\n return { imageUri: image.uri, uploadUri, fileName };\n });\n this.hideUploadMenu();\n\n // Sequentially upload all imagesUploaded\n for (let i = 0; i < imagesUploaded.length; i++) {\n const image = imagesUploaded[i];\n const { imageUri, uploadUri, fileName } = image;\n try {\n const resized = await this.resizeImageAsync(imageUri);\n if (this.props.onlySelectImage) {\n this.props.onImageSelected(resized, fileName);\n return;\n }\n\n const res = await fileActions.uploadUserMediaWithProgress(resized.uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);\n console.log('upload success', Config.env.baseUploadsUrl + res.key);\n } catch (e) {\n console.log('handleMultiImagePicked error', e);\n this.props.onUploadFailed(uploadUri);\n }\n }\n };\n\n handleVideoPicked = async uri => {\n let uploadUri;\n try {\n const fileType = uri.substring(uri.lastIndexOf('.') + 1);\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_VIDEO_NAME)}.${fileType}`;\n uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);\n\n this.props.onUploadStarted(uploadUri, uri);\n this.hideUploadMenu();\n\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);\n console.log('upload success', Config.env.baseUploadsUrl + res.key);\n } catch (e) {\n console.log('handleVideoPicked error', e);\n this.props.onUploadFailed(uploadUri);\n }\n };\n\n showWarningPopup(camera, roll) {\n if (Platform.OS !== 'ios') {\n return;\n }\n let innerWarning = '';\n if (camera && roll) {\n innerWarning = 'both your camera and photo library';\n } else if (camera) {\n innerWarning = 'your camera';\n } else if (roll) {\n innerWarning = 'your photo library';\n } else {\n // nothing to warn about\n return;\n }\n this.setState({\n warning: `You must grant access to ${innerWarning}. Tap Go to settings to change your permission settings.`,\n });\n }\n\n closeWarningPopup() {\n this.setState({\n warning: null,\n });\n }\n\n goToPermissionSettings() {\n Linking.openURL('app-settings:');\n this.setState({\n warning: null,\n });\n }\n\n askPermissionsAsync = async () => {\n const cameraPermission = await Camera.requestCameraPermissionsAsync();\n const rollPermission = await MediaLibrary.requestPermissionsAsync();\n if (cameraPermission.status !== 'granted' || rollPermission.status !== 'granted') {\n this.showWarningPopup(cameraPermission.status !== 'granted', rollPermission.status !== 'granted');\n return false;\n }\n if (this.state.localAlbums?.length <= 0) this.loadLocalAlbums();\n\n return true;\n };\n\n isEditingEnabled = () => {\n return !this.props.multiple && !this.props.allowVideo && getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_EDITING);\n };\n\n // NOTE: No longer used (replaced by openPhotos)\n openCameraRoll = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n const result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Images,\n allowsEditing: this.isEditingEnabled(),\n aspect: getValueOrDefault(this.props.aspect, DEFAULT_ASPECT),\n exif: true,\n base64: true,\n });\n\n if (!result.cancelled) this.handleImagePicked(result.uri);\n };\n\n // NOTE: No longer used (replaced by openPhotos)\n openVideoRoll = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n const result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Videos,\n allowsEditing: this.isEditingEnabled(),\n });\n\n if (!result.cancelled) this.handleVideoPicked(result.uri);\n };\n\n openCamera = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n let editingAllowed = this.isEditingEnabled();\n if (Platform.OS === 'ios') {\n editingAllowed = getValueOrDefault(\n this.props.allowsEditingIOSCamera,\n getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_IOS_CAMERA_EDITING),\n );\n }\n const result = await ImagePicker.launchCameraAsync({\n allowsEditing: editingAllowed,\n aspect: getValueOrDefault(this.props.aspect, DEFAULT_ASPECT),\n exif: getValueOrDefault(this.props.exif, DEFAULT_EXIF),\n });\n\n if (!result.cancelled) this.handleImagePicked(result.uri);\n };\n\n openVideoCamera = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n const result = await ImagePicker.launchCameraAsync({\n allowsEditing: this.isEditingEnabled(),\n mediaTypes: ImagePicker.MediaTypeOptions.Videos,\n });\n\n if (!result.cancelled) this.handleVideoPicked(result.uri);\n };\n\n openLibrary = async () => {\n this.setState({\n showUploadMenu: false,\n showPhotos: true,\n selected: [],\n showRemote: true,\n selectedAlbumId: '',\n });\n };\n\n openPhotos = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n this.setState({\n showUploadMenu: false,\n showPhotos: true,\n selected: [],\n showRemote: false,\n selectedAlbumId: '',\n });\n };\n\n hidePhotos = () => {\n this.setState({ showPhotos: false });\n };\n\n openCropper = () => {\n this.setState({ showPhotos: false, showCropper: true });\n };\n\n toggleCropper = () => {\n this.setState({ showCropper: !this.state.showCropper });\n };\n\n onSelectAlbum = () => {\n this.setState({ showSelectAlbum: true });\n };\n\n onSelectAlbumClosed = () => {\n this.setState({ showSelectAlbum: false });\n };\n\n onAlbumSelected = selectedAlbumId => {\n this.setState({ showSelectAlbum: false, selectedAlbumId });\n };\n\n onSelectionChange = (selected, videoSelected, onAttach) => {\n this.setState({\n selected,\n selectedType: videoSelected ? 'video' : 'image',\n onAttach,\n });\n };\n\n onSelected = async callback => {\n if (this.isEditingEnabled()) {\n this.openCropper();\n } else {\n const mediaSelected = await callback;\n // console.log('mediaSelected', mediaSelected);\n if (this.state.showRemote) {\n if (this.props.onLibrarySelected) {\n mediaSelected.map(media => {\n this.props.onLibrarySelected(media.uri);\n });\n }\n } else {\n if (mediaSelected[0].mediaType === MediaLibrary.MediaType.video) {\n const uri = mediaSelected[0].localUri || mediaSelected[0].uri;\n this.handleVideoPicked(uri);\n } else {\n this.handleMultiImagePicked(mediaSelected);\n }\n }\n\n this.hidePhotos();\n }\n };\n\n onRemoveImage = uri => {\n const selected = [...this.state.selected];\n const deleteIndex = selected.indexOf(uri);\n selected.splice(deleteIndex, 1);\n this.setState({ selected });\n };\n\n buildOptions = () => {\n const options = [\n {\n text: 'Take photo',\n onPress: this.openCamera,\n },\n ];\n if (this.props.allowVideo)\n options.push({\n text: 'Record video',\n onPress: this.openVideoCamera,\n });\n options.push({\n text: 'Camera Roll',\n onPress: this.openPhotos,\n });\n if (!this.props.hideLibrary)\n options.push({\n text: 'Image Library',\n onPress: this.openLibrary,\n });\n\n return options;\n };\n\n renderSelectionPreview() {\n const { selected, showRemote } = this.state;\n\n return (\n <View>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.selectionPreviewContainer}>\n {selected &&\n selected.map(uri => {\n const imageUri = showRemote ? getThumb300(uri) : uri;\n return (\n <View key={uri} style={styles.previewItemContainer}>\n <ImageBackground style={styles.previewItemImage} source={{ uri: imageUri }} />\n <TouchableOpacity style={styles.previewItemRemoveButton} onPress={() => this.onRemoveImage(uri)}>\n <View style={[styles.previewItemRemoveContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n <Icon name=\"times\" type=\"font-awesome\" iconStyle={styles.previewItemRemoveIcon} />\n </View>\n </TouchableOpacity>\n </View>\n );\n })}\n </ScrollView>\n </View>\n );\n }\n\n renderSelectedAlbum() {\n const { localAlbums, selectedAlbumId, showRemote } = this.state;\n const selectedAlbum = (showRemote ? this.props.imageLibrary : localAlbums).find(album => album.id === selectedAlbumId);\n const selectedAlbumText = selectedAlbum ? selectedAlbum.title : '';\n\n return (\n <TouchableOpacity onPress={this.onSelectAlbum}>\n <View style={styles.selectAlbumButton}>\n <Text style={styles.selectAlbumButtonText}>{selectedAlbumText}</Text>\n <Icon name=\"angle-down\" type=\"font-awesome\" iconStyle={styles.selectAlbumButtonIcon} />\n </View>\n </TouchableOpacity>\n );\n }\n\n renderSelectedComponent = selectedItemNumber => {\n return (\n <View style={styles.selectedItemContainer}>\n <View style={[styles.selectedMarkerContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n {this.props.multiple ? (\n <Text style={styles.selectedItemText}>{selectedItemNumber}</Text>\n ) : (\n <Icon name=\"check\" type=\"font-awesome\" iconStyle={styles.selectedItemIcon} />\n )}\n </View>\n </View>\n );\n };\n\n renderBrowser() {\n const { selected, selectedAlbumId, showRemote } = this.state;\n const { imagesLimit, multiple, allowVideo, imageLibrary } = this.props;\n const width = (SCREEN_WIDTH - 10 * 2) / 4;\n\n return (\n <ImageBrowser\n max={!multiple ? 1 : imagesLimit}\n loadCount={30}\n onChange={this.onSelectionChange}\n renderSelectedComponent={this.renderSelectedComponent}\n callback={this.onSelected}\n selected={selected}\n allowVideo={allowVideo}\n style={styles.browserContainer}\n itemStyle={styles.itemContainer}\n itemWidth={width}\n itemHeight={width}\n album={selectedAlbumId}\n remoteAlbums={showRemote ? imageLibrary : null}\n />\n );\n }\n\n renderAttachButton() {\n const { selected, selectedType } = this.state;\n const canAttach = selected.length > 0 && !_.isEmpty(selectedType);\n const attachText = `Attach ${canAttach ? selected.length : ''} ${canAttach ? selectedType : ''}${selected.length > 1 ? 's' : ''}`;\n\n return (\n <View style={styles.buttonContainer}>\n <InlineButton\n color={canAttach ? this.props.colourBrandingMain : INACTIVE_BUTTON}\n onPress={this.state.onAttach}\n fillTouchable\n large\n disabled={!canAttach}\n >\n {attachText}\n </InlineButton>\n </View>\n );\n }\n\n renderSelectAlbumPopup() {\n const { showSelectAlbum, localAlbums, showRemote } = this.state;\n if (!showSelectAlbum) return null;\n\n return (\n <Modal visible transparent animationType=\"slide\" onRequestClose={this.onSelectAlbumClosed}>\n <View style={styles.selectAlbumModal}>\n <View style={styles.selectAlbumContainer}>\n <View style={styles.selectAlbumTitleContainer}>\n <Text style={styles.selectAlbumTitle}>Select Album</Text>\n </View>\n <ScrollView>\n {(showRemote ? this.props.imageLibrary : localAlbums).map((album, index) => {\n return (\n <TouchableOpacity key={album.id} onPress={() => this.onAlbumSelected(album.id)}>\n <View style={[styles.albumOptionContainer, index === 0 && { borderTopWidth: 0 }]}>\n <Text style={styles.albumOptionText}>{album.title}</Text>\n </View>\n </TouchableOpacity>\n );\n })}\n </ScrollView>\n <TouchableOpacity onPress={this.onSelectAlbumClosed}>\n <View style={[styles.albumOptionContainer, { marginHorizontal: 0 }]}>\n <Text style={[styles.albumOptionText, { color: this.props.colourBrandingMain }]}>Cancel</Text>\n </View>\n </TouchableOpacity>\n </View>\n </View>\n </Modal>\n );\n }\n\n renderPhotos() {\n return (\n <Modal visible transparent animationType=\"slide\" onRequestClose={this.hidePhotos}>\n <Header leftIcon=\"angle-left\" onPressLeft={this.hidePhotos} text={this.props.popupTitle || 'Attach image'} />\n <View style={styles.contentContainer}>\n {this.renderSelectionPreview()}\n {this.renderSelectedAlbum()}\n {this.renderBrowser()}\n </View>\n {this.renderAttachButton()}\n {this.renderSelectAlbumPopup()}\n </Modal>\n );\n }\n\n render() {\n const { warning, showUploadMenu, showPhotos, showCropper, selected } = this.state;\n\n if (warning != null) {\n return (\n <Popup\n title=\"Permissions missing\"\n text={warning}\n options={[\n {\n text: 'Go to settings',\n action: this.goToPermissionSettings.bind(this),\n bold: true,\n },\n {\n text: 'Ignore',\n action: this.closeWarningPopup.bind(this),\n },\n ]}\n />\n );\n }\n\n if (showUploadMenu) {\n const options = this.buildOptions();\n return <PopupMenu onClose={this.hideUploadMenu.bind(this)} options={options} title={this.props.popupTitle} cancelText=\"Cancel\" />;\n }\n\n if (showPhotos) return this.renderPhotos();\n\n if (showCropper) {\n return (\n <ExpoImageManipulator\n photo={{ uri: selected[0] }}\n onToggleModal={this.toggleCropper}\n isVisible={showCropper}\n onPictureChoosed={data => {\n this.handleImagePicked(data.uri);\n }}\n />\n );\n }\n\n return null;\n }\n}\n\nconst styles = StyleSheet.create({\n contentContainer: {\n flex: 1,\n backgroundColor: BOXGREY,\n },\n browserContainer: {\n padding: 10,\n },\n itemContainer: {\n padding: 4,\n },\n selectedItemContainer: {\n flex: 1,\n backgroundColor: '#0008',\n },\n selectedMarkerContainer: {\n position: 'absolute',\n top: 6,\n right: 6,\n width: 20,\n height: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n selectedItemText: {\n fontFamily: 'sf-semibold',\n fontSize: 12,\n color: '#fff',\n marginBottom: 1,\n },\n selectedItemIcon: {\n fontSize: 12,\n color: '#fff',\n marginBottom: 1,\n },\n buttonContainer: {\n alignItems: 'center',\n justifyContent: 'center',\n height: 60,\n paddingHorizontal: 14,\n backgroundColor: '#fff',\n },\n selectAlbumButton: {\n paddingTop: 13,\n paddingHorizontal: 14,\n flexDirection: 'row',\n alignItems: 'center',\n },\n selectAlbumButtonText: {\n fontFamily: 'sf-medium',\n fontSize: 14,\n color: TEXT_BLUEGREY,\n marginRight: 6,\n },\n selectAlbumButtonIcon: {\n fontSize: 20,\n color: TEXT_BLUEGREY,\n },\n selectAlbumModal: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: 1000,\n },\n selectAlbumContainer: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: '#fff',\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n maxHeight: SCREEN_HEIGHT / 2,\n },\n selectAlbumTitleContainer: {\n padding: 16,\n borderColor: LINEGREY,\n borderBottomWidth: 1,\n },\n selectAlbumTitle: {\n fontFamily: 'sf-semibold',\n fontSize: 16,\n textAlign: 'center',\n color: TEXT_DARK,\n },\n albumOptionContainer: {\n marginHorizontal: 16,\n paddingVertical: 16,\n borderColor: LINEGREY,\n borderTopWidth: 1,\n },\n albumOptionText: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n textAlign: 'center',\n color: TEXT_DARK,\n },\n selectionPreviewContainer: {\n paddingTop: 14,\n paddingRight: 2,\n paddingLeft: 14,\n },\n previewItemContainer: {\n marginRight: 12,\n },\n previewItemImage: {\n width: 50,\n height: 50,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n overflow: 'hidden',\n },\n previewItemRemoveButton: {\n position: 'absolute',\n top: -8,\n right: -8,\n },\n previewItemRemoveContainer: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 10,\n width: 20,\n height: 20,\n borderWidth: 2,\n borderColor: '#fff',\n },\n previewItemRemoveIcon: {\n fontSize: 10,\n color: '#fff',\n marginBottom: 1,\n },\n});\n\nconst mapStateToProps = state => {\n const { user, media } = state;\n const imageLibrary = media.imageLibrary\n .filter(folder => !folder.Public)\n .map(album => {\n return {\n title: album.Name,\n id: album.RowId || '',\n images: album.RowId ? album.Images : media.stockImages,\n };\n });\n\n return {\n user,\n imageLibrary,\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nexport default connect(mapStateToProps, { stockImagesLoaded, imageLibraryLoaded }, null, { forwardRef: true })(ImageUploader);\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","Component","View","ScrollView","TouchableOpacity","Text","Platform","Linking","Modal","Dimensions","StyleSheet","ImageBackground","connect","Icon","_","Camera","MediaLibrary","ImageManipulator","ImagePicker","ImageBrowser","ExpoImageManipulator","Header","Popup","PopupMenu","InlineButton","getValueOrDefault","getThumb300","isVideo","getMainBrandingColourFromState","BOXGREY","INACTIVE_BUTTON","TEXT_BLUEGREY","TEXT_DARK","LINEGREY","Config","fileActions","stockImagesLoaded","imageLibraryLoaded","SCREEN_WIDTH","get","width","SCREEN_HEIGHT","height","DEFAULT_ASPECT","DEFAULT_ALLOWS_EDITING","DEFAULT_ALLOWS_IOS_CAMERA_EDITING","DEFAULT_EXIF","DEFULAT_IMAGE_TYPE","DEFAULT_IMAGE_NAME","DEFAULT_VIDEO_NAME","DEFAULT_SIZE","DEFAULT_COMPRESSION","ImageUploader","constructor","props","_defineProperty","hasPermission","getPermissionsAsync","granted","setState","loadingLocalFolders","localAlbums","getAlbumsAsync","includeSmartAlbums","title","id","error","console","log","loadingRemoteFolders","stockImages","getStockPhotos","libraryRes","getMediaFolders","user","site","data","mediaUri","uploadUri","uri","resizeImageAsync","res","uploadUserMediaWithProgress","progress","onUploadProgress","onUploadSuccess","env","baseUploadsUrl","key","e","onUploadFailed","actions","resize","size","saveOptions","format","compress","quality","base64","manipulateAsync","imageUri","fileName","hideUploadMenu","resized","blob","imageToBlob","presignedUriRes","getPresignedUrl","last","split","type","onUploadStarted","onlySelectImage","onImageSelected","uploadResult","url","imagesSelected","imagesUploaded","map","image","getUploadUrl","userId","i","length","fileType","substring","lastIndexOf","_this$state$localAlbu","cameraPermission","requestCameraPermissionsAsync","rollPermission","requestPermissionsAsync","status","showWarningPopup","state","loadLocalAlbums","multiple","allowVideo","allowsEditing","askPermissionsAsync","result","launchImageLibraryAsync","mediaTypes","MediaTypeOptions","Images","isEditingEnabled","aspect","exif","cancelled","handleImagePicked","Videos","handleVideoPicked","editingAllowed","OS","allowsEditingIOSCamera","launchCameraAsync","showUploadMenu","showPhotos","selected","showRemote","selectedAlbumId","showCropper","showSelectAlbum","videoSelected","onAttach","selectedType","callback","openCropper","mediaSelected","onLibrarySelected","media","mediaType","MediaType","video","localUri","handleMultiImagePicked","hidePhotos","deleteIndex","indexOf","splice","options","text","onPress","openCamera","push","openVideoCamera","openPhotos","hideLibrary","openLibrary","selectedItemNumber","createElement","style","styles","selectedItemContainer","selectedMarkerContainer","backgroundColor","colourBrandingMain","selectedItemText","name","iconStyle","selectedItemIcon","warning","componentDidMount","loadRemoteAlbums","camera","roll","innerWarning","closeWarningPopup","goToPermissionSettings","openURL","renderSelectionPreview","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","selectionPreviewContainer","previewItemContainer","previewItemImage","source","previewItemRemoveButton","onRemoveImage","previewItemRemoveContainer","previewItemRemoveIcon","renderSelectedAlbum","selectedAlbum","imageLibrary","find","album","selectedAlbumText","onSelectAlbum","selectAlbumButton","selectAlbumButtonText","selectAlbumButtonIcon","renderBrowser","imagesLimit","max","loadCount","onChange","onSelectionChange","renderSelectedComponent","onSelected","browserContainer","itemStyle","itemContainer","itemWidth","itemHeight","remoteAlbums","renderAttachButton","canAttach","isEmpty","attachText","buttonContainer","color","fillTouchable","large","disabled","renderSelectAlbumPopup","visible","transparent","animationType","onRequestClose","onSelectAlbumClosed","selectAlbumModal","selectAlbumContainer","selectAlbumTitleContainer","selectAlbumTitle","index","onAlbumSelected","albumOptionContainer","borderTopWidth","albumOptionText","marginHorizontal","renderPhotos","leftIcon","onPressLeft","popupTitle","contentContainer","render","action","bind","bold","buildOptions","onClose","cancelText","photo","onToggleModal","toggleCropper","isVisible","onPictureChoosed","create","flex","padding","position","top","right","borderRadius","alignItems","justifyContent","fontFamily","fontSize","marginBottom","paddingHorizontal","paddingTop","flexDirection","marginRight","bottom","left","zIndex","borderTopLeftRadius","borderTopRightRadius","maxHeight","borderColor","borderBottomWidth","textAlign","paddingVertical","paddingRight","paddingLeft","overflow","borderWidth","mapStateToProps","filter","folder","Public","Name","RowId","images","forwardRef"],"sources":["ImageUploader.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, ScrollView, TouchableOpacity, Text, Platform, Linking, Modal, Dimensions, StyleSheet, ImageBackground } from 'react-native';\nimport { connect } from 'react-redux';\nimport { Icon } from 'react-native-elements';\nimport _ from 'lodash';\nimport { Camera } from 'expo-camera';\nimport * as MediaLibrary from 'expo-media-library';\nimport * as ImageManipulator from 'expo-image-manipulator';\nimport * as ImagePicker from 'expo-image-picker';\nimport ImageBrowser from './expo-image-picker-multiple/ImageBrowser';\nimport ExpoImageManipulator from './react-native-expo-image-cropper/ExpoImageManipulator';\nimport Header from './Header';\nimport { Popup } from './Popup';\nimport { PopupMenu } from './PopupMenu';\nimport { InlineButton } from './InlineButton';\nimport { getValueOrDefault, getThumb300, isVideo } from '../helper';\nimport { getMainBrandingColourFromState, BOXGREY, INACTIVE_BUTTON, TEXT_BLUEGREY, TEXT_DARK, LINEGREY } from '../colours';\nimport Config from '../config';\nimport { fileActions } from '../apis';\nimport { stockImagesLoaded, imageLibraryLoaded } from '../actions';\n\nconst SCREEN_WIDTH = Dimensions.get('window').width;\nconst SCREEN_HEIGHT = Dimensions.get('window').height;\nconst DEFAULT_ASPECT = [1, 1];\nconst DEFAULT_ALLOWS_EDITING = true;\nconst DEFAULT_ALLOWS_IOS_CAMERA_EDITING = false;\nconst DEFAULT_EXIF = true;\nconst DEFULAT_IMAGE_TYPE = 'jpeg';\nconst DEFAULT_IMAGE_NAME = 'image';\nconst DEFAULT_VIDEO_NAME = 'video';\nconst DEFAULT_SIZE = {\n width: 1400,\n};\nconst DEFAULT_COMPRESSION = 0.8;\n\nclass ImageUploader extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n showUploadMenu: false,\n warning: null,\n showPhotos: false,\n showRemote: false,\n selected: [],\n selectedType: '',\n onAttach: null,\n selectedAlbumId: '',\n showSelectAlbum: false,\n showCropper: false,\n localAlbums: [],\n loadingLocalFolders: false,\n loadingRemoteFolders: false,\n };\n }\n\n componentDidMount() {\n this.loadLocalAlbums();\n this.loadRemoteAlbums();\n }\n\n loadLocalAlbums = async () => {\n const hasPermission = await MediaLibrary.getPermissionsAsync();\n if (!hasPermission.granted) return;\n\n this.setState({ loadingLocalFolders: true }, async () => {\n try {\n const localAlbums = await MediaLibrary.getAlbumsAsync({ includeSmartAlbums: true });\n this.setState({\n loadingLocalFolders: false,\n localAlbums: [\n {\n title: 'All Photos',\n id: '',\n },\n ...localAlbums,\n ],\n });\n } catch (error) {\n console.log('loadLocalAlbums - error', error);\n this.setState({ loadingLocalFolders: false });\n }\n });\n };\n\n loadRemoteAlbums = () => {\n this.setState({ loadingRemoteFolders: true }, async () => {\n try {\n const stockImages = await fileActions.getStockPhotos();\n this.props.stockImagesLoaded(stockImages);\n const libraryRes = await fileActions.getMediaFolders(this.props.user.site);\n this.props.imageLibraryLoaded(libraryRes.data);\n } catch (error) {\n console.log('loadRemoteAlbums - error', error);\n } finally {\n this.setState({ loadingRemoteFolders: false });\n }\n });\n };\n\n showUploadMenu() {\n this.setState({\n showUploadMenu: true,\n });\n }\n\n hideUploadMenu() {\n this.setState({\n showUploadMenu: false,\n });\n }\n\n retryUpload = async (mediaUri, uploadUri) => {\n try {\n const uri = isVideo(uploadUri) ? mediaUri : (await this.resizeImageAsync(mediaUri)).uri;\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);\n console.log('upload(retry) success', Config.env.baseUploadsUrl + res.key);\n } catch (e) {\n console.log('retryUpload error', e);\n this.props.onUploadFailed(uploadUri);\n }\n };\n\n resizeImageAsync = async uri => {\n const actions = [\n {\n resize: getValueOrDefault(this.props.size, DEFAULT_SIZE),\n },\n ];\n const saveOptions = {\n format: DEFULAT_IMAGE_TYPE,\n compress: getValueOrDefault(this.props.quality, DEFAULT_COMPRESSION),\n base64: true,\n };\n return await ImageManipulator.manipulateAsync(uri, actions, saveOptions);\n };\n\n handleImagePicked = async imageUri => {\n let uploadUri;\n try {\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;\n\n this.hideUploadMenu();\n\n const resized = await this.resizeImageAsync(imageUri);\n const blob = await fileActions.imageToBlob(resized.uri);\n const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);\n uploadUri = presignedUriRes.key;\n this.props.onUploadStarted(uploadUri, imageUri);\n if (this.props.onlySelectImage) {\n this.props.onImageSelected(resized, fileName);\n return;\n }\n\n const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);\n console.log('upload success', Config.env.baseUploadsUrl + uploadUri);\n } catch (e) {\n console.log('handleImagePicked error', e);\n this.props.onUploadFailed(uploadUri);\n }\n };\n\n handleMultiImagePicked = async imagesSelected => {\n // Signal start of all images selected\n const imagesUploaded = imagesSelected.map(image => {\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;\n const uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);\n return { imageUri: image.uri, uploadUri, fileName };\n });\n this.hideUploadMenu();\n\n // Sequentially upload all imagesUploaded\n for (let i = 0; i < imagesUploaded.length; i++) {\n const image = imagesUploaded[i];\n const { imageUri, uploadUri, fileName } = image;\n try {\n const resized = await this.resizeImageAsync(imageUri);\n const blob = await fileActions.imageToBlob(resized.uri);\n if (this.props.onlySelectImage) {\n this.props.onImageSelected(resized, fileName);\n return;\n }\n const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);\n const uploadUri = presignedUriRes.key;\n if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, imageUri);\n\n const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);\n console.log('upload success', Config.env.baseUploadsUrl + uploadUri);\n } catch (e) {\n console.log('handleMultiImagePicked error', e);\n this.props.onUploadFailed(uploadUri);\n }\n }\n };\n\n handleVideoPicked = async uri => {\n let uploadUri;\n try {\n const fileType = uri.substring(uri.lastIndexOf('.') + 1);\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_VIDEO_NAME)}.${fileType}`;\n uploadUri = await fileActions.getPresignedUrl(fileName);\n\n this.props.onUploadStarted(uploadUri, uri);\n this.hideUploadMenu();\n\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);\n console.log('upload success', Config.env.baseUploadsUrl + res.key);\n } catch (e) {\n console.log('handleVideoPicked error', e);\n this.props.onUploadFailed(uploadUri);\n }\n };\n\n showWarningPopup(camera, roll) {\n if (Platform.OS !== 'ios') {\n return;\n }\n let innerWarning = '';\n if (camera && roll) {\n innerWarning = 'both your camera and photo library';\n } else if (camera) {\n innerWarning = 'your camera';\n } else if (roll) {\n innerWarning = 'your photo library';\n } else {\n // nothing to warn about\n return;\n }\n this.setState({\n warning: `You must grant access to ${innerWarning}. Tap Go to settings to change your permission settings.`,\n });\n }\n\n closeWarningPopup() {\n this.setState({\n warning: null,\n });\n }\n\n goToPermissionSettings() {\n Linking.openURL('app-settings:');\n this.setState({\n warning: null,\n });\n }\n\n askPermissionsAsync = async () => {\n const cameraPermission = await Camera.requestCameraPermissionsAsync();\n const rollPermission = await MediaLibrary.requestPermissionsAsync();\n if (cameraPermission.status !== 'granted' || rollPermission.status !== 'granted') {\n this.showWarningPopup(cameraPermission.status !== 'granted', rollPermission.status !== 'granted');\n return false;\n }\n if (this.state.localAlbums?.length <= 0) this.loadLocalAlbums();\n\n return true;\n };\n\n isEditingEnabled = () => {\n return false;\n return !this.props.multiple && !this.props.allowVideo && getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_EDITING);\n };\n\n // NOTE: No longer used (replaced by openPhotos)\n openCameraRoll = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n const result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Images,\n allowsEditing: this.isEditingEnabled(),\n aspect: getValueOrDefault(this.props.aspect, DEFAULT_ASPECT),\n exif: true,\n base64: true,\n });\n\n if (!result.cancelled) this.handleImagePicked(result.uri);\n };\n\n // NOTE: No longer used (replaced by openPhotos)\n openVideoRoll = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n const result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Videos,\n allowsEditing: this.isEditingEnabled(),\n });\n\n if (!result.cancelled) this.handleVideoPicked(result.uri);\n };\n\n openCamera = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n let editingAllowed = this.isEditingEnabled();\n if (Platform.OS === 'ios') {\n editingAllowed = getValueOrDefault(\n this.props.allowsEditingIOSCamera,\n getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_IOS_CAMERA_EDITING),\n );\n }\n const result = await ImagePicker.launchCameraAsync({\n allowsEditing: editingAllowed,\n aspect: getValueOrDefault(this.props.aspect, DEFAULT_ASPECT),\n exif: getValueOrDefault(this.props.exif, DEFAULT_EXIF),\n });\n\n if (!result.cancelled) this.handleImagePicked(result.uri);\n };\n\n openVideoCamera = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n const result = await ImagePicker.launchCameraAsync({\n allowsEditing: this.isEditingEnabled(),\n mediaTypes: ImagePicker.MediaTypeOptions.Videos,\n });\n\n if (!result.cancelled) this.handleVideoPicked(result.uri);\n };\n\n openLibrary = async () => {\n this.setState({\n showUploadMenu: false,\n showPhotos: true,\n selected: [],\n showRemote: true,\n selectedAlbumId: '',\n });\n };\n\n openPhotos = async () => {\n if (!(await this.askPermissionsAsync())) return;\n\n this.setState({\n showUploadMenu: false,\n showPhotos: true,\n selected: [],\n showRemote: false,\n selectedAlbumId: '',\n });\n };\n\n hidePhotos = () => {\n this.setState({ showPhotos: false });\n };\n\n openCropper = () => {\n this.setState({ showPhotos: false, showCropper: true });\n };\n\n toggleCropper = () => {\n this.setState({ showCropper: !this.state.showCropper });\n };\n\n onSelectAlbum = () => {\n this.setState({ showSelectAlbum: true });\n };\n\n onSelectAlbumClosed = () => {\n this.setState({ showSelectAlbum: false });\n };\n\n onAlbumSelected = selectedAlbumId => {\n this.setState({ showSelectAlbum: false, selectedAlbumId });\n };\n\n onSelectionChange = (selected, videoSelected, onAttach) => {\n this.setState({\n selected,\n selectedType: videoSelected ? 'video' : 'image',\n onAttach,\n });\n };\n\n onSelected = async callback => {\n if (this.isEditingEnabled()) {\n this.openCropper();\n } else {\n const mediaSelected = await callback;\n // console.log('mediaSelected', mediaSelected);\n if (this.state.showRemote) {\n if (this.props.onLibrarySelected) {\n mediaSelected.map(media => {\n this.props.onLibrarySelected(media.uri);\n });\n }\n } else {\n if (mediaSelected[0].mediaType === MediaLibrary.MediaType.video) {\n const uri = mediaSelected[0].localUri || mediaSelected[0].uri;\n this.handleVideoPicked(uri);\n } else {\n this.handleMultiImagePicked(mediaSelected);\n }\n }\n\n this.hidePhotos();\n }\n };\n\n onRemoveImage = uri => {\n const selected = [...this.state.selected];\n const deleteIndex = selected.indexOf(uri);\n selected.splice(deleteIndex, 1);\n this.setState({ selected });\n };\n\n buildOptions = () => {\n const options = [\n {\n text: 'Take photo',\n onPress: this.openCamera,\n },\n ];\n if (this.props.allowVideo)\n options.push({\n text: 'Record video',\n onPress: this.openVideoCamera,\n });\n options.push({\n text: 'Camera Roll',\n onPress: this.openPhotos,\n });\n if (!this.props.hideLibrary)\n options.push({\n text: 'Image Library',\n onPress: this.openLibrary,\n });\n\n return options;\n };\n\n renderSelectionPreview() {\n const { selected, showRemote } = this.state;\n\n return (\n <View>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.selectionPreviewContainer}>\n {selected &&\n selected.map(uri => {\n const imageUri = showRemote ? getThumb300(uri) : uri;\n return (\n <View key={uri} style={styles.previewItemContainer}>\n <ImageBackground style={styles.previewItemImage} source={{ uri: imageUri }} />\n <TouchableOpacity style={styles.previewItemRemoveButton} onPress={() => this.onRemoveImage(uri)}>\n <View style={[styles.previewItemRemoveContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n <Icon name=\"times\" type=\"font-awesome\" iconStyle={styles.previewItemRemoveIcon} />\n </View>\n </TouchableOpacity>\n </View>\n );\n })}\n </ScrollView>\n </View>\n );\n }\n\n renderSelectedAlbum() {\n const { localAlbums, selectedAlbumId, showRemote } = this.state;\n const selectedAlbum = (showRemote ? this.props.imageLibrary : localAlbums).find(album => album.id === selectedAlbumId);\n const selectedAlbumText = selectedAlbum ? selectedAlbum.title : '';\n\n return (\n <TouchableOpacity onPress={this.onSelectAlbum}>\n <View style={styles.selectAlbumButton}>\n <Text style={styles.selectAlbumButtonText}>{selectedAlbumText}</Text>\n <Icon name=\"angle-down\" type=\"font-awesome\" iconStyle={styles.selectAlbumButtonIcon} />\n </View>\n </TouchableOpacity>\n );\n }\n\n renderSelectedComponent = selectedItemNumber => {\n return (\n <View style={styles.selectedItemContainer}>\n <View style={[styles.selectedMarkerContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n {this.props.multiple ? (\n <Text style={styles.selectedItemText}>{selectedItemNumber}</Text>\n ) : (\n <Icon name=\"check\" type=\"font-awesome\" iconStyle={styles.selectedItemIcon} />\n )}\n </View>\n </View>\n );\n };\n\n renderBrowser() {\n const { selected, selectedAlbumId, showRemote } = this.state;\n const { imagesLimit, multiple, allowVideo, imageLibrary } = this.props;\n const width = (SCREEN_WIDTH - 10 * 2) / 4;\n\n return (\n <ImageBrowser\n max={!multiple ? 1 : imagesLimit}\n loadCount={30}\n onChange={this.onSelectionChange}\n renderSelectedComponent={this.renderSelectedComponent}\n callback={this.onSelected}\n selected={selected}\n allowVideo={allowVideo}\n style={styles.browserContainer}\n itemStyle={styles.itemContainer}\n itemWidth={width}\n itemHeight={width}\n album={selectedAlbumId}\n remoteAlbums={showRemote ? imageLibrary : null}\n />\n );\n }\n\n renderAttachButton() {\n const { selected, selectedType } = this.state;\n const canAttach = selected.length > 0 && !_.isEmpty(selectedType);\n const attachText = `Attach ${canAttach ? selected.length : ''} ${canAttach ? selectedType : ''}${selected.length > 1 ? 's' : ''}`;\n\n return (\n <View style={styles.buttonContainer}>\n <InlineButton\n color={canAttach ? this.props.colourBrandingMain : INACTIVE_BUTTON}\n onPress={this.state.onAttach}\n fillTouchable\n large\n disabled={!canAttach}\n >\n {attachText}\n </InlineButton>\n </View>\n );\n }\n\n renderSelectAlbumPopup() {\n const { showSelectAlbum, localAlbums, showRemote } = this.state;\n if (!showSelectAlbum) return null;\n\n return (\n <Modal visible transparent animationType=\"slide\" onRequestClose={this.onSelectAlbumClosed}>\n <View style={styles.selectAlbumModal}>\n <View style={styles.selectAlbumContainer}>\n <View style={styles.selectAlbumTitleContainer}>\n <Text style={styles.selectAlbumTitle}>Select Album</Text>\n </View>\n <ScrollView>\n {(showRemote ? this.props.imageLibrary : localAlbums).map((album, index) => {\n return (\n <TouchableOpacity key={album.id} onPress={() => this.onAlbumSelected(album.id)}>\n <View style={[styles.albumOptionContainer, index === 0 && { borderTopWidth: 0 }]}>\n <Text style={styles.albumOptionText}>{album.title}</Text>\n </View>\n </TouchableOpacity>\n );\n })}\n </ScrollView>\n <TouchableOpacity onPress={this.onSelectAlbumClosed}>\n <View style={[styles.albumOptionContainer, { marginHorizontal: 0 }]}>\n <Text style={[styles.albumOptionText, { color: this.props.colourBrandingMain }]}>Cancel</Text>\n </View>\n </TouchableOpacity>\n </View>\n </View>\n </Modal>\n );\n }\n\n renderPhotos() {\n return (\n <Modal visible transparent animationType=\"slide\" onRequestClose={this.hidePhotos}>\n <Header leftIcon=\"angle-left\" onPressLeft={this.hidePhotos} text={this.props.popupTitle || 'Attach image'} />\n <View style={styles.contentContainer}>\n {this.renderSelectionPreview()}\n {this.renderSelectedAlbum()}\n {this.renderBrowser()}\n </View>\n {this.renderAttachButton()}\n {this.renderSelectAlbumPopup()}\n </Modal>\n );\n }\n\n render() {\n const { warning, showUploadMenu, showPhotos, showCropper, selected } = this.state;\n\n if (warning != null) {\n return (\n <Popup\n title=\"Permissions missing\"\n text={warning}\n options={[\n {\n text: 'Go to settings',\n action: this.goToPermissionSettings.bind(this),\n bold: true,\n },\n {\n text: 'Ignore',\n action: this.closeWarningPopup.bind(this),\n },\n ]}\n />\n );\n }\n\n if (showUploadMenu) {\n const options = this.buildOptions();\n return <PopupMenu onClose={this.hideUploadMenu.bind(this)} options={options} title={this.props.popupTitle} cancelText=\"Cancel\" />;\n }\n\n if (showPhotos) return this.renderPhotos();\n\n if (showCropper) {\n return (\n <ExpoImageManipulator\n photo={{ uri: selected[0] }}\n onToggleModal={this.toggleCropper}\n isVisible={showCropper}\n onPictureChoosed={data => {\n this.handleImagePicked(data.uri);\n }}\n />\n );\n }\n\n return null;\n }\n}\n\nconst styles = StyleSheet.create({\n contentContainer: {\n flex: 1,\n backgroundColor: BOXGREY,\n },\n browserContainer: {\n padding: 10,\n },\n itemContainer: {\n padding: 4,\n },\n selectedItemContainer: {\n flex: 1,\n backgroundColor: '#0008',\n },\n selectedMarkerContainer: {\n position: 'absolute',\n top: 6,\n right: 6,\n width: 20,\n height: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n selectedItemText: {\n fontFamily: 'sf-semibold',\n fontSize: 12,\n color: '#fff',\n marginBottom: 1,\n },\n selectedItemIcon: {\n fontSize: 12,\n color: '#fff',\n marginBottom: 1,\n },\n buttonContainer: {\n alignItems: 'center',\n justifyContent: 'center',\n height: 60,\n paddingHorizontal: 14,\n backgroundColor: '#fff',\n },\n selectAlbumButton: {\n paddingTop: 13,\n paddingHorizontal: 14,\n flexDirection: 'row',\n alignItems: 'center',\n },\n selectAlbumButtonText: {\n fontFamily: 'sf-medium',\n fontSize: 14,\n color: TEXT_BLUEGREY,\n marginRight: 6,\n },\n selectAlbumButtonIcon: {\n fontSize: 20,\n color: TEXT_BLUEGREY,\n },\n selectAlbumModal: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: 1000,\n },\n selectAlbumContainer: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: '#fff',\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n maxHeight: SCREEN_HEIGHT / 2,\n },\n selectAlbumTitleContainer: {\n padding: 16,\n borderColor: LINEGREY,\n borderBottomWidth: 1,\n },\n selectAlbumTitle: {\n fontFamily: 'sf-semibold',\n fontSize: 16,\n textAlign: 'center',\n color: TEXT_DARK,\n },\n albumOptionContainer: {\n marginHorizontal: 16,\n paddingVertical: 16,\n borderColor: LINEGREY,\n borderTopWidth: 1,\n },\n albumOptionText: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n textAlign: 'center',\n color: TEXT_DARK,\n },\n selectionPreviewContainer: {\n paddingTop: 14,\n paddingRight: 2,\n paddingLeft: 14,\n },\n previewItemContainer: {\n marginRight: 12,\n },\n previewItemImage: {\n width: 50,\n height: 50,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n overflow: 'hidden',\n },\n previewItemRemoveButton: {\n position: 'absolute',\n top: -8,\n right: -8,\n },\n previewItemRemoveContainer: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 10,\n width: 20,\n height: 20,\n borderWidth: 2,\n borderColor: '#fff',\n },\n previewItemRemoveIcon: {\n fontSize: 10,\n color: '#fff',\n marginBottom: 1,\n },\n});\n\nconst mapStateToProps = state => {\n const { user, media } = state;\n const imageLibrary = media.imageLibrary\n .filter(folder => !folder.Public)\n .map(album => {\n return {\n title: album.Name,\n id: album.RowId || '',\n images: album.RowId ? album.Images : media.stockImages,\n };\n });\n\n return {\n user,\n imageLibrary,\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nexport default connect(mapStateToProps, { stockImagesLoaded, imageLibraryLoaded }, null, { forwardRef: true })(ImageUploader);\n"],"mappings":"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"}
@@ -16,7 +16,12 @@ const CoreConfig = {
16
16
  preferredSite: '',
17
17
  strings: {},
18
18
  newEventDefaults: '',
19
- defaultAllowComments: true
19
+ defaultAllowComments: true,
20
+ AuthStrategy: {
21
+ getAccessToken: async () => null,
22
+ getCurrentUserId: async () => null,
23
+ hasActiveSession: async () => false
24
+ }
20
25
  },
21
26
  init: (environment, navigation) => {
22
27
  CoreConfig.env = environment;
@@ -1 +1 @@
1
- {"version":3,"names":["Services","navigation","CoreConfig","env","baseStage","baseAPIUrl","hasGradientHeader","defaultProfileImage","tinyChatDefault","baseUploadsUrl","allowMediaDownload","allowMediaSharing","awsUploadsBucket","awsStorageBucket","preferredSite","strings","newEventDefaults","defaultAllowComments","init","environment"],"sources":["config.js"],"sourcesContent":["export const Services = {\n navigation: null,\n};\n\nconst CoreConfig = {\n env: {\n baseStage: '',\n baseAPIUrl: '',\n hasGradientHeader: false,\n defaultProfileImage: '',\n tinyChatDefault: '',\n baseUploadsUrl: '',\n allowMediaDownload: false,\n allowMediaSharing: false,\n awsUploadsBucket: '',\n awsStorageBucket: '',\n preferredSite: '',\n strings: {},\n newEventDefaults: '',\n defaultAllowComments: true,\n },\n init: (environment, navigation) => {\n CoreConfig.env = environment;\n Services.navigation = navigation;\n },\n};\nexport default CoreConfig;\n"],"mappings":"AAAA,OAAO,MAAMA,QAAQ,GAAG;EACtBC,UAAU,EAAE;AACd,CAAC;AAED,MAAMC,UAAU,GAAG;EACjBC,GAAG,EAAE;IACHC,SAAS,EAAE,EAAE;IACbC,UAAU,EAAE,EAAE;IACdC,iBAAiB,EAAE,KAAK;IACxBC,mBAAmB,EAAE,EAAE;IACvBC,eAAe,EAAE,EAAE;IACnBC,cAAc,EAAE,EAAE;IAClBC,kBAAkB,EAAE,KAAK;IACzBC,iBAAiB,EAAE,KAAK;IACxBC,gBAAgB,EAAE,EAAE;IACpBC,gBAAgB,EAAE,EAAE;IACpBC,aAAa,EAAE,EAAE;IACjBC,OAAO,EAAE,CAAC,CAAC;IACXC,gBAAgB,EAAE,EAAE;IACpBC,oBAAoB,EAAE;EACxB,CAAC;EACDC,IAAI,EAAEA,CAACC,WAAW,EAAElB,UAAU,KAAK;IACjCC,UAAU,CAACC,GAAG,GAAGgB,WAAW;IAC5BnB,QAAQ,CAACC,UAAU,GAAGA,UAAU;EAClC;AACF,CAAC;AACD,eAAeC,UAAU"}
1
+ {"version":3,"names":["Services","navigation","CoreConfig","env","baseStage","baseAPIUrl","hasGradientHeader","defaultProfileImage","tinyChatDefault","baseUploadsUrl","allowMediaDownload","allowMediaSharing","awsUploadsBucket","awsStorageBucket","preferredSite","strings","newEventDefaults","defaultAllowComments","AuthStrategy","getAccessToken","getCurrentUserId","hasActiveSession","init","environment"],"sources":["config.js"],"sourcesContent":["export const Services = {\n navigation: null,\n};\n\nconst CoreConfig = {\n env: {\n baseStage: '',\n baseAPIUrl: '',\n hasGradientHeader: false,\n defaultProfileImage: '',\n tinyChatDefault: '',\n baseUploadsUrl: '',\n allowMediaDownload: false,\n allowMediaSharing: false,\n awsUploadsBucket: '',\n awsStorageBucket: '',\n preferredSite: '',\n strings: {},\n newEventDefaults: '',\n defaultAllowComments: true,\n AuthStrategy: {\n getAccessToken: async () => null,\n getCurrentUserId: async () => null,\n hasActiveSession: async () => false,\n },\n },\n init: (environment, navigation) => {\n CoreConfig.env = environment;\n Services.navigation = navigation;\n },\n};\nexport default CoreConfig;\n"],"mappings":"AAAA,OAAO,MAAMA,QAAQ,GAAG;EACtBC,UAAU,EAAE;AACd,CAAC;AAED,MAAMC,UAAU,GAAG;EACjBC,GAAG,EAAE;IACHC,SAAS,EAAE,EAAE;IACbC,UAAU,EAAE,EAAE;IACdC,iBAAiB,EAAE,KAAK;IACxBC,mBAAmB,EAAE,EAAE;IACvBC,eAAe,EAAE,EAAE;IACnBC,cAAc,EAAE,EAAE;IAClBC,kBAAkB,EAAE,KAAK;IACzBC,iBAAiB,EAAE,KAAK;IACxBC,gBAAgB,EAAE,EAAE;IACpBC,gBAAgB,EAAE,EAAE;IACpBC,aAAa,EAAE,EAAE;IACjBC,OAAO,EAAE,CAAC,CAAC;IACXC,gBAAgB,EAAE,EAAE;IACpBC,oBAAoB,EAAE,IAAI;IAC1BC,YAAY,EAAE;MACZC,cAAc,EAAE,MAAAA,CAAA,KAAY,IAAI;MAChCC,gBAAgB,EAAE,MAAAA,CAAA,KAAY,IAAI;MAClCC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;IAChC;EACF,CAAC;EACDC,IAAI,EAAEA,CAACC,WAAW,EAAEtB,UAAU,KAAK;IACjCC,UAAU,CAACC,GAAG,GAAGoB,WAAW;IAC5BvB,QAAQ,CAACC,UAAU,GAAGA,UAAU;EAClC;AACF,CAAC;AACD,eAAeC,UAAU"}
@@ -1,8 +1,11 @@
1
1
  import { stringActions } from '../../apis';
2
2
  import moment from 'moment';
3
3
  import * as FileSystem from 'expo-file-system';
4
- import * as FaceDetector from 'expo-face-detector';
4
+ // import * as FaceDetector from 'expo-face-detector';
5
+
5
6
  const detectFaces = async remoteUrl => {
7
+ // deprecated
8
+
6
9
  const parts = remoteUrl.split('/').splice(-2);
7
10
  const mediaId = parts[0];
8
11
  const extension = parts[1].split('.').splice(-1)[0];
@@ -10,9 +13,12 @@ const detectFaces = async remoteUrl => {
10
13
  const {
11
14
  uri: localUrl
12
15
  } = await FileSystem.downloadAsync(remoteUrl, downloadPath);
13
- const faces = await FaceDetector.detectFacesAsync(localUrl, {
14
- mode: FaceDetector.FaceDetectorMode.accurate
15
- });
16
+
17
+ // const faces = await FaceDetector.detectFacesAsync(localUrl, {
18
+ // mode: FaceDetector.FaceDetectorMode.accurate,
19
+ // });
20
+
21
+ const faces = null;
16
22
  if (faces && faces.image && faces.image.uri) {
17
23
  delete faces.image.uri;
18
24
  }
@@ -1 +1 @@
1
- {"version":3,"names":["stringActions","moment","FileSystem","FaceDetector","detectFaces","remoteUrl","parts","split","splice","mediaId","extension","downloadPath","cacheDirectory","uri","localUrl","downloadAsync","faces","detectFacesAsync","mode","FaceDetectorMode","accurate","image","timestamp","valueOf","setString","encodeURIComponent"],"sources":["detectFaces.js"],"sourcesContent":["import { stringActions } from '../../apis';\nimport moment from 'moment';\nimport * as FileSystem from 'expo-file-system';\nimport * as FaceDetector from 'expo-face-detector';\n\nconst detectFaces = async remoteUrl => {\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 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,OAAO,KAAKC,YAAY,MAAM,oBAAoB;AAElD,MAAMC,WAAW,GAAG,MAAMC,SAAS,IAAI;EACrC,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,GAAET,UAAU,CAACU,cAAe,GAAEH,OAAQ,IAAGC,SAAU,EAAC;EAE1E,MAAM;IAAEG,GAAG,EAAEC;EAAS,CAAC,GAAG,MAAMZ,UAAU,CAACa,aAAa,CAACV,SAAS,EAAEM,YAAY,CAAC;EAEjF,MAAMK,KAAK,GAAG,MAAMb,YAAY,CAACc,gBAAgB,CAACH,QAAQ,EAAE;IAC1DI,IAAI,EAAEf,YAAY,CAACgB,gBAAgB,CAACC;EACtC,CAAC,CAAC;EAEF,IAAIJ,KAAK,IAAIA,KAAK,CAACK,KAAK,IAAIL,KAAK,CAACK,KAAK,CAACR,GAAG,EAAE;IAC3C,OAAOG,KAAK,CAACK,KAAK,CAACR,GAAG;EACxB;EAEAG,KAAK,CAACM,SAAS,GAAGrB,MAAM,CAAC,CAAC,CAACsB,OAAO,CAAC,CAAC;EAEpCvB,aAAa,CAACwB,SAAS,CAAC,YAAY,EAAG,cAAaC,kBAAkB,CAACpB,SAAS,CAAE,EAAC,EAAEW,KAAK,CAAC;EAE3F,OAAOA,KAAK;AACd,CAAC;AAED,eAAeZ,WAAW"}
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"}
@@ -1,9 +1,9 @@
1
1
  import _ from 'lodash';
2
2
  import axios from 'axios';
3
3
  import { Auth } from 'aws-amplify';
4
+ import Config from './config';
4
5
  export const getSessionTokenAWS = async prefix => {
5
- const data = await Auth.currentSession();
6
- const token = data.accessToken.jwtToken;
6
+ const token = await Config.env.AuthStrategy.getAccessToken();
7
7
  if (_.isUndefined(prefix)) return token;
8
8
  return `${prefix} ${token}`;
9
9
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_","axios","Auth","getSessionTokenAWS","prefix","data","currentSession","token","accessToken","jwtToken","isUndefined","getSessionUidAWS","Promise","resolve","reject","then","payload","username","catch","err","console","log","authedFunction","request","authkey","headers","getApiError","error","__DEV__","errorData","response","e"],"sources":["session.js"],"sourcesContent":["import _ from 'lodash';\nimport axios from 'axios';\nimport { Auth } from 'aws-amplify';\n\nexport const getSessionTokenAWS = async prefix => {\n const data = await Auth.currentSession();\n const token = data.accessToken.jwtToken;\n if (_.isUndefined(prefix)) return token;\n return `${prefix} ${token}`;\n};\n\n// export const getRefreshTokenAWS = async () => {\n// const data = await Auth.currentSession();\n// return data.getRefreshToken().token;\n// };\n\nexport const getSessionUidAWS = () => {\n return new Promise((resolve, reject) => {\n Auth.currentSession()\n .then(data => {\n resolve(data.accessToken.payload.username);\n })\n .catch(err => {\n console.log('getSessionUidAWS error', err);\n reject(err);\n });\n });\n};\n\nexport const authedFunction = async request => {\n const authkey = await getSessionTokenAWS();\n if (!request.headers) request.headers = {};\n request.headers.authkey = authkey;\n\n return axios(request);\n};\n\n// export const LogoutAWS = () => {\n// return new Promise((resolve, reject) => {\n// Auth.signOut()\n// .then(() => {\n// resolve();\n// })\n// .catch(err => {\n// reject(err);\n// });\n// });\n// };\n\n// export const isTheBest = auth => {\n// return auth && auth.site === 'plussSpace' && auth.type === 'master';\n// };\n\nexport const getApiError = error => {\n if (!__DEV__) return error;\n try {\n const errorData = error.response.data;\n return errorData || error;\n } catch (e) {\n return error;\n }\n};\n"],"mappings":"AAAA,OAAOA,CAAC,MAAM,QAAQ;AACtB,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,aAAa;AAElC,OAAO,MAAMC,kBAAkB,GAAG,MAAMC,MAAM,IAAI;EAChD,MAAMC,IAAI,GAAG,MAAMH,IAAI,CAACI,cAAc,CAAC,CAAC;EACxC,MAAMC,KAAK,GAAGF,IAAI,CAACG,WAAW,CAACC,QAAQ;EACvC,IAAIT,CAAC,CAACU,WAAW,CAACN,MAAM,CAAC,EAAE,OAAOG,KAAK;EACvC,OAAQ,GAAEH,MAAO,IAAGG,KAAM,EAAC;AAC7B,CAAC;;AAED;AACA;AACA;AACA;;AAEA,OAAO,MAAMI,gBAAgB,GAAGA,CAAA,KAAM;EACpC,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCZ,IAAI,CAACI,cAAc,CAAC,CAAC,CAClBS,IAAI,CAACV,IAAI,IAAI;MACZQ,OAAO,CAACR,IAAI,CAACG,WAAW,CAACQ,OAAO,CAACC,QAAQ,CAAC;IAC5C,CAAC,CAAC,CACDC,KAAK,CAACC,GAAG,IAAI;MACZC,OAAO,CAACC,GAAG,CAAC,wBAAwB,EAAEF,GAAG,CAAC;MAC1CL,MAAM,CAACK,GAAG,CAAC;IACb,CAAC,CAAC;EACN,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMG,cAAc,GAAG,MAAMC,OAAO,IAAI;EAC7C,MAAMC,OAAO,GAAG,MAAMrB,kBAAkB,CAAC,CAAC;EAC1C,IAAI,CAACoB,OAAO,CAACE,OAAO,EAAEF,OAAO,CAACE,OAAO,GAAG,CAAC,CAAC;EAC1CF,OAAO,CAACE,OAAO,CAACD,OAAO,GAAGA,OAAO;EAEjC,OAAOvB,KAAK,CAACsB,OAAO,CAAC;AACvB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO,MAAMG,WAAW,GAAGC,KAAK,IAAI;EAClC,IAAI,CAACC,OAAO,EAAE,OAAOD,KAAK;EAC1B,IAAI;IACF,MAAME,SAAS,GAAGF,KAAK,CAACG,QAAQ,CAACzB,IAAI;IACrC,OAAOwB,SAAS,IAAIF,KAAK;EAC3B,CAAC,CAAC,OAAOI,CAAC,EAAE;IACV,OAAOJ,KAAK;EACd;AACF,CAAC"}
1
+ {"version":3,"names":["_","axios","Auth","Config","getSessionTokenAWS","prefix","token","env","AuthStrategy","getAccessToken","isUndefined","getSessionUidAWS","Promise","resolve","reject","currentSession","then","data","accessToken","payload","username","catch","err","console","log","authedFunction","request","authkey","headers","getApiError","error","__DEV__","errorData","response","e"],"sources":["session.js"],"sourcesContent":["import _ from 'lodash';\nimport axios from 'axios';\nimport { Auth } from 'aws-amplify';\nimport Config from './config';\n\nexport const getSessionTokenAWS = async prefix => {\n const token = await Config.env.AuthStrategy.getAccessToken();\n if (_.isUndefined(prefix)) return token;\n return `${prefix} ${token}`;\n};\n\n// export const getRefreshTokenAWS = async () => {\n// const data = await Auth.currentSession();\n// return data.getRefreshToken().token;\n// };\n\nexport const getSessionUidAWS = () => {\n return new Promise((resolve, reject) => {\n Auth.currentSession()\n .then(data => {\n resolve(data.accessToken.payload.username);\n })\n .catch(err => {\n console.log('getSessionUidAWS error', err);\n reject(err);\n });\n });\n};\n\nexport const authedFunction = async request => {\n const authkey = await getSessionTokenAWS();\n if (!request.headers) request.headers = {};\n request.headers.authkey = authkey;\n\n return axios(request);\n};\n\n// export const LogoutAWS = () => {\n// return new Promise((resolve, reject) => {\n// Auth.signOut()\n// .then(() => {\n// resolve();\n// })\n// .catch(err => {\n// reject(err);\n// });\n// });\n// };\n\n// export const isTheBest = auth => {\n// return auth && auth.site === 'plussSpace' && auth.type === 'master';\n// };\n\nexport const getApiError = error => {\n if (!__DEV__) return error;\n try {\n const errorData = error.response.data;\n return errorData || error;\n } catch (e) {\n return error;\n }\n};\n"],"mappings":"AAAA,OAAOA,CAAC,MAAM,QAAQ;AACtB,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,aAAa;AAClC,OAAOC,MAAM,MAAM,UAAU;AAE7B,OAAO,MAAMC,kBAAkB,GAAG,MAAMC,MAAM,IAAI;EAChD,MAAMC,KAAK,GAAG,MAAMH,MAAM,CAACI,GAAG,CAACC,YAAY,CAACC,cAAc,CAAC,CAAC;EAC5D,IAAIT,CAAC,CAACU,WAAW,CAACL,MAAM,CAAC,EAAE,OAAOC,KAAK;EACvC,OAAQ,GAAED,MAAO,IAAGC,KAAM,EAAC;AAC7B,CAAC;;AAED;AACA;AACA;AACA;;AAEA,OAAO,MAAMK,gBAAgB,GAAGA,CAAA,KAAM;EACpC,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCZ,IAAI,CAACa,cAAc,CAAC,CAAC,CAClBC,IAAI,CAACC,IAAI,IAAI;MACZJ,OAAO,CAACI,IAAI,CAACC,WAAW,CAACC,OAAO,CAACC,QAAQ,CAAC;IAC5C,CAAC,CAAC,CACDC,KAAK,CAACC,GAAG,IAAI;MACZC,OAAO,CAACC,GAAG,CAAC,wBAAwB,EAAEF,GAAG,CAAC;MAC1CR,MAAM,CAACQ,GAAG,CAAC;IACb,CAAC,CAAC;EACN,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMG,cAAc,GAAG,MAAMC,OAAO,IAAI;EAC7C,MAAMC,OAAO,GAAG,MAAMvB,kBAAkB,CAAC,CAAC;EAC1C,IAAI,CAACsB,OAAO,CAACE,OAAO,EAAEF,OAAO,CAACE,OAAO,GAAG,CAAC,CAAC;EAC1CF,OAAO,CAACE,OAAO,CAACD,OAAO,GAAGA,OAAO;EAEjC,OAAO1B,KAAK,CAACyB,OAAO,CAAC;AACvB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO,MAAMG,WAAW,GAAGC,KAAK,IAAI;EAClC,IAAI,CAACC,OAAO,EAAE,OAAOD,KAAK;EAC1B,IAAI;IACF,MAAME,SAAS,GAAGF,KAAK,CAACG,QAAQ,CAAChB,IAAI;IACrC,OAAOe,SAAS,IAAIF,KAAK;EAC3B,CAAC,CAAC,OAAOI,CAAC,EAAE;IACV,OAAOJ,KAAK;EACd;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-core-app",
3
- "version": "4.0.3",
3
+ "version": "6.0.0-auth.0",
4
4
  "description": "Core extension package for Pluss Communities platform",
5
5
  "main": "dist/module/index.js",
6
6
  "module": "dist/module/index.js",
@@ -15,50 +15,49 @@
15
15
  "patch": "npm version patch",
16
16
  "betaupload": "npm run build && npm publish --access public --tag beta",
17
17
  "betaupload:p": "npm run betapatch && npm run betaupload",
18
+ "authpatch": "npm version prepatch --preid=auth",
19
+ "authupload": "npm i && npm i && npm publish --access public --tag auth",
20
+ "authupload:p": "npm run authpatch && npm run authupload",
18
21
  "upload": "npm run build && npm publish --access public",
19
22
  "upload:p": "npm run patch && npm run upload"
20
23
  },
21
24
  "author": "Phillip Suh",
22
25
  "license": "ISC",
23
- "dependencies": {
24
- "@expo/vector-icons": "^13.0.0",
25
- "@react-native-async-storage/async-storage": "1.17.11",
26
- "@react-native-community/netinfo": "9.3.7",
27
- "@react-native-picker/picker": "2.4.8",
26
+ "dependencies": {},
27
+ "peerDependencies": {
28
+ "@expo/vector-icons": "^14.0.0",
29
+ "@react-native-async-storage/async-storage": "1.21.0",
28
30
  "aws-amplify": "^4.3.11",
29
31
  "aws-amplify-react-native": "^6.0.2",
30
- "expo-av": "~13.2.1",
31
- "expo-calendar": "~11.1.1",
32
- "expo-constants": "~14.2.1",
33
- "expo-face-detector": "~12.1.1",
34
- "expo-file-system": "~15.2.2",
35
- "expo-image-manipulator": "~11.1.1",
36
- "expo-image-picker": "~14.1.1",
37
- "expo-linear-gradient": "~12.1.2",
38
- "expo-media-library": "~15.2.3",
39
- "expo-screen-orientation": "~5.1.1",
40
- "expo-sharing": "~11.2.2",
32
+ "axios": "^1.6.8",
33
+ "deprecated-react-native-prop-types": "^4.1.0",
34
+ "expo-av": "~13.10.6",
35
+ "expo-calendar": "~12.2.1",
36
+ "expo-constants": "~15.4.6",
37
+ "expo-file-system": "~16.0.9",
38
+ "expo-image-manipulator": "~11.8.0",
39
+ "expo-image-picker": "~14.7.1",
40
+ "expo-linear-gradient": "~12.7.2",
41
+ "expo-media-library": "~15.9.2",
42
+ "expo-screen-orientation": "~6.4.1",
43
+ "expo-sharing": "~11.10.0",
41
44
  "expo-video-player": "^1.6.0",
42
45
  "js-cookie": "^2.2.1",
43
46
  "lodash": "^4.17.4",
44
47
  "mime-types": "^2.1.24",
45
48
  "moment": "^2.18.1",
46
49
  "react": "18.2.0",
47
- "react-native": "0.71.14",
50
+ "react-native": "0.73.6",
48
51
  "react-native-auto-height-image": "3.1.3",
49
52
  "react-native-elements": "^0.17.0",
53
+ "react-native-gifted-chat": "^0.16.3",
50
54
  "react-native-image-zoom-viewer": "^3.0.1",
51
55
  "react-native-iphone-x-helper": "^1.3.1",
52
56
  "react-native-vimeo-iframe": "^1.0.4",
53
- "react-native-webview": "11.26.0",
57
+ "react-native-webview": "13.6.4",
54
58
  "react-native-youtube-iframe": "^2.2.1",
55
59
  "react-redux": "^7.2.6"
56
60
  },
57
- "peerDependencies": {
58
- "react-native-gifted-chat": "^0.16.3",
59
- "axios": "^0.16.2",
60
- "deprecated-react-native-prop-types": "^4.1.0"
61
- },
62
61
  "devDependencies": {
63
62
  "react-native-builder-bob": "^0.18.2"
64
63
  },
@@ -1,41 +1,34 @@
1
- import mime from 'mime-types';
2
- import { Storage } from 'aws-amplify';
1
+ import Axios from 'axios';
3
2
  import { getUrl, generateImageName, randomString } from '../helper';
4
3
  import { authedFunction } from '../session';
5
- import Config from '../config';
6
4
 
7
5
  export const fileActions = {
6
+ getPresignedUrl: async (filename, contentType) => {
7
+ // const newFilename = filename.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();
8
+ const signedUrlRes = await authedFunction({
9
+ method: 'GET',
10
+ url: getUrl('media', 'get/presignedurl', { filename, contentType }),
11
+ });
12
+ return signedUrlRes.data;
13
+ },
8
14
  getUploadUrl: (userId, fileName) => {
9
15
  const newFilename = fileName.replace(/[^a-z0-9+.]+/gi, '').toLowerCase();
10
16
  return `uploads/users/${userId}/public/${randomString()}/${newFilename}`;
11
17
  },
12
- uploadUserMediaWithProgress: async (imageUri, url, progressCallback = null) => {
13
- const blob = await fileActions.imageToBlob(imageUri);
14
- return fileActions.uploadBlobAWS(Config.env.awsUploadsBucket, url, blob, '', progressCallback);
18
+ uploadUserMediaWithProgress: async (blob, url, progressCallback = null) => {
19
+ return fileActions.uploadBlobAWS(url, blob, progressCallback);
15
20
  },
16
- // uploadUserMedia: async (userId, image, fileName) => {
17
- // const blob = await fileActions.imageToBlob(image.uri);
18
- // const url = fileActions.getUploadUrl(userId, fileName);
19
- // return fileActions.uploadBlobAWS(Config.env.awsUploadsBucket, url, blob);
20
- // },
21
- // uploadSignatureImage: async (image, name) => {
22
- // const blob = await fileActions.imageToBlob(image);
23
- // const newImageName = generateImageName(name, 'signature.png');
24
- // return fileActions.uploadBlobAWS(Config.env.awsStorageBucket, newImageName, blob, 'images/');
25
- // },
26
21
  imageToBlob: async imageUri => {
27
22
  const response = await fetch(imageUri);
28
23
  return response.blob();
29
24
  },
30
- uploadBlobAWS: (bucket, uri, blob, prefix = '', progressCallback = null) => {
31
- const imageName = prefix ? uri.replace(/^.*[\\/]/, '') : uri;
32
- const fileType = mime.lookup(uri);
33
- const access = {
34
- level: 'public',
35
- bucket,
36
- contentType: fileType,
37
- customPrefix: { public: '' },
38
- progressCallback: progress =>
25
+ uploadBlobAWS: async (uri, blob, progressCallback = null) => {
26
+ return Axios.put(uri, blob, {
27
+ headers: {
28
+ 'Content-Type': blob.type,
29
+ },
30
+ transformRequest: d => d,
31
+ onUploadProgress: progress =>
39
32
  progressCallback &&
40
33
  progressCallback({
41
34
  uri,
@@ -43,8 +36,7 @@ export const fileActions = {
43
36
  total: progress.total,
44
37
  percentage: `${Math.floor((progress.loaded / progress.total) * 100)}%`,
45
38
  }),
46
- };
47
- return Storage.put(`${prefix}${imageName}`, blob, access);
39
+ });
48
40
  },
49
41
  getStockPhotos: async () => {
50
42
  const response = await authedFunction({
@@ -142,23 +142,25 @@ class ImageUploader extends Component {
142
142
  let uploadUri;
143
143
  try {
144
144
  const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;
145
- uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
146
145
 
147
- this.props.onUploadStarted(uploadUri, imageUri);
148
146
  this.hideUploadMenu();
149
147
 
150
148
  const resized = await this.resizeImageAsync(imageUri);
149
+ const blob = await fileActions.imageToBlob(resized.uri);
150
+ const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);
151
+ uploadUri = presignedUriRes.key;
152
+ this.props.onUploadStarted(uploadUri, imageUri);
151
153
  if (this.props.onlySelectImage) {
152
154
  this.props.onImageSelected(resized, fileName);
153
155
  return;
154
156
  }
155
157
 
156
- const res = await fileActions.uploadUserMediaWithProgress(resized.uri, uploadUri, progress => {
158
+ const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {
157
159
  if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
158
160
  });
159
161
 
160
- this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);
161
- console.log('upload success', Config.env.baseUploadsUrl + res.key);
162
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);
163
+ console.log('upload success', Config.env.baseUploadsUrl + uploadUri);
162
164
  } catch (e) {
163
165
  console.log('handleImagePicked error', e);
164
166
  this.props.onUploadFailed(uploadUri);
@@ -170,7 +172,6 @@ class ImageUploader extends Component {
170
172
  const imagesUploaded = imagesSelected.map(image => {
171
173
  const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_IMAGE_NAME)}.${DEFULAT_IMAGE_TYPE}`;
172
174
  const uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
173
- if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, image.uri);
174
175
  return { imageUri: image.uri, uploadUri, fileName };
175
176
  });
176
177
  this.hideUploadMenu();
@@ -181,16 +182,21 @@ class ImageUploader extends Component {
181
182
  const { imageUri, uploadUri, fileName } = image;
182
183
  try {
183
184
  const resized = await this.resizeImageAsync(imageUri);
185
+ const blob = await fileActions.imageToBlob(resized.uri);
184
186
  if (this.props.onlySelectImage) {
185
187
  this.props.onImageSelected(resized, fileName);
186
188
  return;
187
189
  }
190
+ const presignedUriRes = await fileActions.getPresignedUrl(_.last(resized.uri.split('/')), blob.type);
191
+ const uploadUri = presignedUriRes.key;
192
+ if (!this.props.onlySelectImage) this.props.onUploadStarted(uploadUri, imageUri);
188
193
 
189
- const res = await fileActions.uploadUserMediaWithProgress(resized.uri, uploadUri, progress => {
194
+ const uploadResult = await fileActions.uploadUserMediaWithProgress(blob, presignedUriRes.url, progress => {
190
195
  if (this.props.onUploadProgress) this.props.onUploadProgress(progress);
191
196
  });
192
- this.props.onUploadSuccess(Config.env.baseUploadsUrl + res.key, uploadUri);
193
- console.log('upload success', Config.env.baseUploadsUrl + res.key);
197
+
198
+ this.props.onUploadSuccess(Config.env.baseUploadsUrl + uploadUri, uploadUri);
199
+ console.log('upload success', Config.env.baseUploadsUrl + uploadUri);
194
200
  } catch (e) {
195
201
  console.log('handleMultiImagePicked error', e);
196
202
  this.props.onUploadFailed(uploadUri);
@@ -203,7 +209,7 @@ class ImageUploader extends Component {
203
209
  try {
204
210
  const fileType = uri.substring(uri.lastIndexOf('.') + 1);
205
211
  const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_VIDEO_NAME)}.${fileType}`;
206
- uploadUri = fileActions.getUploadUrl(this.props.userId, fileName);
212
+ uploadUri = await fileActions.getPresignedUrl(fileName);
207
213
 
208
214
  this.props.onUploadStarted(uploadUri, uri);
209
215
  this.hideUploadMenu();
@@ -266,6 +272,7 @@ class ImageUploader extends Component {
266
272
  };
267
273
 
268
274
  isEditingEnabled = () => {
275
+ return false;
269
276
  return !this.props.multiple && !this.props.allowVideo && getValueOrDefault(this.props.allowsEditing, DEFAULT_ALLOWS_EDITING);
270
277
  };
271
278
 
package/src/config.js CHANGED
@@ -18,6 +18,11 @@ const CoreConfig = {
18
18
  strings: {},
19
19
  newEventDefaults: '',
20
20
  defaultAllowComments: true,
21
+ AuthStrategy: {
22
+ getAccessToken: async () => null,
23
+ getCurrentUserId: async () => null,
24
+ hasActiveSession: async () => false,
25
+ },
21
26
  },
22
27
  init: (environment, navigation) => {
23
28
  CoreConfig.env = environment;
@@ -1,9 +1,11 @@
1
1
  import { stringActions } from '../../apis';
2
2
  import moment from 'moment';
3
3
  import * as FileSystem from 'expo-file-system';
4
- import * as FaceDetector from 'expo-face-detector';
4
+ // import * as FaceDetector from 'expo-face-detector';
5
5
 
6
6
  const detectFaces = async remoteUrl => {
7
+ // deprecated
8
+
7
9
  const parts = remoteUrl.split('/').splice(-2);
8
10
  const mediaId = parts[0];
9
11
  const extension = parts[1].split('.').splice(-1)[0];
@@ -12,9 +14,11 @@ const detectFaces = async remoteUrl => {
12
14
 
13
15
  const { uri: localUrl } = await FileSystem.downloadAsync(remoteUrl, downloadPath);
14
16
 
15
- const faces = await FaceDetector.detectFacesAsync(localUrl, {
16
- mode: FaceDetector.FaceDetectorMode.accurate,
17
- });
17
+ // const faces = await FaceDetector.detectFacesAsync(localUrl, {
18
+ // mode: FaceDetector.FaceDetectorMode.accurate,
19
+ // });
20
+
21
+ const faces = null;
18
22
 
19
23
  if (faces && faces.image && faces.image.uri) {
20
24
  delete faces.image.uri;
package/src/session.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import _ from 'lodash';
2
2
  import axios from 'axios';
3
3
  import { Auth } from 'aws-amplify';
4
+ import Config from './config';
4
5
 
5
6
  export const getSessionTokenAWS = async prefix => {
6
- const data = await Auth.currentSession();
7
- const token = data.accessToken.jwtToken;
7
+ const token = await Config.env.AuthStrategy.getAccessToken();
8
8
  if (_.isUndefined(prefix)) return token;
9
9
  return `${prefix} ${token}`;
10
10
  };