about summary refs log tree commit diff
path: root/app/assets/javascripts/components/actions
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-05-03 02:04:16 +0200
committerGitHub <noreply@github.com>2017-05-03 02:04:16 +0200
commitf5bf5ebb82e3af420dcd23d602b1be6cc86838e1 (patch)
tree92eef08642a038cf44ccbc6d16a884293e7a0814 /app/assets/javascripts/components/actions
parent26bc5915727e0a0173c03cb49f5193dd612fb888 (diff)
Replace sprockets/browserify with Webpack (#2617)
* Replace browserify with webpack

* Add react-intl-translations-manager

* Do not minify in development, add offline-plugin for ServiceWorker background cache updates

* Adjust tests and dependencies

* Fix production deployments

* Fix tests

* More optimizations

* Improve travis cache for npm stuff

* Re-run travis

* Add back support for custom.scss as before

* Remove offline-plugin and babili

* Fix issue with Immutable.List().unshift(...values) not working as expected

* Make travis load schema instead of running all migrations in sequence

* Fix missing React import in WarningContainer. Optimize rendering performance by using ImmutablePureComponent instead of
React.PureComponent. ImmutablePureComponent uses Immutable.is() to compare props. Replace dynamic callback bindings in
<UI />

* Add react definitions to places that use JSX

* Add Procfile.dev for running rails, webpack and streaming API at the same time
Diffstat (limited to 'app/assets/javascripts/components/actions')
-rw-r--r--app/assets/javascripts/components/actions/accounts.jsx762
-rw-r--r--app/assets/javascripts/components/actions/alerts.jsx24
-rw-r--r--app/assets/javascripts/components/actions/blocks.jsx82
-rw-r--r--app/assets/javascripts/components/actions/cards.jsx52
-rw-r--r--app/assets/javascripts/components/actions/compose.jsx279
-rw-r--r--app/assets/javascripts/components/actions/favourites.jsx83
-rw-r--r--app/assets/javascripts/components/actions/interactions.jsx235
-rw-r--r--app/assets/javascripts/components/actions/modal.jsx16
-rw-r--r--app/assets/javascripts/components/actions/mutes.jsx82
-rw-r--r--app/assets/javascripts/components/actions/notifications.jsx165
-rw-r--r--app/assets/javascripts/components/actions/onboarding.jsx14
-rw-r--r--app/assets/javascripts/components/actions/reports.jsx72
-rw-r--r--app/assets/javascripts/components/actions/search.jsx73
-rw-r--r--app/assets/javascripts/components/actions/settings.jsx19
-rw-r--r--app/assets/javascripts/components/actions/statuses.jsx141
-rw-r--r--app/assets/javascripts/components/actions/store.jsx17
-rw-r--r--app/assets/javascripts/components/actions/timelines.jsx186
17 files changed, 0 insertions, 2302 deletions
diff --git a/app/assets/javascripts/components/actions/accounts.jsx b/app/assets/javascripts/components/actions/accounts.jsx
deleted file mode 100644
index eac5c78bb..000000000
--- a/app/assets/javascripts/components/actions/accounts.jsx
+++ /dev/null
@@ -1,762 +0,0 @@
-import api, { getLinks } from '../api'
-import Immutable from 'immutable';
-
-export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
-export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
-export const ACCOUNT_FETCH_FAIL    = 'ACCOUNT_FETCH_FAIL';
-
-export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
-export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
-export const ACCOUNT_FOLLOW_FAIL    = 'ACCOUNT_FOLLOW_FAIL';
-
-export const ACCOUNT_UNFOLLOW_REQUEST = 'ACCOUNT_UNFOLLOW_REQUEST';
-export const ACCOUNT_UNFOLLOW_SUCCESS = 'ACCOUNT_UNFOLLOW_SUCCESS';
-export const ACCOUNT_UNFOLLOW_FAIL    = 'ACCOUNT_UNFOLLOW_FAIL';
-
-export const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST';
-export const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS';
-export const ACCOUNT_BLOCK_FAIL    = 'ACCOUNT_BLOCK_FAIL';
-
-export const ACCOUNT_UNBLOCK_REQUEST = 'ACCOUNT_UNBLOCK_REQUEST';
-export const ACCOUNT_UNBLOCK_SUCCESS = 'ACCOUNT_UNBLOCK_SUCCESS';
-export const ACCOUNT_UNBLOCK_FAIL    = 'ACCOUNT_UNBLOCK_FAIL';
-
-export const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST';
-export const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS';
-export const ACCOUNT_MUTE_FAIL    = 'ACCOUNT_MUTE_FAIL';
-
-export const ACCOUNT_UNMUTE_REQUEST = 'ACCOUNT_UNMUTE_REQUEST';
-export const ACCOUNT_UNMUTE_SUCCESS = 'ACCOUNT_UNMUTE_SUCCESS';
-export const ACCOUNT_UNMUTE_FAIL    = 'ACCOUNT_UNMUTE_FAIL';
-
-export const ACCOUNT_TIMELINE_FETCH_REQUEST = 'ACCOUNT_TIMELINE_FETCH_REQUEST';
-export const ACCOUNT_TIMELINE_FETCH_SUCCESS = 'ACCOUNT_TIMELINE_FETCH_SUCCESS';
-export const ACCOUNT_TIMELINE_FETCH_FAIL    = 'ACCOUNT_TIMELINE_FETCH_FAIL';
-
-export const ACCOUNT_TIMELINE_EXPAND_REQUEST = 'ACCOUNT_TIMELINE_EXPAND_REQUEST';
-export const ACCOUNT_TIMELINE_EXPAND_SUCCESS = 'ACCOUNT_TIMELINE_EXPAND_SUCCESS';
-export const ACCOUNT_TIMELINE_EXPAND_FAIL    = 'ACCOUNT_TIMELINE_EXPAND_FAIL';
-
-export const FOLLOWERS_FETCH_REQUEST = 'FOLLOWERS_FETCH_REQUEST';
-export const FOLLOWERS_FETCH_SUCCESS = 'FOLLOWERS_FETCH_SUCCESS';
-export const FOLLOWERS_FETCH_FAIL    = 'FOLLOWERS_FETCH_FAIL';
-
-export const FOLLOWERS_EXPAND_REQUEST = 'FOLLOWERS_EXPAND_REQUEST';
-export const FOLLOWERS_EXPAND_SUCCESS = 'FOLLOWERS_EXPAND_SUCCESS';
-export const FOLLOWERS_EXPAND_FAIL    = 'FOLLOWERS_EXPAND_FAIL';
-
-export const FOLLOWING_FETCH_REQUEST = 'FOLLOWING_FETCH_REQUEST';
-export const FOLLOWING_FETCH_SUCCESS = 'FOLLOWING_FETCH_SUCCESS';
-export const FOLLOWING_FETCH_FAIL    = 'FOLLOWING_FETCH_FAIL';
-
-export const FOLLOWING_EXPAND_REQUEST = 'FOLLOWING_EXPAND_REQUEST';
-export const FOLLOWING_EXPAND_SUCCESS = 'FOLLOWING_EXPAND_SUCCESS';
-export const FOLLOWING_EXPAND_FAIL    = 'FOLLOWING_EXPAND_FAIL';
-
-export const RELATIONSHIPS_FETCH_REQUEST = 'RELATIONSHIPS_FETCH_REQUEST';
-export const RELATIONSHIPS_FETCH_SUCCESS = 'RELATIONSHIPS_FETCH_SUCCESS';
-export const RELATIONSHIPS_FETCH_FAIL    = 'RELATIONSHIPS_FETCH_FAIL';
-
-export const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST';
-export const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS';
-export const FOLLOW_REQUESTS_FETCH_FAIL    = 'FOLLOW_REQUESTS_FETCH_FAIL';
-
-export const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST';
-export const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS';
-export const FOLLOW_REQUESTS_EXPAND_FAIL    = 'FOLLOW_REQUESTS_EXPAND_FAIL';
-
-export const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUEST';
-export const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCESS';
-export const FOLLOW_REQUEST_AUTHORIZE_FAIL    = 'FOLLOW_REQUEST_AUTHORIZE_FAIL';
-
-export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST';
-export const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS';
-export const FOLLOW_REQUEST_REJECT_FAIL    = 'FOLLOW_REQUEST_REJECT_FAIL';
-
-export function fetchAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(fetchRelationships([id]));
-
-    if (getState().getIn(['accounts', id], null) !== null) {
-      return;
-    }
-
-    dispatch(fetchAccountRequest(id));
-
-    api(getState).get(`/api/v1/accounts/${id}`).then(response => {
-      dispatch(fetchAccountSuccess(response.data));
-    }).catch(error => {
-      dispatch(fetchAccountFail(id, error));
-    });
-  };
-};
-
-export function fetchAccountTimeline(id, replace = false) {
-  return (dispatch, getState) => {
-    const ids      = getState().getIn(['timelines', 'accounts_timelines', id, 'items'], Immutable.List());
-    const newestId = ids.size > 0 ? ids.first() : null;
-
-    let params = '';
-    let skipLoading = false;
-
-    if (newestId !== null && !replace) {
-      params      = `?since_id=${newestId}`;
-      skipLoading = true;
-    }
-
-    dispatch(fetchAccountTimelineRequest(id, skipLoading));
-
-    api(getState).get(`/api/v1/accounts/${id}/statuses${params}`).then(response => {
-      dispatch(fetchAccountTimelineSuccess(id, response.data, replace, skipLoading));
-    }).catch(error => {
-      dispatch(fetchAccountTimelineFail(id, error, skipLoading));
-    });
-  };
-};
-
-export function expandAccountTimeline(id) {
-  return (dispatch, getState) => {
-    const lastId = getState().getIn(['timelines', 'accounts_timelines', id, 'items'], Immutable.List()).last();
-
-    dispatch(expandAccountTimelineRequest(id));
-
-    api(getState).get(`/api/v1/accounts/${id}/statuses`, {
-      params: {
-        limit: 10,
-        max_id: lastId
-      }
-    }).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(expandAccountTimelineSuccess(id, response.data, next));
-    }).catch(error => {
-      dispatch(expandAccountTimelineFail(id, error));
-    });
-  };
-};
-
-export function fetchAccountRequest(id) {
-  return {
-    type: ACCOUNT_FETCH_REQUEST,
-    id
-  };
-};
-
-export function fetchAccountSuccess(account) {
-  return {
-    type: ACCOUNT_FETCH_SUCCESS,
-    account
-  };
-};
-
-export function fetchAccountFail(id, error) {
-  return {
-    type: ACCOUNT_FETCH_FAIL,
-    id,
-    error,
-    skipAlert: true
-  };
-};
-
-export function followAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(followAccountRequest(id));
-
-    api(getState).post(`/api/v1/accounts/${id}/follow`).then(response => {
-      dispatch(followAccountSuccess(response.data));
-    }).catch(error => {
-      dispatch(followAccountFail(error));
-    });
-  };
-};
-
-export function unfollowAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(unfollowAccountRequest(id));
-
-    api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => {
-      dispatch(unfollowAccountSuccess(response.data));
-    }).catch(error => {
-      dispatch(unfollowAccountFail(error));
-    });
-  }
-};
-
-export function followAccountRequest(id) {
-  return {
-    type: ACCOUNT_FOLLOW_REQUEST,
-    id
-  };
-};
-
-export function followAccountSuccess(relationship) {
-  return {
-    type: ACCOUNT_FOLLOW_SUCCESS,
-    relationship
-  };
-};
-
-export function followAccountFail(error) {
-  return {
-    type: ACCOUNT_FOLLOW_FAIL,
-    error
-  };
-};
-
-export function unfollowAccountRequest(id) {
-  return {
-    type: ACCOUNT_UNFOLLOW_REQUEST,
-    id
-  };
-};
-
-export function unfollowAccountSuccess(relationship) {
-  return {
-    type: ACCOUNT_UNFOLLOW_SUCCESS,
-    relationship
-  };
-};
-
-export function unfollowAccountFail(error) {
-  return {
-    type: ACCOUNT_UNFOLLOW_FAIL,
-    error
-  };
-};
-
-export function fetchAccountTimelineRequest(id, skipLoading) {
-  return {
-    type: ACCOUNT_TIMELINE_FETCH_REQUEST,
-    id,
-    skipLoading
-  };
-};
-
-export function fetchAccountTimelineSuccess(id, statuses, replace, skipLoading) {
-  return {
-    type: ACCOUNT_TIMELINE_FETCH_SUCCESS,
-    id,
-    statuses,
-    replace,
-    skipLoading
-  };
-};
-
-export function fetchAccountTimelineFail(id, error, skipLoading) {
-  return {
-    type: ACCOUNT_TIMELINE_FETCH_FAIL,
-    id,
-    error,
-    skipLoading,
-    skipAlert: error.response.status === 404
-  };
-};
-
-export function expandAccountTimelineRequest(id) {
-  return {
-    type: ACCOUNT_TIMELINE_EXPAND_REQUEST,
-    id
-  };
-};
-
-export function expandAccountTimelineSuccess(id, statuses, next) {
-  return {
-    type: ACCOUNT_TIMELINE_EXPAND_SUCCESS,
-    id,
-    statuses,
-    next
-  };
-};
-
-export function expandAccountTimelineFail(id, error) {
-  return {
-    type: ACCOUNT_TIMELINE_EXPAND_FAIL,
-    id,
-    error
-  };
-};
-
-export function blockAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(blockAccountRequest(id));
-
-    api(getState).post(`/api/v1/accounts/${id}/block`).then(response => {
-      // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers
-      dispatch(blockAccountSuccess(response.data, getState().get('statuses')));
-    }).catch(error => {
-      dispatch(blockAccountFail(id, error));
-    });
-  };
-};
-
-export function unblockAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(unblockAccountRequest(id));
-
-    api(getState).post(`/api/v1/accounts/${id}/unblock`).then(response => {
-      dispatch(unblockAccountSuccess(response.data));
-    }).catch(error => {
-      dispatch(unblockAccountFail(id, error));
-    });
-  };
-};
-
-export function blockAccountRequest(id) {
-  return {
-    type: ACCOUNT_BLOCK_REQUEST,
-    id
-  };
-};
-
-export function blockAccountSuccess(relationship, statuses) {
-  return {
-    type: ACCOUNT_BLOCK_SUCCESS,
-    relationship,
-    statuses
-  };
-};
-
-export function blockAccountFail(error) {
-  return {
-    type: ACCOUNT_BLOCK_FAIL,
-    error
-  };
-};
-
-export function unblockAccountRequest(id) {
-  return {
-    type: ACCOUNT_UNBLOCK_REQUEST,
-    id
-  };
-};
-
-export function unblockAccountSuccess(relationship) {
-  return {
-    type: ACCOUNT_UNBLOCK_SUCCESS,
-    relationship
-  };
-};
-
-export function unblockAccountFail(error) {
-  return {
-    type: ACCOUNT_UNBLOCK_FAIL,
-    error
-  };
-};
-
-
-export function muteAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(muteAccountRequest(id));
-
-    api(getState).post(`/api/v1/accounts/${id}/mute`).then(response => {
-      // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers
-      dispatch(muteAccountSuccess(response.data, getState().get('statuses')));
-    }).catch(error => {
-      dispatch(muteAccountFail(id, error));
-    });
-  };
-};
-
-export function unmuteAccount(id) {
-  return (dispatch, getState) => {
-    dispatch(unmuteAccountRequest(id));
-
-    api(getState).post(`/api/v1/accounts/${id}/unmute`).then(response => {
-      dispatch(unmuteAccountSuccess(response.data));
-    }).catch(error => {
-      dispatch(unmuteAccountFail(id, error));
-    });
-  };
-};
-
-export function muteAccountRequest(id) {
-  return {
-    type: ACCOUNT_MUTE_REQUEST,
-    id
-  };
-};
-
-export function muteAccountSuccess(relationship, statuses) {
-  return {
-    type: ACCOUNT_MUTE_SUCCESS,
-    relationship,
-    statuses
-  };
-};
-
-export function muteAccountFail(error) {
-  return {
-    type: ACCOUNT_MUTE_FAIL,
-    error
-  };
-};
-
-export function unmuteAccountRequest(id) {
-  return {
-    type: ACCOUNT_UNMUTE_REQUEST,
-    id
-  };
-};
-
-export function unmuteAccountSuccess(relationship) {
-  return {
-    type: ACCOUNT_UNMUTE_SUCCESS,
-    relationship
-  };
-};
-
-export function unmuteAccountFail(error) {
-  return {
-    type: ACCOUNT_UNMUTE_FAIL,
-    error
-  };
-};
-
-
-export function fetchFollowers(id) {
-  return (dispatch, getState) => {
-    dispatch(fetchFollowersRequest(id));
-
-    api(getState).get(`/api/v1/accounts/${id}/followers`).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-
-      dispatch(fetchFollowersSuccess(id, response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => {
-      dispatch(fetchFollowersFail(id, error));
-    });
-  };
-};
-
-export function fetchFollowersRequest(id) {
-  return {
-    type: FOLLOWERS_FETCH_REQUEST,
-    id
-  };
-};
-
-export function fetchFollowersSuccess(id, accounts, next) {
-  return {
-    type: FOLLOWERS_FETCH_SUCCESS,
-    id,
-    accounts,
-    next
-  };
-};
-
-export function fetchFollowersFail(id, error) {
-  return {
-    type: FOLLOWERS_FETCH_FAIL,
-    id,
-    error
-  };
-};
-
-export function expandFollowers(id) {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['user_lists', 'followers', id, 'next']);
-
-    if (url === null) {
-      return;
-    }
-
-    dispatch(expandFollowersRequest(id));
-
-    api(getState).get(url).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-
-      dispatch(expandFollowersSuccess(id, response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => {
-      dispatch(expandFollowersFail(id, error));
-    });
-  };
-};
-
-export function expandFollowersRequest(id) {
-  return {
-    type: FOLLOWERS_EXPAND_REQUEST,
-    id
-  };
-};
-
-export function expandFollowersSuccess(id, accounts, next) {
-  return {
-    type: FOLLOWERS_EXPAND_SUCCESS,
-    id,
-    accounts,
-    next
-  };
-};
-
-export function expandFollowersFail(id, error) {
-  return {
-    type: FOLLOWERS_EXPAND_FAIL,
-    id,
-    error
-  };
-};
-
-export function fetchFollowing(id) {
-  return (dispatch, getState) => {
-    dispatch(fetchFollowingRequest(id));
-
-    api(getState).get(`/api/v1/accounts/${id}/following`).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-
-      dispatch(fetchFollowingSuccess(id, response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => {
-      dispatch(fetchFollowingFail(id, error));
-    });
-  };
-};
-
-export function fetchFollowingRequest(id) {
-  return {
-    type: FOLLOWING_FETCH_REQUEST,
-    id
-  };
-};
-
-export function fetchFollowingSuccess(id, accounts, next) {
-  return {
-    type: FOLLOWING_FETCH_SUCCESS,
-    id,
-    accounts,
-    next
-  };
-};
-
-export function fetchFollowingFail(id, error) {
-  return {
-    type: FOLLOWING_FETCH_FAIL,
-    id,
-    error
-  };
-};
-
-export function expandFollowing(id) {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['user_lists', 'following', id, 'next']);
-
-    if (url === null) {
-      return;
-    }
-
-    dispatch(expandFollowingRequest(id));
-
-    api(getState).get(url).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-
-      dispatch(expandFollowingSuccess(id, response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => {
-      dispatch(expandFollowingFail(id, error));
-    });
-  };
-};
-
-export function expandFollowingRequest(id) {
-  return {
-    type: FOLLOWING_EXPAND_REQUEST,
-    id
-  };
-};
-
-export function expandFollowingSuccess(id, accounts, next) {
-  return {
-    type: FOLLOWING_EXPAND_SUCCESS,
-    id,
-    accounts,
-    next
-  };
-};
-
-export function expandFollowingFail(id, error) {
-  return {
-    type: FOLLOWING_EXPAND_FAIL,
-    id,
-    error
-  };
-};
-
-export function fetchRelationships(accountIds) {
-  return (dispatch, getState) => {
-    const loadedRelationships = getState().get('relationships');
-    const newAccountIds = accountIds.filter(id => loadedRelationships.get(id, null) === null);
-
-    if (newAccountIds.length === 0) {
-      return;
-    }
-
-    dispatch(fetchRelationshipsRequest(newAccountIds));
-
-    api(getState).get(`/api/v1/accounts/relationships?${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
-      dispatch(fetchRelationshipsSuccess(response.data));
-    }).catch(error => {
-      dispatch(fetchRelationshipsFail(error));
-    });
-  };
-};
-
-export function fetchRelationshipsRequest(ids) {
-  return {
-    type: RELATIONSHIPS_FETCH_REQUEST,
-    ids,
-    skipLoading: true
-  };
-};
-
-export function fetchRelationshipsSuccess(relationships) {
-  return {
-    type: RELATIONSHIPS_FETCH_SUCCESS,
-    relationships,
-    skipLoading: true
-  };
-};
-
-export function fetchRelationshipsFail(error) {
-  return {
-    type: RELATIONSHIPS_FETCH_FAIL,
-    error,
-    skipLoading: true
-  };
-};
-
-export function fetchFollowRequests() {
-  return (dispatch, getState) => {
-    dispatch(fetchFollowRequestsRequest());
-
-    api(getState).get('/api/v1/follow_requests').then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null))
-    }).catch(error => dispatch(fetchFollowRequestsFail(error)));
-  };
-};
-
-export function fetchFollowRequestsRequest() {
-  return {
-    type: FOLLOW_REQUESTS_FETCH_REQUEST
-  };
-};
-
-export function fetchFollowRequestsSuccess(accounts, next) {
-  return {
-    type: FOLLOW_REQUESTS_FETCH_SUCCESS,
-    accounts,
-    next
-  };
-};
-
-export function fetchFollowRequestsFail(error) {
-  return {
-    type: FOLLOW_REQUESTS_FETCH_FAIL,
-    error
-  };
-};
-
-export function expandFollowRequests() {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['user_lists', 'follow_requests', 'next']);
-
-    if (url === null) {
-      return;
-    }
-
-    dispatch(expandFollowRequestsRequest());
-
-    api(getState).get(url).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null))
-    }).catch(error => dispatch(expandFollowRequestsFail(error)));
-  };
-};
-
-export function expandFollowRequestsRequest() {
-  return {
-    type: FOLLOW_REQUESTS_EXPAND_REQUEST
-  };
-};
-
-export function expandFollowRequestsSuccess(accounts, next) {
-  return {
-    type: FOLLOW_REQUESTS_EXPAND_SUCCESS,
-    accounts,
-    next
-  };
-};
-
-export function expandFollowRequestsFail(error) {
-  return {
-    type: FOLLOW_REQUESTS_EXPAND_FAIL,
-    error
-  };
-};
-
-export function authorizeFollowRequest(id) {
-  return (dispatch, getState) => {
-    dispatch(authorizeFollowRequestRequest(id));
-
-    api(getState)
-      .post(`/api/v1/follow_requests/${id}/authorize`)
-      .then(response => dispatch(authorizeFollowRequestSuccess(id)))
-      .catch(error => dispatch(authorizeFollowRequestFail(id, error)));
-  };
-};
-
-export function authorizeFollowRequestRequest(id) {
-  return {
-    type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
-    id
-  };
-};
-
-export function authorizeFollowRequestSuccess(id) {
-  return {
-    type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
-    id
-  };
-};
-
-export function authorizeFollowRequestFail(id, error) {
-  return {
-    type: FOLLOW_REQUEST_AUTHORIZE_FAIL,
-    id,
-    error
-  };
-};
-
-
-export function rejectFollowRequest(id) {
-  return (dispatch, getState) => {
-    dispatch(rejectFollowRequestRequest(id));
-
-    api(getState)
-      .post(`/api/v1/follow_requests/${id}/reject`)
-      .then(response => dispatch(rejectFollowRequestSuccess(id)))
-      .catch(error => dispatch(rejectFollowRequestFail(id, error)));
-  };
-};
-
-export function rejectFollowRequestRequest(id) {
-  return {
-    type: FOLLOW_REQUEST_REJECT_REQUEST,
-    id
-  };
-};
-
-export function rejectFollowRequestSuccess(id) {
-  return {
-    type: FOLLOW_REQUEST_REJECT_SUCCESS,
-    id
-  };
-};
-
-export function rejectFollowRequestFail(id, error) {
-  return {
-    type: FOLLOW_REQUEST_REJECT_FAIL,
-    id,
-    error
-  };
-};
diff --git a/app/assets/javascripts/components/actions/alerts.jsx b/app/assets/javascripts/components/actions/alerts.jsx
deleted file mode 100644
index 086e0727e..000000000
--- a/app/assets/javascripts/components/actions/alerts.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-export const ALERT_SHOW    = 'ALERT_SHOW';
-export const ALERT_DISMISS = 'ALERT_DISMISS';
-export const ALERT_CLEAR   = 'ALERT_CLEAR';
-
-export function dismissAlert(alert) {
-  return {
-    type: ALERT_DISMISS,
-    alert
-  };
-};
-
-export function clearAlert() {
-  return {
-    type: ALERT_CLEAR
-  };
-};
-
-export function showAlert(title, message) {
-  return {
-    type: ALERT_SHOW,
-    title,
-    message
-  };
-};
diff --git a/app/assets/javascripts/components/actions/blocks.jsx b/app/assets/javascripts/components/actions/blocks.jsx
deleted file mode 100644
index 79e316497..000000000
--- a/app/assets/javascripts/components/actions/blocks.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import api, { getLinks } from '../api'
-import { fetchRelationships } from './accounts';
-
-export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST';
-export const BLOCKS_FETCH_SUCCESS = 'BLOCKS_FETCH_SUCCESS';
-export const BLOCKS_FETCH_FAIL    = 'BLOCKS_FETCH_FAIL';
-
-export const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST';
-export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS';
-export const BLOCKS_EXPAND_FAIL    = 'BLOCKS_EXPAND_FAIL';
-
-export function fetchBlocks() {
-  return (dispatch, getState) => {
-    dispatch(fetchBlocksRequest());
-
-    api(getState).get('/api/v1/blocks').then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(fetchBlocksSuccess(response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => dispatch(fetchBlocksFail(error)));
-  };
-};
-
-export function fetchBlocksRequest() {
-  return {
-    type: BLOCKS_FETCH_REQUEST
-  };
-};
-
-export function fetchBlocksSuccess(accounts, next) {
-  return {
-    type: BLOCKS_FETCH_SUCCESS,
-    accounts,
-    next
-  };
-};
-
-export function fetchBlocksFail(error) {
-  return {
-    type: BLOCKS_FETCH_FAIL,
-    error
-  };
-};
-
-export function expandBlocks() {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['user_lists', 'blocks', 'next']);
-
-    if (url === null) {
-      return;
-    }
-
-    dispatch(expandBlocksRequest());
-
-    api(getState).get(url).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(expandBlocksSuccess(response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => dispatch(expandBlocksFail(error)));
-  };
-};
-
-export function expandBlocksRequest() {
-  return {
-    type: BLOCKS_EXPAND_REQUEST
-  };
-};
-
-export function expandBlocksSuccess(accounts, next) {
-  return {
-    type: BLOCKS_EXPAND_SUCCESS,
-    accounts,
-    next
-  };
-};
-
-export function expandBlocksFail(error) {
-  return {
-    type: BLOCKS_EXPAND_FAIL,
-    error
-  };
-};
diff --git a/app/assets/javascripts/components/actions/cards.jsx b/app/assets/javascripts/components/actions/cards.jsx
deleted file mode 100644
index 805be9709..000000000
--- a/app/assets/javascripts/components/actions/cards.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import api from '../api';
-
-export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST';
-export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS';
-export const STATUS_CARD_FETCH_FAIL    = 'STATUS_CARD_FETCH_FAIL';
-
-export function fetchStatusCard(id) {
-  return (dispatch, getState) => {
-    if (getState().getIn(['cards', id], null) !== null) {
-      return;
-    }
-
-    dispatch(fetchStatusCardRequest(id));
-
-    api(getState).get(`/api/v1/statuses/${id}/card`).then(response => {
-      if (!response.data.url) {
-        return;
-      }
-
-      dispatch(fetchStatusCardSuccess(id, response.data));
-    }).catch(error => {
-      dispatch(fetchStatusCardFail(id, error));
-    });
-  };
-};
-
-export function fetchStatusCardRequest(id) {
-  return {
-    type: STATUS_CARD_FETCH_REQUEST,
-    id,
-    skipLoading: true
-  };
-};
-
-export function fetchStatusCardSuccess(id, card) {
-  return {
-    type: STATUS_CARD_FETCH_SUCCESS,
-    id,
-    card,
-    skipLoading: true
-  };
-};
-
-export function fetchStatusCardFail(id, error) {
-  return {
-    type: STATUS_CARD_FETCH_FAIL,
-    id,
-    error,
-    skipLoading: true,
-    skipAlert: true
-  };
-};
diff --git a/app/assets/javascripts/components/actions/compose.jsx b/app/assets/javascripts/components/actions/compose.jsx
deleted file mode 100644
index d7ff6ea63..000000000
--- a/app/assets/javascripts/components/actions/compose.jsx
+++ /dev/null
@@ -1,279 +0,0 @@
-import api from '../api';
-
-import { updateTimeline } from './timelines';
-
-import * as emojione from 'emojione';
-
-export const COMPOSE_CHANGE          = 'COMPOSE_CHANGE';
-export const COMPOSE_SUBMIT_REQUEST  = 'COMPOSE_SUBMIT_REQUEST';
-export const COMPOSE_SUBMIT_SUCCESS  = 'COMPOSE_SUBMIT_SUCCESS';
-export const COMPOSE_SUBMIT_FAIL     = 'COMPOSE_SUBMIT_FAIL';
-export const COMPOSE_REPLY           = 'COMPOSE_REPLY';
-export const COMPOSE_REPLY_CANCEL    = 'COMPOSE_REPLY_CANCEL';
-export const COMPOSE_MENTION         = 'COMPOSE_MENTION';
-export const COMPOSE_UPLOAD_REQUEST  = 'COMPOSE_UPLOAD_REQUEST';
-export const COMPOSE_UPLOAD_SUCCESS  = 'COMPOSE_UPLOAD_SUCCESS';
-export const COMPOSE_UPLOAD_FAIL     = 'COMPOSE_UPLOAD_FAIL';
-export const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS';
-export const COMPOSE_UPLOAD_UNDO     = 'COMPOSE_UPLOAD_UNDO';
-
-export const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR';
-export const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY';
-export const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT';
-
-export const COMPOSE_MOUNT   = 'COMPOSE_MOUNT';
-export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
-
-export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
-export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
-export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
-export const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
-export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
-
-export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
-
-export function changeCompose(text) {
-  return {
-    type: COMPOSE_CHANGE,
-    text: text
-  };
-};
-
-export function replyCompose(status, router) {
-  return (dispatch, getState) => {
-    dispatch({
-      type: COMPOSE_REPLY,
-      status: status
-    });
-
-    if (!getState().getIn(['compose', 'mounted'])) {
-      router.push('/statuses/new');
-    }
-  };
-};
-
-export function cancelReplyCompose() {
-  return {
-    type: COMPOSE_REPLY_CANCEL
-  };
-};
-
-export function mentionCompose(account, router) {
-  return (dispatch, getState) => {
-    dispatch({
-      type: COMPOSE_MENTION,
-      account: account
-    });
-
-    if (!getState().getIn(['compose', 'mounted'])) {
-      router.push('/statuses/new');
-    }
-  };
-};
-
-export function submitCompose() {
-  return function (dispatch, getState) {
-    const status = emojione.shortnameToUnicode(getState().getIn(['compose', 'text'], ''));
-    if (!status || !status.length) {
-      return;
-    }
-    dispatch(submitComposeRequest());
-    api(getState).post('/api/v1/statuses', {
-      status,
-      in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
-      media_ids: getState().getIn(['compose', 'media_attachments']).map(item => item.get('id')),
-      sensitive: getState().getIn(['compose', 'sensitive']),
-      spoiler_text: getState().getIn(['compose', 'spoiler_text'], ''),
-      visibility: getState().getIn(['compose', 'privacy'])
-    }, {
-      headers: {
-        'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey'])
-      }
-    }).then(function (response) {
-      dispatch(submitComposeSuccess({ ...response.data }));
-
-      // To make the app more responsive, immediately get the status into the columns
-      dispatch(updateTimeline('home', { ...response.data }));
-
-      if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
-        if (getState().getIn(['timelines', 'community', 'loaded'])) {
-          dispatch(updateTimeline('community', { ...response.data }));
-        }
-
-        if (getState().getIn(['timelines', 'public', 'loaded'])) {
-          dispatch(updateTimeline('public', { ...response.data }));
-        }
-      }
-    }).catch(function (error) {
-      dispatch(submitComposeFail(error));
-    });
-  };
-};
-
-export function submitComposeRequest() {
-  return {
-    type: COMPOSE_SUBMIT_REQUEST
-  };
-};
-
-export function submitComposeSuccess(status) {
-  return {
-    type: COMPOSE_SUBMIT_SUCCESS,
-    status: status
-  };
-};
-
-export function submitComposeFail(error) {
-  return {
-    type: COMPOSE_SUBMIT_FAIL,
-    error: error
-  };
-};
-
-export function uploadCompose(files) {
-  return function (dispatch, getState) {
-    if (getState().getIn(['compose', 'media_attachments']).size > 3) {
-      return;
-    }
-
-    dispatch(uploadComposeRequest());
-
-    let data = new FormData();
-    data.append('file', files[0]);
-
-    api(getState).post('/api/v1/media', data, {
-      onUploadProgress: function (e) {
-        dispatch(uploadComposeProgress(e.loaded, e.total));
-      }
-    }).then(function (response) {
-      dispatch(uploadComposeSuccess(response.data));
-    }).catch(function (error) {
-      dispatch(uploadComposeFail(error));
-    });
-  };
-};
-
-export function uploadComposeRequest() {
-  return {
-    type: COMPOSE_UPLOAD_REQUEST,
-    skipLoading: true
-  };
-};
-
-export function uploadComposeProgress(loaded, total) {
-  return {
-    type: COMPOSE_UPLOAD_PROGRESS,
-    loaded: loaded,
-    total: total
-  };
-};
-
-export function uploadComposeSuccess(media) {
-  return {
-    type: COMPOSE_UPLOAD_SUCCESS,
-    media: media,
-    skipLoading: true
-  };
-};
-
-export function uploadComposeFail(error) {
-  return {
-    type: COMPOSE_UPLOAD_FAIL,
-    error: error,
-    skipLoading: true
-  };
-};
-
-export function undoUploadCompose(media_id) {
-  return {
-    type: COMPOSE_UPLOAD_UNDO,
-    media_id: media_id
-  };
-};
-
-export function clearComposeSuggestions() {
-  return {
-    type: COMPOSE_SUGGESTIONS_CLEAR
-  };
-};
-
-export function fetchComposeSuggestions(token) {
-  return (dispatch, getState) => {
-    api(getState).get('/api/v1/accounts/search', {
-      params: {
-        q: token,
-        resolve: false,
-        limit: 4
-      }
-    }).then(response => {
-      dispatch(readyComposeSuggestions(token, response.data));
-    });
-  };
-};
-
-export function readyComposeSuggestions(token, accounts) {
-  return {
-    type: COMPOSE_SUGGESTIONS_READY,
-    token,
-    accounts
-  };
-};
-
-export function selectComposeSuggestion(position, token, accountId) {
-  return (dispatch, getState) => {
-    const completion = getState().getIn(['accounts', accountId, 'acct']);
-
-    dispatch({
-      type: COMPOSE_SUGGESTION_SELECT,
-      position,
-      token,
-      completion
-    });
-  };
-};
-
-export function mountCompose() {
-  return {
-    type: COMPOSE_MOUNT
-  };
-};
-
-export function unmountCompose() {
-  return {
-    type: COMPOSE_UNMOUNT
-  };
-};
-
-export function changeComposeSensitivity() {
-  return {
-    type: COMPOSE_SENSITIVITY_CHANGE,
-  };
-};
-
-export function changeComposeSpoilerness() {
-  return {
-    type: COMPOSE_SPOILERNESS_CHANGE
-  };
-};
-
-export function changeComposeSpoilerText(text) {
-  return {
-    type: COMPOSE_SPOILER_TEXT_CHANGE,
-    text
-  };
-};
-
-export function changeComposeVisibility(value) {
-  return {
-    type: COMPOSE_VISIBILITY_CHANGE,
-    value
-  };
-};
-
-export function insertEmojiCompose(position, emoji) {
-  return {
-    type: COMPOSE_EMOJI_INSERT,
-    position,
-    emoji
-  };
-};
diff --git a/app/assets/javascripts/components/actions/favourites.jsx b/app/assets/javascripts/components/actions/favourites.jsx
deleted file mode 100644
index a25c1ae1c..000000000
--- a/app/assets/javascripts/components/actions/favourites.jsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import api, { getLinks } from '../api'
-
-export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST';
-export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS';
-export const FAVOURITED_STATUSES_FETCH_FAIL    = 'FAVOURITED_STATUSES_FETCH_FAIL';
-
-export const FAVOURITED_STATUSES_EXPAND_REQUEST = 'FAVOURITED_STATUSES_EXPAND_REQUEST';
-export const FAVOURITED_STATUSES_EXPAND_SUCCESS = 'FAVOURITED_STATUSES_EXPAND_SUCCESS';
-export const FAVOURITED_STATUSES_EXPAND_FAIL    = 'FAVOURITED_STATUSES_EXPAND_FAIL';
-
-export function fetchFavouritedStatuses() {
-  return (dispatch, getState) => {
-    dispatch(fetchFavouritedStatusesRequest());
-
-    api(getState).get('/api/v1/favourites').then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(fetchFavouritedStatusesSuccess(response.data, next ? next.uri : null));
-    }).catch(error => {
-      dispatch(fetchFavouritedStatusesFail(error));
-    });
-  };
-};
-
-export function fetchFavouritedStatusesRequest() {
-  return {
-    type: FAVOURITED_STATUSES_FETCH_REQUEST
-  };
-};
-
-export function fetchFavouritedStatusesSuccess(statuses, next) {
-  return {
-    type: FAVOURITED_STATUSES_FETCH_SUCCESS,
-    statuses,
-    next
-  };
-};
-
-export function fetchFavouritedStatusesFail(error) {
-  return {
-    type: FAVOURITED_STATUSES_FETCH_FAIL,
-    error
-  };
-};
-
-export function expandFavouritedStatuses() {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['status_lists', 'favourites', 'next'], null);
-
-    if (url === null) {
-      return;
-    }
-
-    dispatch(expandFavouritedStatusesRequest());
-
-    api(getState).get(url).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(expandFavouritedStatusesSuccess(response.data, next ? next.uri : null));
-    }).catch(error => {
-      dispatch(expandFavouritedStatusesFail(error));
-    });
-  };
-};
-
-export function expandFavouritedStatusesRequest() {
-  return {
-    type: FAVOURITED_STATUSES_EXPAND_REQUEST
-  };
-};
-
-export function expandFavouritedStatusesSuccess(statuses, next) {
-  return {
-    type: FAVOURITED_STATUSES_EXPAND_SUCCESS,
-    statuses,
-    next
-  };
-};
-
-export function expandFavouritedStatusesFail(error) {
-  return {
-    type: FAVOURITED_STATUSES_EXPAND_FAIL,
-    error
-  };
-};
diff --git a/app/assets/javascripts/components/actions/interactions.jsx b/app/assets/javascripts/components/actions/interactions.jsx
deleted file mode 100644
index 45f4508f6..000000000
--- a/app/assets/javascripts/components/actions/interactions.jsx
+++ /dev/null
@@ -1,235 +0,0 @@
-import api from '../api'
-
-export const REBLOG_REQUEST = 'REBLOG_REQUEST';
-export const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
-export const REBLOG_FAIL    = 'REBLOG_FAIL';
-
-export const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST';
-export const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS';
-export const FAVOURITE_FAIL    = 'FAVOURITE_FAIL';
-
-export const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST';
-export const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS';
-export const UNREBLOG_FAIL    = 'UNREBLOG_FAIL';
-
-export const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST';
-export const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS';
-export const UNFAVOURITE_FAIL    = 'UNFAVOURITE_FAIL';
-
-export const REBLOGS_FETCH_REQUEST = 'REBLOGS_FETCH_REQUEST';
-export const REBLOGS_FETCH_SUCCESS = 'REBLOGS_FETCH_SUCCESS';
-export const REBLOGS_FETCH_FAIL    = 'REBLOGS_FETCH_FAIL';
-
-export const FAVOURITES_FETCH_REQUEST = 'FAVOURITES_FETCH_REQUEST';
-export const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS';
-export const FAVOURITES_FETCH_FAIL    = 'FAVOURITES_FETCH_FAIL';
-
-export function reblog(status) {
-  return function (dispatch, getState) {
-    dispatch(reblogRequest(status));
-
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`).then(function (response) {
-      // The reblog API method returns a new status wrapped around the original. In this case we are only
-      // interested in how the original is modified, hence passing it skipping the wrapper
-      dispatch(reblogSuccess(status, response.data.reblog));
-    }).catch(function (error) {
-      dispatch(reblogFail(status, error));
-    });
-  };
-};
-
-export function unreblog(status) {
-  return (dispatch, getState) => {
-    dispatch(unreblogRequest(status));
-
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => {
-      dispatch(unreblogSuccess(status, response.data));
-    }).catch(error => {
-      dispatch(unreblogFail(status, error));
-    });
-  };
-};
-
-export function reblogRequest(status) {
-  return {
-    type: REBLOG_REQUEST,
-    status: status
-  };
-};
-
-export function reblogSuccess(status, response) {
-  return {
-    type: REBLOG_SUCCESS,
-    status: status,
-    response: response
-  };
-};
-
-export function reblogFail(status, error) {
-  return {
-    type: REBLOG_FAIL,
-    status: status,
-    error: error
-  };
-};
-
-export function unreblogRequest(status) {
-  return {
-    type: UNREBLOG_REQUEST,
-    status: status
-  };
-};
-
-export function unreblogSuccess(status, response) {
-  return {
-    type: UNREBLOG_SUCCESS,
-    status: status,
-    response: response
-  };
-};
-
-export function unreblogFail(status, error) {
-  return {
-    type: UNREBLOG_FAIL,
-    status: status,
-    error: error
-  };
-};
-
-export function favourite(status) {
-  return function (dispatch, getState) {
-    dispatch(favouriteRequest(status));
-
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) {
-      dispatch(favouriteSuccess(status, response.data));
-    }).catch(function (error) {
-      dispatch(favouriteFail(status, error));
-    });
-  };
-};
-
-export function unfavourite(status) {
-  return (dispatch, getState) => {
-    dispatch(unfavouriteRequest(status));
-
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => {
-      dispatch(unfavouriteSuccess(status, response.data));
-    }).catch(error => {
-      dispatch(unfavouriteFail(status, error));
-    });
-  };
-};
-
-export function favouriteRequest(status) {
-  return {
-    type: FAVOURITE_REQUEST,
-    status: status
-  };
-};
-
-export function favouriteSuccess(status, response) {
-  return {
-    type: FAVOURITE_SUCCESS,
-    status: status,
-    response: response
-  };
-};
-
-export function favouriteFail(status, error) {
-  return {
-    type: FAVOURITE_FAIL,
-    status: status,
-    error: error
-  };
-};
-
-export function unfavouriteRequest(status) {
-  return {
-    type: UNFAVOURITE_REQUEST,
-    status: status
-  };
-};
-
-export function unfavouriteSuccess(status, response) {
-  return {
-    type: UNFAVOURITE_SUCCESS,
-    status: status,
-    response: response
-  };
-};
-
-export function unfavouriteFail(status, error) {
-  return {
-    type: UNFAVOURITE_FAIL,
-    status: status,
-    error: error
-  };
-};
-
-export function fetchReblogs(id) {
-  return (dispatch, getState) => {
-    dispatch(fetchReblogsRequest(id));
-
-    api(getState).get(`/api/v1/statuses/${id}/reblogged_by`).then(response => {
-      dispatch(fetchReblogsSuccess(id, response.data));
-    }).catch(error => {
-      dispatch(fetchReblogsFail(id, error));
-    });
-  };
-};
-
-export function fetchReblogsRequest(id) {
-  return {
-    type: REBLOGS_FETCH_REQUEST,
-    id
-  };
-};
-
-export function fetchReblogsSuccess(id, accounts) {
-  return {
-    type: REBLOGS_FETCH_SUCCESS,
-    id,
-    accounts
-  };
-};
-
-export function fetchReblogsFail(id, error) {
-  return {
-    type: REBLOGS_FETCH_FAIL,
-    error
-  };
-};
-
-export function fetchFavourites(id) {
-  return (dispatch, getState) => {
-    dispatch(fetchFavouritesRequest(id));
-
-    api(getState).get(`/api/v1/statuses/${id}/favourited_by`).then(response => {
-      dispatch(fetchFavouritesSuccess(id, response.data));
-    }).catch(error => {
-      dispatch(fetchFavouritesFail(id, error));
-    });
-  };
-};
-
-export function fetchFavouritesRequest(id) {
-  return {
-    type: FAVOURITES_FETCH_REQUEST,
-    id
-  };
-};
-
-export function fetchFavouritesSuccess(id, accounts) {
-  return {
-    type: FAVOURITES_FETCH_SUCCESS,
-    id,
-    accounts
-  };
-};
-
-export function fetchFavouritesFail(id, error) {
-  return {
-    type: FAVOURITES_FETCH_FAIL,
-    error
-  };
-};
diff --git a/app/assets/javascripts/components/actions/modal.jsx b/app/assets/javascripts/components/actions/modal.jsx
deleted file mode 100644
index 615cd6bfe..000000000
--- a/app/assets/javascripts/components/actions/modal.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-export const MODAL_OPEN  = 'MODAL_OPEN';
-export const MODAL_CLOSE = 'MODAL_CLOSE';
-
-export function openModal(type, props) {
-  return {
-    type: MODAL_OPEN,
-    modalType: type,
-    modalProps: props
-  };
-};
-
-export function closeModal() {
-  return {
-    type: MODAL_CLOSE
-  };
-};
diff --git a/app/assets/javascripts/components/actions/mutes.jsx b/app/assets/javascripts/components/actions/mutes.jsx
deleted file mode 100644
index 824821594..000000000
--- a/app/assets/javascripts/components/actions/mutes.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import api, { getLinks } from '../api'
-import { fetchRelationships } from './accounts';
-
-export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST';
-export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS';
-export const MUTES_FETCH_FAIL    = 'MUTES_FETCH_FAIL';
-
-export const MUTES_EXPAND_REQUEST = 'MUTES_EXPAND_REQUEST';
-export const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS';
-export const MUTES_EXPAND_FAIL    = 'MUTES_EXPAND_FAIL';
-
-export function fetchMutes() {
-  return (dispatch, getState) => {
-    dispatch(fetchMutesRequest());
-
-    api(getState).get('/api/v1/mutes').then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(fetchMutesSuccess(response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => dispatch(fetchMutesFail(error)));
-  };
-};
-
-export function fetchMutesRequest() {
-  return {
-    type: MUTES_FETCH_REQUEST
-  };
-};
-
-export function fetchMutesSuccess(accounts, next) {
-  return {
-    type: MUTES_FETCH_SUCCESS,
-    accounts,
-    next
-  };
-};
-
-export function fetchMutesFail(error) {
-  return {
-    type: MUTES_FETCH_FAIL,
-    error
-  };
-};
-
-export function expandMutes() {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['user_lists', 'mutes', 'next']);
-
-    if (url === null) {
-      return;
-    }
-
-    dispatch(expandMutesRequest());
-
-    api(getState).get(url).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(expandMutesSuccess(response.data, next ? next.uri : null));
-      dispatch(fetchRelationships(response.data.map(item => item.id)));
-    }).catch(error => dispatch(expandMutesFail(error)));
-  };
-};
-
-export function expandMutesRequest() {
-  return {
-    type: MUTES_EXPAND_REQUEST
-  };
-};
-
-export function expandMutesSuccess(accounts, next) {
-  return {
-    type: MUTES_EXPAND_SUCCESS,
-    accounts,
-    next
-  };
-};
-
-export function expandMutesFail(error) {
-  return {
-    type: MUTES_EXPAND_FAIL,
-    error
-  };
-};
diff --git a/app/assets/javascripts/components/actions/notifications.jsx b/app/assets/javascripts/components/actions/notifications.jsx
deleted file mode 100644
index b09ca0854..000000000
--- a/app/assets/javascripts/components/actions/notifications.jsx
+++ /dev/null
@@ -1,165 +0,0 @@
-import api, { getLinks } from '../api'
-import Immutable from 'immutable';
-import IntlMessageFormat from 'intl-messageformat';
-
-import { fetchRelationships } from './accounts';
-
-export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE';
-
-export const NOTIFICATIONS_REFRESH_REQUEST = 'NOTIFICATIONS_REFRESH_REQUEST';
-export const NOTIFICATIONS_REFRESH_SUCCESS = 'NOTIFICATIONS_REFRESH_SUCCESS';
-export const NOTIFICATIONS_REFRESH_FAIL    = 'NOTIFICATIONS_REFRESH_FAIL';
-
-export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST';
-export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS';
-export const NOTIFICATIONS_EXPAND_FAIL    = 'NOTIFICATIONS_EXPAND_FAIL';
-
-export const NOTIFICATIONS_CLEAR      = 'NOTIFICATIONS_CLEAR';
-export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
-
-const fetchRelatedRelationships = (dispatch, notifications) => {
-  const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id);
-
-  if (accountIds > 0) {
-    dispatch(fetchRelationships(accountIds));
-  }
-};
-
-export function updateNotifications(notification, intlMessages, intlLocale) {
-  return (dispatch, getState) => {
-    const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true);
-    const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true);
-
-    dispatch({
-      type: NOTIFICATIONS_UPDATE,
-      notification,
-      account: notification.account,
-      status: notification.status,
-      meta: playSound ? { sound: 'boop' } : undefined
-    });
-
-    fetchRelatedRelationships(dispatch, [notification]);
-
-    // Desktop notifications
-    if (typeof window.Notification !== 'undefined' && showAlert) {
-      const title = new IntlMessageFormat(intlMessages[`notification.${notification.type}`], intlLocale).format({ name: notification.account.display_name.length > 0 ? notification.account.display_name : notification.account.username });
-      const body  = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : $('<p>').html(notification.status ? notification.status.content : '').text();
-
-      new Notification(title, { body, icon: notification.account.avatar, tag: notification.id });
-    }
-  };
-};
-
-const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
-
-export function refreshNotifications() {
-  return (dispatch, getState) => {
-    dispatch(refreshNotificationsRequest());
-
-    const params = {};
-    const ids    = getState().getIn(['notifications', 'items']);
-
-    if (ids.size > 0) {
-      params.since_id = ids.first().get('id');
-    }
-
-    params.exclude_types = excludeTypesFromSettings(getState());
-
-    api(getState).get('/api/v1/notifications', { params }).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-
-      dispatch(refreshNotificationsSuccess(response.data, next ? next.uri : null));
-      fetchRelatedRelationships(dispatch, response.data);
-    }).catch(error => {
-      dispatch(refreshNotificationsFail(error));
-    });
-  };
-};
-
-export function refreshNotificationsRequest() {
-  return {
-    type: NOTIFICATIONS_REFRESH_REQUEST
-  };
-};
-
-export function refreshNotificationsSuccess(notifications, next) {
-  return {
-    type: NOTIFICATIONS_REFRESH_SUCCESS,
-    notifications,
-    accounts: notifications.map(item => item.account),
-    statuses: notifications.map(item => item.status).filter(status => !!status),
-    next
-  };
-};
-
-export function refreshNotificationsFail(error) {
-  return {
-    type: NOTIFICATIONS_REFRESH_FAIL,
-    error
-  };
-};
-
-export function expandNotifications() {
-  return (dispatch, getState) => {
-    const url = getState().getIn(['notifications', 'next'], null);
-
-    if (url === null || getState().getIn(['notifications', 'isLoading'])) {
-      return;
-    }
-
-    dispatch(expandNotificationsRequest());
-
-    const params = {};
-
-    params.exclude_types = excludeTypesFromSettings(getState());
-
-    api(getState).get(url, params).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-
-      dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null));
-      fetchRelatedRelationships(dispatch, response.data);
-    }).catch(error => {
-      dispatch(expandNotificationsFail(error));
-    });
-  };
-};
-
-export function expandNotificationsRequest() {
-  return {
-    type: NOTIFICATIONS_EXPAND_REQUEST
-  };
-};
-
-export function expandNotificationsSuccess(notifications, next) {
-  return {
-    type: NOTIFICATIONS_EXPAND_SUCCESS,
-    notifications,
-    accounts: notifications.map(item => item.account),
-    statuses: notifications.map(item => item.status).filter(status => !!status),
-    next
-  };
-};
-
-export function expandNotificationsFail(error) {
-  return {
-    type: NOTIFICATIONS_EXPAND_FAIL,
-    error
-  };
-};
-
-export function clearNotifications() {
-  return (dispatch, getState) => {
-    dispatch({
-      type: NOTIFICATIONS_CLEAR
-    });
-
-    api(getState).post('/api/v1/notifications/clear');
-  };
-};
-
-export function scrollTopNotifications(top) {
-  return {
-    type: NOTIFICATIONS_SCROLL_TOP,
-    top
-  };
-};
diff --git a/app/assets/javascripts/components/actions/onboarding.jsx b/app/assets/javascripts/components/actions/onboarding.jsx
deleted file mode 100644
index a161c50ef..000000000
--- a/app/assets/javascripts/components/actions/onboarding.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { openModal } from './modal';
-import { changeSetting, saveSettings } from './settings';
-
-export function showOnboardingOnce() {
-  return (dispatch, getState) => {
-    const alreadySeen = getState().getIn(['settings', 'onboarded']);
-
-    if (!alreadySeen) {
-      dispatch(openModal('ONBOARDING'));
-      dispatch(changeSetting(['onboarded'], true));
-      dispatch(saveSettings());
-    }
-  };
-};
diff --git a/app/assets/javascripts/components/actions/reports.jsx b/app/assets/javascripts/components/actions/reports.jsx
deleted file mode 100644
index 094670d62..000000000
--- a/app/assets/javascripts/components/actions/reports.jsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import api from '../api';
-
-export const REPORT_INIT   = 'REPORT_INIT';
-export const REPORT_CANCEL = 'REPORT_CANCEL';
-
-export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
-export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
-export const REPORT_SUBMIT_FAIL    = 'REPORT_SUBMIT_FAIL';
-
-export const REPORT_STATUS_TOGGLE  = 'REPORT_STATUS_TOGGLE';
-export const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
-
-export function initReport(account, status) {
-  return {
-    type: REPORT_INIT,
-    account,
-    status
-  };
-};
-
-export function cancelReport() {
-  return {
-    type: REPORT_CANCEL
-  };
-};
-
-export function toggleStatusReport(statusId, checked) {
-  return {
-    type: REPORT_STATUS_TOGGLE,
-    statusId,
-    checked,
-  };
-};
-
-export function submitReport() {
-  return (dispatch, getState) => {
-    dispatch(submitReportRequest());
-
-    api(getState).post('/api/v1/reports', {
-      account_id: getState().getIn(['reports', 'new', 'account_id']),
-      status_ids: getState().getIn(['reports', 'new', 'status_ids']),
-      comment: getState().getIn(['reports', 'new', 'comment'])
-    }).then(response => dispatch(submitReportSuccess(response.data))).catch(error => dispatch(submitReportFail(error)));
-  };
-};
-
-export function submitReportRequest() {
-  return {
-    type: REPORT_SUBMIT_REQUEST
-  };
-};
-
-export function submitReportSuccess(report) {
-  return {
-    type: REPORT_SUBMIT_SUCCESS,
-    report
-  };
-};
-
-export function submitReportFail(error) {
-  return {
-    type: REPORT_SUBMIT_FAIL,
-    error
-  };
-};
-
-export function changeReportComment(comment) {
-  return {
-    type: REPORT_COMMENT_CHANGE,
-    comment
-  };
-};
diff --git a/app/assets/javascripts/components/actions/search.jsx b/app/assets/javascripts/components/actions/search.jsx
deleted file mode 100644
index df3ae0db1..000000000
--- a/app/assets/javascripts/components/actions/search.jsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import api from '../api'
-
-export const SEARCH_CHANGE = 'SEARCH_CHANGE';
-export const SEARCH_CLEAR  = 'SEARCH_CLEAR';
-export const SEARCH_SHOW   = 'SEARCH_SHOW';
-
-export const SEARCH_FETCH_REQUEST = 'SEARCH_FETCH_REQUEST';
-export const SEARCH_FETCH_SUCCESS = 'SEARCH_FETCH_SUCCESS';
-export const SEARCH_FETCH_FAIL    = 'SEARCH_FETCH_FAIL';
-
-export function changeSearch(value) {
-  return {
-    type: SEARCH_CHANGE,
-    value
-  };
-};
-
-export function clearSearch() {
-  return {
-    type: SEARCH_CLEAR
-  };
-};
-
-export function submitSearch() {
-  return (dispatch, getState) => {
-    const value = getState().getIn(['search', 'value']);
-
-    if (value.length === 0) {
-      return;
-    }
-
-    dispatch(fetchSearchRequest());
-
-    api(getState).get('/api/v1/search', {
-      params: {
-        q: value,
-        resolve: true
-      }
-    }).then(response => {
-      dispatch(fetchSearchSuccess(response.data));
-    }).catch(error => {
-      dispatch(fetchSearchFail(error));
-    });
-  };
-};
-
-export function fetchSearchRequest() {
-  return {
-    type: SEARCH_FETCH_REQUEST
-  };
-};
-
-export function fetchSearchSuccess(results) {
-  return {
-    type: SEARCH_FETCH_SUCCESS,
-    results,
-    accounts: results.accounts,
-    statuses: results.statuses
-  };
-};
-
-export function fetchSearchFail(error) {
-  return {
-    type: SEARCH_FETCH_FAIL,
-    error
-  };
-};
-
-export function showSearch() {
-  return {
-    type: SEARCH_SHOW
-  };
-};
diff --git a/app/assets/javascripts/components/actions/settings.jsx b/app/assets/javascripts/components/actions/settings.jsx
deleted file mode 100644
index c754b30ca..000000000
--- a/app/assets/javascripts/components/actions/settings.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import axios from 'axios';
-
-export const SETTING_CHANGE = 'SETTING_CHANGE';
-
-export function changeSetting(key, value) {
-  return {
-    type: SETTING_CHANGE,
-    key,
-    value
-  };
-};
-
-export function saveSettings() {
-  return (_, getState) => {
-    axios.put('/api/web/settings', {
-      data: getState().get('settings').toJS()
-    });
-  };
-};
diff --git a/app/assets/javascripts/components/actions/statuses.jsx b/app/assets/javascripts/components/actions/statuses.jsx
deleted file mode 100644
index 19df2c36c..000000000
--- a/app/assets/javascripts/components/actions/statuses.jsx
+++ /dev/null
@@ -1,141 +0,0 @@
-import api from '../api';
-
-import { deleteFromTimelines } from './timelines';
-import { fetchStatusCard } from './cards';
-
-export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
-export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
-export const STATUS_FETCH_FAIL    = 'STATUS_FETCH_FAIL';
-
-export const STATUS_DELETE_REQUEST = 'STATUS_DELETE_REQUEST';
-export const STATUS_DELETE_SUCCESS = 'STATUS_DELETE_SUCCESS';
-export const STATUS_DELETE_FAIL    = 'STATUS_DELETE_FAIL';
-
-export const CONTEXT_FETCH_REQUEST = 'CONTEXT_FETCH_REQUEST';
-export const CONTEXT_FETCH_SUCCESS = 'CONTEXT_FETCH_SUCCESS';
-export const CONTEXT_FETCH_FAIL    = 'CONTEXT_FETCH_FAIL';
-
-export function fetchStatusRequest(id, skipLoading) {
-  return {
-    type: STATUS_FETCH_REQUEST,
-    id,
-    skipLoading
-  };
-};
-
-export function fetchStatus(id) {
-  return (dispatch, getState) => {
-    const skipLoading = getState().getIn(['statuses', id], null) !== null;
-
-    dispatch(fetchContext(id));
-    dispatch(fetchStatusCard(id));
-
-    if (skipLoading) {
-      return;
-    }
-
-    dispatch(fetchStatusRequest(id, skipLoading));
-
-    api(getState).get(`/api/v1/statuses/${id}`).then(response => {
-      dispatch(fetchStatusSuccess(response.data, skipLoading));
-    }).catch(error => {
-      dispatch(fetchStatusFail(id, error, skipLoading));
-    });
-  };
-};
-
-export function fetchStatusSuccess(status, skipLoading) {
-  return {
-    type: STATUS_FETCH_SUCCESS,
-    status,
-    skipLoading
-  };
-};
-
-export function fetchStatusFail(id, error, skipLoading) {
-  return {
-    type: STATUS_FETCH_FAIL,
-    id,
-    error,
-    skipLoading,
-    skipAlert: true
-  };
-};
-
-export function deleteStatus(id) {
-  return (dispatch, getState) => {
-    dispatch(deleteStatusRequest(id));
-
-    api(getState).delete(`/api/v1/statuses/${id}`).then(response => {
-      dispatch(deleteStatusSuccess(id));
-      dispatch(deleteFromTimelines(id));
-    }).catch(error => {
-      dispatch(deleteStatusFail(id, error));
-    });
-  };
-};
-
-export function deleteStatusRequest(id) {
-  return {
-    type: STATUS_DELETE_REQUEST,
-    id: id
-  };
-};
-
-export function deleteStatusSuccess(id) {
-  return {
-    type: STATUS_DELETE_SUCCESS,
-    id: id
-  };
-};
-
-export function deleteStatusFail(id, error) {
-  return {
-    type: STATUS_DELETE_FAIL,
-    id: id,
-    error: error
-  };
-};
-
-export function fetchContext(id) {
-  return (dispatch, getState) => {
-    dispatch(fetchContextRequest(id));
-
-    api(getState).get(`/api/v1/statuses/${id}/context`).then(response => {
-      dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants));
-
-    }).catch(error => {
-      if (error.response.status === 404) {
-        dispatch(deleteFromTimelines(id));
-      }
-
-      dispatch(fetchContextFail(id, error));
-    });
-  };
-};
-
-export function fetchContextRequest(id) {
-  return {
-    type: CONTEXT_FETCH_REQUEST,
-    id
-  };
-};
-
-export function fetchContextSuccess(id, ancestors, descendants) {
-  return {
-    type: CONTEXT_FETCH_SUCCESS,
-    id,
-    ancestors,
-    descendants,
-    statuses: ancestors.concat(descendants)
-  };
-};
-
-export function fetchContextFail(id, error) {
-  return {
-    type: CONTEXT_FETCH_FAIL,
-    id,
-    error,
-    skipAlert: true
-  };
-};
diff --git a/app/assets/javascripts/components/actions/store.jsx b/app/assets/javascripts/components/actions/store.jsx
deleted file mode 100644
index 3bba99549..000000000
--- a/app/assets/javascripts/components/actions/store.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import Immutable from 'immutable';
-
-export const STORE_HYDRATE = 'STORE_HYDRATE';
-
-const convertState = rawState =>
-  Immutable.fromJS(rawState, (k, v) =>
-    Immutable.Iterable.isIndexed(v) ? v.toList() : v.toMap().mapKeys(x =>
-      Number.isNaN(x * 1) ? x : x * 1));
-
-export function hydrateStore(rawState) {
-  const state = convertState(rawState);
-
-  return {
-    type: STORE_HYDRATE,
-    state
-  };
-};
diff --git a/app/assets/javascripts/components/actions/timelines.jsx b/app/assets/javascripts/components/actions/timelines.jsx
deleted file mode 100644
index 6cd1f04b3..000000000
--- a/app/assets/javascripts/components/actions/timelines.jsx
+++ /dev/null
@@ -1,186 +0,0 @@
-import api, { getLinks } from '../api'
-import Immutable from 'immutable';
-
-export const TIMELINE_UPDATE  = 'TIMELINE_UPDATE';
-export const TIMELINE_DELETE  = 'TIMELINE_DELETE';
-
-export const TIMELINE_REFRESH_REQUEST = 'TIMELINE_REFRESH_REQUEST';
-export const TIMELINE_REFRESH_SUCCESS = 'TIMELINE_REFRESH_SUCCESS';
-export const TIMELINE_REFRESH_FAIL    = 'TIMELINE_REFRESH_FAIL';
-
-export const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST';
-export const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS';
-export const TIMELINE_EXPAND_FAIL    = 'TIMELINE_EXPAND_FAIL';
-
-export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP';
-
-export const TIMELINE_CONNECT    = 'TIMELINE_CONNECT';
-export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';
-
-export function refreshTimelineSuccess(timeline, statuses, skipLoading, next) {
-  return {
-    type: TIMELINE_REFRESH_SUCCESS,
-    timeline,
-    statuses,
-    skipLoading,
-    next
-  };
-};
-
-export function updateTimeline(timeline, status) {
-  return (dispatch, getState) => {
-    const references = status.reblog ? getState().get('statuses').filter((item, itemId) => (itemId === status.reblog.id || item.get('reblog') === status.reblog.id)).map((_, itemId) => itemId) : [];
-
-    dispatch({
-      type: TIMELINE_UPDATE,
-      timeline,
-      status,
-      references
-    });
-  };
-};
-
-export function deleteFromTimelines(id) {
-  return (dispatch, getState) => {
-    const accountId  = getState().getIn(['statuses', id, 'account']);
-    const references = getState().get('statuses').filter(status => status.get('reblog') === id).map(status => [status.get('id'), status.get('account')]);
-    const reblogOf   = getState().getIn(['statuses', id, 'reblog'], null);
-
-    dispatch({
-      type: TIMELINE_DELETE,
-      id,
-      accountId,
-      references,
-      reblogOf
-    });
-  };
-};
-
-export function refreshTimelineRequest(timeline, id, skipLoading) {
-  return {
-    type: TIMELINE_REFRESH_REQUEST,
-    timeline,
-    id,
-    skipLoading
-  };
-};
-
-export function refreshTimeline(timeline, id = null) {
-  return function (dispatch, getState) {
-    if (getState().getIn(['timelines', timeline, 'isLoading'])) {
-      return;
-    }
-
-    const ids      = getState().getIn(['timelines', timeline, 'items'], Immutable.List());
-    const newestId = ids.size > 0 ? ids.first() : null;
-    let params     = getState().getIn(['timelines', timeline, 'params'], {});
-    const path     = getState().getIn(['timelines', timeline, 'path'])(id);
-
-    let skipLoading = false;
-
-    if (newestId !== null && getState().getIn(['timelines', timeline, 'loaded']) && (id === null || getState().getIn(['timelines', timeline, 'id']) === id)) {
-      if (id === null && getState().getIn(['timelines', timeline, 'online'])) {
-        // Skip refreshing when timeline is live anyway
-        return;
-      }
-
-      params          = { ...params, since_id: newestId };
-      skipLoading     = true;
-    }
-
-    dispatch(refreshTimelineRequest(timeline, id, skipLoading));
-
-    api(getState).get(path, { params }).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(refreshTimelineSuccess(timeline, response.data, skipLoading, next ? next.uri : null));
-    }).catch(error => {
-      dispatch(refreshTimelineFail(timeline, error, skipLoading));
-    });
-  };
-};
-
-export function refreshTimelineFail(timeline, error, skipLoading) {
-  return {
-    type: TIMELINE_REFRESH_FAIL,
-    timeline,
-    error,
-    skipLoading
-  };
-};
-
-export function expandTimeline(timeline) {
-  return (dispatch, getState) => {
-    if (getState().getIn(['timelines', timeline, 'isLoading'])) {
-      return;
-    }
-
-    if (getState().getIn(['timelines', timeline, 'items']).size === 0) {
-      return;
-    }
-
-    const path   = getState().getIn(['timelines', timeline, 'path'])(getState().getIn(['timelines', timeline, 'id']));
-    const params = getState().getIn(['timelines', timeline, 'params'], {});
-    const lastId = getState().getIn(['timelines', timeline, 'items']).last();
-
-    dispatch(expandTimelineRequest(timeline));
-
-    api(getState).get(path, {
-      params: {
-        ...params,
-        max_id: lastId,
-        limit: 10
-      }
-    }).then(response => {
-      const next = getLinks(response).refs.find(link => link.rel === 'next');
-      dispatch(expandTimelineSuccess(timeline, response.data, next ? next.uri : null));
-    }).catch(error => {
-      dispatch(expandTimelineFail(timeline, error));
-    });
-  };
-};
-
-export function expandTimelineRequest(timeline) {
-  return {
-    type: TIMELINE_EXPAND_REQUEST,
-    timeline
-  };
-};
-
-export function expandTimelineSuccess(timeline, statuses, next) {
-  return {
-    type: TIMELINE_EXPAND_SUCCESS,
-    timeline,
-    statuses,
-    next
-  };
-};
-
-export function expandTimelineFail(timeline, error) {
-  return {
-    type: TIMELINE_EXPAND_FAIL,
-    timeline,
-    error
-  };
-};
-
-export function scrollTopTimeline(timeline, top) {
-  return {
-    type: TIMELINE_SCROLL_TOP,
-    timeline,
-    top
-  };
-};
-
-export function connectTimeline(timeline) {
-  return {
-    type: TIMELINE_CONNECT,
-    timeline
-  };
-};
-
-export function disconnectTimeline(timeline) {
-  return {
-    type: TIMELINE_DISCONNECT,
-    timeline
-  };
-};