From f5bf5ebb82e3af420dcd23d602b1be6cc86838e1 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 3 May 2017 02:04:16 +0200 Subject: 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 * Add react definitions to places that use JSX * Add Procfile.dev for running rails, webpack and streaming API at the same time --- app/assets/javascripts/application.js | 15 - app/assets/javascripts/application_public.js | 9 - app/assets/javascripts/components.js | 15 - app/assets/javascripts/components/.gitkeep | 0 .../javascripts/components/actions/accounts.jsx | 762 --------------------- .../javascripts/components/actions/alerts.jsx | 24 - .../javascripts/components/actions/blocks.jsx | 82 --- .../javascripts/components/actions/cards.jsx | 52 -- .../javascripts/components/actions/compose.jsx | 279 -------- .../javascripts/components/actions/favourites.jsx | 83 --- .../components/actions/interactions.jsx | 235 ------- .../javascripts/components/actions/modal.jsx | 16 - .../javascripts/components/actions/mutes.jsx | 82 --- .../components/actions/notifications.jsx | 165 ----- .../javascripts/components/actions/onboarding.jsx | 14 - .../javascripts/components/actions/reports.jsx | 72 -- .../javascripts/components/actions/search.jsx | 73 -- .../javascripts/components/actions/settings.jsx | 19 - .../javascripts/components/actions/statuses.jsx | 141 ---- .../javascripts/components/actions/store.jsx | 17 - .../javascripts/components/actions/timelines.jsx | 186 ----- app/assets/javascripts/components/api.jsx | 26 - .../javascripts/components/components/account.jsx | 91 --- .../components/components/attachment_list.jsx | 32 - .../components/components/autosuggest_textarea.jsx | 211 ------ .../javascripts/components/components/avatar.jsx | 63 -- .../javascripts/components/components/button.jsx | 49 -- .../components/components/collapsable.jsx | 20 - .../components/components/column_back_button.jsx | 31 - .../components/column_back_button_slim.jsx | 31 - .../components/components/column_collapsable.jsx | 56 -- .../components/components/display_name.jsx | 24 - .../components/components/dropdown_menu.jsx | 78 --- .../components/extended_video_player.jsx | 53 -- .../components/components/icon_button.jsx | 95 --- .../components/components/load_more.jsx | 14 - .../components/components/loading_indicator.jsx | 9 - .../components/components/media_gallery.jsx | 195 ------ .../components/components/missing_indicator.jsx | 9 - .../components/components/permalink.jsx | 36 - .../components/components/relative_timestamp.jsx | 19 - .../javascripts/components/components/status.jsx | 121 ---- .../components/components/status_action_bar.jsx | 137 ---- .../components/components/status_content.jsx | 157 ----- .../components/components/status_list.jsx | 128 ---- .../components/components/video_player.jsx | 198 ------ .../components/containers/account_container.jsx | 50 -- .../javascripts/components/containers/mastodon.jsx | 320 --------- .../components/containers/status_container.jsx | 117 ---- app/assets/javascripts/components/emoji.jsx | 35 - .../features/account/components/action_bar.jsx | 92 --- .../features/account/components/header.jsx | 148 ---- .../account_timeline/components/header.jsx | 81 --- .../containers/header_container.jsx | 75 -- .../components/features/account_timeline/index.jsx | 87 --- .../components/features/blocks/index.jsx | 72 -- .../features/community_timeline/index.jsx | 95 --- .../compose/components/autosuggest_account.jsx | 16 - .../compose/components/autosuggest_status.jsx | 15 - .../compose/components/character_counter.jsx | 26 - .../features/compose/components/compose_form.jsx | 209 ------ .../compose/components/emoji_picker_dropdown.jsx | 114 --- .../features/compose/components/navigation_bar.jsx | 32 - .../compose/components/privacy_dropdown.jsx | 104 --- .../compose/components/reply_indicator.jsx | 69 -- .../features/compose/components/search.jsx | 82 --- .../features/compose/components/search_results.jsx | 65 -- .../compose/components/text_icon_button.jsx | 35 - .../features/compose/components/upload_button.jsx | 60 -- .../features/compose/components/upload_form.jsx | 45 -- .../compose/components/upload_progress.jsx | 42 -- .../features/compose/components/warning.jsx | 25 - .../containers/autosuggest_account_container.jsx | 15 - .../containers/autosuggest_status_container.jsx | 15 - .../compose/containers/compose_form_container.jsx | 64 -- .../compose/containers/navigation_container.jsx | 10 - .../containers/privacy_dropdown_container.jsx | 17 - .../containers/reply_indicator_container.jsx | 24 - .../compose/containers/search_container.jsx | 35 - .../containers/search_results_container.jsx | 8 - .../containers/sensitive_button_container.jsx | 50 -- .../containers/spoiler_button_container.jsx | 25 - .../compose/containers/upload_button_container.jsx | 18 - .../compose/containers/upload_form_container.jsx | 17 - .../containers/upload_progress_container.jsx | 9 - .../compose/containers/warning_container.jsx | 48 -- .../components/features/compose/index.jsx | 85 --- .../features/favourited_statuses/index.jsx | 66 -- .../components/features/favourites/index.jsx | 59 -- .../components/account_authorize.jsx | 44 -- .../containers/account_authorize_container.jsx | 26 - .../components/features/follow_requests/index.jsx | 72 -- .../components/features/followers/index.jsx | 90 --- .../components/features/following/index.jsx | 90 --- .../features/generic_not_found/index.jsx | 10 - .../components/features/getting_started/index.jsx | 66 -- .../components/features/hashtag_timeline/index.jsx | 89 --- .../home_timeline/components/column_settings.jsx | 50 -- .../home_timeline/components/setting_text.jsx | 37 - .../containers/column_settings_container.jsx | 21 - .../components/features/home_timeline/index.jsx | 37 - .../components/features/mutes/index.jsx | 73 -- .../components/clear_column_button.jsx | 26 - .../notifications/components/column_settings.jsx | 70 -- .../notifications/components/notification.jsx | 88 --- .../notifications/components/setting_toggle.jsx | 20 - .../containers/column_settings_container.jsx | 21 - .../containers/notification_container.jsx | 15 - .../components/features/notifications/index.jsx | 142 ---- .../components/features/public_timeline/index.jsx | 95 --- .../components/features/reblogs/index.jsx | 59 -- .../report/components/status_check_box.jsx | 39 -- .../containers/status_check_box_container.jsx | 19 - .../components/features/report/index.jsx | 130 ---- .../features/status/components/action_bar.jsx | 101 --- .../components/features/status/components/card.jsx | 95 --- .../features/status/components/detailed_status.jsx | 94 --- .../features/status/containers/card_container.jsx | 8 - .../components/features/status/index.jsx | 197 ------ .../features/ui/components/boost_modal.jsx | 82 --- .../components/features/ui/components/column.jsx | 82 --- .../features/ui/components/column_header.jsx | 42 -- .../features/ui/components/column_link.jsx | 31 - .../features/ui/components/column_subheading.jsx | 15 - .../features/ui/components/columns_area.jsx | 19 - .../features/ui/components/confirmation_modal.jsx | 50 -- .../features/ui/components/media_modal.jsx | 101 --- .../features/ui/components/modal_root.jsx | 92 --- .../features/ui/components/onboarding_modal.jsx | 263 ------- .../components/features/ui/components/tabs_bar.jsx | 23 - .../features/ui/components/upload_area.jsx | 59 -- .../features/ui/components/video_modal.jsx | 38 - .../ui/containers/loading_bar_container.jsx | 8 - .../features/ui/containers/modal_container.jsx | 16 - .../ui/containers/notifications_container.jsx | 21 - .../ui/containers/status_list_container.jsx | 74 -- .../javascripts/components/features/ui/index.jsx | 166 ----- app/assets/javascripts/components/is_mobile.jsx | 11 - app/assets/javascripts/components/link_header.jsx | 33 - app/assets/javascripts/components/locales/ar.jsx | 131 ---- app/assets/javascripts/components/locales/bg.jsx | 68 -- app/assets/javascripts/components/locales/de.jsx | 126 ---- app/assets/javascripts/components/locales/en.jsx | 177 ----- app/assets/javascripts/components/locales/eo.jsx | 68 -- app/assets/javascripts/components/locales/es.jsx | 93 --- app/assets/javascripts/components/locales/fa.jsx | 136 ---- app/assets/javascripts/components/locales/fi.jsx | 68 -- app/assets/javascripts/components/locales/fr.jsx | 155 ----- app/assets/javascripts/components/locales/he.jsx | 177 ----- app/assets/javascripts/components/locales/hr.jsx | 121 ---- app/assets/javascripts/components/locales/hu.jsx | 57 -- app/assets/javascripts/components/locales/id.jsx | 167 ----- .../javascripts/components/locales/index.jsx | 57 -- app/assets/javascripts/components/locales/io.jsx | 126 ---- app/assets/javascripts/components/locales/it.jsx | 125 ---- app/assets/javascripts/components/locales/ja.jsx | 167 ----- app/assets/javascripts/components/locales/nl.jsx | 130 ---- app/assets/javascripts/components/locales/no.jsx | 130 ---- app/assets/javascripts/components/locales/oc.jsx | 128 ---- .../javascripts/components/locales/pt-br.jsx | 125 ---- app/assets/javascripts/components/locales/pt.jsx | 125 ---- app/assets/javascripts/components/locales/ru.jsx | 138 ---- app/assets/javascripts/components/locales/uk.jsx | 57 -- .../javascripts/components/locales/zh-cn.jsx | 157 ----- .../javascripts/components/locales/zh-hk.jsx | 150 ---- .../javascripts/components/middleware/errors.jsx | 33 - .../components/middleware/loading_bar.jsx | 25 - .../javascripts/components/middleware/sounds.jsx | 22 - .../javascripts/components/reducers/accounts.jsx | 131 ---- .../javascripts/components/reducers/alerts.jsx | 25 - .../javascripts/components/reducers/cards.jsx | 14 - .../javascripts/components/reducers/compose.jsx | 232 ------- .../javascripts/components/reducers/index.jsx | 36 - .../javascripts/components/reducers/meta.jsx | 17 - .../javascripts/components/reducers/modal.jsx | 18 - .../components/reducers/notifications.jsx | 104 --- .../components/reducers/relationships.jsx | 38 - .../javascripts/components/reducers/reports.jsx | 60 -- .../javascripts/components/reducers/search.jsx | 96 --- .../javascripts/components/reducers/settings.jsx | 48 -- .../components/reducers/status_lists.jsx | 39 -- .../javascripts/components/reducers/statuses.jsx | 124 ---- .../javascripts/components/reducers/timelines.jsx | 317 --------- .../javascripts/components/reducers/user_lists.jsx | 80 --- app/assets/javascripts/components/rtl.jsx | 27 - .../javascripts/components/selectors/index.jsx | 72 -- .../components/store/configureStore.jsx | 16 - app/assets/javascripts/components/stream.jsx | 22 - app/assets/javascripts/components/uuid.jsx | 3 - app/assets/javascripts/extras.jsx | 49 -- 190 files changed, 14857 deletions(-) delete mode 100644 app/assets/javascripts/application.js delete mode 100644 app/assets/javascripts/application_public.js delete mode 100644 app/assets/javascripts/components.js delete mode 100644 app/assets/javascripts/components/.gitkeep delete mode 100644 app/assets/javascripts/components/actions/accounts.jsx delete mode 100644 app/assets/javascripts/components/actions/alerts.jsx delete mode 100644 app/assets/javascripts/components/actions/blocks.jsx delete mode 100644 app/assets/javascripts/components/actions/cards.jsx delete mode 100644 app/assets/javascripts/components/actions/compose.jsx delete mode 100644 app/assets/javascripts/components/actions/favourites.jsx delete mode 100644 app/assets/javascripts/components/actions/interactions.jsx delete mode 100644 app/assets/javascripts/components/actions/modal.jsx delete mode 100644 app/assets/javascripts/components/actions/mutes.jsx delete mode 100644 app/assets/javascripts/components/actions/notifications.jsx delete mode 100644 app/assets/javascripts/components/actions/onboarding.jsx delete mode 100644 app/assets/javascripts/components/actions/reports.jsx delete mode 100644 app/assets/javascripts/components/actions/search.jsx delete mode 100644 app/assets/javascripts/components/actions/settings.jsx delete mode 100644 app/assets/javascripts/components/actions/statuses.jsx delete mode 100644 app/assets/javascripts/components/actions/store.jsx delete mode 100644 app/assets/javascripts/components/actions/timelines.jsx delete mode 100644 app/assets/javascripts/components/api.jsx delete mode 100644 app/assets/javascripts/components/components/account.jsx delete mode 100644 app/assets/javascripts/components/components/attachment_list.jsx delete mode 100644 app/assets/javascripts/components/components/autosuggest_textarea.jsx delete mode 100644 app/assets/javascripts/components/components/avatar.jsx delete mode 100644 app/assets/javascripts/components/components/button.jsx delete mode 100644 app/assets/javascripts/components/components/collapsable.jsx delete mode 100644 app/assets/javascripts/components/components/column_back_button.jsx delete mode 100644 app/assets/javascripts/components/components/column_back_button_slim.jsx delete mode 100644 app/assets/javascripts/components/components/column_collapsable.jsx delete mode 100644 app/assets/javascripts/components/components/display_name.jsx delete mode 100644 app/assets/javascripts/components/components/dropdown_menu.jsx delete mode 100644 app/assets/javascripts/components/components/extended_video_player.jsx delete mode 100644 app/assets/javascripts/components/components/icon_button.jsx delete mode 100644 app/assets/javascripts/components/components/load_more.jsx delete mode 100644 app/assets/javascripts/components/components/loading_indicator.jsx delete mode 100644 app/assets/javascripts/components/components/media_gallery.jsx delete mode 100644 app/assets/javascripts/components/components/missing_indicator.jsx delete mode 100644 app/assets/javascripts/components/components/permalink.jsx delete mode 100644 app/assets/javascripts/components/components/relative_timestamp.jsx delete mode 100644 app/assets/javascripts/components/components/status.jsx delete mode 100644 app/assets/javascripts/components/components/status_action_bar.jsx delete mode 100644 app/assets/javascripts/components/components/status_content.jsx delete mode 100644 app/assets/javascripts/components/components/status_list.jsx delete mode 100644 app/assets/javascripts/components/components/video_player.jsx delete mode 100644 app/assets/javascripts/components/containers/account_container.jsx delete mode 100644 app/assets/javascripts/components/containers/mastodon.jsx delete mode 100644 app/assets/javascripts/components/containers/status_container.jsx delete mode 100644 app/assets/javascripts/components/emoji.jsx delete mode 100644 app/assets/javascripts/components/features/account/components/action_bar.jsx delete mode 100644 app/assets/javascripts/components/features/account/components/header.jsx delete mode 100644 app/assets/javascripts/components/features/account_timeline/components/header.jsx delete mode 100644 app/assets/javascripts/components/features/account_timeline/containers/header_container.jsx delete mode 100644 app/assets/javascripts/components/features/account_timeline/index.jsx delete mode 100644 app/assets/javascripts/components/features/blocks/index.jsx delete mode 100644 app/assets/javascripts/components/features/community_timeline/index.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/autosuggest_account.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/autosuggest_status.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/character_counter.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/compose_form.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/emoji_picker_dropdown.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/navigation_bar.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/privacy_dropdown.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/reply_indicator.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/search.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/search_results.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/text_icon_button.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/upload_button.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/upload_form.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/upload_progress.jsx delete mode 100644 app/assets/javascripts/components/features/compose/components/warning.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/autosuggest_account_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/autosuggest_status_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/compose_form_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/navigation_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/privacy_dropdown_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/reply_indicator_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/search_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/search_results_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/sensitive_button_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/spoiler_button_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/upload_button_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/upload_form_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/upload_progress_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/containers/warning_container.jsx delete mode 100644 app/assets/javascripts/components/features/compose/index.jsx delete mode 100644 app/assets/javascripts/components/features/favourited_statuses/index.jsx delete mode 100644 app/assets/javascripts/components/features/favourites/index.jsx delete mode 100644 app/assets/javascripts/components/features/follow_requests/components/account_authorize.jsx delete mode 100644 app/assets/javascripts/components/features/follow_requests/containers/account_authorize_container.jsx delete mode 100644 app/assets/javascripts/components/features/follow_requests/index.jsx delete mode 100644 app/assets/javascripts/components/features/followers/index.jsx delete mode 100644 app/assets/javascripts/components/features/following/index.jsx delete mode 100644 app/assets/javascripts/components/features/generic_not_found/index.jsx delete mode 100644 app/assets/javascripts/components/features/getting_started/index.jsx delete mode 100644 app/assets/javascripts/components/features/hashtag_timeline/index.jsx delete mode 100644 app/assets/javascripts/components/features/home_timeline/components/column_settings.jsx delete mode 100644 app/assets/javascripts/components/features/home_timeline/components/setting_text.jsx delete mode 100644 app/assets/javascripts/components/features/home_timeline/containers/column_settings_container.jsx delete mode 100644 app/assets/javascripts/components/features/home_timeline/index.jsx delete mode 100644 app/assets/javascripts/components/features/mutes/index.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/components/clear_column_button.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/components/column_settings.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/components/notification.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/components/setting_toggle.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/containers/column_settings_container.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/containers/notification_container.jsx delete mode 100644 app/assets/javascripts/components/features/notifications/index.jsx delete mode 100644 app/assets/javascripts/components/features/public_timeline/index.jsx delete mode 100644 app/assets/javascripts/components/features/reblogs/index.jsx delete mode 100644 app/assets/javascripts/components/features/report/components/status_check_box.jsx delete mode 100644 app/assets/javascripts/components/features/report/containers/status_check_box_container.jsx delete mode 100644 app/assets/javascripts/components/features/report/index.jsx delete mode 100644 app/assets/javascripts/components/features/status/components/action_bar.jsx delete mode 100644 app/assets/javascripts/components/features/status/components/card.jsx delete mode 100644 app/assets/javascripts/components/features/status/components/detailed_status.jsx delete mode 100644 app/assets/javascripts/components/features/status/containers/card_container.jsx delete mode 100644 app/assets/javascripts/components/features/status/index.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/boost_modal.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/column.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/column_header.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/column_link.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/column_subheading.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/columns_area.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/confirmation_modal.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/media_modal.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/modal_root.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/onboarding_modal.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/tabs_bar.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/upload_area.jsx delete mode 100644 app/assets/javascripts/components/features/ui/components/video_modal.jsx delete mode 100644 app/assets/javascripts/components/features/ui/containers/loading_bar_container.jsx delete mode 100644 app/assets/javascripts/components/features/ui/containers/modal_container.jsx delete mode 100644 app/assets/javascripts/components/features/ui/containers/notifications_container.jsx delete mode 100644 app/assets/javascripts/components/features/ui/containers/status_list_container.jsx delete mode 100644 app/assets/javascripts/components/features/ui/index.jsx delete mode 100644 app/assets/javascripts/components/is_mobile.jsx delete mode 100644 app/assets/javascripts/components/link_header.jsx delete mode 100644 app/assets/javascripts/components/locales/ar.jsx delete mode 100644 app/assets/javascripts/components/locales/bg.jsx delete mode 100644 app/assets/javascripts/components/locales/de.jsx delete mode 100644 app/assets/javascripts/components/locales/en.jsx delete mode 100644 app/assets/javascripts/components/locales/eo.jsx delete mode 100644 app/assets/javascripts/components/locales/es.jsx delete mode 100644 app/assets/javascripts/components/locales/fa.jsx delete mode 100644 app/assets/javascripts/components/locales/fi.jsx delete mode 100644 app/assets/javascripts/components/locales/fr.jsx delete mode 100644 app/assets/javascripts/components/locales/he.jsx delete mode 100644 app/assets/javascripts/components/locales/hr.jsx delete mode 100644 app/assets/javascripts/components/locales/hu.jsx delete mode 100644 app/assets/javascripts/components/locales/id.jsx delete mode 100644 app/assets/javascripts/components/locales/index.jsx delete mode 100644 app/assets/javascripts/components/locales/io.jsx delete mode 100644 app/assets/javascripts/components/locales/it.jsx delete mode 100644 app/assets/javascripts/components/locales/ja.jsx delete mode 100644 app/assets/javascripts/components/locales/nl.jsx delete mode 100644 app/assets/javascripts/components/locales/no.jsx delete mode 100644 app/assets/javascripts/components/locales/oc.jsx delete mode 100644 app/assets/javascripts/components/locales/pt-br.jsx delete mode 100644 app/assets/javascripts/components/locales/pt.jsx delete mode 100644 app/assets/javascripts/components/locales/ru.jsx delete mode 100644 app/assets/javascripts/components/locales/uk.jsx delete mode 100644 app/assets/javascripts/components/locales/zh-cn.jsx delete mode 100644 app/assets/javascripts/components/locales/zh-hk.jsx delete mode 100644 app/assets/javascripts/components/middleware/errors.jsx delete mode 100644 app/assets/javascripts/components/middleware/loading_bar.jsx delete mode 100644 app/assets/javascripts/components/middleware/sounds.jsx delete mode 100644 app/assets/javascripts/components/reducers/accounts.jsx delete mode 100644 app/assets/javascripts/components/reducers/alerts.jsx delete mode 100644 app/assets/javascripts/components/reducers/cards.jsx delete mode 100644 app/assets/javascripts/components/reducers/compose.jsx delete mode 100644 app/assets/javascripts/components/reducers/index.jsx delete mode 100644 app/assets/javascripts/components/reducers/meta.jsx delete mode 100644 app/assets/javascripts/components/reducers/modal.jsx delete mode 100644 app/assets/javascripts/components/reducers/notifications.jsx delete mode 100644 app/assets/javascripts/components/reducers/relationships.jsx delete mode 100644 app/assets/javascripts/components/reducers/reports.jsx delete mode 100644 app/assets/javascripts/components/reducers/search.jsx delete mode 100644 app/assets/javascripts/components/reducers/settings.jsx delete mode 100644 app/assets/javascripts/components/reducers/status_lists.jsx delete mode 100644 app/assets/javascripts/components/reducers/statuses.jsx delete mode 100644 app/assets/javascripts/components/reducers/timelines.jsx delete mode 100644 app/assets/javascripts/components/reducers/user_lists.jsx delete mode 100644 app/assets/javascripts/components/rtl.jsx delete mode 100644 app/assets/javascripts/components/selectors/index.jsx delete mode 100644 app/assets/javascripts/components/store/configureStore.jsx delete mode 100644 app/assets/javascripts/components/stream.jsx delete mode 100644 app/assets/javascripts/components/uuid.jsx delete mode 100644 app/assets/javascripts/extras.jsx (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js deleted file mode 100644 index 441282825..000000000 --- a/app/assets/javascripts/application.js +++ /dev/null @@ -1,15 +0,0 @@ -// This is a manifest file that'll be compiled into application.js, which will include all the files -// listed below. -// -// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, -// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. -// -// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// compiled file. -// -// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details -// about supported directives. -// -//= require jquery2 -//= require jquery_ujs -//= require components diff --git a/app/assets/javascripts/application_public.js b/app/assets/javascripts/application_public.js deleted file mode 100644 index 7df4891e7..000000000 --- a/app/assets/javascripts/application_public.js +++ /dev/null @@ -1,9 +0,0 @@ -//= require jquery2 -//= require jquery_ujs -//= require extras -//= require best_in_place -//= require local_time - -$(function () { - $(".best_in_place").best_in_place(); -}); diff --git a/app/assets/javascripts/components.js b/app/assets/javascripts/components.js deleted file mode 100644 index 1604d5198..000000000 --- a/app/assets/javascripts/components.js +++ /dev/null @@ -1,15 +0,0 @@ -//= require_self -//= require react_ujs - -window.React = require('react'); -window.ReactDOM = require('react-dom'); -window.Perf = require('react-addons-perf'); - -if (!window.Intl) { - require('intl'); - require('intl/locale-data/jsonp/en.js'); -} - -//= require_tree ./components - -window.Mastodon = require('./components/containers/mastodon'); diff --git a/app/assets/javascripts/components/.gitkeep b/app/assets/javascripts/components/.gitkeep deleted file mode 100644 index e69de29bb..000000000 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 : $('

').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 - }; -}; diff --git a/app/assets/javascripts/components/api.jsx b/app/assets/javascripts/components/api.jsx deleted file mode 100644 index 185729ce0..000000000 --- a/app/assets/javascripts/components/api.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import axios from 'axios'; -import LinkHeader from './link_header'; - -export const getLinks = response => { - const value = response.headers.link; - - if (!value) { - return { refs: [] }; - } - - return LinkHeader.parse(value); -}; - -export default getState => axios.create({ - headers: { - 'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}` - }, - - transformResponse: [function (data) { - try { - return JSON.parse(data); - } catch(Exception) { - return data; - } - }] -}); diff --git a/app/assets/javascripts/components/components/account.jsx b/app/assets/javascripts/components/components/account.jsx deleted file mode 100644 index 81439bd25..000000000 --- a/app/assets/javascripts/components/components/account.jsx +++ /dev/null @@ -1,91 +0,0 @@ -import ImmutablePropTypes from 'react-immutable-proptypes'; -import PropTypes from 'prop-types'; -import Avatar from './avatar'; -import DisplayName from './display_name'; -import Permalink from './permalink'; -import IconButton from './icon_button'; -import { defineMessages, injectIntl } from 'react-intl'; - -const messages = defineMessages({ - follow: { id: 'account.follow', defaultMessage: 'Follow' }, - unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, - requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' }, - unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, - unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' } -}); - -class Account extends React.PureComponent { - - constructor (props, context) { - super(props, context); - this.handleFollow = this.handleFollow.bind(this); - this.handleBlock = this.handleBlock.bind(this); - this.handleMute = this.handleMute.bind(this); - } - - handleFollow () { - this.props.onFollow(this.props.account); - } - - handleBlock () { - this.props.onBlock(this.props.account); - } - - handleMute () { - this.props.onMute(this.props.account); - } - - render () { - const { account, me, intl } = this.props; - - if (!account) { - return

; - } - - let buttons; - - if (account.get('id') !== me && account.get('relationship', null) !== null) { - const following = account.getIn(['relationship', 'following']); - const requested = account.getIn(['relationship', 'requested']); - const blocking = account.getIn(['relationship', 'blocking']); - const muting = account.getIn(['relationship', 'muting']); - - if (requested) { - buttons = - } else if (blocking) { - buttons = ; - } else if (muting) { - buttons = ; - } else { - buttons = ; - } - } - - return ( -
-
- -
- -
- -
- {buttons} -
-
-
- ); - } - -} - -Account.propTypes = { - account: ImmutablePropTypes.map.isRequired, - me: PropTypes.number.isRequired, - onFollow: PropTypes.func.isRequired, - onBlock: PropTypes.func.isRequired, - onMute: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired -} - -export default injectIntl(Account); diff --git a/app/assets/javascripts/components/components/attachment_list.jsx b/app/assets/javascripts/components/components/attachment_list.jsx deleted file mode 100644 index 54841fa51..000000000 --- a/app/assets/javascripts/components/components/attachment_list.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import ImmutablePropTypes from 'react-immutable-proptypes'; - -const filename = url => url.split('/').pop().split('#')[0].split('?')[0]; - -class AttachmentList extends React.PureComponent { - - render () { - const { media } = this.props; - - return ( -
-
- -
- - -
- ); - } -} - -AttachmentList.propTypes = { - media: ImmutablePropTypes.list.isRequired -}; - -export default AttachmentList; diff --git a/app/assets/javascripts/components/components/autosuggest_textarea.jsx b/app/assets/javascripts/components/components/autosuggest_textarea.jsx deleted file mode 100644 index 9a4d5b7e3..000000000 --- a/app/assets/javascripts/components/components/autosuggest_textarea.jsx +++ /dev/null @@ -1,211 +0,0 @@ -import AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import PropTypes from 'prop-types'; -import { isRtl } from '../rtl'; - -const textAtCursorMatchesToken = (str, caretPosition) => { - let word; - - let left = str.slice(0, caretPosition).search(/\S+$/); - let right = str.slice(caretPosition).search(/\s/); - - if (right < 0) { - word = str.slice(left); - } else { - word = str.slice(left, right + caretPosition); - } - - if (!word || word.trim().length < 2 || word[0] !== '@') { - return [null, null]; - } - - word = word.trim().toLowerCase().slice(1); - - if (word.length > 0) { - return [left + 1, word]; - } else { - return [null, null]; - } -}; - -class AutosuggestTextarea extends React.Component { - - constructor (props, context) { - super(props, context); - this.state = { - suggestionsHidden: false, - selectedSuggestion: 0, - lastToken: null, - tokenStart: 0 - }; - this.onChange = this.onChange.bind(this); - this.onKeyDown = this.onKeyDown.bind(this); - this.onBlur = this.onBlur.bind(this); - this.onSuggestionClick = this.onSuggestionClick.bind(this); - this.setTextarea = this.setTextarea.bind(this); - this.onPaste = this.onPaste.bind(this); - } - - onChange (e) { - const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart); - - if (token !== null && this.state.lastToken !== token) { - this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart }); - this.props.onSuggestionsFetchRequested(token); - } else if (token === null) { - this.setState({ lastToken: null }); - this.props.onSuggestionsClearRequested(); - } - - // auto-resize textarea - e.target.style.height = `${e.target.scrollHeight}px`; - - this.props.onChange(e); - } - - onKeyDown (e) { - const { suggestions, disabled } = this.props; - const { selectedSuggestion, suggestionsHidden } = this.state; - - if (disabled) { - e.preventDefault(); - return; - } - - switch(e.key) { - case 'Escape': - if (!suggestionsHidden) { - e.preventDefault(); - this.setState({ suggestionsHidden: true }); - } - - break; - case 'ArrowDown': - if (suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) }); - } - - break; - case 'ArrowUp': - if (suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) }); - } - - break; - case 'Enter': - case 'Tab': - // Select suggestion - if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - e.stopPropagation(); - this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion)); - } - - break; - } - - if (e.defaultPrevented || !this.props.onKeyDown) { - return; - } - - this.props.onKeyDown(e); - } - - onBlur () { - // If we hide the suggestions immediately, then this will prevent the - // onClick for the suggestions themselves from firing. - // Setting a short window for that to take place before hiding the - // suggestions ensures that can't happen. - setTimeout(() => { - this.setState({ suggestionsHidden: true }); - }, 100); - } - - onSuggestionClick (suggestion, e) { - e.preventDefault(); - this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion); - this.textarea.focus(); - } - - componentWillReceiveProps (nextProps) { - if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden) { - this.setState({ suggestionsHidden: false }); - } - } - - setTextarea (c) { - this.textarea = c; - } - - onPaste (e) { - if (e.clipboardData && e.clipboardData.files.length === 1) { - this.props.onPaste(e.clipboardData.files) - e.preventDefault(); - } - } - - reset () { - this.textarea.style.height = 'auto'; - } - - render () { - const { value, suggestions, disabled, placeholder, onKeyUp } = this.props; - const { suggestionsHidden, selectedSuggestion } = this.state; - const style = { direction: 'ltr' }; - - if (isRtl(value)) { - style.direction = 'rtl'; - } - - return ( -
-