modal.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { MODAL_OPEN, MODAL_CLOSE } from '../actions/modal';
  2. import { TIMELINE_DELETE } from '../actions/timelines';
  3. import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from '../actions/compose';
  4. import { Stack as ImmutableStack, Map as ImmutableMap } from 'immutable';
  5. const initialState = ImmutableMap({
  6. ignoreFocus: false,
  7. stack: ImmutableStack(),
  8. });
  9. const popModal = (state, { modalType, ignoreFocus }) => {
  10. if (modalType === undefined || modalType === state.getIn(['stack', 0, 'modalType'])) {
  11. return state.set('ignoreFocus', !!ignoreFocus).update('stack', stack => stack.shift());
  12. } else {
  13. return state;
  14. }
  15. };
  16. const pushModal = (state, modalType, modalProps) => {
  17. return state.withMutations(map => {
  18. map.set('ignoreFocus', false);
  19. map.update('stack', stack => stack.unshift(ImmutableMap({ modalType, modalProps })));
  20. });
  21. };
  22. export default function modal(state = initialState, action) {
  23. switch(action.type) {
  24. case MODAL_OPEN:
  25. return pushModal(state, action.modalType, action.modalProps);
  26. case MODAL_CLOSE:
  27. return popModal(state, action);
  28. case COMPOSE_UPLOAD_CHANGE_SUCCESS:
  29. return popModal(state, { modalType: 'FOCAL_POINT', ignoreFocus: false });
  30. case TIMELINE_DELETE:
  31. return state.update('stack', stack => stack.filterNot((modal) => modal.get('modalProps').statusId === action.id));
  32. default:
  33. return state;
  34. }
  35. };