Changeset View
Changeset View
Standalone View
Standalone View
native/input/input-state-container.react.js
Show First 20 Lines • Show All 176 Lines • ▼ Show 20 Lines | class InputStateContainer extends React.PureComponent<Props, State> { | ||||
sendCallbacks: Array<() => void> = []; | sendCallbacks: Array<() => void> = []; | ||||
activeURIs = new Map(); | activeURIs = new Map(); | ||||
editInputBarCallbacks: Array< | editInputBarCallbacks: Array< | ||||
(params: EditInputBarMessageParameters) => void, | (params: EditInputBarMessageParameters) => void, | ||||
> = []; | > = []; | ||||
scrollToMessageCallbacks: Array<(messageID: string) => void> = []; | scrollToMessageCallbacks: Array<(messageID: string) => void> = []; | ||||
pendingThreadCreations = new Map<string, Promise<string>>(); | pendingThreadCreations = new Map<string, Promise<string>>(); | ||||
pendingThreadUpdateHandlers = new Map<string, (ThreadInfo) => mixed>(); | pendingThreadUpdateHandlers = new Map<string, (ThreadInfo) => mixed>(); | ||||
// TODO: flip the switch | |||||
// Note that this enables Blob service for encrypted media only | |||||
useBlobServiceUploads = false; | |||||
// When the user sends a multimedia message that triggers the creation of a | // When the user sends a multimedia message that triggers the creation of a | ||||
// sidebar, the sidebar gets created right away, but the message needs to wait | // sidebar, the sidebar gets created right away, but the message needs to wait | ||||
// for the uploads to complete before sending. We use this Set to track the | // for the uploads to complete before sending. We use this Set to track the | ||||
// message localIDs that need sidebarCreation: true. | // message localIDs that need sidebarCreation: true. | ||||
pendingSidebarCreationMessageLocalIDs = new Set<string>(); | pendingSidebarCreationMessageLocalIDs = new Set<string>(); | ||||
static getCompletedUploads(props: Props, state: State): CompletedUploads { | static getCompletedUploads(props: Props, state: State): CompletedUploads { | ||||
▲ Show 20 Lines • Show All 630 Lines • ▼ Show 20 Lines | ): Promise<?string> { | ||||
const uploadStart = Date.now(); | const uploadStart = Date.now(); | ||||
let uploadExceptionMessage, | let uploadExceptionMessage, | ||||
uploadResult, | uploadResult, | ||||
uploadThumbnailResult, | uploadThumbnailResult, | ||||
mediaMissionResult; | mediaMissionResult; | ||||
try { | try { | ||||
const uploadPromises = []; | const uploadPromises = []; | ||||
if ( | |||||
this.useBlobServiceUploads && | |||||
(processedMedia.mediaType === 'encrypted_photo' || | |||||
processedMedia.mediaType === 'encrypted_video') | |||||
) { | |||||
uploadPromises.push( | |||||
this.blobServiceUpload( | |||||
{ | |||||
uri: uploadURI, | |||||
filename: filename, | |||||
mimeType: mime, | |||||
blobHash: processedMedia.blobHash, | |||||
encryptionKey: processedMedia.encryptionKey, | |||||
dimensions: processedMedia.dimensions, | |||||
}, | |||||
{ | |||||
onProgress: (percent: number) => { | |||||
this.setProgress( | |||||
localMessageID, | |||||
localMediaID, | |||||
'uploading', | |||||
percent, | |||||
); | |||||
}, | |||||
}, | |||||
), | |||||
); | |||||
if (processedMedia.mediaType === 'encrypted_video') { | |||||
uploadPromises.push( | |||||
this.blobServiceUpload({ | |||||
uri: processedMedia.uploadThumbnailURI, | |||||
filename: replaceExtension(`thumb${filename}`, 'jpg'), | |||||
mimeType: 'image/jpeg', | |||||
blobHash: processedMedia.thumbnailBlobHash, | |||||
encryptionKey: processedMedia.thumbnailEncryptionKey, | |||||
loop: false, | |||||
dimensions: processedMedia.dimensions, | |||||
}), | |||||
); | |||||
} | |||||
[uploadResult, uploadThumbnailResult] = await Promise.all( | |||||
uploadPromises, | |||||
); | |||||
} else { | |||||
uploadPromises.push( | uploadPromises.push( | ||||
this.props.uploadMultimedia( | this.props.uploadMultimedia( | ||||
{ uri: uploadURI, name: filename, type: mime }, | { uri: uploadURI, name: filename, type: mime }, | ||||
{ | { | ||||
...processedMedia.dimensions, | ...processedMedia.dimensions, | ||||
loop: | loop: | ||||
processedMedia.mediaType === 'video' || | processedMedia.mediaType === 'video' || | ||||
processedMedia.mediaType === 'encrypted_video' | processedMedia.mediaType === 'encrypted_video' | ||||
? processedMedia.loop | ? processedMedia.loop | ||||
: undefined, | : undefined, | ||||
encryptionKey: processedMedia.encryptionKey, | encryptionKey: processedMedia.encryptionKey, | ||||
}, | }, | ||||
{ | { | ||||
onProgress: (percent: number) => | onProgress: (percent: number) => | ||||
this.setProgress( | this.setProgress( | ||||
localMessageID, | localMessageID, | ||||
localMediaID, | localMediaID, | ||||
'uploading', | 'uploading', | ||||
percent, | percent, | ||||
), | ), | ||||
uploadBlob: this.uploadBlob, | uploadBlob: this.uploadBlob, | ||||
}, | }, | ||||
), | ), | ||||
); | ); | ||||
if ( | if ( | ||||
processedMedia.mediaType === 'video' || | processedMedia.mediaType === 'video' || | ||||
processedMedia.mediaType === 'encrypted_video' | processedMedia.mediaType === 'encrypted_video' | ||||
) { | ) { | ||||
uploadPromises.push( | uploadPromises.push( | ||||
this.props.uploadMultimedia( | this.props.uploadMultimedia( | ||||
{ | { | ||||
uri: processedMedia.uploadThumbnailURI, | uri: processedMedia.uploadThumbnailURI, | ||||
name: replaceExtension(`thumb${filename}`, 'jpg'), | name: replaceExtension(`thumb${filename}`, 'jpg'), | ||||
type: 'image/jpeg', | type: 'image/jpeg', | ||||
}, | }, | ||||
{ | { | ||||
...processedMedia.dimensions, | ...processedMedia.dimensions, | ||||
loop: false, | loop: false, | ||||
encryptionKey: processedMedia.thumbnailEncryptionKey, | encryptionKey: processedMedia.thumbnailEncryptionKey, | ||||
}, | }, | ||||
{ | { | ||||
uploadBlob: this.uploadBlob, | uploadBlob: this.uploadBlob, | ||||
}, | }, | ||||
), | ), | ||||
); | ); | ||||
} | } | ||||
[uploadResult, uploadThumbnailResult] = await Promise.all(uploadPromises); | [uploadResult, uploadThumbnailResult] = await Promise.all( | ||||
uploadPromises, | |||||
); | |||||
} | |||||
mediaMissionResult = { success: true }; | mediaMissionResult = { success: true }; | ||||
} catch (e) { | } catch (e) { | ||||
uploadExceptionMessage = getMessageForException(e); | uploadExceptionMessage = getMessageForException(e); | ||||
onUploadFailed(localMediaID, 'upload failed'); | onUploadFailed(localMediaID, 'upload failed'); | ||||
mediaMissionResult = { | mediaMissionResult = { | ||||
success: false, | success: false, | ||||
reason: 'http_upload_failed', | reason: 'http_upload_failed', | ||||
exceptionMessage: uploadExceptionMessage, | exceptionMessage: uploadExceptionMessage, | ||||
▲ Show 20 Lines • Show All 888 Lines • Show Last 20 Lines |