UNPKG

@gechiui/block-editor

Version:
163 lines (137 loc) 3.99 kB
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