@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
173 lines (156 loc) • 4.49 kB
JavaScript
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import { Component } from '@wordpress/element';
import { VisuallyHidden } from '@wordpress/components';
import { withInstanceId, compose } from '@wordpress/compose';
import { withSelect, withDispatch } from '@wordpress/data';
/**
* Internal dependencies
*/
import { visibilityOptions } from './utils';
export class PostVisibility extends Component {
constructor( props ) {
super( ...arguments );
this.setPublic = this.setPublic.bind( this );
this.setPrivate = this.setPrivate.bind( this );
this.setPasswordProtected = this.setPasswordProtected.bind( this );
this.updatePassword = this.updatePassword.bind( this );
this.state = {
hasPassword: !! props.password,
};
}
setPublic() {
const { visibility, onUpdateVisibility, status } = this.props;
onUpdateVisibility( visibility === 'private' ? 'draft' : status );
this.setState( { hasPassword: false } );
}
setPrivate() {
if (
// eslint-disable-next-line no-alert
! window.confirm(
__( 'Would you like to privately publish this post now?' )
)
) {
return;
}
const { onUpdateVisibility, onSave } = this.props;
onUpdateVisibility( 'private' );
this.setState( { hasPassword: false } );
onSave();
}
setPasswordProtected() {
const { visibility, onUpdateVisibility, status, password } = this.props;
onUpdateVisibility(
visibility === 'private' ? 'draft' : status,
password || ''
);
this.setState( { hasPassword: true } );
}
updatePassword( event ) {
const { status, onUpdateVisibility } = this.props;
onUpdateVisibility( status, event.target.value );
}
render() {
const { visibility, password, instanceId } = this.props;
const visibilityHandlers = {
public: {
onSelect: this.setPublic,
checked: visibility === 'public' && ! this.state.hasPassword,
},
private: {
onSelect: this.setPrivate,
checked: visibility === 'private',
},
password: {
onSelect: this.setPasswordProtected,
checked: this.state.hasPassword,
},
};
return [
<fieldset
key="visibility-selector"
className="editor-post-visibility__dialog-fieldset"
>
<legend className="editor-post-visibility__dialog-legend">
{ __( 'Post Visibility' ) }
</legend>
{ visibilityOptions.map( ( { value, label, info } ) => (
<div
key={ value }
className="editor-post-visibility__choice"
>
<input
type="radio"
name={ `editor-post-visibility__setting-${ instanceId }` }
value={ value }
onChange={ visibilityHandlers[ value ].onSelect }
checked={ visibilityHandlers[ value ].checked }
id={ `editor-post-${ value }-${ instanceId }` }
aria-describedby={ `editor-post-${ value }-${ instanceId }-description` }
className="editor-post-visibility__dialog-radio"
/>
<label
htmlFor={ `editor-post-${ value }-${ instanceId }` }
className="editor-post-visibility__dialog-label"
>
{ label }
</label>
{
<p
id={ `editor-post-${ value }-${ instanceId }-description` }
className="editor-post-visibility__dialog-info"
>
{ info }
</p>
}
</div>
) ) }
</fieldset>,
this.state.hasPassword && (
<div
className="editor-post-visibility__dialog-password"
key="password-selector"
>
<VisuallyHidden
as="label"
htmlFor={ `editor-post-visibility__dialog-password-input-${ instanceId }` }
>
{ __( 'Create password' ) }
</VisuallyHidden>
<input
className="editor-post-visibility__dialog-password-input"
id={ `editor-post-visibility__dialog-password-input-${ instanceId }` }
type="text"
onChange={ this.updatePassword }
value={ password }
placeholder={ __( 'Use a secure password' ) }
/>
</div>
),
];
}
}
export default compose( [
withSelect( ( select ) => {
const { getEditedPostAttribute, getEditedPostVisibility } = select(
'core/editor'
);
return {
status: getEditedPostAttribute( 'status' ),
visibility: getEditedPostVisibility(),
password: getEditedPostAttribute( 'password' ),
};
} ),
withDispatch( ( dispatch ) => {
const { savePost, editPost } = dispatch( 'core/editor' );
return {
onSave: savePost,
onUpdateVisibility( status, password = '' ) {
editPost( { status, password } );
},
};
} ),
withInstanceId,
] )( PostVisibility );