/** @jsx h */ import { h, Component } from 'preact'; import { BASE_URL, API_BASE, DEFAULT_MAX_COMMENT_SIZE } from 'common/constants'; import { siteId, url, pageTitle } from 'common/settings'; import api from 'common/api'; import store from 'common/store'; import { extractErrorMessageFromResponse } from 'utils/errorUtils'; import TextareaAutosize from 'components/input/textarea-autosize'; const RSS_THREAD_URL = `${BASE_URL}${API_BASE}/rss/post?site=${siteId}&url=${url}`; const RSS_SITE_URL = `${BASE_URL}${API_BASE}/rss/site?site=${siteId}`; const RSS_REPLIES_URL = `${BASE_URL}${API_BASE}/rss/reply?site=${siteId}&user=`; export default class Input extends Component { constructor(props) { super(props); const config = store.get('config') || {}; this.state = { preview: null, isErrorShown: false, errorMessage: null, isDisabled: false, maxLength: config.max_comment_size || DEFAULT_MAX_COMMENT_SIZE, text: props.value || '', }; this.send = this.send.bind(this); this.getPreview = this.getPreview.bind(this); this.onInput = this.onInput.bind(this); this.onKeyDown = this.onKeyDown.bind(this); } componentDidMount() { store.onUpdate('config', config => { this.setState({ maxLength: (config && config.max_comment_size) || DEFAULT_MAX_COMMENT_SIZE }); }); } shouldComponentUpdate(nextProps, nextState) { return ( nextProps.id !== this.props.id || nextProps.mods !== this.props.mods || nextProps.pid !== this.props.pid || nextProps.value !== this.props.value || nextProps.errorMessage !== this.props.errorMessage || nextState !== this.state ); } onKeyDown(e) { // send on cmd+enter / ctrl+enter if (e.keyCode === 13 && (e.metaKey || e.ctrlKey)) { this.send(); } } onInput(e) { this.setState({ preview: null, isErrorShown: false, errorMessage: null, text: e.target.value, }); } send(e) { const text = this.state.text; const { mods = {}, pid, id } = this.props; if (e) e.preventDefault(); if (!text || !text.trim()) return; if (text === this.props.value) { this.props.onCancel && this.props.onCancel(); this.setState({ preview: null, text: '' }); } this.setState({ isDisabled: true, isErrorShown: false }); const request = mods.mode === 'edit' ? api.updateComment({ text, id }) : api.addComment({ title: pageTitle || document.title, text, ...(pid ? { pid } : {}) }); request .then(comment => { this.props.onSubmit && this.props.onSubmit(comment); this.setState({ preview: null, text: '' }); }) .catch(e => { const errorMessage = extractErrorMessageFromResponse(e.response); this.setState({ isErrorShown: true, errorMessage }); }) .finally(() => this.setState({ isDisabled: false })); } getPreview() { const text = this.state.text; if (!text || !text.trim()) return; this.setState({ isErrorShown: false, errorMessage: null }); api .getPreview({ text }) .then(preview => this.setState({ preview })) .catch(() => { this.setState({ isErrorShown: true, errorMessage: null }); }); } render(props, { isDisabled, isErrorShown, errorMessage, preview, maxLength, text }) { const charactersLeft = maxLength - text.length; const { mods = {}, userId } = props; errorMessage = props.errorMessage || errorMessage; return (
); } }