import api from '../api'; import { importFetchedAccounts } from './importer'; import { showAlertForError } from './alerts'; export const CIRCLE_FETCH_REQUEST = 'CIRCLE_FETCH_REQUEST'; export const CIRCLE_FETCH_SUCCESS = 'CIRCLE_FETCH_SUCCESS'; export const CIRCLE_FETCH_FAIL = 'CIRCLE_FETCH_FAIL'; export const CIRCLES_FETCH_REQUEST = 'CIRCLES_FETCH_REQUEST'; export const CIRCLES_FETCH_SUCCESS = 'CIRCLES_FETCH_SUCCESS'; export const CIRCLES_FETCH_FAIL = 'CIRCLES_FETCH_FAIL'; export const CIRCLE_EDITOR_TITLE_CHANGE = 'CIRCLE_EDITOR_TITLE_CHANGE'; export const CIRCLE_EDITOR_RESET = 'CIRCLE_EDITOR_RESET'; export const CIRCLE_EDITOR_SETUP = 'CIRCLE_EDITOR_SETUP'; export const CIRCLE_CREATE_REQUEST = 'CIRCLE_CREATE_REQUEST'; export const CIRCLE_CREATE_SUCCESS = 'CIRCLE_CREATE_SUCCESS'; export const CIRCLE_CREATE_FAIL = 'CIRCLE_CREATE_FAIL'; export const CIRCLE_UPDATE_REQUEST = 'CIRCLE_UPDATE_REQUEST'; export const CIRCLE_UPDATE_SUCCESS = 'CIRCLE_UPDATE_SUCCESS'; export const CIRCLE_UPDATE_FAIL = 'CIRCLE_UPDATE_FAIL'; export const CIRCLE_DELETE_REQUEST = 'CIRCLE_DELETE_REQUEST'; export const CIRCLE_DELETE_SUCCESS = 'CIRCLE_DELETE_SUCCESS'; export const CIRCLE_DELETE_FAIL = 'CIRCLE_DELETE_FAIL'; export const CIRCLE_ACCOUNTS_FETCH_REQUEST = 'CIRCLE_ACCOUNTS_FETCH_REQUEST'; export const CIRCLE_ACCOUNTS_FETCH_SUCCESS = 'CIRCLE_ACCOUNTS_FETCH_SUCCESS'; export const CIRCLE_ACCOUNTS_FETCH_FAIL = 'CIRCLE_ACCOUNTS_FETCH_FAIL'; export const CIRCLE_EDITOR_SUGGESTIONS_CHANGE = 'CIRCLE_EDITOR_SUGGESTIONS_CHANGE'; export const CIRCLE_EDITOR_SUGGESTIONS_READY = 'CIRCLE_EDITOR_SUGGESTIONS_READY'; export const CIRCLE_EDITOR_SUGGESTIONS_CLEAR = 'CIRCLE_EDITOR_SUGGESTIONS_CLEAR'; export const CIRCLE_EDITOR_ADD_REQUEST = 'CIRCLE_EDITOR_ADD_REQUEST'; export const CIRCLE_EDITOR_ADD_SUCCESS = 'CIRCLE_EDITOR_ADD_SUCCESS'; export const CIRCLE_EDITOR_ADD_FAIL = 'CIRCLE_EDITOR_ADD_FAIL'; export const CIRCLE_EDITOR_REMOVE_REQUEST = 'CIRCLE_EDITOR_REMOVE_REQUEST'; export const CIRCLE_EDITOR_REMOVE_SUCCESS = 'CIRCLE_EDITOR_REMOVE_SUCCESS'; export const CIRCLE_EDITOR_REMOVE_FAIL = 'CIRCLE_EDITOR_REMOVE_FAIL'; export const CIRCLE_ADDER_RESET = 'CIRCLE_ADDER_RESET'; export const CIRCLE_ADDER_SETUP = 'CIRCLE_ADDER_SETUP'; export const CIRCLE_ADDER_CIRCLES_FETCH_REQUEST = 'CIRCLE_ADDER_CIRCLES_FETCH_REQUEST'; export const CIRCLE_ADDER_CIRCLES_FETCH_SUCCESS = 'CIRCLE_ADDER_CIRCLES_FETCH_SUCCESS'; export const CIRCLE_ADDER_CIRCLES_FETCH_FAIL = 'CIRCLE_ADDER_CIRCLES_FETCH_FAIL'; export const fetchCircle = id => (dispatch, getState) => { if (getState().getIn(['circles', id])) { return; } dispatch(fetchCircleRequest(id)); api(getState).get(`/api/v1/circles/${id}`) .then(({ data }) => dispatch(fetchCircleSuccess(data))) .catch(err => dispatch(fetchCircleFail(id, err))); }; export const fetchCircleRequest = id => ({ type: CIRCLE_FETCH_REQUEST, id, }); export const fetchCircleSuccess = circle => ({ type: CIRCLE_FETCH_SUCCESS, circle, }); export const fetchCircleFail = (id, error) => ({ type: CIRCLE_FETCH_FAIL, id, error, }); export const fetchCircles = () => (dispatch, getState) => { dispatch(fetchCirclesRequest()); api(getState).get('/api/v1/circles') .then(({ data }) => dispatch(fetchCirclesSuccess(data))) .catch(err => dispatch(fetchCirclesFail(err))); }; export const fetchCirclesRequest = () => ({ type: CIRCLES_FETCH_REQUEST, }); export const fetchCirclesSuccess = circles => ({ type: CIRCLES_FETCH_SUCCESS, circles, }); export const fetchCirclesFail = error => ({ type: CIRCLES_FETCH_FAIL, error, }); export const submitCircleEditor = shouldReset => (dispatch, getState) => { const circleId = getState().getIn(['circleEditor', 'circleId']); const title = getState().getIn(['circleEditor', 'title']); if (circleId === null) { dispatch(createCircle(title, shouldReset)); } else { dispatch(updateCircle(circleId, title, shouldReset)); } }; export const setupCircleEditor = circleId => (dispatch, getState) => { dispatch({ type: CIRCLE_EDITOR_SETUP, circle: getState().getIn(['circles', circleId]), }); dispatch(fetchCircleAccounts(circleId)); }; export const changeCircleEditorTitle = value => ({ type: CIRCLE_EDITOR_TITLE_CHANGE, value, }); export const createCircle = (title, shouldReset) => (dispatch, getState) => { dispatch(createCircleRequest()); api(getState).post('/api/v1/circles', { title }).then(({ data }) => { dispatch(createCircleSuccess(data)); if (shouldReset) { dispatch(resetCircleEditor()); } }).catch(err => dispatch(createCircleFail(err))); }; export const createCircleRequest = () => ({ type: CIRCLE_CREATE_REQUEST, }); export const createCircleSuccess = circle => ({ type: CIRCLE_CREATE_SUCCESS, circle, }); export const createCircleFail = error => ({ type: CIRCLE_CREATE_FAIL, error, }); export const updateCircle = (id, title, shouldReset) => (dispatch, getState) => { dispatch(updateCircleRequest(id)); api(getState).put(`/api/v1/circles/${id}`, { title }).then(({ data }) => { dispatch(updateCircleSuccess(data)); if (shouldReset) { dispatch(resetCircleEditor()); } }).catch(err => dispatch(updateCircleFail(id, err))); }; export const updateCircleRequest = id => ({ type: CIRCLE_UPDATE_REQUEST, id, }); export const updateCircleSuccess = circle => ({ type: CIRCLE_UPDATE_SUCCESS, circle, }); export const updateCircleFail = (id, error) => ({ type: CIRCLE_UPDATE_FAIL, id, error, }); export const resetCircleEditor = () => ({ type: CIRCLE_EDITOR_RESET, }); export const deleteCircle = id => (dispatch, getState) => { dispatch(deleteCircleRequest(id)); api(getState).delete(`/api/v1/circles/${id}`) .then(() => dispatch(deleteCircleSuccess(id))) .catch(err => dispatch(deleteCircleFail(id, err))); }; export const deleteCircleRequest = id => ({ type: CIRCLE_DELETE_REQUEST, id, }); export const deleteCircleSuccess = id => ({ type: CIRCLE_DELETE_SUCCESS, id, }); export const deleteCircleFail = (id, error) => ({ type: CIRCLE_DELETE_FAIL, id, error, }); export const fetchCircleAccounts = circleId => (dispatch, getState) => { dispatch(fetchCircleAccountsRequest(circleId)); api(getState).get(`/api/v1/circles/${circleId}/accounts`, { params: { limit: 0 } }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchCircleAccountsSuccess(circleId, data)); }).catch(err => dispatch(fetchCircleAccountsFail(circleId, err))); }; export const fetchCircleAccountsRequest = id => ({ type: CIRCLE_ACCOUNTS_FETCH_REQUEST, id, }); export const fetchCircleAccountsSuccess = (id, accounts, next) => ({ type: CIRCLE_ACCOUNTS_FETCH_SUCCESS, id, accounts, next, }); export const fetchCircleAccountsFail = (id, error) => ({ type: CIRCLE_ACCOUNTS_FETCH_FAIL, id, error, }); export const fetchCircleSuggestions = q => (dispatch, getState) => { const params = { q, resolve: false, limit: 4, followers: true, }; api(getState).get('/api/v1/accounts/search', { params }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchCircleSuggestionsReady(q, data)); }).catch(error => dispatch(showAlertForError(error))); }; export const fetchCircleSuggestionsReady = (query, accounts) => ({ type: CIRCLE_EDITOR_SUGGESTIONS_READY, query, accounts, }); export const clearCircleSuggestions = () => ({ type: CIRCLE_EDITOR_SUGGESTIONS_CLEAR, }); export const changeCircleSuggestions = value => ({ type: CIRCLE_EDITOR_SUGGESTIONS_CHANGE, value, }); export const addToCircleEditor = accountId => (dispatch, getState) => { dispatch(addToCircle(getState().getIn(['circleEditor', 'circleId']), accountId)); }; export const addToCircle = (circleId, accountId) => (dispatch, getState) => { dispatch(addToCircleRequest(circleId, accountId)); api(getState).post(`/api/v1/circles/${circleId}/accounts`, { account_ids: [accountId] }) .then(() => dispatch(addToCircleSuccess(circleId, accountId))) .catch(err => dispatch(addToCircleFail(circleId, accountId, err))); }; export const addToCircleRequest = (circleId, accountId) => ({ type: CIRCLE_EDITOR_ADD_REQUEST, circleId, accountId, }); export const addToCircleSuccess = (circleId, accountId) => ({ type: CIRCLE_EDITOR_ADD_SUCCESS, circleId, accountId, }); export const addToCircleFail = (circleId, accountId, error) => ({ type: CIRCLE_EDITOR_ADD_FAIL, circleId, accountId, error, }); export const removeFromCircleEditor = accountId => (dispatch, getState) => { dispatch(removeFromCircle(getState().getIn(['circleEditor', 'circleId']), accountId)); }; export const removeFromCircle = (circleId, accountId) => (dispatch, getState) => { dispatch(removeFromCircleRequest(circleId, accountId)); api(getState).delete(`/api/v1/circles/${circleId}/accounts`, { params: { account_ids: [accountId] } }) .then(() => dispatch(removeFromCircleSuccess(circleId, accountId))) .catch(err => dispatch(removeFromCircleFail(circleId, accountId, err))); }; export const removeFromCircleRequest = (circleId, accountId) => ({ type: CIRCLE_EDITOR_REMOVE_REQUEST, circleId, accountId, }); export const removeFromCircleSuccess = (circleId, accountId) => ({ type: CIRCLE_EDITOR_REMOVE_SUCCESS, circleId, accountId, }); export const removeFromCircleFail = (circleId, accountId, error) => ({ type: CIRCLE_EDITOR_REMOVE_FAIL, circleId, accountId, error, }); export const resetCircleAdder = () => ({ type: CIRCLE_ADDER_RESET, }); export const setupCircleAdder = accountId => (dispatch, getState) => { dispatch({ type: CIRCLE_ADDER_SETUP, account: getState().getIn(['accounts', accountId]), }); dispatch(fetchCircles()); dispatch(fetchAccountCircles(accountId)); }; export const fetchAccountCircles = accountId => (dispatch, getState) => { dispatch(fetchAccountCirclesRequest(accountId)); api(getState).get(`/api/v1/accounts/${accountId}/circles`) .then(({ data }) => dispatch(fetchAccountCirclesSuccess(accountId, data))) .catch(err => dispatch(fetchAccountCirclesFail(accountId, err))); }; export const fetchAccountCirclesRequest = id => ({ type:CIRCLE_ADDER_CIRCLES_FETCH_REQUEST, id, }); export const fetchAccountCirclesSuccess = (id, circles) => ({ type: CIRCLE_ADDER_CIRCLES_FETCH_SUCCESS, id, circles, }); export const fetchAccountCirclesFail = (id, err) => ({ type: CIRCLE_ADDER_CIRCLES_FETCH_FAIL, id, err, }); export const addToCircleAdder = circleId => (dispatch, getState) => { dispatch(addToCircle(circleId, getState().getIn(['circleAdder', 'accountId']))); }; export const removeFromCircleAdder = circleId => (dispatch, getState) => { dispatch(removeFromCircle(circleId, getState().getIn(['circleAdder', 'accountId']))); };