Changeset View
Changeset View
Standalone View
Standalone View
native/input/input-state-container.react.js
Show First 20 Lines • Show All 629 Lines • ▼ Show 20 Lines | for (const selection of selections) { | ||||
selection.step === 'photo_paste' | selection.step === 'photo_paste' | ||||
) { | ) { | ||||
media.push({ | media.push({ | ||||
id: localMediaID, | id: localMediaID, | ||||
uri: selection.uri, | uri: selection.uri, | ||||
type: 'photo', | type: 'photo', | ||||
dimensions: selection.dimensions, | dimensions: selection.dimensions, | ||||
localMediaSelection: selection, | localMediaSelection: selection, | ||||
thumbHash: null, | |||||
}); | }); | ||||
ids = { type: 'photo', localMediaID }; | ids = { type: 'photo', localMediaID }; | ||||
} | } | ||||
const localThumbnailID = getNextLocalUploadID(); | const localThumbnailID = getNextLocalUploadID(); | ||||
if (selection.step === 'video_library') { | if (selection.step === 'video_library') { | ||||
media.push({ | media.push({ | ||||
id: localMediaID, | id: localMediaID, | ||||
uri: selection.uri, | uri: selection.uri, | ||||
type: 'video', | type: 'video', | ||||
dimensions: selection.dimensions, | dimensions: selection.dimensions, | ||||
localMediaSelection: selection, | localMediaSelection: selection, | ||||
loop: false, | loop: false, | ||||
thumbnailID: localThumbnailID, | thumbnailID: localThumbnailID, | ||||
thumbnailURI: selection.uri, | thumbnailURI: selection.uri, | ||||
thumbnailThumbHash: null, | |||||
}); | }); | ||||
ids = { type: 'video', localMediaID, localThumbnailID }; | ids = { type: 'video', localMediaID, localThumbnailID }; | ||||
} | } | ||||
invariant(ids, `unexpected MediaSelection ${selection.step}`); | invariant(ids, `unexpected MediaSelection ${selection.step}`); | ||||
uploadFileInputs.push({ selection, ids }); | uploadFileInputs.push({ selection, ids }); | ||||
} | } | ||||
const pendingUploads = {}; | const pendingUploads = {}; | ||||
▲ Show 20 Lines • Show All 180 Lines • ▼ Show 20 Lines | try { | ||||
this.blobServiceUpload( | this.blobServiceUpload( | ||||
{ | { | ||||
uri: uploadURI, | uri: uploadURI, | ||||
filename: filename, | filename: filename, | ||||
mimeType: mime, | mimeType: mime, | ||||
blobHash: processedMedia.blobHash, | blobHash: processedMedia.blobHash, | ||||
encryptionKey: processedMedia.encryptionKey, | encryptionKey: processedMedia.encryptionKey, | ||||
dimensions: processedMedia.dimensions, | dimensions: processedMedia.dimensions, | ||||
thumbHash: | |||||
processedMedia.mediaType === 'encrypted_photo' | |||||
? processedMedia.thumbHash | |||||
: null, | |||||
}, | }, | ||||
{ | { | ||||
onProgress: (percent: number) => { | onProgress: (percent: number) => { | ||||
this.setProgress( | this.setProgress( | ||||
localMessageID, | localMessageID, | ||||
localMediaID, | localMediaID, | ||||
'uploading', | 'uploading', | ||||
percent, | percent, | ||||
); | ); | ||||
}, | }, | ||||
}, | }, | ||||
), | ), | ||||
); | ); | ||||
if (processedMedia.mediaType === 'encrypted_video') { | if (processedMedia.mediaType === 'encrypted_video') { | ||||
uploadPromises.push( | uploadPromises.push( | ||||
this.blobServiceUpload({ | this.blobServiceUpload({ | ||||
uri: processedMedia.uploadThumbnailURI, | uri: processedMedia.uploadThumbnailURI, | ||||
filename: replaceExtension(`thumb${filename}`, 'jpg'), | filename: replaceExtension(`thumb${filename}`, 'jpg'), | ||||
mimeType: 'image/jpeg', | mimeType: 'image/jpeg', | ||||
blobHash: processedMedia.thumbnailBlobHash, | blobHash: processedMedia.thumbnailBlobHash, | ||||
encryptionKey: processedMedia.thumbnailEncryptionKey, | encryptionKey: processedMedia.thumbnailEncryptionKey, | ||||
loop: false, | loop: false, | ||||
dimensions: processedMedia.dimensions, | dimensions: processedMedia.dimensions, | ||||
thumbHash: processedMedia.thumbHash, | |||||
}), | }), | ||||
); | ); | ||||
} | } | ||||
[uploadResult, uploadThumbnailResult] = await Promise.all( | [uploadResult, uploadThumbnailResult] = await Promise.all( | ||||
uploadPromises, | uploadPromises, | ||||
); | ); | ||||
} else { | } 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, | ||||
thumbHash: | |||||
processedMedia.mediaType === 'photo' || | |||||
processedMedia.mediaType === 'encrypted_photo' | |||||
? processedMedia.thumbHash | |||||
: null, | |||||
}, | }, | ||||
{ | { | ||||
onProgress: (percent: number) => | onProgress: (percent: number) => | ||||
this.setProgress( | this.setProgress( | ||||
localMessageID, | localMessageID, | ||||
localMediaID, | localMediaID, | ||||
'uploading', | 'uploading', | ||||
percent, | percent, | ||||
Show All 13 Lines | try { | ||||
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, | ||||
thumbHash: processedMedia.thumbHash, | |||||
}, | }, | ||||
{ | { | ||||
uploadBlob: this.uploadBlob, | uploadBlob: this.uploadBlob, | ||||
}, | }, | ||||
), | ), | ||||
); | ); | ||||
} | } | ||||
[uploadResult, uploadThumbnailResult] = await Promise.all( | [uploadResult, uploadThumbnailResult] = await Promise.all( | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | ) { | ||||
}; | }; | ||||
if ( | if ( | ||||
processedMedia.mediaType === 'video' || | processedMedia.mediaType === 'video' || | ||||
processedMedia.mediaType === 'encrypted_video' | processedMedia.mediaType === 'encrypted_video' | ||||
) { | ) { | ||||
invariant(uploadThumbnailResult, 'uploadThumbnailResult exists'); | invariant(uploadThumbnailResult, 'uploadThumbnailResult exists'); | ||||
const { uri: thumbnailURI, id: thumbnailID } = uploadThumbnailResult; | const { uri: thumbnailURI, id: thumbnailID } = uploadThumbnailResult; | ||||
const { thumbnailEncryptionKey } = processedMedia; | const { thumbnailEncryptionKey, thumbHash: thumbnailThumbHash } = | ||||
processedMedia; | |||||
if (processedMedia.mediaType === 'encrypted_video') { | if (processedMedia.mediaType === 'encrypted_video') { | ||||
updateMediaPayload = { | updateMediaPayload = { | ||||
...updateMediaPayload, | ...updateMediaPayload, | ||||
mediaUpdate: { | mediaUpdate: { | ||||
...updateMediaPayload.mediaUpdate, | ...updateMediaPayload.mediaUpdate, | ||||
thumbnailID, | thumbnailID, | ||||
thumbnailHolder: thumbnailURI, | thumbnailHolder: thumbnailURI, | ||||
thumbnailEncryptionKey, | thumbnailEncryptionKey, | ||||
thumbnailThumbHash, | |||||
}, | }, | ||||
}; | }; | ||||
} else { | } else { | ||||
updateMediaPayload = { | updateMediaPayload = { | ||||
...updateMediaPayload, | ...updateMediaPayload, | ||||
mediaUpdate: { | mediaUpdate: { | ||||
...updateMediaPayload.mediaUpdate, | ...updateMediaPayload.mediaUpdate, | ||||
thumbnailID, | thumbnailID, | ||||
thumbnailURI, | thumbnailURI, | ||||
thumbnailThumbHash, | |||||
}, | }, | ||||
}; | }; | ||||
} | } | ||||
} else { | |||||
updateMediaPayload = { | |||||
...updateMediaPayload, | |||||
mediaUpdate: { | |||||
...updateMediaPayload.mediaUpdate, | |||||
thumbHash: processedMedia.thumbHash, | |||||
}, | |||||
}; | |||||
} | } | ||||
// When we dispatch this action, it updates Redux and triggers the | // When we dispatch this action, it updates Redux and triggers the | ||||
// componentDidUpdate in this class. componentDidUpdate will handle | // componentDidUpdate in this class. componentDidUpdate will handle | ||||
// calling dispatchMultimediaMessageAction once all the uploads are | // calling dispatchMultimediaMessageAction once all the uploads are | ||||
// complete, and does not wait until this function concludes. | // complete, and does not wait until this function concludes. | ||||
this.props.dispatch({ | this.props.dispatch({ | ||||
type: updateMultimediaMessageMediaActionType, | type: updateMultimediaMessageMediaActionType, | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | this.setState(prevState => { | ||||
[localMessageID]: newPendingUploads, | [localMessageID]: newPendingUploads, | ||||
}, | }, | ||||
}; | }; | ||||
}); | }); | ||||
} | } | ||||
async blobServiceUpload( | async blobServiceUpload( | ||||
input: { | input: { | ||||
uri: string, | +uri: string, | ||||
filename: string, | +filename: string, | ||||
mimeType: string, | +mimeType: string, | ||||
blobHash: string, | +blobHash: string, | ||||
encryptionKey: string, | +encryptionKey: string, | ||||
dimensions: Dimensions, | +dimensions: Dimensions, | ||||
loop?: boolean, | +loop?: boolean, | ||||
+thumbHash: ?string, | |||||
}, | }, | ||||
options?: ?CallServerEndpointOptions, | options?: ?CallServerEndpointOptions, | ||||
): Promise<void> { | ): Promise<void> { | ||||
const newHolder = uuid.v4(); | const newHolder = uuid.v4(); | ||||
const blobHash = toBase64URL(input.blobHash); | const blobHash = toBase64URL(input.blobHash); | ||||
// 1. Assign new holder for blob with given blobHash | // 1. Assign new holder for blob with given blobHash | ||||
let blobAlreadyExists: boolean; | let blobAlreadyExists: boolean; | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | if (!blobAlreadyExists) { | ||||
Upload.addListener('progress', uploadID, data => | Upload.addListener('progress', uploadID, data => | ||||
onProgress(data.progress / 100), | onProgress(data.progress / 100), | ||||
); | ); | ||||
} | } | ||||
}); | }); | ||||
} | } | ||||
// 3. Send upload metadata to the keyserver, return response | // 3. Send upload metadata to the keyserver, return response | ||||
const { filename, mimeType, loop, dimensions, encryptionKey } = input; | const { filename, mimeType, loop, dimensions, encryptionKey, thumbHash } = | ||||
input; | |||||
return await this.props.uploadMediaMetadata({ | return await this.props.uploadMediaMetadata({ | ||||
...dimensions, | ...dimensions, | ||||
filename, | filename, | ||||
mimeType, | mimeType, | ||||
blobHolder: newHolder, | blobHolder: newHolder, | ||||
encryptionKey, | encryptionKey, | ||||
loop: loop ?? false, | loop: loop ?? false, | ||||
...(thumbHash ? { thumbHash } : null), | |||||
}); | }); | ||||
} | } | ||||
uploadBlob = async ( | uploadBlob = async ( | ||||
url: string, | url: string, | ||||
cookie: ?string, | cookie: ?string, | ||||
sessionID: ?string, | sessionID: ?string, | ||||
input: { [key: string]: mixed }, | input: { [key: string]: mixed }, | ||||
▲ Show 20 Lines • Show All 580 Lines • Show Last 20 Lines |