The code powering m.abunchtell.com https://m.abunchtell.com
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.
 
 
 
 

373 lines
10 KiB

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