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