UNPKG

@wordpress/block-editor

Version:
300 lines (266 loc) 7.48 kB
/** * External dependencies */ import { View } from 'react-native'; /** * WordPress dependencies */ import { Component } from '@wordpress/element'; import { Spinner } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { subscribeMediaUpload, subscribeMediaSave, } from '@wordpress/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 const MEDIA_SAVE_STATE_SAVING = 5; export const MEDIA_SAVE_STATE_SUCCEEDED = 6; export const MEDIA_SAVE_STATE_FAILED = 7; export const MEDIA_SAVE_STATE_RESET = 8; export const MEDIA_SAVE_FINAL_STATE_RESULT = 9; export const MEDIA_SAVE_MEDIAID_CHANGED = 10; export class BlockMediaUpdateProgress extends Component { constructor( props ) { super( props ); this.state = { progress: 0, isSaveInProgress: false, isSaveFailed: false, isUploadInProgress: false, isUploadFailed: false, }; this.mediaUpload = this.mediaUpload.bind( this ); this.mediaSave = this.mediaSave.bind( this ); } componentDidMount() { this.addMediaUploadListener(); this.addMediaSaveListener(); } componentWillUnmount() { this.removeMediaUploadListener(); this.removeMediaSaveListener(); } mediaIdContainedInMediaFiles( mediaId, mediaFiles ) { if ( mediaId !== undefined && mediaFiles !== undefined ) { return mediaFiles.some( ( element ) => element.id === mediaId.toString() ); } return false; } mediaUpload( payload ) { const { mediaFiles } = this.props; if ( this.mediaIdContainedInMediaFiles( payload.mediaId, mediaFiles ) === false ) { return; } switch ( payload.state ) { case MEDIA_UPLOAD_STATE_UPLOADING: this.updateMediaUploadProgress( 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; } } mediaSave( payload ) { const { mediaFiles } = this.props; if ( this.mediaIdContainedInMediaFiles( payload.mediaId, mediaFiles ) === false ) { return; } switch ( payload.state ) { case MEDIA_SAVE_STATE_SAVING: this.updateMediaSaveProgress( payload ); break; case MEDIA_SAVE_STATE_SUCCEEDED: this.finishMediaSaveWithSuccess( payload ); break; case MEDIA_SAVE_STATE_FAILED: this.finishMediaSaveWithFailure( payload ); break; case MEDIA_SAVE_STATE_RESET: this.mediaSaveStateReset( payload ); break; case MEDIA_SAVE_FINAL_STATE_RESULT: this.finalSaveResult( payload ); break; case MEDIA_SAVE_MEDIAID_CHANGED: this.mediaIdChanged( payload ); break; } } // ---- Block media save actions. updateMediaSaveProgress( payload ) { this.setState( { progress: payload.progress, isUploadInProgress: false, isUploadFailed: false, isSaveInProgress: true, isSaveFailed: false, } ); if ( this.props.onUpdateMediaSaveProgress ) { this.props.onUpdateMediaSaveProgress( payload ); } } finishMediaSaveWithSuccess( payload ) { this.setState( { isSaveInProgress: false } ); if ( this.props.onFinishMediaSaveWithSuccess ) { this.props.onFinishMediaSaveWithSuccess( payload ); } } finishMediaSaveWithFailure( payload ) { this.setState( { isSaveInProgress: false, isSaveFailed: true } ); if ( this.props.onFinishMediaSaveWithFailure ) { this.props.onFinishMediaSaveWithFailure( payload ); } } mediaSaveStateReset( payload ) { this.setState( { isSaveInProgress: false, isSaveFailed: false } ); if ( this.props.onMediaSaveStateReset ) { this.props.onMediaSaveStateReset( payload ); } } finalSaveResult( payload ) { this.setState( { progress: payload.progress, isUploadInProgress: false, isUploadFailed: false, isSaveInProgress: false, isSaveFailed: ! payload.success, } ); if ( this.props.onFinalSaveResult ) { this.props.onFinalSaveResult( payload ); } } mediaIdChanged( payload ) { this.setState( { isUploadInProgress: false, isUploadFailed: false, isSaveInProgress: false, isSaveFailed: false, } ); if ( this.props.onMediaIdChanged ) { this.props.onMediaIdChanged( payload ); } } // ---- Block media upload actions. updateMediaUploadProgress( payload ) { this.setState( { progress: payload.progress, isUploadInProgress: true, isUploadFailed: false, isSaveInProgress: false, isSaveFailed: false, } ); if ( this.props.onUpdateMediaUploadProgress ) { this.props.onUpdateMediaUploadProgress( payload ); } } finishMediaUploadWithSuccess( payload ) { this.setState( { isUploadInProgress: false, isSaveInProgress: 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(); } } addMediaSaveListener() { // If we already have a subscription not worth doing it again. if ( this.subscriptionParentMediaSave ) { return; } this.subscriptionParentMediaSave = subscribeMediaSave( ( payload ) => { this.mediaSave( payload ); } ); } removeMediaSaveListener() { if ( this.subscriptionParentMediaSave ) { this.subscriptionParentMediaSave.remove(); } } render() { const { renderContent = () => null } = this.props; const { isUploadInProgress, isUploadFailed, isSaveInProgress, isSaveFailed, } = this.state; const showSpinner = this.state.isUploadInProgress || this.state.isSaveInProgress; const progress = this.state.progress * 100; // eslint-disable-next-line @wordpress/i18n-no-collapsible-whitespace const retryMessageSave = __( 'Failed to save files.\nPlease tap for options.' ); // eslint-disable-next-line @wordpress/i18n-no-collapsible-whitespace const retryMessageUpload = __( 'Failed to upload files.\nPlease tap for options.' ); let retryMessage = retryMessageSave; if ( isUploadFailed ) { retryMessage = retryMessageUpload; } return ( <View style={ styles.mediaUploadProgress } pointerEvents="box-none"> { showSpinner && ( <View style={ styles.progressBar }> <Spinner progress={ progress } testID="spinner" /> </View> ) } { renderContent( { isUploadInProgress, isUploadFailed, isSaveInProgress, isSaveFailed, retryMessage, } ) } </View> ); } } export default BlockMediaUpdateProgress;