You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

317 lines
8.4 KiB

  1. import api from '../api';
  2. import { importFetchedAccounts } from './importer';
  3. export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST';
  4. export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS';
  5. export const LIST_FETCH_FAIL = 'LIST_FETCH_FAIL';
  6. export const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST';
  7. export const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS';
  8. export const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL';
  9. export const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE';
  10. export const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET';
  11. export const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP';
  12. export const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST';
  13. export const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS';
  14. export const LIST_CREATE_FAIL = 'LIST_CREATE_FAIL';
  15. export const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST';
  16. export const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS';
  17. export const LIST_UPDATE_FAIL = 'LIST_UPDATE_FAIL';
  18. export const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST';
  19. export const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS';
  20. export const LIST_DELETE_FAIL = 'LIST_DELETE_FAIL';
  21. export const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST';
  22. export const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS';
  23. export const LIST_ACCOUNTS_FETCH_FAIL = 'LIST_ACCOUNTS_FETCH_FAIL';
  24. export const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE';
  25. export const LIST_EDITOR_SUGGESTIONS_READY = 'LIST_EDITOR_SUGGESTIONS_READY';
  26. export const LIST_EDITOR_SUGGESTIONS_CLEAR = 'LIST_EDITOR_SUGGESTIONS_CLEAR';
  27. export const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST';
  28. export const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS';
  29. export const LIST_EDITOR_ADD_FAIL = 'LIST_EDITOR_ADD_FAIL';
  30. export const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST';
  31. export const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS';
  32. export const LIST_EDITOR_REMOVE_FAIL = 'LIST_EDITOR_REMOVE_FAIL';
  33. export const fetchList = id => (dispatch, getState) => {
  34. if (getState().getIn(['lists', id])) {
  35. return;
  36. }
  37. dispatch(fetchListRequest(id));
  38. api(getState).get(`/api/v1/lists/${id}`)
  39. .then(({ data }) => dispatch(fetchListSuccess(data)))
  40. .catch(err => dispatch(fetchListFail(id, err)));
  41. };
  42. export const fetchListRequest = id => ({
  43. type: LIST_FETCH_REQUEST,
  44. id,
  45. });
  46. export const fetchListSuccess = list => ({
  47. type: LIST_FETCH_SUCCESS,
  48. list,
  49. });
  50. export const fetchListFail = (id, error) => ({
  51. type: LIST_FETCH_FAIL,
  52. id,
  53. error,
  54. });
  55. export const fetchLists = () => (dispatch, getState) => {
  56. dispatch(fetchListsRequest());
  57. api(getState).get('/api/v1/lists')
  58. .then(({ data }) => dispatch(fetchListsSuccess(data)))
  59. .catch(err => dispatch(fetchListsFail(err)));
  60. };
  61. export const fetchListsRequest = () => ({
  62. type: LISTS_FETCH_REQUEST,
  63. });
  64. export const fetchListsSuccess = lists => ({
  65. type: LISTS_FETCH_SUCCESS,
  66. lists,
  67. });
  68. export const fetchListsFail = error => ({
  69. type: LISTS_FETCH_FAIL,
  70. error,
  71. });
  72. export const submitListEditor = shouldReset => (dispatch, getState) => {
  73. const listId = getState().getIn(['listEditor', 'listId']);
  74. const title = getState().getIn(['listEditor', 'title']);
  75. if (listId === null) {
  76. dispatch(createList(title, shouldReset));
  77. } else {
  78. dispatch(updateList(listId, title, shouldReset));
  79. }
  80. };
  81. export const setupListEditor = listId => (dispatch, getState) => {
  82. dispatch({
  83. type: LIST_EDITOR_SETUP,
  84. list: getState().getIn(['lists', listId]),
  85. });
  86. dispatch(fetchListAccounts(listId));
  87. };
  88. export const changeListEditorTitle = value => ({
  89. type: LIST_EDITOR_TITLE_CHANGE,
  90. value,
  91. });
  92. export const createList = (title, shouldReset) => (dispatch, getState) => {
  93. dispatch(createListRequest());
  94. api(getState).post('/api/v1/lists', { title }).then(({ data }) => {
  95. dispatch(createListSuccess(data));
  96. if (shouldReset) {
  97. dispatch(resetListEditor());
  98. }
  99. }).catch(err => dispatch(createListFail(err)));
  100. };
  101. export const createListRequest = () => ({
  102. type: LIST_CREATE_REQUEST,
  103. });
  104. export const createListSuccess = list => ({
  105. type: LIST_CREATE_SUCCESS,
  106. list,
  107. });
  108. export const createListFail = error => ({
  109. type: LIST_CREATE_FAIL,
  110. error,
  111. });
  112. export const updateList = (id, title, shouldReset) => (dispatch, getState) => {
  113. dispatch(updateListRequest(id));
  114. api(getState).put(`/api/v1/lists/${id}`, { title }).then(({ data }) => {
  115. dispatch(updateListSuccess(data));
  116. if (shouldReset) {
  117. dispatch(resetListEditor());
  118. }
  119. }).catch(err => dispatch(updateListFail(id, err)));
  120. };
  121. export const updateListRequest = id => ({
  122. type: LIST_UPDATE_REQUEST,
  123. id,
  124. });
  125. export const updateListSuccess = list => ({
  126. type: LIST_UPDATE_SUCCESS,
  127. list,
  128. });
  129. export const updateListFail = (id, error) => ({
  130. type: LIST_UPDATE_FAIL,
  131. id,
  132. error,
  133. });
  134. export const resetListEditor = () => ({
  135. type: LIST_EDITOR_RESET,
  136. });
  137. export const deleteList = id => (dispatch, getState) => {
  138. dispatch(deleteListRequest(id));
  139. api(getState).delete(`/api/v1/lists/${id}`)
  140. .then(() => dispatch(deleteListSuccess(id)))
  141. .catch(err => dispatch(deleteListFail(id, err)));
  142. };
  143. export const deleteListRequest = id => ({
  144. type: LIST_DELETE_REQUEST,
  145. id,
  146. });
  147. export const deleteListSuccess = id => ({
  148. type: LIST_DELETE_SUCCESS,
  149. id,
  150. });
  151. export const deleteListFail = (id, error) => ({
  152. type: LIST_DELETE_FAIL,
  153. id,
  154. error,
  155. });
  156. export const fetchListAccounts = listId => (dispatch, getState) => {
  157. dispatch(fetchListAccountsRequest(listId));
  158. api(getState).get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => {
  159. dispatch(importFetchedAccounts(data));
  160. dispatch(fetchListAccountsSuccess(listId, data));
  161. }).catch(err => dispatch(fetchListAccountsFail(listId, err)));
  162. };
  163. export const fetchListAccountsRequest = id => ({
  164. type: LIST_ACCOUNTS_FETCH_REQUEST,
  165. id,
  166. });
  167. export const fetchListAccountsSuccess = (id, accounts, next) => ({
  168. type: LIST_ACCOUNTS_FETCH_SUCCESS,
  169. id,
  170. accounts,
  171. next,
  172. });
  173. export const fetchListAccountsFail = (id, error) => ({
  174. type: LIST_ACCOUNTS_FETCH_FAIL,
  175. id,
  176. error,
  177. });
  178. export const fetchListSuggestions = q => (dispatch, getState) => {
  179. const params = {
  180. q,
  181. resolve: false,
  182. limit: 4,
  183. following: true,
  184. };
  185. api(getState).get('/api/v1/accounts/search', { params }).then(({ data }) => {
  186. dispatch(importFetchedAccounts(data));
  187. dispatch(fetchListSuggestionsReady(q, data));
  188. });
  189. };
  190. export const fetchListSuggestionsReady = (query, accounts) => ({
  191. type: LIST_EDITOR_SUGGESTIONS_READY,
  192. query,
  193. accounts,
  194. });
  195. export const clearListSuggestions = () => ({
  196. type: LIST_EDITOR_SUGGESTIONS_CLEAR,
  197. });
  198. export const changeListSuggestions = value => ({
  199. type: LIST_EDITOR_SUGGESTIONS_CHANGE,
  200. value,
  201. });
  202. export const addToListEditor = accountId => (dispatch, getState) => {
  203. dispatch(addToList(getState().getIn(['listEditor', 'listId']), accountId));
  204. };
  205. export const addToList = (listId, accountId) => (dispatch, getState) => {
  206. dispatch(addToListRequest(listId, accountId));
  207. api(getState).post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] })
  208. .then(() => dispatch(addToListSuccess(listId, accountId)))
  209. .catch(err => dispatch(addToListFail(listId, accountId, err)));
  210. };
  211. export const addToListRequest = (listId, accountId) => ({
  212. type: LIST_EDITOR_ADD_REQUEST,
  213. listId,
  214. accountId,
  215. });
  216. export const addToListSuccess = (listId, accountId) => ({
  217. type: LIST_EDITOR_ADD_SUCCESS,
  218. listId,
  219. accountId,
  220. });
  221. export const addToListFail = (listId, accountId, error) => ({
  222. type: LIST_EDITOR_ADD_FAIL,
  223. listId,
  224. accountId,
  225. error,
  226. });
  227. export const removeFromListEditor = accountId => (dispatch, getState) => {
  228. dispatch(removeFromList(getState().getIn(['listEditor', 'listId']), accountId));
  229. };
  230. export const removeFromList = (listId, accountId) => (dispatch, getState) => {
  231. dispatch(removeFromListRequest(listId, accountId));
  232. api(getState).delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } })
  233. .then(() => dispatch(removeFromListSuccess(listId, accountId)))
  234. .catch(err => dispatch(removeFromListFail(listId, accountId, err)));
  235. };
  236. export const removeFromListRequest = (listId, accountId) => ({
  237. type: LIST_EDITOR_REMOVE_REQUEST,
  238. listId,
  239. accountId,
  240. });
  241. export const removeFromListSuccess = (listId, accountId) => ({
  242. type: LIST_EDITOR_REMOVE_SUCCESS,
  243. listId,
  244. accountId,
  245. });
  246. export const removeFromListFail = (listId, accountId, error) => ({
  247. type: LIST_EDITOR_REMOVE_FAIL,
  248. listId,
  249. accountId,
  250. error,
  251. });