settings.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { Map as ImmutableMap, fromJS } from 'immutable';
  2. import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
  3. import { EMOJI_USE } from '../actions/emojis';
  4. import { LANGUAGE_USE } from '../actions/languages';
  5. import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists';
  6. import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications';
  7. import { SETTING_CHANGE, SETTING_SAVE } from '../actions/settings';
  8. import { STORE_HYDRATE } from '../actions/store';
  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. firehose: ImmutableMap({
  71. onlyMedia: false,
  72. }),
  73. community: ImmutableMap({
  74. regex: ImmutableMap({
  75. body: '',
  76. }),
  77. }),
  78. public: ImmutableMap({
  79. regex: ImmutableMap({
  80. body: '',
  81. }),
  82. }),
  83. direct: ImmutableMap({
  84. regex: ImmutableMap({
  85. body: '',
  86. }),
  87. }),
  88. dismissed_banners: ImmutableMap({
  89. 'public_timeline': false,
  90. 'community_timeline': false,
  91. 'home/follow-suggestions': false,
  92. 'explore/links': false,
  93. 'explore/statuses': false,
  94. 'explore/tags': false,
  95. }),
  96. });
  97. const defaultColumns = fromJS([
  98. { id: 'COMPOSE', uuid: uuid(), params: {} },
  99. { id: 'HOME', uuid: uuid(), params: {} },
  100. { id: 'NOTIFICATIONS', uuid: uuid(), params: {} },
  101. ]);
  102. const hydrate = (state, settings) => state.mergeDeep(settings).update('columns', (val = defaultColumns) => val);
  103. const moveColumn = (state, uuid, direction) => {
  104. const columns = state.get('columns');
  105. const index = columns.findIndex(item => item.get('uuid') === uuid);
  106. const newIndex = index + direction;
  107. let newColumns;
  108. newColumns = columns.splice(index, 1);
  109. newColumns = newColumns.splice(newIndex, 0, columns.get(index));
  110. return state
  111. .set('columns', newColumns)
  112. .set('saved', false);
  113. };
  114. const changeColumnParams = (state, uuid, path, value) => {
  115. const columns = state.get('columns');
  116. const index = columns.findIndex(item => item.get('uuid') === uuid);
  117. const newColumns = columns.update(index, column => column.updateIn(['params', ...path], () => value));
  118. return state
  119. .set('columns', newColumns)
  120. .set('saved', false);
  121. };
  122. const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false);
  123. const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false);
  124. const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId));
  125. export default function settings(state = initialState, action) {
  126. switch(action.type) {
  127. case STORE_HYDRATE:
  128. return hydrate(state, action.state.get('settings'));
  129. case NOTIFICATIONS_FILTER_SET:
  130. case SETTING_CHANGE:
  131. return state
  132. .setIn(action.path, action.value)
  133. .set('saved', false);
  134. case COLUMN_ADD:
  135. return state
  136. .update('columns', list => list.push(fromJS({ id: action.id, uuid: uuid(), params: action.params })))
  137. .set('saved', false);
  138. case COLUMN_REMOVE:
  139. return state
  140. .update('columns', list => list.filterNot(item => item.get('uuid') === action.uuid))
  141. .set('saved', false);
  142. case COLUMN_MOVE:
  143. return moveColumn(state, action.uuid, action.direction);
  144. case COLUMN_PARAMS_CHANGE:
  145. return changeColumnParams(state, action.uuid, action.path, action.value);
  146. case EMOJI_USE:
  147. return updateFrequentEmojis(state, action.emoji);
  148. case LANGUAGE_USE:
  149. return updateFrequentLanguages(state, action.language);
  150. case SETTING_SAVE:
  151. return state.set('saved', true);
  152. case LIST_FETCH_FAIL:
  153. return action.error.response.status === 404 ? filterDeadListColumns(state, action.id) : state;
  154. case LIST_DELETE_SUCCESS:
  155. return filterDeadListColumns(state, action.id);
  156. default:
  157. return state;
  158. }
  159. }