From db9bf61075f1226d61256762ad0d85a7fd53922e Mon Sep 17 00:00:00 2001 From: Rakib Hasan Date: Sun, 19 Feb 2017 07:32:35 +0000 Subject: [PATCH 1/5] Fixing issue #626 The status is not showing anymore after clicking on it --- app/assets/javascripts/components/actions/statuses.jsx | 4 +++- app/assets/javascripts/components/features/status/index.jsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/components/actions/statuses.jsx b/app/assets/javascripts/components/actions/statuses.jsx index ee662fe791..d83edd1454 100644 --- a/app/assets/javascripts/components/actions/statuses.jsx +++ b/app/assets/javascripts/components/actions/statuses.jsx @@ -28,7 +28,6 @@ export function fetchStatus(id) { const skipLoading = getState().getIn(['statuses', id], null) !== null; dispatch(fetchContext(id)); - dispatch(fetchStatusCard(id)); if (skipLoading) { return; @@ -102,7 +101,10 @@ export function fetchContext(id) { api(getState).get(`/api/v1/statuses/${id}/context`).then(response => { dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants)); + dispatch(fetchStatusCard(id)); }).catch(error => { + dispatch(deleteStatusSuccess(id)); + dispatch(deleteFromTimelines(id)); dispatch(fetchContextFail(id, error)); }); }; diff --git a/app/assets/javascripts/components/features/status/index.jsx b/app/assets/javascripts/components/features/status/index.jsx index e17c078d27..7c9fcef3dd 100644 --- a/app/assets/javascripts/components/features/status/index.jsx +++ b/app/assets/javascripts/components/features/status/index.jsx @@ -117,7 +117,7 @@ const Status = React.createClass({ if (status === null) { return ( - + ); } From 0caff2da64c6113859799e2358b77d7bb9cc76f9 Mon Sep 17 00:00:00 2001 From: Rakib Hasan Date: Sun, 19 Feb 2017 07:42:03 +0000 Subject: [PATCH 2/5] adding new react class StatusNotFound --- .../components/components/status_not_found.jsx | 16 ++++++++++++++++ .../components/features/status/index.jsx | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/components/components/status_not_found.jsx diff --git a/app/assets/javascripts/components/components/status_not_found.jsx b/app/assets/javascripts/components/components/status_not_found.jsx new file mode 100644 index 0000000000..917c1c06f6 --- /dev/null +++ b/app/assets/javascripts/components/components/status_not_found.jsx @@ -0,0 +1,16 @@ +import { FormattedMessage } from 'react-intl'; + +const style = { + textAlign: 'center', + fontSize: '16px', + fontWeight: '500', + paddingTop: '120px' +}; + +const StatusNotFound = () => ( +
+ +
+); + +export default StatusNotFound; diff --git a/app/assets/javascripts/components/features/status/index.jsx b/app/assets/javascripts/components/features/status/index.jsx index 7c9fcef3dd..68509d5933 100644 --- a/app/assets/javascripts/components/features/status/index.jsx +++ b/app/assets/javascripts/components/features/status/index.jsx @@ -4,7 +4,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { fetchStatus } from '../../actions/statuses'; import Immutable from 'immutable'; import EmbeddedStatus from '../../components/status'; -import LoadingIndicator from '../../components/loading_indicator'; +import StatusNotFound from '../../components/status_not_found'; import DetailedStatus from './components/detailed_status'; import ActionBar from './components/action_bar'; import Column from '../ui/components/column'; @@ -118,6 +118,7 @@ const Status = React.createClass({ return ( + ); } From 4909069b7b4140fb064bee37fcf7cb053fef865b Mon Sep 17 00:00:00 2001 From: Rakib Hasan Date: Sun, 19 Feb 2017 08:13:57 +0000 Subject: [PATCH 3/5] Removing dispatch of fetchContextFail No need to flash error message when status is not found. The column will display the message "status not found" --- app/assets/javascripts/components/actions/statuses.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/components/actions/statuses.jsx b/app/assets/javascripts/components/actions/statuses.jsx index d83edd1454..66b25f6f01 100644 --- a/app/assets/javascripts/components/actions/statuses.jsx +++ b/app/assets/javascripts/components/actions/statuses.jsx @@ -105,7 +105,6 @@ export function fetchContext(id) { }).catch(error => { dispatch(deleteStatusSuccess(id)); dispatch(deleteFromTimelines(id)); - dispatch(fetchContextFail(id, error)); }); }; }; From 620cba2e2a4f2fb7442998bff5f7f0bbd248e4d8 Mon Sep 17 00:00:00 2001 From: Rakib Hasan Date: Sun, 19 Feb 2017 10:54:27 +0000 Subject: [PATCH 4/5] added if else clause in fetchContext So that if we get an error, then we will only delete status if it is an 404 error --- app/assets/javascripts/components/actions/statuses.jsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/components/actions/statuses.jsx b/app/assets/javascripts/components/actions/statuses.jsx index 66b25f6f01..6f43539e07 100644 --- a/app/assets/javascripts/components/actions/statuses.jsx +++ b/app/assets/javascripts/components/actions/statuses.jsx @@ -103,8 +103,12 @@ export function fetchContext(id) { dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants)); dispatch(fetchStatusCard(id)); }).catch(error => { - dispatch(deleteStatusSuccess(id)); - dispatch(deleteFromTimelines(id)); + if (error.response.status == 404){ + dispatch(deleteStatusSuccess(id)); + dispatch(deleteFromTimelines(id)); + }else{ + dispatch(fetchContextFail(id, error)); + } }); }; }; From 7d51f71aba2b9dc3de9d3c962b68821d4a8cb807 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 26 Feb 2017 23:06:27 +0100 Subject: [PATCH 5/5] Add when status or account are not found, skip alerts for those errors --- .../javascripts/components/actions/accounts.jsx | 6 ++++-- .../javascripts/components/actions/cards.jsx | 3 ++- .../javascripts/components/actions/statuses.jsx | 16 +++++++++------- .../components/components/status_not_found.jsx | 16 ---------------- .../account_timeline/components/header.jsx | 7 ++++--- .../components/features/status/index.jsx | 4 ++-- .../javascripts/components/middleware/errors.jsx | 2 +- .../javascripts/components/reducers/statuses.jsx | 9 +++++---- 8 files changed, 27 insertions(+), 36 deletions(-) delete mode 100644 app/assets/javascripts/components/components/status_not_found.jsx diff --git a/app/assets/javascripts/components/actions/accounts.jsx b/app/assets/javascripts/components/actions/accounts.jsx index 0be05034e9..47c0d9f851 100644 --- a/app/assets/javascripts/components/actions/accounts.jsx +++ b/app/assets/javascripts/components/actions/accounts.jsx @@ -138,7 +138,8 @@ export function fetchAccountFail(id, error) { return { type: ACCOUNT_FETCH_FAIL, id, - error + error, + skipAlert: true }; }; @@ -231,7 +232,8 @@ export function fetchAccountTimelineFail(id, error, skipLoading) { type: ACCOUNT_TIMELINE_FETCH_FAIL, id, error, - skipLoading + skipLoading, + skipAlert: error.response.status === 404 }; }; diff --git a/app/assets/javascripts/components/actions/cards.jsx b/app/assets/javascripts/components/actions/cards.jsx index cc7baf376d..d4c1eda601 100644 --- a/app/assets/javascripts/components/actions/cards.jsx +++ b/app/assets/javascripts/components/actions/cards.jsx @@ -46,6 +46,7 @@ export function fetchStatusCardFail(id, error) { type: STATUS_CARD_FETCH_FAIL, id, error, - skipLoading: true + skipLoading: true, + skipAlert: true }; }; diff --git a/app/assets/javascripts/components/actions/statuses.jsx b/app/assets/javascripts/components/actions/statuses.jsx index 6f43539e07..19df2c36cc 100644 --- a/app/assets/javascripts/components/actions/statuses.jsx +++ b/app/assets/javascripts/components/actions/statuses.jsx @@ -28,6 +28,7 @@ export function fetchStatus(id) { const skipLoading = getState().getIn(['statuses', id], null) !== null; dispatch(fetchContext(id)); + dispatch(fetchStatusCard(id)); if (skipLoading) { return; @@ -56,7 +57,8 @@ export function fetchStatusFail(id, error, skipLoading) { type: STATUS_FETCH_FAIL, id, error, - skipLoading + skipLoading, + skipAlert: true }; }; @@ -101,14 +103,13 @@ export function fetchContext(id) { api(getState).get(`/api/v1/statuses/${id}/context`).then(response => { dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants)); - dispatch(fetchStatusCard(id)); + }).catch(error => { - if (error.response.status == 404){ - dispatch(deleteStatusSuccess(id)); + if (error.response.status === 404) { dispatch(deleteFromTimelines(id)); - }else{ - dispatch(fetchContextFail(id, error)); } + + dispatch(fetchContextFail(id, error)); }); }; }; @@ -134,6 +135,7 @@ export function fetchContextFail(id, error) { return { type: CONTEXT_FETCH_FAIL, id, - error + error, + skipAlert: true }; }; diff --git a/app/assets/javascripts/components/components/status_not_found.jsx b/app/assets/javascripts/components/components/status_not_found.jsx deleted file mode 100644 index 917c1c06f6..0000000000 --- a/app/assets/javascripts/components/components/status_not_found.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { FormattedMessage } from 'react-intl'; - -const style = { - textAlign: 'center', - fontSize: '16px', - fontWeight: '500', - paddingTop: '120px' -}; - -const StatusNotFound = () => ( -
- -
-); - -export default StatusNotFound; diff --git a/app/assets/javascripts/components/features/account_timeline/components/header.jsx b/app/assets/javascripts/components/features/account_timeline/components/header.jsx index 0cdfc8b02d..2dd3ca7b15 100644 --- a/app/assets/javascripts/components/features/account_timeline/components/header.jsx +++ b/app/assets/javascripts/components/features/account_timeline/components/header.jsx @@ -2,6 +2,7 @@ import PureRenderMixin from 'react-addons-pure-render-mixin'; import ImmutablePropTypes from 'react-immutable-proptypes'; import InnerHeader from '../../account/components/header'; import ActionBar from '../../account/components/action_bar'; +import MissingIndicator from '../../../components/missing_indicator'; const Header = React.createClass({ contextTypes: { @@ -9,7 +10,7 @@ const Header = React.createClass({ }, propTypes: { - account: ImmutablePropTypes.map.isRequired, + account: ImmutablePropTypes.map, me: React.PropTypes.number.isRequired, onFollow: React.PropTypes.func.isRequired, onBlock: React.PropTypes.func.isRequired, @@ -39,8 +40,8 @@ const Header = React.createClass({ render () { const { account, me } = this.props; - if (!account) { - return null; + if (account === null) { + return ; } return ( diff --git a/app/assets/javascripts/components/features/status/index.jsx b/app/assets/javascripts/components/features/status/index.jsx index 68509d5933..6a7635cc66 100644 --- a/app/assets/javascripts/components/features/status/index.jsx +++ b/app/assets/javascripts/components/features/status/index.jsx @@ -4,7 +4,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { fetchStatus } from '../../actions/statuses'; import Immutable from 'immutable'; import EmbeddedStatus from '../../components/status'; -import StatusNotFound from '../../components/status_not_found'; +import MissingIndicator from '../../components/missing_indicator'; import DetailedStatus from './components/detailed_status'; import ActionBar from './components/action_bar'; import Column from '../ui/components/column'; @@ -118,7 +118,7 @@ const Status = React.createClass({ return ( - + ); } diff --git a/app/assets/javascripts/components/middleware/errors.jsx b/app/assets/javascripts/components/middleware/errors.jsx index 74d77f0f9a..4aca75f1e3 100644 --- a/app/assets/javascripts/components/middleware/errors.jsx +++ b/app/assets/javascripts/components/middleware/errors.jsx @@ -5,7 +5,7 @@ const defaultFailSuffix = 'FAIL'; export default function errorsMiddleware() { return ({ dispatch }) => next => action => { - if (action.type) { + if (action.type && !action.skipAlert) { const isFail = new RegExp(`${defaultFailSuffix}$`, 'g'); const isSuccess = new RegExp(`${defaultSuccessSuffix}$`, 'g'); diff --git a/app/assets/javascripts/components/reducers/statuses.jsx b/app/assets/javascripts/components/reducers/statuses.jsx index 6323e0fbed..ce791eab60 100644 --- a/app/assets/javascripts/components/reducers/statuses.jsx +++ b/app/assets/javascripts/components/reducers/statuses.jsx @@ -39,14 +39,15 @@ const normalizeStatus = (state, status) => { return state; } - status.account = status.account.id; + const normalStatus = { ...status }; + normalStatus.account = status.account.id; if (status.reblog && status.reblog.id) { - state = normalizeStatus(state, status.reblog); - status.reblog = status.reblog.id; + state = normalizeStatus(state, status.reblog); + normalStatus.reblog = status.reblog.id; } - return state.update(status.id, Immutable.Map(), map => map.mergeDeep(Immutable.fromJS(status))); + return state.update(status.id, Immutable.Map(), map => map.mergeDeep(Immutable.fromJS(normalStatus))); }; const normalizeStatuses = (state, statuses) => {