forked from cybrespace/mastodon
Add <MissingIndicator /> when status or account are not found, skip alerts
for those errors
This commit is contained in:
parent
4bb8ff7c8e
commit
4fbdf100c4
|
@ -138,7 +138,8 @@ export function fetchAccountFail(id, error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_FETCH_FAIL,
|
type: ACCOUNT_FETCH_FAIL,
|
||||||
id,
|
id,
|
||||||
error
|
error,
|
||||||
|
skipAlert: true
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -231,7 +232,8 @@ export function fetchAccountTimelineFail(id, error, skipLoading) {
|
||||||
type: ACCOUNT_TIMELINE_FETCH_FAIL,
|
type: ACCOUNT_TIMELINE_FETCH_FAIL,
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
skipLoading
|
skipLoading,
|
||||||
|
skipAlert: error.response.status === 404
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ export function fetchStatusCardFail(id, error) {
|
||||||
type: STATUS_CARD_FETCH_FAIL,
|
type: STATUS_CARD_FETCH_FAIL,
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
skipLoading: true
|
skipLoading: true,
|
||||||
|
skipAlert: true
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -28,6 +28,7 @@ export function fetchStatus(id) {
|
||||||
const skipLoading = getState().getIn(['statuses', id], null) !== null;
|
const skipLoading = getState().getIn(['statuses', id], null) !== null;
|
||||||
|
|
||||||
dispatch(fetchContext(id));
|
dispatch(fetchContext(id));
|
||||||
|
dispatch(fetchStatusCard(id));
|
||||||
|
|
||||||
if (skipLoading) {
|
if (skipLoading) {
|
||||||
return;
|
return;
|
||||||
|
@ -56,7 +57,8 @@ export function fetchStatusFail(id, error, skipLoading) {
|
||||||
type: STATUS_FETCH_FAIL,
|
type: STATUS_FETCH_FAIL,
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
skipLoading
|
skipLoading,
|
||||||
|
skipAlert: true
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -101,14 +103,13 @@ export function fetchContext(id) {
|
||||||
|
|
||||||
api(getState).get(`/api/v1/statuses/${id}/context`).then(response => {
|
api(getState).get(`/api/v1/statuses/${id}/context`).then(response => {
|
||||||
dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants));
|
dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants));
|
||||||
dispatch(fetchStatusCard(id));
|
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
if (error.response.status == 404){
|
if (error.response.status === 404) {
|
||||||
dispatch(deleteStatusSuccess(id));
|
|
||||||
dispatch(deleteFromTimelines(id));
|
dispatch(deleteFromTimelines(id));
|
||||||
}else{
|
|
||||||
dispatch(fetchContextFail(id, error));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dispatch(fetchContextFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -134,6 +135,7 @@ export function fetchContextFail(id, error) {
|
||||||
return {
|
return {
|
||||||
type: CONTEXT_FETCH_FAIL,
|
type: CONTEXT_FETCH_FAIL,
|
||||||
id,
|
id,
|
||||||
error
|
error,
|
||||||
|
skipAlert: true
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
import { FormattedMessage } from 'react-intl';
|
|
||||||
|
|
||||||
const style = {
|
|
||||||
textAlign: 'center',
|
|
||||||
fontSize: '16px',
|
|
||||||
fontWeight: '500',
|
|
||||||
paddingTop: '120px'
|
|
||||||
};
|
|
||||||
|
|
||||||
const StatusNotFound = () => (
|
|
||||||
<div className='status-not-found-indicator' style={style}>
|
|
||||||
<FormattedMessage id='status_not_found_indicator.label' defaultMessage='Status Not Found' />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
export default StatusNotFound;
|
|
|
@ -2,6 +2,7 @@ import PureRenderMixin from 'react-addons-pure-render-mixin';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import InnerHeader from '../../account/components/header';
|
import InnerHeader from '../../account/components/header';
|
||||||
import ActionBar from '../../account/components/action_bar';
|
import ActionBar from '../../account/components/action_bar';
|
||||||
|
import MissingIndicator from '../../../components/missing_indicator';
|
||||||
|
|
||||||
const Header = React.createClass({
|
const Header = React.createClass({
|
||||||
contextTypes: {
|
contextTypes: {
|
||||||
|
@ -9,7 +10,7 @@ const Header = React.createClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
propTypes: {
|
propTypes: {
|
||||||
account: ImmutablePropTypes.map.isRequired,
|
account: ImmutablePropTypes.map,
|
||||||
me: React.PropTypes.number.isRequired,
|
me: React.PropTypes.number.isRequired,
|
||||||
onFollow: React.PropTypes.func.isRequired,
|
onFollow: React.PropTypes.func.isRequired,
|
||||||
onBlock: React.PropTypes.func.isRequired,
|
onBlock: React.PropTypes.func.isRequired,
|
||||||
|
@ -39,8 +40,8 @@ const Header = React.createClass({
|
||||||
render () {
|
render () {
|
||||||
const { account, me } = this.props;
|
const { account, me } = this.props;
|
||||||
|
|
||||||
if (!account) {
|
if (account === null) {
|
||||||
return null;
|
return <MissingIndicator />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -4,7 +4,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { fetchStatus } from '../../actions/statuses';
|
import { fetchStatus } from '../../actions/statuses';
|
||||||
import Immutable from 'immutable';
|
import Immutable from 'immutable';
|
||||||
import EmbeddedStatus from '../../components/status';
|
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 DetailedStatus from './components/detailed_status';
|
||||||
import ActionBar from './components/action_bar';
|
import ActionBar from './components/action_bar';
|
||||||
import Column from '../ui/components/column';
|
import Column from '../ui/components/column';
|
||||||
|
@ -118,7 +118,7 @@ const Status = React.createClass({
|
||||||
return (
|
return (
|
||||||
<Column>
|
<Column>
|
||||||
<ColumnBackButton />
|
<ColumnBackButton />
|
||||||
<StatusNotFound />
|
<MissingIndicator />
|
||||||
</Column>
|
</Column>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ const defaultFailSuffix = 'FAIL';
|
||||||
|
|
||||||
export default function errorsMiddleware() {
|
export default function errorsMiddleware() {
|
||||||
return ({ dispatch }) => next => action => {
|
return ({ dispatch }) => next => action => {
|
||||||
if (action.type) {
|
if (action.type && !action.skipAlert) {
|
||||||
const isFail = new RegExp(`${defaultFailSuffix}$`, 'g');
|
const isFail = new RegExp(`${defaultFailSuffix}$`, 'g');
|
||||||
const isSuccess = new RegExp(`${defaultSuccessSuffix}$`, 'g');
|
const isSuccess = new RegExp(`${defaultSuccessSuffix}$`, 'g');
|
||||||
|
|
||||||
|
|
|
@ -39,14 +39,15 @@ const normalizeStatus = (state, status) => {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
status.account = status.account.id;
|
const normalStatus = { ...status };
|
||||||
|
normalStatus.account = status.account.id;
|
||||||
|
|
||||||
if (status.reblog && status.reblog.id) {
|
if (status.reblog && status.reblog.id) {
|
||||||
state = normalizeStatus(state, status.reblog);
|
state = normalizeStatus(state, status.reblog);
|
||||||
status.reblog = status.reblog.id;
|
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) => {
|
const normalizeStatuses = (state, statuses) => {
|
||||||
|
|
Loading…
Reference in New Issue