@gechiui/block-editor
Version:
163 lines (137 loc) • 3.99 kB
JavaScript
import { createElement } from "@gechiui/element";
/**
* External dependencies
*/
import { View } from 'react-native';
/**
* GeChiUI dependencies
*/
import { Component } from '@gechiui/element';
import { Spinner } from '@gechiui/components';
import { __ } from '@gechiui/i18n';
import { subscribeMediaUpload } from '@gechiui/react-native-bridge';
/**
* Internal dependencies
*/
import styles from './styles.scss';
export const MEDIA_UPLOAD_STATE_UPLOADING = 1;
export const MEDIA_UPLOAD_STATE_SUCCEEDED = 2;
export const MEDIA_UPLOAD_STATE_FAILED = 3;
export const MEDIA_UPLOAD_STATE_RESET = 4;
export class MediaUploadProgress extends Component {
constructor(props) {
super(props);
this.state = {
progress: 0,
isUploadInProgress: false,
isUploadFailed: false
};
this.mediaUpload = this.mediaUpload.bind(this);
}
componentDidMount() {
this.addMediaUploadListener();
}
componentWillUnmount() {
this.removeMediaUploadListener();
}
mediaUpload(payload) {
const {
mediaId
} = this.props;
if (payload.mediaId !== mediaId) {
return;
}
switch (payload.state) {
case MEDIA_UPLOAD_STATE_UPLOADING:
this.updateMediaProgress(payload);
break;
case MEDIA_UPLOAD_STATE_SUCCEEDED:
this.finishMediaUploadWithSuccess(payload);
break;
case MEDIA_UPLOAD_STATE_FAILED:
this.finishMediaUploadWithFailure(payload);
break;
case MEDIA_UPLOAD_STATE_RESET:
this.mediaUploadStateReset(payload);
break;
}
}
updateMediaProgress(payload) {
this.setState({
progress: payload.progress,
isUploadInProgress: true,
isUploadFailed: false
});
if (this.props.onUpdateMediaProgress) {
this.props.onUpdateMediaProgress(payload);
}
}
finishMediaUploadWithSuccess(payload) {
this.setState({
isUploadInProgress: false
});
if (this.props.onFinishMediaUploadWithSuccess) {
this.props.onFinishMediaUploadWithSuccess(payload);
}
}
finishMediaUploadWithFailure(payload) {
this.setState({
isUploadInProgress: false,
isUploadFailed: true
});
if (this.props.onFinishMediaUploadWithFailure) {
this.props.onFinishMediaUploadWithFailure(payload);
}
}
mediaUploadStateReset(payload) {
this.setState({
isUploadInProgress: false,
isUploadFailed: false
});
if (this.props.onMediaUploadStateReset) {
this.props.onMediaUploadStateReset(payload);
}
}
addMediaUploadListener() {
//if we already have a subscription not worth doing it again
if (this.subscriptionParentMediaUpload) {
return;
}
this.subscriptionParentMediaUpload = subscribeMediaUpload(payload => {
this.mediaUpload(payload);
});
}
removeMediaUploadListener() {
if (this.subscriptionParentMediaUpload) {
this.subscriptionParentMediaUpload.remove();
}
}
render() {
const {
renderContent = () => null
} = this.props;
const {
isUploadInProgress,
isUploadFailed
} = this.state;
const showSpinner = this.state.isUploadInProgress;
const progress = this.state.progress * 100; // eslint-disable-next-line @gechiui/i18n-no-collapsible-whitespace
const retryMessage = __('Failed to insert media.\nPlease tap for options.');
const progressBarStyle = [styles.progressBar, showSpinner || styles.progressBarHidden, this.props.progressBarStyle];
return createElement(View, {
style: [styles.mediaUploadProgress, this.props.containerStyle],
pointerEvents: "box-none"
}, createElement(View, {
style: progressBarStyle
}, showSpinner && createElement(Spinner, {
progress: progress,
style: this.props.spinnerStyle
})), renderContent({
isUploadInProgress,
isUploadFailed,
retryMessage
}));
}
}
export default MediaUploadProgress;
//# sourceMappingURL=index.native.js.map