settings.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { SETTING_CHANGE, SETTING_SAVE } from '../actions/settings';
  2. import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications';
  3. import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
  4. import { STORE_HYDRATE } from '../actions/store';
  5. import { EMOJI_USE } from '../actions/emojis';
  6. import { LANGUAGE_USE } from '../actions/languages';
  7. import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists';
  8. import { Map as ImmutableMap, fromJS } from 'immutable';
  9. import uuid from '../uuid';
  10. const initialState = ImmutableMap({
  11. saved: true,
  12. skinTone: 1,
  13. trends: ImmutableMap({
  14. show: true,
  15. }),
  16. home: ImmutableMap({
  17. shows: ImmutableMap({
  18. reblog: true,
  19. reply: true,
  20. }),
  21. regex: ImmutableMap({
  22. body: '',
  23. }),
  24. }),
  25. notifications: ImmutableMap({
  26. alerts: ImmutableMap({
  27. follow: false,
  28. follow_request: false,
  29. favourite: false,
  30. reblog: false,
  31. mention: false,
  32. poll: false,
  33. status: false,
  34. update: false,
  35. 'admin.sign_up': false,
  36. 'admin.report': false,
  37. }),
  38. quickFilter: ImmutableMap({
  39. active: 'all',
  40. show: true,
  41. advanced: false,
  42. }),
  43. dismissPermissionBanner: false,
  44. showUnread: true,
  45. shows: ImmutableMap({
  46. follow: true,
  47. follow_request: false,
  48. favourite: true,
  49. reblog: true,
  50. mention: true,
  51. poll: true,
  52. status: true,
  53. update: true,
  54. 'admin.sign_up': true,
  55. 'admin.report': true,
  56. }),
  57. sounds: ImmutableMap({
  58. follow: true,
  59. follow_request: false,
  60. favourite: true,
  61. reblog: true,
  62. mention: true,
  63. poll: true,
  64. status: true,
  65. update: true,
  66. 'admin.sign_up': true,
  67. 'admin.report': true,
  68. }),
  69. }),
  70. community: ImmutableMap({
  71. regex: ImmutableMap({
  72. body: '',
  73. }),
  74. }),
  75. public: ImmutableMap({
  76. regex: ImmutableMap({
  77. body: '',
  78. }),
  79. }),
  80. direct: ImmutableMap({
  81. regex: ImmutableMap({
  82. body: '',
  83. }),
  84. }),
  85. });
  86. const defaultColumns = fromJS([
  87. { id: 'COMPOSE', uuid: uuid(), params: {} },
  88. { id: 'HOME', uuid: uuid(), params: {} },
  89. { id: 'NOTIFICATIONS', uuid: uuid(), params: {} },
  90. ]);
  91. const hydrate = (state, settings) => state.mergeDeep(settings).update('columns', (val = defaultColumns) => val);
  92. const moveColumn = (state, uuid, direction) => {
  93. const columns = state.get('columns');
  94. const index = columns.findIndex(item => item.get('uuid') === uuid);
  95. const newIndex = index + direction;
  96. let newColumns;
  97. newColumns = columns.splice(index, 1);
  98. newColumns = newColumns.splice(newIndex, 0, columns.get(index));
  99. return state
  100. .set('columns', newColumns)
  101. .set('saved', false);
  102. };
  103. const changeColumnParams = (state, uuid, path, value) => {
  104. const columns = state.get('columns');
  105. const index = columns.findIndex(item => item.get('uuid') === uuid);
  106. const newColumns = columns.update(index, column => column.updateIn(['params', ...path], () => value));
  107. return state
  108. .set('columns', newColumns)
  109. .set('saved', false);
  110. };
  111. const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false);
  112. const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false);
  113. const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId));
  114. export default function settings(state = initialState, action) {
  115. switch(action.type) {
  116. case STORE_HYDRATE:
  117. return hydrate(state, action.state.get('settings'));
  118. case NOTIFICATIONS_FILTER_SET:
  119. case SETTING_CHANGE:
  120. return state
  121. .setIn(action.path, action.value)
  122. .set('saved', false);
  123. case COLUMN_ADD:
  124. return state
  125. .update('columns', list => list.push(fromJS({ id: action.id, uuid: uuid(), params: action.params })))
  126. .set('saved', false);
  127. case COLUMN_REMOVE:
  128. return state
  129. .update('columns', list => list.filterNot(item => item.get('uuid') === action.uuid))
  130. .set('saved', false);
  131. case COLUMN_MOVE:
  132. return moveColumn(state, action.uuid, action.direction);
  133. case COLUMN_PARAMS_CHANGE:
  134. return changeColumnParams(state, action.uuid, action.path, action.value);
  135. case EMOJI_USE:
  136. return updateFrequentEmojis(state, action.emoji);
  137. case LANGUAGE_USE:
  138. return updateFrequentLanguages(state, action.language);
  139. case SETTING_SAVE:
  140. return state.set('saved', true);
  141. case LIST_FETCH_FAIL:
  142. return action.error.response.status === 404 ? filterDeadListColumns(state, action.id) : state;
  143. case LIST_DELETE_SUCCESS:
  144. return filterDeadListColumns(state, action.id);
  145. default:
  146. return state;
  147. }
  148. };