landscape: delay uploading briefly to account for browser inconsistencies

fixes #3589

Due to inconsistencies in how browsers handle "change" events, it is necessary to make a brief delay on S3 uploader to prevent double-uploading
This commit is contained in:
Tyler Brown Cifu Shuster 2020-09-28 13:13:43 -07:00
parent 4fad47d151
commit d42755a9e5
2 changed files with 21 additions and 21 deletions

View File

@ -162,12 +162,9 @@ export default class ChatInput extends Component<ChatInputProps, ChatInputState>
}
if (!this.s3Uploader.current || !this.s3Uploader.current.inputRef.current) return;
this.s3Uploader.current.inputRef.current.files = files;
setTimeout(() => {
if (this.s3Uploader.current.state.isUploading) return;
const fire = document.createEvent("HTMLEvents");
fire.initEvent("change", true, true);
this.s3Uploader.current?.inputRef.current?.dispatchEvent(fire);
}, 200);
const fire = document.createEvent("HTMLEvents");
fire.initEvent("change", true, true);
this.s3Uploader.current?.inputRef.current?.dispatchEvent(fire);
}
render() {

View File

@ -99,22 +99,25 @@ export class S3Upload extends Component<S3UploadProps, S3UploadState> {
const timestamp = deSig(dateToDa(new Date()));
let bucket = props.configuration.currentBucket;
this.setState({ isUploading: true });
setTimeout(() => {
if (this.state.isUploading) return;
this.setState({ isUploading: true });
this.s3.upload(bucket, `${window.ship}/${timestamp}-${fileName}.${fileExtension}`, file)
.then((data) => {
if (!data || !('Location' in data)) {
return;
}
this.props.uploadSuccess(data.Location);
})
.catch((err) => {
console.error(err);
this.props.uploadError(err);
})
.finally(() => {
this.setState({ isUploading: false });
});
}, 200);
this.s3.upload(bucket, `${window.ship}/${timestamp}-${fileName}.${fileExtension}`, file)
.then((data) => {
if (!data || !('Location' in data)) {
return;
}
this.props.uploadSuccess(data.Location);
})
.catch((err) => {
console.error(err);
this.props.uploadError(err);
})
.finally(() => {
this.setState({ isUploading: false });
});
}
onClick() {