From dbae8062f4ff6dcad98c90f6654b27111806013a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 31 Aug 2016 22:58:10 +0200 Subject: Replies in the compose form --- .../javascripts/components/actions/compose.jsx | 17 ++++++++- .../javascripts/components/components/avatar.jsx | 7 ++-- .../javascripts/components/components/button.jsx | 8 ++--- .../components/components/composer_drawer.jsx | 24 +++++++++---- .../components/components/display_name.jsx | 26 -------------- .../components/components/icon_button.jsx | 35 +++++++++++++++++++ .../components/components/relative_timestamp.jsx | 2 +- .../components/components/reply_indicator.jsx | 40 ++++++++++++++++++++++ .../javascripts/components/components/status.jsx | 37 ++++++++++++++------ .../components/components/status_list.jsx | 2 +- .../containers/composer_drawer_container.jsx | 13 ++++--- .../containers/status_list_container.jsx | 15 ++++++-- .../javascripts/components/reducers/compose.jsx | 30 ++++++++++------ 13 files changed, 184 insertions(+), 72 deletions(-) delete mode 100644 app/assets/javascripts/components/components/display_name.jsx create mode 100644 app/assets/javascripts/components/components/icon_button.jsx create mode 100644 app/assets/javascripts/components/components/reply_indicator.jsx (limited to 'app/assets/javascripts/components') diff --git a/app/assets/javascripts/components/actions/compose.jsx b/app/assets/javascripts/components/actions/compose.jsx index 614ed1a89..cf5345078 100644 --- a/app/assets/javascripts/components/actions/compose.jsx +++ b/app/assets/javascripts/components/actions/compose.jsx @@ -5,6 +5,8 @@ export const COMPOSE_SUBMIT = 'COMPOSE_SUBMIT'; export const COMPOSE_SUBMIT_REQUEST = 'COMPOSE_SUBMIT_REQUEST'; export const COMPOSE_SUBMIT_SUCCESS = 'COMPOSE_SUBMIT_SUCCESS'; export const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL'; +export const COMPOSE_REPLY = 'COMPOSE_REPLY'; +export const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL'; export function changeCompose(text) { return { @@ -13,13 +15,26 @@ export function changeCompose(text) { }; } +export function replyCompose(payload) { + return { + type: COMPOSE_REPLY, + payload: payload + }; +} + +export function cancelReplyCompose() { + return { + type: COMPOSE_REPLY_CANCEL + }; +} + export function submitCompose() { return function (dispatch, getState) { dispatch(submitComposeRequest()); api(getState).post('/api/statuses', { status: getState().getIn(['compose', 'text'], ''), - in_reply_to_id: getState().getIn(['compose', 'in_reply_to_id'], null) + in_reply_to_id: getState().getIn(['compose', 'in_reply_to', 'id'], null) }).then(function (response) { dispatch(submitComposeSuccess(response.data)); }).catch(function (error) { diff --git a/app/assets/javascripts/components/components/avatar.jsx b/app/assets/javascripts/components/components/avatar.jsx index abbef72f8..6177683ba 100644 --- a/app/assets/javascripts/components/components/avatar.jsx +++ b/app/assets/javascripts/components/components/avatar.jsx @@ -3,15 +3,16 @@ import PureRenderMixin from 'react-addons-pure-render-mixin'; const Avatar = React.createClass({ propTypes: { - src: React.PropTypes.string.isRequired + src: React.PropTypes.string.isRequired, + size: React.PropTypes.number.isRequired }, mixins: [PureRenderMixin], render () { return ( -
- +
+
); } diff --git a/app/assets/javascripts/components/components/button.jsx b/app/assets/javascripts/components/components/button.jsx index e70382142..9e276cbe8 100644 --- a/app/assets/javascripts/components/components/button.jsx +++ b/app/assets/javascripts/components/components/button.jsx @@ -5,14 +5,12 @@ const Button = React.createClass({ propTypes: { text: React.PropTypes.string.isRequired, onClick: React.PropTypes.func, - disabled: React.PropTypes.boolean + disabled: React.PropTypes.bool }, mixins: [PureRenderMixin], handleClick (e) { - e.preventDefault(); - if (!this.props.disabled) { this.props.onClick(); } @@ -20,9 +18,9 @@ const Button = React.createClass({ render () { return ( - + ); } diff --git a/app/assets/javascripts/components/components/composer_drawer.jsx b/app/assets/javascripts/components/components/composer_drawer.jsx index 8cc4afc99..25696f200 100644 --- a/app/assets/javascripts/components/components/composer_drawer.jsx +++ b/app/assets/javascripts/components/components/composer_drawer.jsx @@ -1,14 +1,18 @@ -import CharacterCounter from './character_counter'; -import Button from './button'; -import PureRenderMixin from 'react-addons-pure-render-mixin'; +import CharacterCounter from './character_counter'; +import Button from './button'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import ReplyIndicator from './reply_indicator'; const ComposerDrawer = React.createClass({ propTypes: { text: React.PropTypes.string.isRequired, - isSubmitting: React.PropTypes.boolean, + is_submitting: React.PropTypes.bool, + in_reply_to: ImmutablePropTypes.map, onChange: React.PropTypes.func.isRequired, - onSubmit: React.PropTypes.func.isRequired + onSubmit: React.PropTypes.func.isRequired, + onCancelReply: React.PropTypes.func.isRequired }, mixins: [PureRenderMixin], @@ -28,9 +32,17 @@ const ComposerDrawer = React.createClass({ }, render () { + let replyArea = ''; + + if (this.props.in_reply_to) { + replyArea = ; + } + return (
-