e230b176fb
Inspired by 0e513ff862
108 lines
2.4 KiB
JavaScript
108 lines
2.4 KiB
JavaScript
// Package imports.
|
|
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { defineMessages, FormattedMessage } from 'react-intl';
|
|
|
|
// Utils.
|
|
import {
|
|
assignHandlers,
|
|
hiddenComponent,
|
|
} from 'flavours/glitch/util/react_helpers';
|
|
|
|
// Messages.
|
|
const messages = defineMessages({
|
|
placeholder: {
|
|
defaultMessage: 'Write your warning here',
|
|
id: 'compose_form.spoiler_placeholder',
|
|
},
|
|
});
|
|
|
|
// Handlers.
|
|
const handlers = {
|
|
|
|
// Handles a keypress.
|
|
handleKeyDown ({
|
|
ctrlKey,
|
|
keyCode,
|
|
metaKey,
|
|
altKey,
|
|
}) {
|
|
const { onSubmit, onSecondarySubmit } = this.props;
|
|
|
|
// We submit the status on control/meta + enter.
|
|
if (onSubmit && keyCode === 13 && (ctrlKey || metaKey)) {
|
|
onSubmit();
|
|
}
|
|
|
|
// Submit the status with secondary visibility on alt + enter.
|
|
if (onSecondarySubmit && keyCode === 13 && altKey) {
|
|
onSecondarySubmit();
|
|
}
|
|
},
|
|
|
|
handleRefSpoilerText (spoilerText) {
|
|
this.spoilerText = spoilerText;
|
|
},
|
|
|
|
// When the escape key is released, we focus the UI.
|
|
handleKeyUp ({ key }) {
|
|
if (key === 'Escape') {
|
|
document.querySelector('.ui').parentElement.focus();
|
|
}
|
|
},
|
|
};
|
|
|
|
// The component.
|
|
export default class ComposerSpoiler extends React.PureComponent {
|
|
|
|
// Constructor.
|
|
constructor (props) {
|
|
super(props);
|
|
assignHandlers(this, handlers);
|
|
}
|
|
|
|
// Rendering.
|
|
render () {
|
|
const { handleKeyDown, handleKeyUp, handleRefSpoilerText } = this.handlers;
|
|
const {
|
|
hidden,
|
|
intl,
|
|
onChange,
|
|
text,
|
|
} = this.props;
|
|
|
|
// The result.
|
|
return (
|
|
<div className={`composer--spoiler ${hidden ? '' : 'composer--spoiler--visible'}`}>
|
|
<label>
|
|
<span {...hiddenComponent}>
|
|
<FormattedMessage {...messages.placeholder} />
|
|
</span>
|
|
<input
|
|
id='glitch.composer.spoiler.input'
|
|
onChange={onChange}
|
|
onKeyDown={handleKeyDown}
|
|
onKeyUp={handleKeyUp}
|
|
placeholder={intl.formatMessage(messages.placeholder)}
|
|
type='text'
|
|
value={text}
|
|
ref={handleRefSpoilerText}
|
|
disabled={hidden}
|
|
/>
|
|
</label>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
// Props.
|
|
ComposerSpoiler.propTypes = {
|
|
hidden: PropTypes.bool,
|
|
intl: PropTypes.object.isRequired,
|
|
onChange: PropTypes.func,
|
|
onSubmit: PropTypes.func,
|
|
onSecondarySubmit: PropTypes.func,
|
|
text: PropTypes.string,
|
|
};
|