~cytrogen/masto-fe

7d7db8977b205f537388044c614c2f8b2105371d — Claire 2 years ago 1cd7f5f
Fix import order with ESLint

Port d27216dc4616d80659c0cc5d2a55394e0e1ae874 to glitch-soc
373 files changed, 2391 insertions(+), 1246 deletions(-)

M app/javascript/flavours/glitch/actions/accounts.js
M app/javascript/flavours/glitch/actions/announcements.js
M app/javascript/flavours/glitch/actions/blocks.js
M app/javascript/flavours/glitch/actions/bookmarks.js
M app/javascript/flavours/glitch/actions/compose.js
M app/javascript/flavours/glitch/actions/conversations.js
M app/javascript/flavours/glitch/actions/directory.js
M app/javascript/flavours/glitch/actions/favourites.js
M app/javascript/flavours/glitch/actions/filters.js
M app/javascript/flavours/glitch/actions/history.js
M app/javascript/flavours/glitch/actions/importer/normalizer.js
M app/javascript/flavours/glitch/actions/interactions.js
M app/javascript/flavours/glitch/actions/lists.js
M app/javascript/flavours/glitch/actions/local_settings.js
M app/javascript/flavours/glitch/actions/markers.js
M app/javascript/flavours/glitch/actions/mutes.js
M app/javascript/flavours/glitch/actions/notifications.js
M app/javascript/flavours/glitch/actions/pin_statuses.js
M app/javascript/flavours/glitch/actions/polls.js
M app/javascript/flavours/glitch/actions/push_notifications/index.js
M app/javascript/flavours/glitch/actions/push_notifications/registerer.js
M app/javascript/flavours/glitch/actions/reports.js
M app/javascript/flavours/glitch/actions/search.js
M app/javascript/flavours/glitch/actions/server.js
M app/javascript/flavours/glitch/actions/settings.js
M app/javascript/flavours/glitch/actions/statuses.js
M app/javascript/flavours/glitch/actions/store.js
M app/javascript/flavours/glitch/actions/streaming.js
M app/javascript/flavours/glitch/actions/suggestions.js
M app/javascript/flavours/glitch/actions/timelines.js
M app/javascript/flavours/glitch/actions/trends.js
M app/javascript/flavours/glitch/api.js
M app/javascript/flavours/glitch/components/account.jsx
M app/javascript/flavours/glitch/components/admin/Counter.jsx
M app/javascript/flavours/glitch/components/admin/Dimension.jsx
M app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx
M app/javascript/flavours/glitch/components/admin/Retention.jsx
M app/javascript/flavours/glitch/components/admin/Trends.jsx
M app/javascript/flavours/glitch/components/attachment_list.jsx
M app/javascript/flavours/glitch/components/autosuggest_emoji.jsx
M app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx
M app/javascript/flavours/glitch/components/autosuggest_input.jsx
M app/javascript/flavours/glitch/components/autosuggest_textarea.jsx
M app/javascript/flavours/glitch/components/avatar_composite.jsx
M app/javascript/flavours/glitch/components/avatar_overlay.jsx
M app/javascript/flavours/glitch/components/button.jsx
M app/javascript/flavours/glitch/components/column.jsx
M app/javascript/flavours/glitch/components/column_back_button.jsx
M app/javascript/flavours/glitch/components/column_back_button_slim.jsx
M app/javascript/flavours/glitch/components/column_header.jsx
M app/javascript/flavours/glitch/components/dismissable_banner.jsx
M app/javascript/flavours/glitch/components/dropdown_menu.jsx
M app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js
M app/javascript/flavours/glitch/components/edited_timestamp/index.jsx
M app/javascript/flavours/glitch/components/error_boundary.jsx
M app/javascript/flavours/glitch/components/hashtag.jsx
M app/javascript/flavours/glitch/components/inline_account.jsx
M app/javascript/flavours/glitch/components/intersection_observer_article.jsx
M app/javascript/flavours/glitch/components/link.jsx
M app/javascript/flavours/glitch/components/load_gap.jsx
M app/javascript/flavours/glitch/components/load_more.jsx
M app/javascript/flavours/glitch/components/load_pending.jsx
M app/javascript/flavours/glitch/components/media_attachments.jsx
M app/javascript/flavours/glitch/components/media_gallery.jsx
M app/javascript/flavours/glitch/components/modal_root.jsx
M app/javascript/flavours/glitch/components/navigation_portal.jsx
M app/javascript/flavours/glitch/components/notification_purge_buttons.jsx
M app/javascript/flavours/glitch/components/permalink.jsx
M app/javascript/flavours/glitch/components/picture_in_picture_placeholder.jsx
M app/javascript/flavours/glitch/components/poll.jsx
M app/javascript/flavours/glitch/components/regeneration_indicator.jsx
M app/javascript/flavours/glitch/components/scrollable_list.jsx
M app/javascript/flavours/glitch/components/server_banner.jsx
M app/javascript/flavours/glitch/components/setting_text.jsx
M app/javascript/flavours/glitch/components/short_number.jsx
M app/javascript/flavours/glitch/components/status.jsx
M app/javascript/flavours/glitch/components/status_action_bar.jsx
M app/javascript/flavours/glitch/components/status_content.jsx
M app/javascript/flavours/glitch/components/status_header.jsx
M app/javascript/flavours/glitch/components/status_icons.jsx
M app/javascript/flavours/glitch/components/status_list.jsx
M app/javascript/flavours/glitch/components/status_prepend.jsx
M app/javascript/flavours/glitch/components/status_visibility_icon.jsx
M app/javascript/flavours/glitch/containers/account_container.jsx
M app/javascript/flavours/glitch/containers/admin_component.jsx
M app/javascript/flavours/glitch/containers/compose_container.jsx
M app/javascript/flavours/glitch/containers/domain_container.jsx
M app/javascript/flavours/glitch/containers/dropdown_menu_container.js
M app/javascript/flavours/glitch/containers/intersection_observer_article_container.js
M app/javascript/flavours/glitch/containers/mastodon.jsx
M app/javascript/flavours/glitch/containers/media_container.jsx
M app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js
M app/javascript/flavours/glitch/containers/poll_container.js
M app/javascript/flavours/glitch/containers/status_container.js
M app/javascript/flavours/glitch/features/about/index.jsx
M app/javascript/flavours/glitch/features/account/components/account_note.jsx
M app/javascript/flavours/glitch/features/account/components/action_bar.jsx
M app/javascript/flavours/glitch/features/account/components/featured_tags.jsx
M app/javascript/flavours/glitch/features/account/components/follow_request_note.jsx
M app/javascript/flavours/glitch/features/account/components/header.jsx
M app/javascript/flavours/glitch/features/account/components/profile_column_header.jsx
M app/javascript/flavours/glitch/features/account/containers/account_note_container.js
M app/javascript/flavours/glitch/features/account/containers/featured_tags_container.js
M app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js
M app/javascript/flavours/glitch/features/account/navigation.jsx
M app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx
M app/javascript/flavours/glitch/features/account_gallery/index.jsx
M app/javascript/flavours/glitch/features/account_timeline/components/header.jsx
M app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.jsx
M app/javascript/flavours/glitch/features/account_timeline/components/moved_note.jsx
M app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx
M app/javascript/flavours/glitch/features/account_timeline/index.jsx
M app/javascript/flavours/glitch/features/audio/index.jsx
M app/javascript/flavours/glitch/features/blocks/index.jsx
M app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx
M app/javascript/flavours/glitch/features/closed_registrations_modal/index.jsx
M app/javascript/flavours/glitch/features/community_timeline/components/column_settings.jsx
M app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js
M app/javascript/flavours/glitch/features/community_timeline/index.jsx
M app/javascript/flavours/glitch/features/compose/components/action_bar.jsx
M app/javascript/flavours/glitch/features/compose/components/autosuggest_account.jsx
M app/javascript/flavours/glitch/features/compose/components/character_counter.jsx
M app/javascript/flavours/glitch/features/compose/components/compose_form.jsx
M app/javascript/flavours/glitch/features/compose/components/dropdown.jsx
M app/javascript/flavours/glitch/features/compose/components/dropdown_menu.jsx
M app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx
M app/javascript/flavours/glitch/features/compose/components/header.jsx
M app/javascript/flavours/glitch/features/compose/components/language_dropdown.jsx
M app/javascript/flavours/glitch/features/compose/components/navigation_bar.jsx
M app/javascript/flavours/glitch/features/compose/components/options.jsx
M app/javascript/flavours/glitch/features/compose/components/poll_form.jsx
M app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.jsx
M app/javascript/flavours/glitch/features/compose/components/publisher.jsx
M app/javascript/flavours/glitch/features/compose/components/reply_indicator.jsx
M app/javascript/flavours/glitch/features/compose/components/search.jsx
M app/javascript/flavours/glitch/features/compose/components/search_results.jsx
M app/javascript/flavours/glitch/features/compose/components/text_icon_button.jsx
M app/javascript/flavours/glitch/features/compose/components/textarea_icons.jsx
M app/javascript/flavours/glitch/features/compose/components/upload.jsx
M app/javascript/flavours/glitch/features/compose/components/upload_form.jsx
M app/javascript/flavours/glitch/features/compose/components/upload_progress.jsx
M app/javascript/flavours/glitch/features/compose/components/warning.jsx
M app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js
M app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
M app/javascript/flavours/glitch/features/compose/containers/dropdown_container.js
M app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js
M app/javascript/flavours/glitch/features/compose/containers/header_container.js
M app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js
M app/javascript/flavours/glitch/features/compose/containers/navigation_container.js
M app/javascript/flavours/glitch/features/compose/containers/options_container.js
M app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js
M app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js
M app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js
M app/javascript/flavours/glitch/features/compose/containers/search_container.js
M app/javascript/flavours/glitch/features/compose/containers/search_results_container.js
M app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.jsx
M app/javascript/flavours/glitch/features/compose/containers/upload_container.js
M app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js
M app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js
M app/javascript/flavours/glitch/features/compose/containers/warning_container.jsx
M app/javascript/flavours/glitch/features/compose/index.jsx
M app/javascript/flavours/glitch/features/compose/util/url_regex.js
M app/javascript/flavours/glitch/features/direct_timeline/components/column_settings.jsx
M app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx
M app/javascript/flavours/glitch/features/direct_timeline/components/conversations_list.jsx
M app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js
M app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js
M app/javascript/flavours/glitch/features/direct_timeline/containers/conversations_list_container.js
M app/javascript/flavours/glitch/features/direct_timeline/index.jsx
M app/javascript/flavours/glitch/features/directory/components/account_card.jsx
M app/javascript/flavours/glitch/features/directory/index.jsx
M app/javascript/flavours/glitch/features/domain_blocks/index.jsx
M app/javascript/flavours/glitch/features/emoji/emoji.js
M app/javascript/flavours/glitch/features/emoji/emoji_compressed.js
M app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js
M app/javascript/flavours/glitch/features/emoji/emoji_picker.js
M app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.js
M app/javascript/flavours/glitch/features/explore/components/story.jsx
M app/javascript/flavours/glitch/features/explore/index.jsx
M app/javascript/flavours/glitch/features/explore/links.jsx
M app/javascript/flavours/glitch/features/explore/results.jsx
M app/javascript/flavours/glitch/features/explore/statuses.jsx
M app/javascript/flavours/glitch/features/explore/suggestions.jsx
M app/javascript/flavours/glitch/features/explore/tags.jsx
M app/javascript/flavours/glitch/features/favourited_statuses/index.jsx
M app/javascript/flavours/glitch/features/favourites/index.jsx
M app/javascript/flavours/glitch/features/filters/added_to_filter.jsx
M app/javascript/flavours/glitch/features/filters/select_filter.jsx
M app/javascript/flavours/glitch/features/follow_recommendations/components/account.jsx
M app/javascript/flavours/glitch/features/follow_recommendations/index.jsx
M app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.jsx
M app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js
M app/javascript/flavours/glitch/features/follow_requests/index.jsx
M app/javascript/flavours/glitch/features/followed_tags/index.jsx
M app/javascript/flavours/glitch/features/followers/index.jsx
M app/javascript/flavours/glitch/features/following/index.jsx
M app/javascript/flavours/glitch/features/getting_started/components/announcements.jsx
M app/javascript/flavours/glitch/features/getting_started/components/trends.jsx
M app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
M app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js
M app/javascript/flavours/glitch/features/getting_started/index.jsx
M app/javascript/flavours/glitch/features/getting_started_misc/index.jsx
M app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.jsx
M app/javascript/flavours/glitch/features/hashtag_timeline/containers/column_settings_container.js
M app/javascript/flavours/glitch/features/hashtag_timeline/index.jsx
M app/javascript/flavours/glitch/features/home_timeline/components/column_settings.jsx
M app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js
M app/javascript/flavours/glitch/features/home_timeline/index.jsx
M app/javascript/flavours/glitch/features/interaction_modal/index.jsx
M app/javascript/flavours/glitch/features/keyboard_shortcuts/index.jsx
M app/javascript/flavours/glitch/features/list_adder/components/account.jsx
M app/javascript/flavours/glitch/features/list_adder/components/list.jsx
M app/javascript/flavours/glitch/features/list_adder/index.jsx
M app/javascript/flavours/glitch/features/list_editor/components/account.jsx
M app/javascript/flavours/glitch/features/list_editor/components/edit_list_form.jsx
M app/javascript/flavours/glitch/features/list_editor/components/search.jsx
M app/javascript/flavours/glitch/features/list_editor/containers/account_container.js
M app/javascript/flavours/glitch/features/list_editor/containers/search_container.js
M app/javascript/flavours/glitch/features/list_editor/index.jsx
M app/javascript/flavours/glitch/features/list_timeline/index.jsx
M app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx
M app/javascript/flavours/glitch/features/lists/index.jsx
M app/javascript/flavours/glitch/features/local_settings/index.jsx
M app/javascript/flavours/glitch/features/local_settings/navigation/index.jsx
M app/javascript/flavours/glitch/features/local_settings/navigation/item/index.jsx
M app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.jsx
M app/javascript/flavours/glitch/features/local_settings/page/index.jsx
M app/javascript/flavours/glitch/features/local_settings/page/item/index.jsx
M app/javascript/flavours/glitch/features/mutes/index.jsx
M app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx
M app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx
M app/javascript/flavours/glitch/features/notifications/components/clear_column_button.jsx
M app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx
M app/javascript/flavours/glitch/features/notifications/components/filter_bar.jsx
M app/javascript/flavours/glitch/features/notifications/components/follow.jsx
M app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx
M app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.jsx
M app/javascript/flavours/glitch/features/notifications/components/notification.jsx
M app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.jsx
M app/javascript/flavours/glitch/features/notifications/components/overlay.jsx
M app/javascript/flavours/glitch/features/notifications/components/pill_bar_button.jsx
M app/javascript/flavours/glitch/features/notifications/components/report.jsx
M app/javascript/flavours/glitch/features/notifications/components/setting_toggle.jsx
M app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js
M app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js
M app/javascript/flavours/glitch/features/notifications/containers/filter_bar_container.js
M app/javascript/flavours/glitch/features/notifications/containers/follow_request_container.js
M app/javascript/flavours/glitch/features/notifications/containers/notification_container.js
M app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js
M app/javascript/flavours/glitch/features/notifications/index.jsx
M app/javascript/flavours/glitch/features/picture_in_picture/components/footer.jsx
M app/javascript/flavours/glitch/features/picture_in_picture/components/header.jsx
M app/javascript/flavours/glitch/features/picture_in_picture/index.jsx
M app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js
M app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js
M app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx
M app/javascript/flavours/glitch/features/pinned_statuses/index.jsx
M app/javascript/flavours/glitch/features/privacy_policy/index.jsx
M app/javascript/flavours/glitch/features/public_timeline/components/column_settings.jsx
M app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js
M app/javascript/flavours/glitch/features/public_timeline/index.jsx
M app/javascript/flavours/glitch/features/reblogs/index.jsx
M app/javascript/flavours/glitch/features/report/category.jsx
M app/javascript/flavours/glitch/features/report/comment.jsx
M app/javascript/flavours/glitch/features/report/components/option.jsx
M app/javascript/flavours/glitch/features/report/components/status_check_box.jsx
M app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
M app/javascript/flavours/glitch/features/report/rules.jsx
M app/javascript/flavours/glitch/features/report/statuses.jsx
M app/javascript/flavours/glitch/features/report/thanks.jsx
M app/javascript/flavours/glitch/features/standalone/compose/index.jsx
M app/javascript/flavours/glitch/features/status/components/action_bar.jsx
M app/javascript/flavours/glitch/features/status/components/card.jsx
M app/javascript/flavours/glitch/features/status/components/detailed_status.jsx
M app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
M app/javascript/flavours/glitch/features/status/index.jsx
M app/javascript/flavours/glitch/features/subscribed_languages_modal/index.jsx
M app/javascript/flavours/glitch/features/ui/components/actions_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/block_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/boost_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/bundle.jsx
M app/javascript/flavours/glitch/features/ui/components/bundle_column_error.jsx
M app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.jsx
M app/javascript/flavours/glitch/features/ui/components/column.jsx
M app/javascript/flavours/glitch/features/ui/components/column_header.jsx
M app/javascript/flavours/glitch/features/ui/components/column_link.jsx
M app/javascript/flavours/glitch/features/ui/components/column_loading.jsx
M app/javascript/flavours/glitch/features/ui/components/columns_area.jsx
M app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/compose_panel.jsx
M app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx
M app/javascript/flavours/glitch/features/ui/components/doodle_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/embed_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/favourite_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/filter_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/follow_requests_column_link.jsx
M app/javascript/flavours/glitch/features/ui/components/header.jsx
M app/javascript/flavours/glitch/features/ui/components/image_loader.jsx
M app/javascript/flavours/glitch/features/ui/components/image_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/link_footer.jsx
M app/javascript/flavours/glitch/features/ui/components/list_panel.jsx
M app/javascript/flavours/glitch/features/ui/components/media_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/modal_root.jsx
M app/javascript/flavours/glitch/features/ui/components/mute_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/navigation_panel.jsx
M app/javascript/flavours/glitch/features/ui/components/notifications_counter_icon.js
M app/javascript/flavours/glitch/features/ui/components/onboarding_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/report_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/sign_in_banner.jsx
M app/javascript/flavours/glitch/features/ui/components/upload_area.jsx
M app/javascript/flavours/glitch/features/ui/components/video_modal.jsx
M app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx
M app/javascript/flavours/glitch/features/ui/containers/bundle_container.js
M app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js
M app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js
M app/javascript/flavours/glitch/features/ui/containers/modal_container.js
M app/javascript/flavours/glitch/features/ui/containers/notifications_container.js
M app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
M app/javascript/flavours/glitch/features/ui/index.jsx
M app/javascript/flavours/glitch/features/ui/util/optional_motion.js
M app/javascript/flavours/glitch/features/ui/util/react_router_helpers.jsx
M app/javascript/flavours/glitch/features/ui/util/reduced_motion.jsx
M app/javascript/flavours/glitch/features/video/index.jsx
M app/javascript/flavours/glitch/main.jsx
M app/javascript/flavours/glitch/packs/admin.jsx
M app/javascript/flavours/glitch/packs/public.jsx
M app/javascript/flavours/glitch/packs/settings.js
M app/javascript/flavours/glitch/packs/share.jsx
M app/javascript/flavours/glitch/packs/sign_up.js
M app/javascript/flavours/glitch/reducers/accounts.js
M app/javascript/flavours/glitch/reducers/accounts_counters.js
M app/javascript/flavours/glitch/reducers/accounts_map.js
M app/javascript/flavours/glitch/reducers/alerts.js
M app/javascript/flavours/glitch/reducers/announcements.js
M app/javascript/flavours/glitch/reducers/compose.js
M app/javascript/flavours/glitch/reducers/contexts.js
M app/javascript/flavours/glitch/reducers/conversations.js
M app/javascript/flavours/glitch/reducers/custom_emojis.js
M app/javascript/flavours/glitch/reducers/domain_lists.js
M app/javascript/flavours/glitch/reducers/dropdown_menu.js
M app/javascript/flavours/glitch/reducers/filters.js
M app/javascript/flavours/glitch/reducers/followed_tags.js
M app/javascript/flavours/glitch/reducers/height_cache.js
M app/javascript/flavours/glitch/reducers/history.js
M app/javascript/flavours/glitch/reducers/list_adder.js
M app/javascript/flavours/glitch/reducers/list_editor.js
M app/javascript/flavours/glitch/reducers/lists.js
M app/javascript/flavours/glitch/reducers/local_settings.js
M app/javascript/flavours/glitch/reducers/markers.js
M app/javascript/flavours/glitch/reducers/media_attachments.js
M app/javascript/flavours/glitch/reducers/meta.js
M app/javascript/flavours/glitch/reducers/modal.js
M app/javascript/flavours/glitch/reducers/notifications.js
M app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js
M app/javascript/flavours/glitch/reducers/polls.js
M app/javascript/flavours/glitch/reducers/push_notifications.js
M app/javascript/flavours/glitch/reducers/relationships.js
M app/javascript/flavours/glitch/reducers/search.js
M app/javascript/flavours/glitch/reducers/server.js
M app/javascript/flavours/glitch/reducers/settings.js
M app/javascript/flavours/glitch/reducers/status_lists.js
M app/javascript/flavours/glitch/reducers/statuses.js
M app/javascript/flavours/glitch/reducers/suggestions.js
M app/javascript/flavours/glitch/reducers/tags.js
M app/javascript/flavours/glitch/reducers/timelines.js
M app/javascript/flavours/glitch/reducers/trends.js
M app/javascript/flavours/glitch/reducers/user_lists.js
M app/javascript/flavours/glitch/selectors/index.js
M app/javascript/flavours/glitch/utils/log_out.js
M app/javascript/flavours/glitch/actions/accounts.js => app/javascript/flavours/glitch/actions/accounts.js +1 -0
@@ 1,4 1,5 @@
import api, { getLinks } from '../api';

import { importFetchedAccount, importFetchedAccounts } from './importer';

export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/announcements.js => app/javascript/flavours/glitch/actions/announcements.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { normalizeAnnouncement } from './importer/normalizer';

export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/blocks.js => app/javascript/flavours/glitch/actions/blocks.js +1 -0
@@ 1,4 1,5 @@
import api, { getLinks } from '../api';

import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';
import { openModal } from './modal';

M app/javascript/flavours/glitch/actions/bookmarks.js => app/javascript/flavours/glitch/actions/bookmarks.js +1 -0
@@ 1,4 1,5 @@
import api, { getLinks } from '../api';

import { importFetchedStatuses } from './importer';

export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/compose.js => app/javascript/flavours/glitch/actions/compose.js +4 -1
@@ 1,11 1,14 @@
import { defineMessages } from 'react-intl';

import axios from 'axios';
import { throttle } from 'lodash';
import { defineMessages } from 'react-intl';

import api from 'flavours/glitch/api';
import { search as emojiSearch } from 'flavours/glitch/features/emoji/emoji_mart_search_light';
import { tagHistory } from 'flavours/glitch/settings';
import { recoverHashtags } from 'flavours/glitch/utils/hashtag';
import resizeImage from 'flavours/glitch/utils/resize_image';

import { showAlert, showAlertForError } from './alerts';
import { useEmoji } from './emojis';
import { importFetchedAccounts, importFetchedStatus } from './importer';

M app/javascript/flavours/glitch/actions/conversations.js => app/javascript/flavours/glitch/actions/conversations.js +1 -0
@@ 1,4 1,5 @@
import api, { getLinks } from '../api';

import {
  importFetchedAccounts,
  importFetchedStatuses,

M app/javascript/flavours/glitch/actions/directory.js => app/javascript/flavours/glitch/actions/directory.js +2 -1
@@ 1,6 1,7 @@
import api from '../api';
import { importFetchedAccounts } from './importer';

import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';

export const DIRECTORY_FETCH_REQUEST = 'DIRECTORY_FETCH_REQUEST';
export const DIRECTORY_FETCH_SUCCESS = 'DIRECTORY_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/favourites.js => app/javascript/flavours/glitch/actions/favourites.js +1 -0
@@ 1,4 1,5 @@
import api, { getLinks } from '../api';

import { importFetchedStatuses } from './importer';

export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/filters.js => app/javascript/flavours/glitch/actions/filters.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { openModal } from './modal';

export const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/history.js => app/javascript/flavours/glitch/actions/history.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { importFetchedAccounts } from './importer';

export const HISTORY_FETCH_REQUEST = 'HISTORY_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/importer/normalizer.js => app/javascript/flavours/glitch/actions/importer/normalizer.js +2 -1
@@ 1,7 1,8 @@
import escapeTextContentForBrowser from 'escape-html';

import emojify from 'flavours/glitch/features/emoji/emoji';
import { unescapeHTML } from 'flavours/glitch/utils/html';
import { autoHideCW } from 'flavours/glitch/utils/content_warning';
import { unescapeHTML } from 'flavours/glitch/utils/html';

const domParser = new DOMParser();


M app/javascript/flavours/glitch/actions/interactions.js => app/javascript/flavours/glitch/actions/interactions.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { importFetchedAccounts, importFetchedStatus } from './importer';

export const REBLOG_REQUEST = 'REBLOG_REQUEST';

M app/javascript/flavours/glitch/actions/lists.js => app/javascript/flavours/glitch/actions/lists.js +2 -1
@@ 1,6 1,7 @@
import api from '../api';
import { importFetchedAccounts } from './importer';

import { showAlertForError } from './alerts';
import { importFetchedAccounts } from './importer';

export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST';
export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/local_settings.js => app/javascript/flavours/glitch/actions/local_settings.js +1 -0
@@ 1,4 1,5 @@
import { expandSpoilers, disableSwiping } from 'flavours/glitch/initial_state';

import { openModal } from './modal';

export const LOCAL_SETTING_CHANGE = 'LOCAL_SETTING_CHANGE';

M app/javascript/flavours/glitch/actions/markers.js => app/javascript/flavours/glitch/actions/markers.js +5 -2
@@ 1,7 1,10 @@
import api from '../api';
import { List as ImmutableList } from 'immutable';

import { debounce } from 'lodash';

import api from '../api';
import { compareId } from '../compare_id';
import { List as ImmutableList } from 'immutable';


export const MARKERS_FETCH_REQUEST = 'MARKERS_FETCH_REQUEST';
export const MARKERS_FETCH_SUCCESS = 'MARKERS_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/mutes.js => app/javascript/flavours/glitch/actions/mutes.js +3 -1
@@ 1,7 1,9 @@
import { openModal } from 'flavours/glitch/actions/modal';

import api, { getLinks } from '../api';

import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';
import { openModal } from 'flavours/glitch/actions/modal';

export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST';
export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/notifications.js => app/javascript/flavours/glitch/actions/notifications.js +14 -7
@@ 1,5 1,15 @@
import api, { getLinks } from '../api';
import IntlMessageFormat from 'intl-messageformat';
import { defineMessages } from 'react-intl';

import { List as ImmutableList } from 'immutable';

import { compareId } from 'flavours/glitch/compare_id';
import { usePendingItems as preferPendingItems } from 'flavours/glitch/initial_state';
import { unescapeHTML } from 'flavours/glitch/utils/html';
import { requestNotificationPermission } from 'flavours/glitch/utils/notifications';

import api, { getLinks } from '../api';

import { fetchFollowRequests, fetchRelationships } from './accounts';
import {
  importFetchedAccount,


@@ 9,12 19,9 @@ import {
} from './importer';
import { submitMarkers } from './markers';
import { saveSettings } from './settings';
import { defineMessages } from 'react-intl';
import { List as ImmutableList } from 'immutable';
import { unescapeHTML } from 'flavours/glitch/utils/html';
import { usePendingItems as preferPendingItems } from 'flavours/glitch/initial_state';
import { compareId } from 'flavours/glitch/compare_id';
import { requestNotificationPermission } from 'flavours/glitch/utils/notifications';




export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE';
export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';

M app/javascript/flavours/glitch/actions/pin_statuses.js => app/javascript/flavours/glitch/actions/pin_statuses.js +3 -1
@@ 1,7 1,9 @@
import { me } from 'flavours/glitch/initial_state';

import api from '../api';

import { importFetchedStatuses } from './importer';

import { me } from 'flavours/glitch/initial_state';

export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST';
export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/polls.js => app/javascript/flavours/glitch/actions/polls.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { importFetchedPoll } from './importer';

export const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST';

M app/javascript/flavours/glitch/actions/push_notifications/index.js => app/javascript/flavours/glitch/actions/push_notifications/index.js +1 -1
@@ 1,5 1,5 @@
import { setAlerts } from './setter';
import { saveSettings } from './registerer';
import { setAlerts } from './setter';

export function changeAlerts(path, value) {
  return dispatch => {

M app/javascript/flavours/glitch/actions/push_notifications/registerer.js => app/javascript/flavours/glitch/actions/push_notifications/registerer.js +1 -0
@@ 1,5 1,6 @@
import api from '../../api';
import { pushNotificationsSetting } from '../../settings';

import { setBrowserSupport, setSubscription, clearSubscription } from './setter';

// Taken from https://www.npmjs.com/package/web-push

M app/javascript/flavours/glitch/actions/reports.js => app/javascript/flavours/glitch/actions/reports.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { openModal } from './modal';

export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';

M app/javascript/flavours/glitch/actions/search.js => app/javascript/flavours/glitch/actions/search.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { fetchRelationships } from './accounts';
import { importFetchedAccounts, importFetchedStatuses } from './importer';


M app/javascript/flavours/glitch/actions/server.js => app/javascript/flavours/glitch/actions/server.js +1 -0
@@ 1,4 1,5 @@
import api from '../api';

import { importFetchedAccount } from './importer';

export const SERVER_FETCH_REQUEST = 'Server_FETCH_REQUEST';

M app/javascript/flavours/glitch/actions/settings.js => app/javascript/flavours/glitch/actions/settings.js +3 -1
@@ 1,5 1,7 @@
import api from '../api';
import { debounce } from 'lodash';

import api from '../api';

import { showAlertForError } from './alerts';

export const SETTING_CHANGE = 'SETTING_CHANGE';

M app/javascript/flavours/glitch/actions/statuses.js => app/javascript/flavours/glitch/actions/statuses.js +2 -2
@@ 1,8 1,8 @@
import api from '../api';

import { deleteFromTimelines } from './timelines';
import { importFetchedStatus, importFetchedStatuses } from './importer';
import { ensureComposeIsVisible, setComposeToStatus } from './compose';
import { importFetchedStatus, importFetchedStatuses } from './importer';
import { deleteFromTimelines } from './timelines';

export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/store.js => app/javascript/flavours/glitch/actions/store.js +1 -0
@@ 1,4 1,5 @@
import { Iterable, fromJS } from 'immutable';

import { hydrateCompose } from './compose';
import { importFetchedAccounts } from './importer';
import { saveSettings } from './settings';

M app/javascript/flavours/glitch/actions/streaming.js => app/javascript/flavours/glitch/actions/streaming.js +12 -10
@@ 1,6 1,18 @@
// @ts-check

import { getLocale } from 'mastodon/locales';

import { connectStream } from '../stream';

import {
  fetchAnnouncements,
  updateAnnouncements,
  updateReaction as updateAnnouncementsReaction,
  deleteAnnouncement,
} from './announcements';
import { updateConversations } from './conversations';
import { updateNotifications, expandNotifications } from './notifications';
import { updateStatus } from './statuses';
import {
  updateTimeline,
  deleteFromTimelines,


@@ 12,16 24,6 @@ import {
  fillCommunityTimelineGaps,
  fillListTimelineGaps,
} from './timelines';
import { updateNotifications, expandNotifications } from './notifications';
import { updateConversations } from './conversations';
import { updateStatus } from './statuses';
import {
  fetchAnnouncements,
  updateAnnouncements,
  updateReaction as updateAnnouncementsReaction,
  deleteAnnouncement,
} from './announcements';
import { getLocale } from 'mastodon/locales';

const { messages } = getLocale();


M app/javascript/flavours/glitch/actions/suggestions.js => app/javascript/flavours/glitch/actions/suggestions.js +2 -1
@@ 1,6 1,7 @@
import api from '../api';
import { importFetchedAccounts } from './importer';

import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';

export const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST';
export const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS';

M app/javascript/flavours/glitch/actions/timelines.js => app/javascript/flavours/glitch/actions/timelines.js +5 -3
@@ 1,11 1,13 @@
import { importFetchedStatus, importFetchedStatuses } from './importer';
import { submitMarkers } from './markers';
import api, { getLinks } from 'flavours/glitch/api';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import api, { getLinks } from 'flavours/glitch/api';
import { compareId } from 'flavours/glitch/compare_id';
import { usePendingItems as preferPendingItems } from 'flavours/glitch/initial_state';
import { toServerSideType } from 'flavours/glitch/utils/filters';

import { importFetchedStatus, importFetchedStatuses } from './importer';
import { submitMarkers } from './markers';

export const TIMELINE_UPDATE  = 'TIMELINE_UPDATE';
export const TIMELINE_DELETE  = 'TIMELINE_DELETE';
export const TIMELINE_CLEAR   = 'TIMELINE_CLEAR';

M app/javascript/flavours/glitch/actions/trends.js => app/javascript/flavours/glitch/actions/trends.js +1 -0
@@ 1,4 1,5 @@
import api, { getLinks } from '../api';

import { importFetchedStatuses } from './importer';

export const TRENDS_TAGS_FETCH_REQUEST = 'TRENDS_TAGS_FETCH_REQUEST';

M app/javascript/flavours/glitch/api.js => app/javascript/flavours/glitch/api.js +1 -0
@@ 2,6 2,7 @@

import axios from 'axios';
import LinkHeader from 'http-link-header';

import ready from './ready';

/**

M app/javascript/flavours/glitch/components/account.jsx => app/javascript/flavours/glitch/components/account.jsx +11 -6
@@ 1,14 1,19 @@
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';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Skeleton } from 'flavours/glitch/components/skeleton';
import { me } from 'flavours/glitch/initial_state';

import { Avatar } from './avatar';
import { DisplayName } from './display_name';
import { IconButton } from './icon_button';
import Permalink from './permalink';
import { RelativeTimestamp } from './relative_timestamp';
import { Skeleton } from 'flavours/glitch/components/skeleton';


const messages = defineMessages({
  follow: { id: 'account.follow', defaultMessage: 'Follow' },

M app/javascript/flavours/glitch/components/admin/Counter.jsx => app/javascript/flavours/glitch/components/admin/Counter.jsx +7 -3
@@ 1,9 1,13 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import api from 'flavours/glitch/api';
import { PureComponent } from 'react';

import { FormattedNumber } from 'react-intl';
import { Sparklines, SparklinesCurve } from 'react-sparklines';

import classNames from 'classnames';

import { Sparklines, SparklinesCurve } from 'react-sparklines';

import api from 'flavours/glitch/api';
import { Skeleton } from 'flavours/glitch/components/skeleton';

const percIncrease = (a, b) => {

M app/javascript/flavours/glitch/components/admin/Dimension.jsx => app/javascript/flavours/glitch/components/admin/Dimension.jsx +5 -3
@@ 1,9 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import api from 'flavours/glitch/api';
import { PureComponent } from 'react';

import { FormattedNumber } from 'react-intl';
import { roundTo10 } from 'flavours/glitch/utils/numbers';

import api from 'flavours/glitch/api';
import { Skeleton } from 'flavours/glitch/components/skeleton';
import { roundTo10 } from 'flavours/glitch/utils/numbers';

export default class Dimension extends PureComponent {


M app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx => app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx +5 -2
@@ 1,9 1,12 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import api from 'flavours/glitch/api';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

import classNames from 'classnames';

import api from 'flavours/glitch/api';

const messages = defineMessages({
  other: { id: 'report.categories.other', defaultMessage: 'Other' },
  spam: { id: 'report.categories.spam', defaultMessage: 'Spam' },

M app/javascript/flavours/glitch/components/admin/Retention.jsx => app/javascript/flavours/glitch/components/admin/Retention.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import api from 'flavours/glitch/api';
import { PureComponent } from 'react';

import { FormattedMessage, FormattedNumber, FormattedDate } from 'react-intl';

import classNames from 'classnames';

import api from 'flavours/glitch/api';
import { roundTo10 } from 'flavours/glitch/utils/numbers';

const dateForCohort = cohort => {

M app/javascript/flavours/glitch/components/admin/Trends.jsx => app/javascript/flavours/glitch/components/admin/Trends.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import api from 'flavours/glitch/api';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import api from 'flavours/glitch/api';
import Hashtag from 'flavours/glitch/components/hashtag';

export default class Trends extends PureComponent {

M app/javascript/flavours/glitch/components/attachment_list.jsx => app/javascript/flavours/glitch/components/attachment_list.jsx +6 -2
@@ 1,8 1,12 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Icon } from 'flavours/glitch/components/icon';

const filename = url => url.split('/').pop().split('#')[0].split('?')[0];

M app/javascript/flavours/glitch/components/autosuggest_emoji.jsx => app/javascript/flavours/glitch/components/autosuggest_emoji.jsx +2 -2
@@ 1,7 1,7 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import { PureComponent } from 'react';

import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import { assetHost } from 'flavours/glitch/utils/config';

export default class AutosuggestEmoji extends PureComponent {

M app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx => app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ShortNumber from 'flavours/glitch/components/short_number';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ShortNumber from 'flavours/glitch/components/short_number';


export default class AutosuggestHashtag extends PureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/components/autosuggest_input.jsx => app/javascript/flavours/glitch/components/autosuggest_input.jsx +10 -4
@@ 1,10 1,16 @@
import PropTypes from 'prop-types';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';

import AutosuggestEmoji from './autosuggest_emoji';
import AutosuggestHashtag from './autosuggest_hashtag';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';
import classNames from 'classnames';



const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => {
  let word;

M app/javascript/flavours/glitch/components/autosuggest_textarea.jsx => app/javascript/flavours/glitch/components/autosuggest_textarea.jsx +13 -5
@@ 1,11 1,19 @@
import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';
import AutosuggestEmoji from './autosuggest_emoji';
import AutosuggestHashtag from './autosuggest_hashtag';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import Textarea from 'react-textarea-autosize';
import classNames from 'classnames';

import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';

import AutosuggestEmoji from './autosuggest_emoji';
import AutosuggestHashtag from './autosuggest_hashtag';




const textAtCursorMatchesToken = (str, caretPosition) => {
  let word;

M app/javascript/flavours/glitch/components/avatar_composite.jsx => app/javascript/flavours/glitch/components/avatar_composite.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { autoPlayGif } from 'flavours/glitch/initial_state';

export default class AvatarComposite extends PureComponent {

M app/javascript/flavours/glitch/components/avatar_overlay.jsx => app/javascript/flavours/glitch/components/avatar_overlay.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { autoPlayGif } from 'flavours/glitch/initial_state';

export default class AvatarOverlay extends PureComponent {

M app/javascript/flavours/glitch/components/button.jsx => app/javascript/flavours/glitch/components/button.jsx +2 -1
@@ 1,5 1,6 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

export default class Button extends PureComponent {

M app/javascript/flavours/glitch/components/column.jsx => app/javascript/flavours/glitch/components/column.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { supportsPassiveEvents } from 'detect-passive-events';

import { scrollTop } from '../scroll';

const listenerOptions = supportsPassiveEvents ? { passive: true } : false;

M app/javascript/flavours/glitch/components/column_back_button.jsx => app/javascript/flavours/glitch/components/column_back_button.jsx +5 -2
@@ 1,8 1,11 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { createPortal } from 'react-dom';

import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

import { Icon } from 'flavours/glitch/components/icon';
import { createPortal } from 'react-dom';


export default class ColumnBackButton extends PureComponent {


M app/javascript/flavours/glitch/components/column_back_button_slim.jsx => app/javascript/flavours/glitch/components/column_back_button_slim.jsx +3 -1
@@ 1,6 1,8 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

import { Icon } from 'flavours/glitch/components/icon';

export default class ColumnBackButtonSlim extends PureComponent {

M app/javascript/flavours/glitch/components/column_header.jsx => app/javascript/flavours/glitch/components/column_header.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { createPortal } from 'react-dom';
import classNames from 'classnames';

import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';

import classNames from 'classnames';

import { Icon } from 'flavours/glitch/components/icon';

const messages = defineMessages({

M app/javascript/flavours/glitch/components/dismissable_banner.jsx => app/javascript/flavours/glitch/components/dismissable_banner.jsx +5 -2
@@ 1,9 1,12 @@
import { PureComponent } from 'react';
import { IconButton } from './icon_button';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

import { bannerSettings } from 'flavours/glitch/settings';

import { IconButton } from './icon_button';

const messages = defineMessages({
  dismiss: { id: 'dismissable_banner.dismiss', defaultMessage: 'Dismiss' },
});

M app/javascript/flavours/glitch/components/dropdown_menu.jsx => app/javascript/flavours/glitch/components/dropdown_menu.jsx +11 -4
@@ 1,12 1,19 @@
import { PureComponent, cloneElement, Children } from 'react';
import PropTypes from 'prop-types';
import { PureComponent, cloneElement, Children } from 'react';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { IconButton } from './icon_button';
import Overlay from 'react-overlays/Overlay';

import { supportsPassiveEvents } from 'detect-passive-events';
import classNames from 'classnames';
import Overlay from 'react-overlays/Overlay';

import { CircularProgress } from 'flavours/glitch/components/loading_indicator';

import { IconButton } from './icon_button';



const listenerOptions = supportsPassiveEvents ? { passive: true, capture: true } : true;
let id = 0;


M app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js => app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js +1 -0
@@ 1,4 1,5 @@
import { connect } from 'react-redux';

import { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dropdown_menu';
import { fetchHistory } from 'flavours/glitch/actions/history';
import DropdownMenu from 'flavours/glitch/components/dropdown_menu';

M app/javascript/flavours/glitch/components/edited_timestamp/index.jsx => app/javascript/flavours/glitch/components/edited_timestamp/index.jsx +8 -4
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage, injectIntl } from 'react-intl';
import { Icon } from 'flavours/glitch/components/icon';
import DropdownMenu from './containers/dropdown_menu_container';

import { connect } from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import { Icon } from 'flavours/glitch/components/icon';
import InlineAccount from 'flavours/glitch/components/inline_account';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';

import DropdownMenu from './containers/dropdown_menu_container';

const mapDispatchToProps = (dispatch, { statusId }) => ({


M app/javascript/flavours/glitch/components/error_boundary.jsx => app/javascript/flavours/glitch/components/error_boundary.jsx +7 -3
@@ 1,10 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import StackTrace from 'stacktrace-js';

import { source_url } from 'flavours/glitch/initial_state';
import { preferencesLink } from 'flavours/glitch/utils/backend_links';
import StackTrace from 'stacktrace-js';
import { Helmet } from 'react-helmet';

export default class ErrorBoundary extends PureComponent {


M app/javascript/flavours/glitch/components/hashtag.jsx => app/javascript/flavours/glitch/components/hashtag.jsx +11 -4
@@ 1,13 1,20 @@
// @ts-check
import PropTypes from 'prop-types';
import { Component } from 'react';
import { Sparklines, SparklinesCurve } from 'react-sparklines';

import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import Permalink from './permalink';

import { Sparklines, SparklinesCurve } from 'react-sparklines';

import ShortNumber from 'flavours/glitch/components/short_number';
import { Skeleton } from 'flavours/glitch/components/skeleton';
import classNames from 'classnames';

import Permalink from './permalink';


class SilentErrorBoundary extends Component {


M app/javascript/flavours/glitch/components/inline_account.jsx => app/javascript/flavours/glitch/components/inline_account.jsx +3 -1
@@ 1,8 1,10 @@
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import { makeGetAccount } from 'flavours/glitch/selectors';

import { Avatar } from 'flavours/glitch/components/avatar';
import { makeGetAccount } from 'flavours/glitch/selectors';

const makeMapStateToProps = () => {
  const getAccount = makeGetAccount();

M app/javascript/flavours/glitch/components/intersection_observer_article.jsx => app/javascript/flavours/glitch/components/intersection_observer_article.jsx +3 -2
@@ 1,7 1,8 @@
import { cloneElement, Component } from 'react';
import PropTypes from 'prop-types';
import scheduleIdleTask from '../features/ui/util/schedule_idle_task';
import { cloneElement, Component } from 'react';

import getRectFromEntry from '../features/ui/util/get_rect_from_entry';
import scheduleIdleTask from '../features/ui/util/schedule_idle_task';

// Diff these props in the "unrendered" state
const updateOnPropsForUnrendered = ['id', 'index', 'listLength', 'cachedHeight'];

M app/javascript/flavours/glitch/components/link.jsx => app/javascript/flavours/glitch/components/link.jsx +2 -1
@@ 2,10 2,11 @@
//  ~ 😘 kibi!

//  Package imports.
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

//  Utils.
import { assignHandlers } from 'flavours/glitch/utils/react_helpers';


M app/javascript/flavours/glitch/components/load_gap.jsx => app/javascript/flavours/glitch/components/load_gap.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

import { Icon } from 'flavours/glitch/components/icon';

const messages = defineMessages({

M app/javascript/flavours/glitch/components/load_more.jsx => app/javascript/flavours/glitch/components/load_more.jsx +2 -1
@@ 1,6 1,7 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

export default class LoadMore extends PureComponent {


M app/javascript/flavours/glitch/components/load_pending.jsx => app/javascript/flavours/glitch/components/load_pending.jsx +2 -1
@@ 1,6 1,7 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

export default class LoadPending extends PureComponent {


M app/javascript/flavours/glitch/components/media_attachments.jsx => app/javascript/flavours/glitch/components/media_attachments.jsx +5 -2
@@ 1,10 1,13 @@
import PropTypes from 'prop-types';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { MediaGallery, Video, Audio } from 'flavours/glitch/features/ui/util/async-components';
import Bundle from 'flavours/glitch/features/ui/components/bundle';

import noop from 'lodash/noop';

import Bundle from 'flavours/glitch/features/ui/components/bundle';
import { MediaGallery, Video, Audio } from 'flavours/glitch/features/ui/util/async-components';

export default class MediaAttachments extends ImmutablePureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/components/media_gallery.jsx => app/javascript/flavours/glitch/components/media_gallery.jsx +11 -5
@@ 1,13 1,19 @@
import { PureComponent } from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { is } from 'immutable';
import { IconButton } from './icon_button';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';
import { autoPlayGif, displayMedia, useBlurhash } from 'flavours/glitch/initial_state';

import { is } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { debounce } from 'lodash';

import { Blurhash } from 'flavours/glitch/components/blurhash';
import { autoPlayGif, displayMedia, useBlurhash } from 'flavours/glitch/initial_state';

import { IconButton } from './icon_button';

const messages = defineMessages({
  hidden: {

M app/javascript/flavours/glitch/components/modal_root.jsx => app/javascript/flavours/glitch/components/modal_root.jsx +3 -2
@@ 1,8 1,9 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import 'wicg-inert';
import { createBrowserHistory } from 'history';
import { multiply } from 'color-blend';
import { createBrowserHistory } from 'history';

export default class ModalRoot extends PureComponent {


M app/javascript/flavours/glitch/components/navigation_portal.jsx => app/javascript/flavours/glitch/components/navigation_portal.jsx +4 -2
@@ 1,8 1,10 @@
import { PureComponent } from 'react';

import { Switch, Route, withRouter } from 'react-router-dom';
import { showTrends } from 'flavours/glitch/initial_state';
import Trends from 'flavours/glitch/features/getting_started/containers/trends_container';

import AccountNavigation from 'flavours/glitch/features/account/navigation';
import Trends from 'flavours/glitch/features/getting_started/containers/trends_container';
import { showTrends } from 'flavours/glitch/initial_state';

const DefaultNavigation = () => (
  showTrends ? (

M app/javascript/flavours/glitch/components/notification_purge_buttons.jsx => app/javascript/flavours/glitch/components/notification_purge_buttons.jsx +5 -1
@@ 7,10 7,14 @@

//  Package imports  //
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';

import ImmutablePureComponent from 'react-immutable-pure-component';

import { Icon } from 'flavours/glitch/components/icon';
import classNames from 'classnames';

const messages = defineMessages({
  btnAll : { id: 'notification_purge.btn_all', defaultMessage: 'Select\nall' },

M app/javascript/flavours/glitch/components/permalink.jsx => app/javascript/flavours/glitch/components/permalink.jsx +1 -1
@@ 1,5 1,5 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

export default class Permalink extends PureComponent {


M app/javascript/flavours/glitch/components/picture_in_picture_placeholder.jsx => app/javascript/flavours/glitch/components/picture_in_picture_placeholder.jsx +9 -4
@@ 1,10 1,15 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { Icon } from 'flavours/glitch/components/icon';
import { removePictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
import { connect } from 'react-redux';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import { removePictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
import { Icon } from 'flavours/glitch/components/icon';



class PictureInPicturePlaceholder extends PureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/components/poll.jsx => app/javascript/flavours/glitch/components/poll.jsx +12 -5
@@ 1,14 1,21 @@
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';
import Motion from 'flavours/glitch/features/ui/util/optional_motion';
import spring from 'react-motion/lib/spring';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import escapeTextContentForBrowser from 'escape-html';
import spring from 'react-motion/lib/spring';

import { Icon } from 'flavours/glitch/components/icon';
import emojify from 'flavours/glitch/features/emoji/emoji';
import Motion from 'flavours/glitch/features/ui/util/optional_motion';

import { RelativeTimestamp } from './relative_timestamp';
import { Icon } from 'flavours/glitch/components/icon';


const messages = defineMessages({
  closed: {

M app/javascript/flavours/glitch/components/regeneration_indicator.jsx => app/javascript/flavours/glitch/components/regeneration_indicator.jsx +1 -0
@@ 1,4 1,5 @@
import { FormattedMessage } from 'react-intl';

import illustration from 'flavours/glitch/images/elephant_ui_working.svg';

const RegenerationIndicator = () => (

M app/javascript/flavours/glitch/components/scrollable_list.jsx => app/javascript/flavours/glitch/components/scrollable_list.jsx +16 -9
@@ 1,17 1,24 @@
import { Children, cloneElement, PureComponent } from 'react';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
import PropTypes from 'prop-types';
import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container';
import LoadMore from './load_more';
import LoadPending from './load_pending';
import IntersectionObserverWrapper from 'flavours/glitch/features/ui/util/intersection_observer_wrapper';
import { throttle } from 'lodash';
import { List as ImmutableList } from 'immutable';
import { Children, cloneElement, PureComponent } from 'react';

import classNames from 'classnames';

import { List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';

import { supportsPassiveEvents } from 'detect-passive-events';
import { throttle } from 'lodash';

import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
import IntersectionObserverWrapper from 'flavours/glitch/features/ui/util/intersection_observer_wrapper';

import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../features/ui/util/fullscreen';

import LoadMore from './load_more';
import LoadPending from './load_pending';
import LoadingIndicator from './loading_indicator';
import { connect } from 'react-redux';


const MOUSE_IDLE_DELAY = 300;


M app/javascript/flavours/glitch/components/server_banner.jsx => app/javascript/flavours/glitch/components/server_banner.jsx +6 -2
@@ 1,14 1,18 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';

import { Link } from 'react-router-dom';

import { connect } from 'react-redux';

import { fetchServer } from 'flavours/glitch/actions/server';
import { ServerHeroImage } from 'flavours/glitch/components/server_hero_image';
import ShortNumber from 'flavours/glitch/components/short_number';
import { Skeleton } from 'flavours/glitch/components/skeleton';
import Account from 'flavours/glitch/containers/account_container';
import { domain } from 'flavours/glitch/initial_state';
import { ServerHeroImage } from 'flavours/glitch/components/server_hero_image';
import { Link } from 'react-router-dom';

const messages = defineMessages({
  aboutActiveUsers: { id: 'server_banner.about_active_users', defaultMessage: 'People using this server during the last 30 days (Monthly Active Users)' },

M app/javascript/flavours/glitch/components/setting_text.jsx => app/javascript/flavours/glitch/components/setting_text.jsx +2 -1
@@ 1,5 1,6 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';

export default class SettingText extends PureComponent {

M app/javascript/flavours/glitch/components/short_number.jsx => app/javascript/flavours/glitch/components/short_number.jsx +5 -2
@@ 1,7 1,10 @@
import { memo } from 'react';
import PropTypes from 'prop-types';
import { toShortNumber, pluralReady, DECIMAL_UNITS } from '../utils/numbers';
import { memo } from 'react';

import { FormattedMessage, FormattedNumber } from 'react-intl';

import { toShortNumber, pluralReady, DECIMAL_UNITS } from '../utils/numbers';

// @ts-check

/**

M app/javascript/flavours/glitch/components/status.jsx => app/javascript/flavours/glitch/components/status.jsx +19 -15
@@ 1,26 1,30 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import StatusPrepend from './status_prepend';
import StatusHeader from './status_header';
import StatusIcons from './status_icons';
import StatusContent from './status_content';
import StatusActionBar from './status_action_bar';
import AttachmentList from './attachment_list';
import Card from '../features/status/components/card';

import { injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { MediaGallery, Video, Audio } from '../features/ui/util/async-components';

import { HotKeys } from 'react-hotkeys';
import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container';
import classNames from 'classnames';
import { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';

import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';
import PollContainer from 'flavours/glitch/containers/poll_container';
import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container';
import { displayMedia } from 'flavours/glitch/initial_state';
import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';
import { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';

// We use the component (and not the container) since we do not want
// to use the progress bar to show download progress
import Card from '../features/status/components/card';
import Bundle from '../features/ui/components/bundle';
import { MediaGallery, Video, Audio } from '../features/ui/util/async-components';

import AttachmentList from './attachment_list';
import StatusActionBar from './status_action_bar';
import StatusContent from './status_content';
import StatusHeader from './status_header';
import StatusIcons from './status_icons';
import StatusPrepend from './status_prepend';

export const textForScreenReader = (intl, status, rebloggedByText = false, expanded = false) => {
  const displayName = status.getIn(['account', 'display_name']);

M app/javascript/flavours/glitch/components/status_action_bar.jsx => app/javascript/flavours/glitch/components/status_action_bar.jsx +11 -6
@@ 1,14 1,19 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { IconButton } from './icon_button';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';

import { defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import { me } from 'flavours/glitch/initial_state';
import { RelativeTimestamp } from './relative_timestamp';
import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';
import classNames from 'classnames';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';

import { IconButton } from './icon_button';
import { RelativeTimestamp } from './relative_timestamp';

const messages = defineMessages({
  delete: { id: 'status.delete', defaultMessage: 'Delete' },

M app/javascript/flavours/glitch/components/status_content.jsx => app/javascript/flavours/glitch/components/status_content.jsx +9 -4
@@ 1,14 1,19 @@
import { PureComponent } from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage, injectIntl } from 'react-intl';
import Permalink from './permalink';
import { connect } from 'react-redux';

import classnames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

import { Icon } from 'flavours/glitch/components/icon';
import { autoPlayGif, languages as preloadedLanguages } from 'flavours/glitch/initial_state';
import { decode as decodeIDNA } from 'flavours/glitch/utils/idna';

import Permalink from './permalink';

const textMatchesTarget = (text, origin, host) => {
  return (text === origin || text === host
          || text.startsWith(origin + '/') || text.startsWith(host + '/')

M app/javascript/flavours/glitch/components/status_header.jsx => app/javascript/flavours/glitch/components/status_header.jsx +2 -1
@@ 1,6 1,7 @@
//  Package imports.
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';

//  Mastodon imports.

M app/javascript/flavours/glitch/components/status_icons.jsx => app/javascript/flavours/glitch/components/status_icons.jsx +8 -4
@@ 1,15 1,19 @@
//  Package imports.
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';


//  Mastodon imports.
import { IconButton } from './icon_button';
import VisibilityIcon from './status_visibility_icon';
import { Icon } from 'flavours/glitch/components/icon';
import { languages } from 'flavours/glitch/initial_state';

import { IconButton } from './icon_button';
import VisibilityIcon from './status_visibility_icon';

//  Messages for use with internationalization stuff.
const messages = defineMessages({
  collapse: { id: 'status.collapse', defaultMessage: 'Collapse' },

M app/javascript/flavours/glitch/components/status_list.jsx => app/javascript/flavours/glitch/components/status_list.jsx +8 -4
@@ 1,11 1,15 @@
import { debounce } from 'lodash';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import StatusContainer from 'flavours/glitch/containers/status_container';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { debounce } from 'lodash';

import RegenerationIndicator from 'flavours/glitch/components/regeneration_indicator';
import StatusContainer from 'flavours/glitch/containers/status_container';

import LoadGap from './load_gap';
import ScrollableList from './scrollable_list';
import RegenerationIndicator from 'flavours/glitch/components/regeneration_indicator';

export default class StatusList extends ImmutablePureComponent {


M app/javascript/flavours/glitch/components/status_prepend.jsx => app/javascript/flavours/glitch/components/status_prepend.jsx +5 -2
@@ 1,8 1,11 @@
//  Package imports  //
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { Icon } from 'flavours/glitch/components/icon';
import { me } from 'flavours/glitch/initial_state';


M app/javascript/flavours/glitch/components/status_visibility_icon.jsx => app/javascript/flavours/glitch/components/status_visibility_icon.jsx +3 -0
@@ 1,7 1,10 @@
//  Package imports  //
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePureComponent from 'react-immutable-pure-component';

import { Icon } from 'flavours/glitch/components/icon';

const messages = defineMessages({

M app/javascript/flavours/glitch/containers/account_container.jsx => app/javascript/flavours/glitch/containers/account_container.jsx +5 -3
@@ 1,7 1,7 @@
import { connect } from 'react-redux';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { makeGetAccount } from 'flavours/glitch/selectors';
import Account from 'flavours/glitch/components/account';

import { connect } from 'react-redux';

import {
  followAccount,
  unfollowAccount,


@@ 12,7 12,9 @@ import {
} from 'flavours/glitch/actions/accounts';
import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import Account from 'flavours/glitch/components/account';
import { unfollowModal } from 'flavours/glitch/initial_state';
import { makeGetAccount } from 'flavours/glitch/selectors';

const messages = defineMessages({
  unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },

M app/javascript/flavours/glitch/containers/admin_component.jsx => app/javascript/flavours/glitch/containers/admin_component.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { IntlProvider, addLocaleData } from 'react-intl';

import { getLocale } from 'mastodon/locales';

const { localeData, messages } = getLocale();

M app/javascript/flavours/glitch/containers/compose_container.jsx => app/javascript/flavours/glitch/containers/compose_container.jsx +10 -5
@@ 1,13 1,18 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { IntlProvider, addLocaleData } from 'react-intl';

import { Provider } from 'react-redux';
import PropTypes from 'prop-types';
import { store } from 'flavours/glitch/store';

import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
import { hydrateStore } from 'flavours/glitch/actions/store';
import { IntlProvider, addLocaleData } from 'react-intl';
import { getLocale } from 'mastodon/locales';
import Compose from 'flavours/glitch/features/standalone/compose';
import initialState from 'flavours/glitch/initial_state';
import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
import { store } from 'flavours/glitch/store';

import { getLocale } from 'mastodon/locales';


const { localeData, messages } = getLocale();
addLocaleData(localeData);

M app/javascript/flavours/glitch/containers/domain_container.jsx => app/javascript/flavours/glitch/containers/domain_container.jsx +4 -2
@@ 1,8 1,10 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import { blockDomain, unblockDomain } from '../actions/domain_blocks';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { Domain } from '../components/domain';
import { openModal } from '../actions/modal';
import { Domain } from '../components/domain';

const messages = defineMessages({
  blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },

M app/javascript/flavours/glitch/containers/dropdown_menu_container.js => app/javascript/flavours/glitch/containers/dropdown_menu_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';

import { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dropdown_menu';
import { openModal, closeModal } from 'flavours/glitch/actions/modal';
import { connect } from 'react-redux';
import DropdownMenu from 'flavours/glitch/components/dropdown_menu';

import { isUserTouching } from '../is_mobile';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/containers/intersection_observer_article_container.js => app/javascript/flavours/glitch/containers/intersection_observer_article_container.js +2 -1
@@ 1,6 1,7 @@
import { connect } from 'react-redux';
import IntersectionObserverArticle from 'flavours/glitch/components/intersection_observer_article';

import { setHeight } from 'flavours/glitch/actions/height_cache';
import IntersectionObserverArticle from 'flavours/glitch/components/intersection_observer_article';

const makeMapStateToProps = (state, props) => ({
  cachedHeight: state.getIn(['height_cache', props.saveHeightKey, props.id]),

M app/javascript/flavours/glitch/containers/mastodon.jsx => app/javascript/flavours/glitch/containers/mastodon.jsx +10 -5
@@ 1,18 1,23 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { Helmet } from 'react-helmet';

import { IntlProvider, addLocaleData } from 'react-intl';
import { Provider as ReduxProvider } from 'react-redux';

import { Helmet } from 'react-helmet';
import { BrowserRouter, Route } from 'react-router-dom';

import { Provider as ReduxProvider } from 'react-redux';

import { ScrollContext } from 'react-router-scroll-4';
import { store } from 'flavours/glitch/store';
import UI from 'flavours/glitch/features/ui';

import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
import { hydrateStore } from 'flavours/glitch/actions/store';
import { checkDeprecatedLocalSettings } from 'flavours/glitch/actions/local_settings';
import { hydrateStore } from 'flavours/glitch/actions/store';
import { connectUserStream } from 'flavours/glitch/actions/streaming';
import ErrorBoundary from 'flavours/glitch/components/error_boundary';
import UI from 'flavours/glitch/features/ui';
import initialState, { title as siteTitle } from 'flavours/glitch/initial_state';
import { store } from 'flavours/glitch/store';
import { getLocale } from 'locales';

const { localeData, messages } = getLocale();

M app/javascript/flavours/glitch/containers/media_container.jsx => app/javascript/flavours/glitch/containers/media_container.jsx +11 -7
@@ 1,18 1,22 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { createPortal } from 'react-dom';
import PropTypes from 'prop-types';

import { IntlProvider, addLocaleData } from 'react-intl';

import { fromJS } from 'immutable';
import { getLocale } from 'mastodon/locales';
import { getScrollbarWidth } from 'flavours/glitch/utils/scrollbar';
import MediaGallery from 'flavours/glitch/components/media_gallery';
import Poll from 'flavours/glitch/components/poll';

import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';
import MediaGallery from 'flavours/glitch/components/media_gallery';
import ModalRoot from 'flavours/glitch/components/modal_root';
import Poll from 'flavours/glitch/components/poll';
import Audio from 'flavours/glitch/features/audio';
import Card from 'flavours/glitch/features/status/components/card';
import MediaModal from 'flavours/glitch/features/ui/components/media_modal';
import Video from 'flavours/glitch/features/video';
import Card from 'flavours/glitch/features/status/components/card';
import Audio from 'flavours/glitch/features/audio';
import { getScrollbarWidth } from 'flavours/glitch/utils/scrollbar';

import { getLocale } from 'mastodon/locales';

const { localeData, messages } = getLocale();
addLocaleData(localeData);

M app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js => app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js +4 -3
@@ 1,15 1,16 @@
//  Package imports.
import { connect } from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';

import { connect } from 'react-redux';

//  Our imports.
import NotificationPurgeButtons from 'flavours/glitch/components/notification_purge_buttons';
import { openModal } from 'flavours/glitch/actions/modal';
import {
  deleteMarkedNotifications,
  enterNotificationClearingMode,
  markAllNotifications,
} from 'flavours/glitch/actions/notifications';
import { openModal } from 'flavours/glitch/actions/modal';
import NotificationPurgeButtons from 'flavours/glitch/components/notification_purge_buttons';

const messages = defineMessages({
  clearMessage: { id: 'notifications.marked_clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all selected notifications?' },

M app/javascript/flavours/glitch/containers/poll_container.js => app/javascript/flavours/glitch/containers/poll_container.js +2 -1
@@ 1,8 1,9 @@
import { connect } from 'react-redux';

import { debounce } from 'lodash';

import Poll from 'flavours/glitch/components/poll';
import { fetchPoll, vote } from 'flavours/glitch/actions/polls';
import Poll from 'flavours/glitch/components/poll';

const mapDispatchToProps = (dispatch, { pollId }) => ({
  refresh: debounce(

M app/javascript/flavours/glitch/containers/status_container.js => app/javascript/flavours/glitch/containers/status_container.js +16 -13
@@ 1,12 1,18 @@
import { defineMessages, injectIntl } from 'react-intl';

import { connect } from 'react-redux';
import Status from 'flavours/glitch/components/status';
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';

import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import {
  replyCompose,
  mentionCompose,
  directCompose,
} from 'flavours/glitch/actions/compose';
import {
  initAddFilter,
} from 'flavours/glitch/actions/filters';
import {
  reblog,
  favourite,
  bookmark,


@@ 16,6 22,11 @@ import {
  pin,
  unpin,
} from 'flavours/glitch/actions/interactions';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { deployPictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
import { initReport } from 'flavours/glitch/actions/reports';
import {
  muteStatus,
  unmuteStatus,


@@ 26,18 37,10 @@ import {
  translateStatus,
  undoStatusTranslation,
} from 'flavours/glitch/actions/statuses';
import {
  initAddFilter,
} from 'flavours/glitch/actions/filters';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import { openModal } from 'flavours/glitch/actions/modal';
import { deployPictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import { defineMessages, injectIntl } from 'react-intl';
import Status from 'flavours/glitch/components/status';
import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/initial_state';
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';

import { showAlertForError } from '../actions/alerts';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/about/index.jsx => app/javascript/flavours/glitch/features/about/index.jsx +12 -8
@@ 1,17 1,21 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import Column from 'flavours/glitch/components/column';
import LinkFooter from 'flavours/glitch/features/ui/components/link_footer';

import classNames from 'classnames';
import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

import { fetchServer, fetchExtendedDescription, fetchDomainBlocks } from 'flavours/glitch/actions/server';
import Account from 'flavours/glitch/containers/account_container';
import { Skeleton } from 'flavours/glitch/components/skeleton';
import Column from 'flavours/glitch/components/column';
import { Icon } from 'flavours/glitch/components/icon';
import classNames from 'classnames';
import { ServerHeroImage } from 'flavours/glitch/components/server_hero_image';
import { Skeleton } from 'flavours/glitch/components/skeleton';
import Account from 'flavours/glitch/containers/account_container';
import LinkFooter from 'flavours/glitch/features/ui/components/link_footer';

const messages = defineMessages({
  title: { id: 'column.about', defaultMessage: 'About' },

M app/javascript/flavours/glitch/features/account/components/account_note.jsx => app/javascript/flavours/glitch/features/account/components/account_note.jsx +6 -2
@@ 1,10 1,14 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { Icon } from 'flavours/glitch/components/icon';

import Textarea from 'react-textarea-autosize';

import { Icon } from 'flavours/glitch/components/icon';

const messages = defineMessages({
  placeholder: { id: 'account_note.glitch_placeholder', defaultMessage: 'No comment provided' },
});

M app/javascript/flavours/glitch/features/account/components/action_bar.jsx => app/javascript/flavours/glitch/features/account/components/action_bar.jsx +6 -2
@@ 1,7 1,11 @@
import { PureComponent } from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { NavLink } from 'react-router-dom';

import { FormattedMessage, FormattedNumber } from 'react-intl';

import { NavLink } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { Icon } from 'flavours/glitch/components/icon';

class ActionBar extends PureComponent {

M app/javascript/flavours/glitch/features/account/components/featured_tags.jsx => app/javascript/flavours/glitch/features/account/components/featured_tags.jsx +4 -1
@@ 1,7 1,10 @@
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import Hashtag from 'flavours/glitch/components/hashtag';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/account/components/follow_request_note.jsx => app/javascript/flavours/glitch/features/account/components/follow_request_note.jsx +3 -1
@@ 1,6 1,8 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Icon } from 'flavours/glitch/components/icon';

export default class FollowRequestNote extends ImmutablePureComponent {

M app/javascript/flavours/glitch/features/account/components/header.jsx => app/javascript/flavours/glitch/features/account/components/header.jsx +15 -8
@@ 1,19 1,26 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { autoPlayGif, me, domain } from 'flavours/glitch/initial_state';
import { preferencesLink, profileLink, accountAdminLink } from 'flavours/glitch/utils/backend_links';

import classNames from 'classnames';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Avatar } from 'flavours/glitch/components/avatar';
import Button from 'flavours/glitch/components/button';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import { autoPlayGif, me, domain } from 'flavours/glitch/initial_state';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
import { preferencesLink, profileLink, accountAdminLink } from 'flavours/glitch/utils/backend_links';

import AccountNoteContainer from '../containers/account_note_container';
import FollowRequestNoteContainer from '../containers/follow_request_note_container';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
import { Helmet } from 'react-helmet';



const messages = defineMessages({
  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },

M app/javascript/flavours/glitch/features/account/components/profile_column_header.jsx => app/javascript/flavours/glitch/features/account/components/profile_column_header.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ColumnHeader from '../../../components/column_header';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

import ColumnHeader from '../../../components/column_header';


const messages = defineMessages({
  profile: { id: 'column_header.profile', defaultMessage: 'Profile' },
});

M app/javascript/flavours/glitch/features/account/containers/account_note_container.js => app/javascript/flavours/glitch/features/account/containers/account_note_container.js +2 -0
@@ 1,5 1,7 @@
import { connect } from 'react-redux';

import { changeAccountNoteComment, submitAccountNote, initEditAccountNote, cancelAccountNote } from 'flavours/glitch/actions/account_notes';

import AccountNote from '../components/account_note';

const mapStateToProps = (state, { account }) => {

M app/javascript/flavours/glitch/features/account/containers/featured_tags_container.js => app/javascript/flavours/glitch/features/account/containers/featured_tags_container.js +4 -2
@@ 1,7 1,9 @@
import { List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';
import FeaturedTags from '../components/featured_tags';

import { makeGetAccount } from 'flavours/glitch/selectors';
import { List as ImmutableList } from 'immutable';

import FeaturedTags from '../components/featured_tags';

const mapStateToProps = () => {
  const getAccount = makeGetAccount();

M app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js => app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import FollowRequestNote from '../components/follow_request_note';

import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts';

import FollowRequestNote from '../components/follow_request_note';

const mapDispatchToProps = (dispatch, { account }) => ({
  onAuthorize () {
    dispatch(authorizeFollowRequest(account.get('id')));

M app/javascript/flavours/glitch/features/account/navigation.jsx => app/javascript/flavours/glitch/features/account/navigation.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { connect } from 'react-redux';

import FeaturedTags from 'flavours/glitch/features/account/containers/featured_tags_container';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';


M app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx => app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx +9 -4
@@ 1,11 1,16 @@
import { Blurhash } from 'flavours/glitch/components/blurhash';
import classNames from 'classnames';
import { Icon } from 'flavours/glitch/components/icon';
import { autoPlayGif, displayMedia, useBlurhash } from 'flavours/glitch/initial_state';
import PropTypes from 'prop-types';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Blurhash } from 'flavours/glitch/components/blurhash';
import { Icon } from 'flavours/glitch/components/icon';
import { autoPlayGif, displayMedia, useBlurhash } from 'flavours/glitch/initial_state';



export default class MediaItem extends ImmutablePureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/account_gallery/index.jsx => app/javascript/flavours/glitch/features/account_gallery/index.jsx +16 -11
@@ 1,21 1,26 @@
import { connect } from 'react-redux';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { lookupAccount, fetchAccount } from 'flavours/glitch/actions/accounts';
import { openModal } from 'flavours/glitch/actions/modal';
import { expandAccountMediaTimeline } from 'flavours/glitch/actions/timelines';
import LoadMore from 'flavours/glitch/components/load_more';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import Column from 'flavours/glitch/features/ui/components/column';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
import ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { getAccountGallery } from 'flavours/glitch/selectors';
import MediaItem from './components/media_item';
import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
import LoadMore from 'flavours/glitch/components/load_more';
import { openModal } from 'flavours/glitch/actions/modal';
import { FormattedMessage } from 'react-intl';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import Column from 'flavours/glitch/features/ui/components/column';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import { getAccountGallery } from 'flavours/glitch/selectors';

import MediaItem from './components/media_item';


const mapStateToProps = (state, { params: { acct, id } }) => {
  const accountId = id || state.getIn(['accounts_map', normalizeForLookup(acct)]);

M app/javascript/flavours/glitch/features/account_timeline/components/header.jsx => app/javascript/flavours/glitch/features/account_timeline/components/header.jsx +10 -5
@@ 1,11 1,16 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import InnerHeader from 'flavours/glitch/features/account/components/header';
import ActionBar from 'flavours/glitch/features/account/components/action_bar';
import ImmutablePureComponent from 'react-immutable-pure-component';
import MemorialNote from './memorial_note';

import { FormattedMessage } from 'react-intl';

import { NavLink } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import ActionBar from 'flavours/glitch/features/account/components/action_bar';
import InnerHeader from 'flavours/glitch/features/account/components/header';

import MemorialNote from './memorial_note';
import MovedNote from './moved_note';

export default class Header extends ImmutablePureComponent {

M app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.jsx => app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import { revealAccount } from 'flavours/glitch/actions/accounts';
import { FormattedMessage } from 'react-intl';
import Button from 'flavours/glitch/components/button';
import { domain } from 'flavours/glitch/initial_state';


M app/javascript/flavours/glitch/features/account_timeline/components/moved_note.jsx => app/javascript/flavours/glitch/features/account_timeline/components/moved_note.jsx +6 -2
@@ 1,10 1,14 @@
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Icon } from 'flavours/glitch/components/icon';

import AvatarOverlay from '../../../components/avatar_overlay';
import { DisplayName } from '../../../components/display_name';
import { Icon } from 'flavours/glitch/components/icon';

export default class MovedNote extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx => app/javascript/flavours/glitch/features/account_timeline/containers/header_container.jsx +10 -7
@@ 1,6 1,8 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';
import { makeGetAccount, getAccountHidden } from 'flavours/glitch/selectors';
import Header from '../components/header';

import { initEditAccountNote } from 'flavours/glitch/actions/account_notes';
import {
  followAccount,
  unfollowAccount,


@@ 9,18 11,19 @@ import {
  pinAccount,
  unpinAccount,
} from 'flavours/glitch/actions/accounts';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import {
  mentionCompose,
  directCompose,
} from 'flavours/glitch/actions/compose';
import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_blocks';
import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
import { openModal } from 'flavours/glitch/actions/modal';
import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_blocks';
import { initEditAccountNote } from 'flavours/glitch/actions/account_notes';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { unfollowModal } from 'flavours/glitch/initial_state';
import { makeGetAccount, getAccountHidden } from 'flavours/glitch/selectors';

import Header from '../components/header';

const messages = defineMessages({
  cancelFollowRequestConfirm: { id: 'confirmations.cancel_follow_request.confirm', defaultMessage: 'Withdraw request' },

M app/javascript/flavours/glitch/features/account_timeline/index.jsx => app/javascript/flavours/glitch/features/account_timeline/index.jsx +25 -13
@@ 1,22 1,34 @@
import { connect } from 'react-redux';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { lookupAccount, fetchAccount } from 'flavours/glitch/actions/accounts';
import { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines';
import StatusList from '../../components/status_list';
import LoadingIndicator from '../../components/loading_indicator';
import Column from '../ui/components/column';
import ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header';
import HeaderContainer from './containers/header_container';

import { FormattedMessage } from 'react-intl';

import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';

import { lookupAccount, fetchAccount } from 'flavours/glitch/actions/accounts';
import { TimelineHint } from 'flavours/glitch/components/timeline_hint';
import LimitedAccountHint from './components/limited_account_hint';
import ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import { getAccountHidden } from 'flavours/glitch/selectors';

import { fetchFeaturedTags } from '../../actions/featured_tags';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines';
import LoadingIndicator from '../../components/loading_indicator';
import StatusList from '../../components/status_list';
import Column from '../ui/components/column';

import LimitedAccountHint from './components/limited_account_hint';
import HeaderContainer from './containers/header_container';








const emptyList = ImmutableList();


M app/javascript/flavours/glitch/features/audio/index.jsx => app/javascript/flavours/glitch/features/audio/index.jsx +14 -6
@@ 1,14 1,22 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import { formatTime, getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video';
import { Icon } from 'flavours/glitch/components/icon';

import classNames from 'classnames';

import { is } from 'immutable';

import { throttle, debounce } from 'lodash';
import Visualizer from './visualizer';
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';

import { Blurhash } from 'flavours/glitch/components/blurhash';
import { is } from 'immutable';
import { Icon } from 'flavours/glitch/components/icon';
import { formatTime, getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video';
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';

import Visualizer from './visualizer';



const messages = defineMessages({
  play: { id: 'video.play', defaultMessage: 'Play' },

M app/javascript/flavours/glitch/features/blocks/index.jsx => app/javascript/flavours/glitch/features/blocks/index.jsx +16 -8
@@ 1,15 1,23 @@
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';
import PropTypes from 'prop-types';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ScrollableList from '../../components/scrollable_list';
import Column from 'flavours/glitch/features/ui/components/column';

import { fetchBlocks, expandBlocks } from 'flavours/glitch/actions/blocks';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import AccountContainer from 'flavours/glitch/containers/account_container';
import { fetchBlocks, expandBlocks } from 'flavours/glitch/actions/blocks';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Column from 'flavours/glitch/features/ui/components/column';

import ScrollableList from '../../components/scrollable_list';




const messages = defineMessages({
  heading: { id: 'column.blocks', defaultMessage: 'Blocked users' },

M app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx => app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx +7 -2
@@ 1,10 1,15 @@
import { debounce } from 'lodash';
import PropTypes from 'prop-types';
import { Helmet } from 'react-helmet';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';

import { fetchBookmarkedStatuses, expandBookmarkedStatuses } from 'flavours/glitch/actions/bookmarks';
import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import ColumnHeader from 'flavours/glitch/components/column_header';

M app/javascript/flavours/glitch/features/closed_registrations_modal/index.jsx => app/javascript/flavours/glitch/features/closed_registrations_modal/index.jsx +4 -2
@@ 1,8 1,10 @@
import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';

import ImmutablePureComponent from 'react-immutable-pure-component';
import { domain } from 'flavours/glitch/initial_state';
import { connect } from 'react-redux';

import { fetchServer } from 'flavours/glitch/actions/server';
import { domain } from 'flavours/glitch/initial_state';

const mapStateToProps = state => ({
  message: state.getIn(['server', 'server', 'registrations', 'message']),

M app/javascript/flavours/glitch/features/community_timeline/components/column_settings.jsx => app/javascript/flavours/glitch/features/community_timeline/components/column_settings.jsx +5 -2
@@ 1,7 1,10 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';

import SettingText from 'flavours/glitch/components/setting_text';
import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle';


M app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js => app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js +3 -1
@@ 1,8 1,10 @@
import { connect } from 'react-redux';
import ColumnSettings from '../components/column_settings';

import { changeColumnParams } from 'flavours/glitch/actions/columns';
import { changeSetting } from 'flavours/glitch/actions/settings';

import ColumnSettings from '../components/column_settings';

const mapStateToProps = (state, { columnId }) => {
  const uuid = columnId;
  const columns = state.getIn(['settings', 'columns']);

M app/javascript/flavours/glitch/features/community_timeline/index.jsx => app/javascript/flavours/glitch/features/community_timeline/index.jsx +15 -9
@@ 1,17 1,23 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { connect } from 'react-redux';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { expandCommunityTimeline } from 'flavours/glitch/actions/timelines';

import { Helmet } from 'react-helmet';

import { connect } from 'react-redux';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import ColumnSettingsContainer from './containers/column_settings_container';
import { connectCommunityStream } from 'flavours/glitch/actions/streaming';
import { Helmet } from 'react-helmet';
import { domain } from 'flavours/glitch/initial_state';
import { expandCommunityTimeline } from 'flavours/glitch/actions/timelines';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import DismissableBanner from 'flavours/glitch/components/dismissable_banner';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
import { domain } from 'flavours/glitch/initial_state';

import ColumnSettingsContainer from './containers/column_settings_container';


const messages = defineMessages({
  title: { id: 'column.community', defaultMessage: 'Local timeline' },

M app/javascript/flavours/glitch/features/compose/components/action_bar.jsx => app/javascript/flavours/glitch/features/compose/components/action_bar.jsx +9 -3
@@ 1,10 1,16 @@
import { PureComponent } from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { preferencesLink, profileLink } from 'flavours/glitch/utils/backend_links';

import DropdownMenuContainer from '../../../containers/dropdown_menu_container';



const messages = defineMessages({
  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
  pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' },

M app/javascript/flavours/glitch/features/compose/components/autosuggest_account.jsx => app/javascript/flavours/glitch/features/compose/components/autosuggest_account.jsx +3 -2
@@ 1,8 1,9 @@
import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';

export default class AutosuggestAccount extends ImmutablePureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/compose/components/character_counter.jsx => app/javascript/flavours/glitch/features/compose/components/character_counter.jsx +2 -1
@@ 1,5 1,6 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { length } from 'stringz';

export default class CharacterCounter extends PureComponent {

M app/javascript/flavours/glitch/features/compose/components/compose_form.jsx => app/javascript/flavours/glitch/features/compose/components/compose_form.jsx +16 -10
@@ 1,20 1,26 @@
import CharacterCounter from './character_counter';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import ReplyIndicatorContainer from '../containers/reply_indicator_container';
import AutosuggestTextarea from '../../../components/autosuggest_textarea';
import AutosuggestInput from '../../../components/autosuggest_input';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { length } from 'stringz';

import { maxChars } from 'flavours/glitch/initial_state';
import { isMobile } from 'flavours/glitch/is_mobile';

import AutosuggestInput from '../../../components/autosuggest_input';
import AutosuggestTextarea from '../../../components/autosuggest_textarea';
import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
import OptionsContainer from '../containers/options_container';
import PollFormContainer from '../containers/poll_form_container';
import ReplyIndicatorContainer from '../containers/reply_indicator_container';
import UploadFormContainer from '../containers/upload_form_container';
import WarningContainer from '../containers/warning_container';
import { isMobile } from 'flavours/glitch/is_mobile';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { length } from 'stringz';
import { countableText } from '../util/counter';
import { maxChars } from 'flavours/glitch/initial_state';
import OptionsContainer from '../containers/options_container';

import CharacterCounter from './character_counter';
import Publisher from './publisher';
import TextareaIcons from './textarea_icons';


M app/javascript/flavours/glitch/features/compose/components/dropdown.jsx => app/javascript/flavours/glitch/features/compose/components/dropdown.jsx +4 -1
@@ 1,11 1,14 @@
//  Package imports.
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import Overlay from 'react-overlays/Overlay';

//  Components.
import { IconButton } from 'flavours/glitch/components/icon_button';

import DropdownMenu from './dropdown_menu';

//  The component.

M app/javascript/flavours/glitch/features/compose/components/dropdown_menu.jsx => app/javascript/flavours/glitch/features/compose/components/dropdown_menu.jsx +2 -0
@@ 1,7 1,9 @@
//  Package imports.
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import { supportsPassiveEvents } from 'detect-passive-events';

//  Components.

M app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx => app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx +10 -4
@@ 1,15 1,21 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';
import Overlay from 'react-overlays/Overlay';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { supportsPassiveEvents } from 'detect-passive-events';
import { buildCustomEmojis, categoriesFromEmojis } from '../../emoji/emoji';
import Overlay from 'react-overlays/Overlay';

import { useSystemEmojiFont } from 'flavours/glitch/initial_state';
import { assetHost } from 'flavours/glitch/utils/config';

import { buildCustomEmojis, categoriesFromEmojis } from '../../emoji/emoji';
import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';

const messages = defineMessages({
  emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
  emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },

M app/javascript/flavours/glitch/features/compose/components/header.jsx => app/javascript/flavours/glitch/features/compose/components/header.jsx +5 -7
@@ 1,18 1,16 @@
//  Package imports.
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { injectIntl, defineMessages } from 'react-intl';

import { Link } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

//  Components.
import { Icon } from 'flavours/glitch/components/icon';

//  Utils.
import { conditionalRender } from 'flavours/glitch/utils/react_helpers';
import { signOutLink } from 'flavours/glitch/utils/backend_links';
import { conditionalRender } from 'flavours/glitch/utils/react_helpers';

//  Messages.
const messages = defineMessages({
  community: {
    defaultMessage: 'Local timeline',

M app/javascript/flavours/glitch/features/compose/components/language_dropdown.jsx => app/javascript/flavours/glitch/features/compose/components/language_dropdown.jsx +10 -5
@@ 1,13 1,18 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';
import TextIconButton from './text_icon_button';
import Overlay from 'react-overlays/Overlay';
import { supportsPassiveEvents } from 'detect-passive-events';

import classNames from 'classnames';

import { supportsPassiveEvents } from 'detect-passive-events';
import fuzzysort from 'fuzzysort';
import Overlay from 'react-overlays/Overlay';

import { languages as preloadedLanguages } from 'flavours/glitch/initial_state';
import { loupeIcon, deleteIcon } from 'flavours/glitch/utils/icons';
import fuzzysort from 'fuzzysort';

import TextIconButton from './text_icon_button';

const messages = defineMessages({
  changeLanguage: { id: 'compose.language.change', defaultMessage: 'Change language' },

M app/javascript/flavours/glitch/features/compose/components/navigation_bar.jsx => app/javascript/flavours/glitch/features/compose/components/navigation_bar.jsx +7 -3
@@ 1,12 1,16 @@
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ActionBar from './action_bar';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Avatar } from 'flavours/glitch/components/avatar';
import Permalink from 'flavours/glitch/components/permalink';
import { FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { profileLink } from 'flavours/glitch/utils/backend_links';

import ActionBar from './action_bar';

export default class NavigationBar extends ImmutablePureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/compose/components/options.jsx => app/javascript/flavours/glitch/features/compose/components/options.jsx +14 -6
@@ 1,20 1,28 @@
//  Package imports.
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { defineMessages, injectIntl } from 'react-intl';
import Toggle from 'react-toggle';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import Toggle from 'react-toggle';


//  Components.
import { IconButton } from 'flavours/glitch/components/icon_button';
import TextIconButton from './text_icon_button';
import { pollLimits } from 'flavours/glitch/initial_state';

import DropdownContainer from '../containers/dropdown_container';
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
import LanguageDropdown from '../containers/language_dropdown_container';
import ImmutablePureComponent from 'react-immutable-pure-component';
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';

import TextIconButton from './text_icon_button';



//  Utils.
import { pollLimits } from 'flavours/glitch/initial_state';

//  Messages.
const messages = defineMessages({

M app/javascript/flavours/glitch/features/compose/components/poll_form.jsx => app/javascript/flavours/glitch/features/compose/components/poll_form.jsx +9 -5
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { Icon } from 'flavours/glitch/components/icon';

import AutosuggestInput from 'flavours/glitch/components/autosuggest_input';
import classNames from 'classnames';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { pollLimits } from 'flavours/glitch/initial_state';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.jsx => app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.jsx +2 -0
@@ 1,6 1,8 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import Dropdown from './dropdown';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/compose/components/publisher.jsx => app/javascript/flavours/glitch/features/compose/components/publisher.jsx +6 -7
@@ 1,18 1,17 @@
//  Package imports.
import classNames from 'classnames';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';
import { length } from 'stringz';

import classNames from 'classnames';

import ImmutablePureComponent from 'react-immutable-pure-component';

//  Components.
import { length } from 'stringz';

import Button from 'flavours/glitch/components/button';
import { Icon } from 'flavours/glitch/components/icon';

//  Utils.
import { maxChars } from 'flavours/glitch/initial_state';

//  Messages.
const messages = defineMessages({
  publish: {
    defaultMessage: 'Publish',

M app/javascript/flavours/glitch/features/compose/components/reply_indicator.jsx => app/javascript/flavours/glitch/features/compose/components/reply_indicator.jsx +5 -3
@@ 1,13 1,15 @@
//  Package imports.
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

//  Components.
import AccountContainer from 'flavours/glitch/containers/account_container';
import { IconButton } from 'flavours/glitch/components/icon_button';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { IconButton } from 'flavours/glitch/components/icon_button';
import AccountContainer from 'flavours/glitch/containers/account_container';

//  Messages.
const messages = defineMessages({

M app/javascript/flavours/glitch/features/compose/components/search.jsx => app/javascript/flavours/glitch/features/compose/components/search.jsx +4 -6
@@ 1,19 1,17 @@
//  Package imports.
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import {
  injectIntl,
  FormattedMessage,
  defineMessages,
} from 'react-intl';

import Overlay from 'react-overlays/Overlay';

//  Components.
import { Icon } from 'flavours/glitch/components/icon';

//  Utils.
import { focusRoot } from 'flavours/glitch/utils/dom_helpers';
import { searchEnabled } from 'flavours/glitch/initial_state';
import { focusRoot } from 'flavours/glitch/utils/dom_helpers';

const messages = defineMessages({
  placeholder: { id: 'search.placeholder', defaultMessage: 'Search' },

M app/javascript/flavours/glitch/features/compose/components/search_results.jsx => app/javascript/flavours/glitch/features/compose/components/search_results.jsx +7 -4
@@ 1,13 1,16 @@
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
import AccountContainer from 'flavours/glitch/containers/account_container';
import StatusContainer from 'flavours/glitch/containers/status_container';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';
import { Icon } from 'flavours/glitch/components/icon';
import { searchEnabled } from 'flavours/glitch/initial_state';
import LoadMore from 'flavours/glitch/components/load_more';
import AccountContainer from 'flavours/glitch/containers/account_container';
import StatusContainer from 'flavours/glitch/containers/status_container';
import { searchEnabled } from 'flavours/glitch/initial_state';

const messages = defineMessages({
  dismissSuggestion: { id: 'suggestions.dismiss', defaultMessage: 'Dismiss suggestion' },

M app/javascript/flavours/glitch/features/compose/components/text_icon_button.jsx => app/javascript/flavours/glitch/features/compose/components/text_icon_button.jsx +1 -1
@@ 1,5 1,5 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

const iconStyle = {
  height: null,

M app/javascript/flavours/glitch/features/compose/components/textarea_icons.jsx => app/javascript/flavours/glitch/features/compose/components/textarea_icons.jsx +3 -1
@@ 1,7 1,9 @@
//  Package imports.
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

//  Components.

M app/javascript/flavours/glitch/features/compose/components/upload.jsx => app/javascript/flavours/glitch/features/compose/components/upload.jsx +9 -4
@@ 1,11 1,16 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import Motion from '../../ui/util/optional_motion';
import spring from 'react-motion/lib/spring';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import spring from 'react-motion/lib/spring';

import { Icon } from 'flavours/glitch/components/icon';

import Motion from '../../ui/util/optional_motion';

export default class Upload extends ImmutablePureComponent {

  static contextTypes = {

M app/javascript/flavours/glitch/features/compose/components/upload_form.jsx => app/javascript/flavours/glitch/features/compose/components/upload_form.jsx +3 -2
@@ 1,8 1,9 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import UploadProgressContainer from '../containers/upload_progress_container';
import ImmutablePureComponent from 'react-immutable-pure-component';
import UploadContainer from '../containers/upload_container';

import SensitiveButtonContainer from '../containers/sensitive_button_container';
import UploadContainer from '../containers/upload_container';
import UploadProgressContainer from '../containers/upload_progress_container';

export default class UploadForm extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/compose/components/upload_progress.jsx => app/javascript/flavours/glitch/features/compose/components/upload_progress.jsx +10 -3
@@ 1,9 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import Motion from '../../ui/util/optional_motion';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import spring from 'react-motion/lib/spring';

import { Icon } from 'flavours/glitch/components/icon';
import { FormattedMessage } from 'react-intl';

import Motion from '../../ui/util/optional_motion';




export default class UploadProgress extends PureComponent {


M app/javascript/flavours/glitch/features/compose/components/warning.jsx => app/javascript/flavours/glitch/features/compose/components/warning.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import Motion from '../../ui/util/optional_motion';
import { PureComponent } from 'react';

import spring from 'react-motion/lib/spring';

import Motion from '../../ui/util/optional_motion';


export default class Warning extends PureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js => app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import AutosuggestAccount from '../components/autosuggest_account';

import { makeGetAccount } from 'flavours/glitch/selectors';

import AutosuggestAccount from '../components/autosuggest_account';

const makeMapStateToProps = () => {
  const getAccount = makeGetAccount();


M app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js => app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js +6 -4
@@ 1,6 1,7 @@
import { connect } from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';
import ComposeForm from '../components/compose_form';

import { connect } from 'react-redux';

import {
  changeCompose,
  changeComposeSpoilerText,


@@ 13,13 14,14 @@ import {
  submitCompose,
  uploadCompose,
} from 'flavours/glitch/actions/compose';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import {
  openModal,
} from 'flavours/glitch/actions/modal';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';

import { privacyPreference } from 'flavours/glitch/utils/privacy_preference';

import ComposeForm from '../components/compose_form';

const messages = defineMessages({
  missingDescriptionMessage: {
    id: 'confirmations.missing_media_description.message',

M app/javascript/flavours/glitch/features/compose/containers/dropdown_container.js => app/javascript/flavours/glitch/features/compose/containers/dropdown_container.js +3 -1
@@ 1,6 1,8 @@
import { connect } from 'react-redux';
import { isUserTouching } from 'flavours/glitch/is_mobile';

import { openModal, closeModal } from 'flavours/glitch/actions/modal';
import { isUserTouching } from 'flavours/glitch/is_mobile';

import Dropdown from '../components/dropdown';

const mapDispatchToProps = dispatch => ({

M app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js => app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js +5 -3
@@ 1,9 1,11 @@
import { Map as ImmutableMap } from 'immutable';
import { connect } from 'react-redux';
import EmojiPickerDropdown from '../components/emoji_picker_dropdown';
import { changeSetting } from 'flavours/glitch/actions/settings';
import { createSelector } from 'reselect';
import { Map as ImmutableMap } from 'immutable';

import { useEmoji } from 'flavours/glitch/actions/emojis';
import { changeSetting } from 'flavours/glitch/actions/settings';

import EmojiPickerDropdown from '../components/emoji_picker_dropdown';

const perLine = 8;
const lines   = 2;

M app/javascript/flavours/glitch/features/compose/containers/header_container.js => app/javascript/flavours/glitch/features/compose/containers/header_container.js +6 -3
@@ 1,9 1,12 @@
import { openModal } from 'flavours/glitch/actions/modal';
import { connect }   from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';
import Header from '../components/header';

import { connect }   from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import { logOut } from 'flavours/glitch/utils/log_out';

import Header from '../components/header';

const messages = defineMessages({
  logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
  logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },

M app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js => app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js +6 -3
@@ 1,9 1,12 @@
import { Map as ImmutableMap } from 'immutable';
import { connect } from 'react-redux';
import LanguageDropdown from '../components/language_dropdown';
import { createSelector } from 'reselect';

import { changeComposeLanguage } from 'flavours/glitch/actions/compose';
import { useLanguage } from 'flavours/glitch/actions/languages';
import { createSelector } from 'reselect';
import { Map as ImmutableMap } from 'immutable';

import LanguageDropdown from '../components/language_dropdown';


const getFrequentlyUsedLanguages = createSelector([
  state => state.getIn(['settings', 'frequentlyUsedLanguages'], ImmutableMap()),

M app/javascript/flavours/glitch/features/compose/containers/navigation_container.js => app/javascript/flavours/glitch/features/compose/containers/navigation_container.js +6 -3
@@ 1,9 1,12 @@
import { connect }   from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';
import NavigationBar from '../components/navigation_bar';
import { logOut } from 'flavours/glitch/utils/log_out';

import { connect }   from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import { me } from 'flavours/glitch/initial_state';
import { logOut } from 'flavours/glitch/utils/log_out';

import NavigationBar from '../components/navigation_bar';

const messages = defineMessages({
  logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },

M app/javascript/flavours/glitch/features/compose/containers/options_container.js => app/javascript/flavours/glitch/features/compose/containers/options_container.js +3 -1
@@ 1,5 1,5 @@
import { connect } from 'react-redux';
import Options from '../components/options';

import {
  changeComposeAdvancedOption,
  changeComposeContentType,


@@ 8,6 8,8 @@ import {
} from 'flavours/glitch/actions/compose';
import { openModal } from 'flavours/glitch/actions/modal';

import Options from '../components/options';

function mapStateToProps (state) {
  const poll = state.getIn(['compose', 'poll']);
  const media = state.getIn(['compose', 'media_attachments']);

M app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js => app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js +3 -1
@@ 1,5 1,5 @@
import { connect } from 'react-redux';
import PollForm from '../components/poll_form';

import {
  addPollOption,
  removePollOption,


@@ 10,6 10,8 @@ import {
  selectComposeSuggestion,
} from 'flavours/glitch/actions/compose';

import PollForm from '../components/poll_form';

const mapStateToProps = state => ({
  suggestions: state.getIn(['compose', 'suggestions']),
  options: state.getIn(['compose', 'poll', 'options']),

M app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js => app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js +3 -1
@@ 1,9 1,11 @@
import { connect } from 'react-redux';
import PrivacyDropdown from '../components/privacy_dropdown';

import { changeComposeVisibility } from 'flavours/glitch/actions/compose';
import { openModal, closeModal } from 'flavours/glitch/actions/modal';
import { isUserTouching } from 'flavours/glitch/is_mobile';

import PrivacyDropdown from '../components/privacy_dropdown';

const mapStateToProps = state => ({
  value: state.getIn(['compose', 'privacy']),
});

M app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js => app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js +2 -0
@@ 1,5 1,7 @@
import { connect } from 'react-redux';

import { cancelReplyCompose } from 'flavours/glitch/actions/compose';

import ReplyIndicator from '../components/reply_indicator';

const makeMapStateToProps = () => {

M app/javascript/flavours/glitch/features/compose/containers/search_container.js => app/javascript/flavours/glitch/features/compose/containers/search_container.js +2 -0
@@ 1,10 1,12 @@
import { connect } from 'react-redux';

import {
  changeSearch,
  clearSearch,
  submitSearch,
  showSearch,
} from 'flavours/glitch/actions/search';

import Search from '../components/search';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/compose/containers/search_results_container.js => app/javascript/flavours/glitch/features/compose/containers/search_results_container.js +4 -2
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import SearchResults from '../components/search_results';
import { fetchSuggestions, dismissSuggestion } from 'flavours/glitch/actions/suggestions';

import { expandSearch } from 'flavours/glitch/actions/search';
import { fetchSuggestions, dismissSuggestion } from 'flavours/glitch/actions/suggestions';

import SearchResults from '../components/search_results';

const mapStateToProps = state => ({
  results: state.getIn(['search', 'results']),

M app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.jsx => app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.jsx +8 -3
@@ 1,9 1,14 @@
import { PureComponent } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import { connect } from 'react-redux';

import { changeComposeSensitivity } from 'flavours/glitch/actions/compose';
import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';


const messages = defineMessages({
  marked: {

M app/javascript/flavours/glitch/features/compose/containers/upload_container.js => app/javascript/flavours/glitch/features/compose/containers/upload_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import Upload from '../components/upload';

import { undoUploadCompose, initMediaEditModal, submitCompose } from 'flavours/glitch/actions/compose';

import Upload from '../components/upload';

const mapStateToProps = (state, { id }) => ({
  media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
});

M app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js => app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js +1 -0
@@ 1,4 1,5 @@
import { connect } from 'react-redux';

import UploadForm from '../components/upload_form';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js => app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js +1 -0
@@ 1,4 1,5 @@
import { connect } from 'react-redux';

import UploadProgress from '../components/upload_progress';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/compose/containers/warning_container.jsx => app/javascript/flavours/glitch/features/compose/containers/warning_container.jsx +6 -2
@@ 1,10 1,14 @@
import { connect } from 'react-redux';
import Warning from '../components/warning';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import { me } from 'flavours/glitch/initial_state';
import { profileLink, privacyPolicyLink } from 'flavours/glitch/utils/backend_links';

import Warning from '../components/warning';

const buildHashtagRE = () => {
  try {
    const HASHTAG_SEPARATORS = '_\\u00b7\\u200c';

M app/javascript/flavours/glitch/features/compose/index.jsx => app/javascript/flavours/glitch/features/compose/index.jsx +21 -10
@@ 1,19 1,30 @@
import { PureComponent } from 'react';
import ComposeFormContainer from './containers/compose_form_container';
import NavigationContainer from './containers/navigation_container';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { mountCompose, unmountCompose, cycleElefriendCompose } from 'flavours/glitch/actions/compose';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

import classNames from 'classnames';
import SearchContainer from './containers/search_container';
import Motion from '../ui/util/optional_motion';
import { Helmet } from 'react-helmet';

import { connect } from 'react-redux';

import spring from 'react-motion/lib/spring';
import SearchResultsContainer from './containers/search_results_container';

import { mountCompose, unmountCompose, cycleElefriendCompose } from 'flavours/glitch/actions/compose';
import Column from 'flavours/glitch/components/column';
import { mascot } from 'flavours/glitch/initial_state';

import Motion from '../ui/util/optional_motion';

import ComposeFormContainer from './containers/compose_form_container';
import HeaderContainer from './containers/header_container';
import Column from 'flavours/glitch/components/column';
import { Helmet } from 'react-helmet';
import NavigationContainer from './containers/navigation_container';
import SearchContainer from './containers/search_container';
import SearchResultsContainer from './containers/search_results_container';





const messages = defineMessages({
  compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' },

M app/javascript/flavours/glitch/features/compose/util/url_regex.js => app/javascript/flavours/glitch/features/compose/util/url_regex.js +1 -1
@@ 1,8 1,8 @@
import regexSupplant from 'twitter-text/dist/lib/regexSupplant';
import validUrlPrecedingChars from 'twitter-text/dist/regexp/validUrlPrecedingChars';
import validDomain from 'twitter-text/dist/regexp/validDomain';
import validPortNumber from 'twitter-text/dist/regexp/validPortNumber';
import validUrlPath from 'twitter-text/dist/regexp/validUrlPath';
import validUrlPrecedingChars from 'twitter-text/dist/regexp/validUrlPrecedingChars';
import validUrlQueryChars from 'twitter-text/dist/regexp/validUrlQueryChars';
import validUrlQueryEndingChars from 'twitter-text/dist/regexp/validUrlQueryEndingChars';


M app/javascript/flavours/glitch/features/direct_timeline/components/column_settings.jsx => app/javascript/flavours/glitch/features/direct_timeline/components/column_settings.jsx +6 -2
@@ 1,8 1,12 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';

import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle';

import SettingText from '../../../components/setting_text';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx => app/javascript/flavours/glitch/features/direct_timeline/components/conversation.jsx +12 -6
@@ 1,17 1,23 @@
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import StatusContent from 'flavours/glitch/components/status_content';

import { HotKeys } from 'react-hotkeys';

import AttachmentList from 'flavours/glitch/components/attachment_list';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import AvatarComposite from 'flavours/glitch/components/avatar_composite';
import Permalink from 'flavours/glitch/components/permalink';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Permalink from 'flavours/glitch/components/permalink';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import { HotKeys } from 'react-hotkeys';
import StatusContent from 'flavours/glitch/components/status_content';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import { autoPlayGif } from 'flavours/glitch/initial_state';
import classNames from 'classnames';


const messages = defineMessages({
  more: { id: 'status.more', defaultMessage: 'More' },

M app/javascript/flavours/glitch/features/direct_timeline/components/conversations_list.jsx => app/javascript/flavours/glitch/features/direct_timeline/components/conversations_list.jsx +6 -2
@@ 1,10 1,14 @@
import PropTypes from 'prop-types';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ConversationContainer from '../containers/conversation_container';
import ScrollableList from 'flavours/glitch/components/scrollable_list';

import { debounce } from 'lodash';

import ScrollableList from 'flavours/glitch/components/scrollable_list';

import ConversationContainer from '../containers/conversation_container';

export default class ConversationsList extends ImmutablePureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js => app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import ColumnSettings from '../components/column_settings';

import { changeSetting } from 'flavours/glitch/actions/settings';

import ColumnSettings from '../components/column_settings';

const mapStateToProps = state => ({
  settings: state.getIn(['settings', 'direct']),
});

M app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js => app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js +7 -4
@@ 1,11 1,14 @@
import { defineMessages, injectIntl } from 'react-intl';

import { connect } from 'react-redux';
import Conversation from '../components/conversation';
import { markConversationRead, deleteConversation } from 'flavours/glitch/actions/conversations';
import { makeGetStatus } from 'flavours/glitch/selectors';

import { replyCompose } from 'flavours/glitch/actions/compose';
import { markConversationRead, deleteConversation } from 'flavours/glitch/actions/conversations';
import { openModal } from 'flavours/glitch/actions/modal';
import { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'flavours/glitch/actions/statuses';
import { defineMessages, injectIntl } from 'react-intl';
import { makeGetStatus } from 'flavours/glitch/selectors';

import Conversation from '../components/conversation';

const messages = defineMessages({
  replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },

M app/javascript/flavours/glitch/features/direct_timeline/containers/conversations_list_container.js => app/javascript/flavours/glitch/features/direct_timeline/containers/conversations_list_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import ConversationsList from '../components/conversations_list';

import { expandConversations } from 'flavours/glitch/actions/conversations';

import ConversationsList from '../components/conversations_list';

const mapStateToProps = state => ({
  conversations: state.getIn(['conversations', 'items']),
  isLoading: state.getIn(['conversations', 'isLoading'], true),

M app/javascript/flavours/glitch/features/direct_timeline/index.jsx => app/javascript/flavours/glitch/features/direct_timeline/index.jsx +6 -1
@@ 1,8 1,12 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { Helmet } from 'react-helmet';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import { connect } from 'react-redux';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { mountConversations, unmountConversations, expandConversations } from 'flavours/glitch/actions/conversations';
import { connectDirectStream } from 'flavours/glitch/actions/streaming';


@@ 10,6 14,7 @@ import { expandDirectTimeline } from 'flavours/glitch/actions/timelines';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';

import ColumnSettingsContainer from './containers/column_settings_container';
import ConversationsListContainer from './containers/conversations_list_container';


M app/javascript/flavours/glitch/features/directory/components/account_card.jsx => app/javascript/flavours/glitch/features/directory/components/account_card.jsx +17 -12
@@ 1,16 1,13 @@
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { makeGetAccount } from 'flavours/glitch/selectors';
import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import Permalink from 'flavours/glitch/components/permalink';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Button from 'flavours/glitch/components/button';

import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import { autoPlayGif, me, unfollowModal } from 'flavours/glitch/initial_state';
import ShortNumber from 'flavours/glitch/components/short_number';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import {
  followAccount,
  unfollowAccount,


@@ 18,7 15,15 @@ import {
  unmuteAccount,
} from 'flavours/glitch/actions/accounts';
import { openModal } from 'flavours/glitch/actions/modal';
import classNames from 'classnames';
import { Avatar } from 'flavours/glitch/components/avatar';
import Button from 'flavours/glitch/components/button';
import { DisplayName } from 'flavours/glitch/components/display_name';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Permalink from 'flavours/glitch/components/permalink';
import ShortNumber from 'flavours/glitch/components/short_number';
import { autoPlayGif, me, unfollowModal } from 'flavours/glitch/initial_state';
import { makeGetAccount } from 'flavours/glitch/selectors';


const messages = defineMessages({
  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },

M app/javascript/flavours/glitch/features/directory/index.jsx => app/javascript/flavours/glitch/features/directory/index.jsx +15 -9
@@ 1,19 1,25 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { connect } from 'react-redux';

import { defineMessages, injectIntl } from 'react-intl';
import PropTypes from 'prop-types';

import { Helmet } from 'react-helmet';

import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { connect } from 'react-redux';

import { addColumn, removeColumn, moveColumn, changeColumnParams } from 'flavours/glitch/actions/columns';
import { fetchDirectory, expandDirectory } from 'flavours/glitch/actions/directory';
import { List as ImmutableList } from 'immutable';
import AccountCard from './components/account_card';
import { RadioButton } from 'flavours/glitch/components/radio_button';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import LoadMore from 'flavours/glitch/components/load_more';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { Helmet } from 'react-helmet';
import { RadioButton } from 'flavours/glitch/components/radio_button';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';

import AccountCard from './components/account_card';


const messages = defineMessages({
  title: { id: 'column.directory', defaultMessage: 'Browse profiles' },

M app/javascript/flavours/glitch/features/domain_blocks/index.jsx => app/javascript/flavours/glitch/features/domain_blocks/index.jsx +19 -9
@@ 1,16 1,26 @@
import { connect } from 'react-redux';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { debounce } from 'lodash';
import PropTypes from 'prop-types';
import LoadingIndicator from '../../components/loading_indicator';
import Column from '../ui/components/column';
import ColumnBackButtonSlim from '../../components/column_back_button_slim';
import DomainContainer from '../../containers/domain_container';
import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';

import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { Helmet } from 'react-helmet';

import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks';
import ColumnBackButtonSlim from '../../components/column_back_button_slim';
import LoadingIndicator from '../../components/loading_indicator';
import DomainContainer from '../../containers/domain_container';
import Column from '../ui/components/column';





const messages = defineMessages({
  heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' },

M app/javascript/flavours/glitch/features/emoji/emoji.js => app/javascript/flavours/glitch/features/emoji/emoji.js +4 -2
@@ 1,7 1,9 @@
import Trie from 'substring-trie';

import { autoPlayGif, useSystemEmojiFont } from 'flavours/glitch/initial_state';
import unicodeMapping from './emoji_unicode_mapping_light';
import { assetHost } from 'flavours/glitch/utils/config';
import Trie from 'substring-trie';

import unicodeMapping from './emoji_unicode_mapping_light';

const trie = new Trie(Object.keys(unicodeMapping));


M app/javascript/flavours/glitch/features/emoji/emoji_compressed.js => app/javascript/flavours/glitch/features/emoji/emoji_compressed.js +5 -4
@@ 7,13 7,14 @@
// It's designed to be emitted in an array format to take up less space
// over the wire.

const { unicodeToFilename } = require('./unicode_to_filename');
const { unicodeToUnifiedName } = require('./unicode_to_unified_name');
const emojiMap = require('./emoji_map.json');
const { emojiIndex } = require('emoji-mart');
let data = require('emoji-mart/data/all.json');
const { uncompress: emojiMartUncompress } = require('emoji-mart/dist/utils/data');

let data = require('emoji-mart/data/all.json');
const emojiMap = require('./emoji_map.json');
const { unicodeToFilename } = require('./unicode_to_filename');
const { unicodeToUnifiedName } = require('./unicode_to_unified_name');


if(data.compressed) {
  data = emojiMartUncompress(data);

M app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js => app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js +1 -1
@@ 1,8 1,8 @@
// The output of this module is designed to mimic emoji-mart's
// "data" object, such that we can use it for a light version of emoji-mart's
// emojiIndex.search functionality.
import { unicodeToUnifiedName } from './unicode_to_unified_name';
import emojiCompressed from './emoji_compressed';
import { unicodeToUnifiedName } from './unicode_to_unified_name';

const [ shortCodesToEmojiData, skins, categories, short_names ] = emojiCompressed;


M app/javascript/flavours/glitch/features/emoji/emoji_picker.js => app/javascript/flavours/glitch/features/emoji/emoji_picker.js +1 -1
@@ 1,5 1,5 @@
import Picker from 'emoji-mart/dist-es/components/picker/picker';
import Emoji from 'emoji-mart/dist-es/components/emoji/emoji';
import Picker from 'emoji-mart/dist-es/components/picker/picker';

export {
  Picker,

M app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.js => app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.js +0 -1
@@ 3,7 3,6 @@
// as a "title" attribute in an HTML element (aka tooltip).

import emojiCompressed from './emoji_compressed';

import { unicodeToFilename } from './unicode_to_filename';

const [

M app/javascript/flavours/glitch/features/explore/components/story.jsx => app/javascript/flavours/glitch/features/explore/components/story.jsx +5 -2
@@ 1,10 1,13 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import { Blurhash } from 'flavours/glitch/components/blurhash';
import { accountsCountRenderer } from 'flavours/glitch/components/hashtag';
import ShortNumber from 'flavours/glitch/components/short_number';
import { Skeleton } from 'flavours/glitch/components/skeleton';
import classNames from 'classnames';


export default class Story extends PureComponent {


M app/javascript/flavours/glitch/features/explore/index.jsx => app/javascript/flavours/glitch/features/explore/index.jsx +14 -7
@@ 1,18 1,25 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';
import { NavLink, Switch, Route } from 'react-router-dom';

import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { NavLink, Switch, Route } from 'react-router-dom';
import Search from 'flavours/glitch/features/compose/containers/search_container';
import { showTrends } from 'flavours/glitch/initial_state';

import Links from './links';
import Tags from './tags';
import SearchResults from './results';
import Statuses from './statuses';
import Suggestions from './suggestions';
import Search from 'flavours/glitch/features/compose/containers/search_container';
import SearchResults from './results';
import { showTrends } from 'flavours/glitch/initial_state';
import { Helmet } from 'react-helmet';
import Tags from './tags';



const messages = defineMessages({
  title: { id: 'explore.title', defaultMessage: 'Explore' },

M app/javascript/flavours/glitch/features/explore/links.jsx => app/javascript/flavours/glitch/features/explore/links.jsx +8 -4
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import Story from './components/story';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { connect } from 'react-redux';

import { fetchTrendingLinks } from 'flavours/glitch/actions/trends';
import { FormattedMessage } from 'react-intl';
import DismissableBanner from 'flavours/glitch/components/dismissable_banner';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';

import Story from './components/story';

const mapStateToProps = state => ({
  links: state.getIn(['trends', 'links', 'items']),

M app/javascript/flavours/glitch/features/explore/results.jsx => app/javascript/flavours/glitch/features/explore/results.jsx +12 -6
@@ 1,16 1,22 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

import { expandSearch } from 'flavours/glitch/actions/search';
import Account from 'flavours/glitch/containers/account_container';
import Status from 'flavours/glitch/containers/status_container';
import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';
import { List as ImmutableList } from 'immutable';
import LoadMore from 'flavours/glitch/components/load_more';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { Helmet } from 'react-helmet';
import Account from 'flavours/glitch/containers/account_container';
import Status from 'flavours/glitch/containers/status_container';



const messages = defineMessages({
  title: { id: 'search_results.title', defaultMessage: 'Search for {q}' },

M app/javascript/flavours/glitch/features/explore/statuses.jsx => app/javascript/flavours/glitch/features/explore/statuses.jsx +8 -4
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import StatusList from 'flavours/glitch/components/status_list';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import { fetchTrendingStatuses, expandTrendingStatuses } from 'flavours/glitch/actions/trends';

import { debounce } from 'lodash';

import { fetchTrendingStatuses, expandTrendingStatuses } from 'flavours/glitch/actions/trends';
import DismissableBanner from 'flavours/glitch/components/dismissable_banner';
import StatusList from 'flavours/glitch/components/status_list';

const mapStateToProps = state => ({
  statusIds: state.getIn(['status_lists', 'trending', 'items']),

M app/javascript/flavours/glitch/features/explore/suggestions.jsx => app/javascript/flavours/glitch/features/explore/suggestions.jsx +9 -4
@@ 1,11 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import AccountCard from 'flavours/glitch/features/directory/components/account_card';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { connect } from 'react-redux';

import { fetchSuggestions, dismissSuggestion } from 'flavours/glitch/actions/suggestions';
import { FormattedMessage } from 'react-intl';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import AccountCard from 'flavours/glitch/features/directory/components/account_card';



const mapStateToProps = state => ({
  suggestions: state.getIn(['suggestions', 'items']),

M app/javascript/flavours/glitch/features/explore/tags.jsx => app/javascript/flavours/glitch/features/explore/tags.jsx +9 -4
@@ 1,12 1,17 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { connect } from 'react-redux';

import { fetchTrendingHashtags } from 'flavours/glitch/actions/trends';
import { FormattedMessage } from 'react-intl';
import DismissableBanner from 'flavours/glitch/components/dismissable_banner';
import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';



const mapStateToProps = state => ({
  hashtags: state.getIn(['trends', 'tags', 'items']),

M app/javascript/flavours/glitch/features/favourited_statuses/index.jsx => app/javascript/flavours/glitch/features/favourited_statuses/index.jsx +7 -2
@@ 1,10 1,15 @@
import { debounce } from 'lodash';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';

import { debounce } from 'lodash';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'flavours/glitch/actions/favourites';
import ColumnHeader from 'flavours/glitch/components/column_header';

M app/javascript/flavours/glitch/features/favourites/index.jsx => app/javascript/flavours/glitch/features/favourites/index.jsx +9 -4
@@ 1,16 1,21 @@
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { fetchFavourites } from 'flavours/glitch/actions/interactions';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { Icon } from 'flavours/glitch/components/icon';
import { fetchFavourites } from 'flavours/glitch/actions/interactions';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import AccountContainer from 'flavours/glitch/containers/account_container';
import Column from 'flavours/glitch/features/ui/components/column';
import { Helmet } from 'react-helmet';


const messages = defineMessages({
  heading: { id: 'column.favourited_by', defaultMessage: 'Favourited by' },

M app/javascript/flavours/glitch/features/filters/added_to_filter.jsx => app/javascript/flavours/glitch/features/filters/added_to_filter.jsx +7 -4
@@ 1,11 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';
import { toServerSideType } from 'flavours/glitch/utils/filters';
import Button from 'flavours/glitch/components/button';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

import Button from 'flavours/glitch/components/button';
import { toServerSideType } from 'flavours/glitch/utils/filters';

const mapStateToProps = (state, { filterId }) => ({
  filter: state.getIn(['filters', filterId]),
});

M app/javascript/flavours/glitch/features/filters/select_filter.jsx => app/javascript/flavours/glitch/features/filters/select_filter.jsx +8 -4
@@ 1,11 1,15 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import fuzzysort from 'fuzzysort';

import { Icon } from 'flavours/glitch/components/icon';
import { toServerSideType } from 'flavours/glitch/utils/filters';
import { loupeIcon, deleteIcon } from 'flavours/glitch/utils/icons';
import { Icon } from 'flavours/glitch/components/icon';
import fuzzysort from 'fuzzysort';

const messages = defineMessages({
  search: { id: 'filter_modal.select_filter.search', defaultMessage: 'Search or create' },

M app/javascript/flavours/glitch/features/follow_recommendations/components/account.jsx => app/javascript/flavours/glitch/features/follow_recommendations/components/account.jsx +7 -4
@@ 1,14 1,17 @@
import PropTypes from 'prop-types';

import { injectIntl, defineMessages } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import { makeGetAccount } from 'flavours/glitch/selectors';

import { followAccount, unfollowAccount } from 'flavours/glitch/actions/accounts';
import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import Permalink from 'flavours/glitch/components/permalink';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { injectIntl, defineMessages } from 'react-intl';
import { followAccount, unfollowAccount } from 'flavours/glitch/actions/accounts';
import Permalink from 'flavours/glitch/components/permalink';
import { makeGetAccount } from 'flavours/glitch/selectors';

const messages = defineMessages({
  follow: { id: 'account.follow', defaultMessage: 'Follow' },

M app/javascript/flavours/glitch/features/follow_recommendations/index.jsx => app/javascript/flavours/glitch/features/follow_recommendations/index.jsx +12 -7
@@ 1,17 1,22 @@
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';
import { fetchSuggestions } from 'flavours/glitch/actions/suggestions';
import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings';

import { requestBrowserPermission } from 'flavours/glitch/actions/notifications';
import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings';
import { fetchSuggestions } from 'flavours/glitch/actions/suggestions';
import { markAsPartial } from 'flavours/glitch/actions/timelines';
import Button from 'flavours/glitch/components/button';
import Column from 'flavours/glitch/features/ui/components/column';
import Account from './components/account';
import imageGreeting from 'mastodon/../images/elephant_ui_greeting.svg';
import Button from 'flavours/glitch/components/button';
import { Helmet } from 'react-helmet';

import Account from './components/account';

const mapStateToProps = state => ({
  suggestions: state.getIn(['suggestions', 'items']),

M app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.jsx => app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.jsx +7 -3
@@ 1,11 1,15 @@
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import Permalink from 'flavours/glitch/components/permalink';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Permalink from 'flavours/glitch/components/permalink';


const messages = defineMessages({
  authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },

M app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js => app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';

import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts';
import { makeGetAccount } from 'flavours/glitch/selectors';

import AccountAuthorize from '../components/account_authorize';
import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts';

const makeMapStateToProps = () => {
  const getAccount = makeGetAccount();

M app/javascript/flavours/glitch/features/follow_requests/index.jsx => app/javascript/flavours/glitch/features/follow_requests/index.jsx +18 -7
@@ 1,16 1,27 @@
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import AccountAuthorizeContainer from './containers/account_authorize_container';

import { fetchFollowRequests, expandFollowRequests } from 'flavours/glitch/actions/accounts';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import Column from 'flavours/glitch/features/ui/components/column';
import { me } from 'flavours/glitch/initial_state';
import { Helmet } from 'react-helmet';

import AccountAuthorizeContainer from './containers/account_authorize_container';






const messages = defineMessages({
  heading: { id: 'column.follow_requests', defaultMessage: 'Follow requests' },

M app/javascript/flavours/glitch/features/followed_tags/index.jsx => app/javascript/flavours/glitch/features/followed_tags/index.jsx +12 -6
@@ 1,15 1,21 @@
import { debounce } from 'lodash';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';

import { expandFollowedHashtags, fetchFollowedHashtags } from 'flavours/glitch/actions/tags';
import ColumnHeader from 'flavours/glitch/components/column_header';
import Hashtag from 'flavours/glitch/components/hashtag';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import Column from 'flavours/glitch/features/ui/components/column';
import { Helmet } from 'react-helmet';
import Hashtag from 'flavours/glitch/components/hashtag';
import { expandFollowedHashtags, fetchFollowedHashtags } from 'flavours/glitch/actions/tags';


const messages = defineMessages({
  heading: { id: 'followed_tags', defaultMessage: 'Followed hashtags' },

M app/javascript/flavours/glitch/features/followers/index.jsx => app/javascript/flavours/glitch/features/followers/index.jsx +16 -10
@@ 1,26 1,32 @@
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';

import {
  lookupAccount,
  fetchAccount,
  fetchFollowers,
  expandFollowers,
} from 'flavours/glitch/actions/accounts';
import { FormattedMessage } from 'react-intl';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { TimelineHint } from 'flavours/glitch/components/timeline_hint';
import AccountContainer from 'flavours/glitch/containers/account_container';
import Column from 'flavours/glitch/features/ui/components/column';
import ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header';
import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { TimelineHint } from 'flavours/glitch/components/timeline_hint';
import LimitedAccountHint from '../account_timeline/components/limited_account_hint';
import { getAccountHidden } from 'flavours/glitch/selectors';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import Column from 'flavours/glitch/features/ui/components/column';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import { getAccountHidden } from 'flavours/glitch/selectors';

import LimitedAccountHint from '../account_timeline/components/limited_account_hint';


const mapStateToProps = (state, { params: { acct, id } }) => {
  const accountId = id || state.getIn(['accounts_map', normalizeForLookup(acct)]);

M app/javascript/flavours/glitch/features/following/index.jsx => app/javascript/flavours/glitch/features/following/index.jsx +16 -10
@@ 1,26 1,32 @@
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';

import {
  lookupAccount,
  fetchAccount,
  fetchFollowing,
  expandFollowing,
} from 'flavours/glitch/actions/accounts';
import { FormattedMessage } from 'react-intl';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { TimelineHint } from 'flavours/glitch/components/timeline_hint';
import AccountContainer from 'flavours/glitch/containers/account_container';
import Column from 'flavours/glitch/features/ui/components/column';
import ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header';
import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { TimelineHint } from 'flavours/glitch/components/timeline_hint';
import LimitedAccountHint from '../account_timeline/components/limited_account_hint';
import { getAccountHidden } from 'flavours/glitch/selectors';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import Column from 'flavours/glitch/features/ui/components/column';
import { normalizeForLookup } from 'flavours/glitch/reducers/accounts_map';
import { getAccountHidden } from 'flavours/glitch/selectors';

import LimitedAccountHint from '../account_timeline/components/limited_account_hint';


const mapStateToProps = (state, { params: { acct, id } }) => {
  const accountId = id || state.getIn(['accounts_map', normalizeForLookup(acct)]);

M app/javascript/flavours/glitch/features/getting_started/components/announcements.jsx => app/javascript/flavours/glitch/features/getting_started/components/announcements.jsx +18 -11
@@ 1,20 1,27 @@
import { PureComponent } from 'react';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ReactSwipeableViews from 'react-swipeable-views';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { Icon } from 'flavours/glitch/components/icon';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'flavours/glitch/initial_state';
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';

import classNames from 'classnames';
import EmojiPickerDropdown from 'flavours/glitch/features/compose/containers/emoji_picker_dropdown_container';
import { AnimatedNumber } from 'flavours/glitch/components/animated_number';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import TransitionMotion from 'react-motion/lib/TransitionMotion';
import spring from 'react-motion/lib/spring';
import ReactSwipeableViews from 'react-swipeable-views';

import { AnimatedNumber } from 'flavours/glitch/components/animated_number';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';
import EmojiPickerDropdown from 'flavours/glitch/features/compose/containers/emoji_picker_dropdown_container';
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'flavours/glitch/initial_state';
import { assetHost } from 'flavours/glitch/utils/config';
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';



const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },

M app/javascript/flavours/glitch/features/getting_started/components/trends.jsx => app/javascript/flavours/glitch/features/getting_started/components/trends.jsx +7 -3
@@ 1,10 1,14 @@
import ImmutablePureComponent from 'react-immutable-pure-component';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';

import { FormattedMessage } from 'react-intl';

import { Link } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';

export default class Trends extends ImmutablePureComponent {

  static defaultProps = {

M app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js => app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js +4 -2
@@ 1,8 1,10 @@
import { Map as ImmutableMap } from 'immutable';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';

import { addReaction, removeReaction, dismissAnnouncement } from 'flavours/glitch/actions/announcements';

import Announcements from '../components/announcements';
import { createSelector } from 'reselect';
import { Map as ImmutableMap } from 'immutable';

const customEmojiMap = createSelector([state => state.get('custom_emojis')], items => items.reduce((map, emoji) => map.set(emoji.get('shortcode'), emoji), ImmutableMap()));


M app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js => app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js +2 -0
@@ 1,5 1,7 @@
import { connect } from 'react-redux';

import { fetchTrendingHashtags } from 'flavours/glitch/actions/trends';

import Trends from '../components/trends';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/getting_started/index.jsx => app/javascript/flavours/glitch/features/getting_started/index.jsx +18 -11
@@ 1,22 1,29 @@
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';
import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux';
import { openModal } from 'flavours/glitch/actions/modal';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';

import { Helmet } from 'react-helmet';

import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { me, showTrends } from 'flavours/glitch/initial_state';
import { fetchFollowRequests } from 'flavours/glitch/actions/accounts';
import { List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';

import { fetchFollowRequests } from 'flavours/glitch/actions/accounts';
import { fetchLists } from 'flavours/glitch/actions/lists';
import { openModal } from 'flavours/glitch/actions/modal';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';
import LinkFooter from 'flavours/glitch/features/ui/components/link_footer';
import { me, showTrends } from 'flavours/glitch/initial_state';
import { preferencesLink } from 'flavours/glitch/utils/backend_links';

import NavigationBar from '../compose/components/navigation_bar';
import LinkFooter from 'flavours/glitch/features/ui/components/link_footer';

import TrendsContainer from './containers/trends_container';
import { Helmet } from 'react-helmet';


const messages = defineMessages({
  heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' },

M app/javascript/flavours/glitch/features/getting_started_misc/index.jsx => app/javascript/flavours/glitch/features/getting_started_misc/index.jsx +8 -4
@@ 1,12 1,16 @@
import PropTypes from 'prop-types';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';
import { openModal } from 'flavours/glitch/actions/modal';
import { connect } from 'react-redux';


const messages = defineMessages({
  heading: { id: 'column.heading', defaultMessage: 'Misc' },

M app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.jsx => app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.jsx +8 -4
@@ 1,10 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import Toggle from 'react-toggle';
import AsyncSelect from 'react-select/async';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { NonceProvider } from 'react-select';
import AsyncSelect from 'react-select/async';
import Toggle from 'react-toggle';

import SettingToggle from '../../notifications/components/setting_toggle';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/hashtag_timeline/containers/column_settings_container.js => app/javascript/flavours/glitch/features/hashtag_timeline/containers/column_settings_container.js +3 -1
@@ 1,8 1,10 @@
import { connect } from 'react-redux';
import ColumnSettings from '../components/column_settings';

import { changeColumnParams } from 'flavours/glitch/actions/columns';
import api from 'flavours/glitch/api';

import ColumnSettings from '../components/column_settings';

const mapStateToProps = (state, { columnId }) => {
  const columns = state.getIn(['settings', 'columns']);
  const index   = columns.findIndex(c => c.get('uuid') === columnId);

M app/javascript/flavours/glitch/features/hashtag_timeline/index.jsx => app/javascript/flavours/glitch/features/hashtag_timeline/index.jsx +18 -11
@@ 1,20 1,27 @@
import { PureComponent } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { PureComponent } from 'react';

import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';

import classNames from 'classnames';
import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ColumnSettingsContainer from './containers/column_settings_container';
import { expandHashtagTimeline, clearTimeline } from 'flavours/glitch/actions/timelines';
import { connect } from 'react-redux';

import { isEqual } from 'lodash';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { connectHashtagStream } from 'flavours/glitch/actions/streaming';
import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';
import { isEqual } from 'lodash';
import { fetchHashtag, followHashtag, unfollowHashtag } from 'flavours/glitch/actions/tags';
import { expandHashtagTimeline, clearTimeline } from 'flavours/glitch/actions/timelines';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { Icon } from 'flavours/glitch/components/icon';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';

import ColumnSettingsContainer from './containers/column_settings_container';


const messages = defineMessages({
  followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' },

M app/javascript/flavours/glitch/features/home_timeline/components/column_settings.jsx => app/javascript/flavours/glitch/features/home_timeline/components/column_settings.jsx +6 -3
@@ 1,9 1,12 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle';

import ImmutablePropTypes from 'react-immutable-proptypes';

import SettingText from 'flavours/glitch/components/setting_text';
import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle';

const messages = defineMessages({
  filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },

M app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js => app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import ColumnSettings from '../components/column_settings';

import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings';

import ColumnSettings from '../components/column_settings';

const mapStateToProps = state => ({
  settings: state.getIn(['settings', 'home']),
});

M app/javascript/flavours/glitch/features/home_timeline/index.jsx => app/javascript/flavours/glitch/features/home_timeline/index.jsx +16 -10
@@ 1,20 1,26 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';

import { connect } from 'react-redux';

import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/actions/announcements';
import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
import PropTypes from 'prop-types';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ColumnSettingsContainer from './containers/column_settings_container';
import { Link } from 'react-router-dom';
import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/actions/announcements';
import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container';
import classNames from 'classnames';
import { IconWithBadge } from 'flavours/glitch/components/icon_with_badge';
import { NotSignedInIndicator } from 'flavours/glitch/components/not_signed_in_indicator';
import { Helmet } from 'react-helmet';
import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';

import ColumnSettingsContainer from './containers/column_settings_container';


const messages = defineMessages({
  title: { id: 'column.home', defaultMessage: 'Home' },

M app/javascript/flavours/glitch/features/interaction_modal/index.jsx => app/javascript/flavours/glitch/features/interaction_modal/index.jsx +8 -4
@@ 1,11 1,15 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';
import { registrationsOpen } from 'flavours/glitch/initial_state';
import { connect } from 'react-redux';
import { Icon } from 'flavours/glitch/components/icon';

import classNames from 'classnames';

import { connect } from 'react-redux';

import { openModal, closeModal } from 'flavours/glitch/actions/modal';
import { Icon } from 'flavours/glitch/components/icon';
import { registrationsOpen } from 'flavours/glitch/initial_state';

const mapStateToProps = (state, { accountId }) => ({
  displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']),

M app/javascript/flavours/glitch/features/keyboard_shortcuts/index.jsx => app/javascript/flavours/glitch/features/keyboard_shortcuts/index.jsx +9 -4
@@ 1,10 1,15 @@
import Column from 'flavours/glitch/components/column';
import { connect } from 'react-redux';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { Helmet } from 'react-helmet';


const messages = defineMessages({
  heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },

M app/javascript/flavours/glitch/features/list_adder/components/account.jsx => app/javascript/flavours/glitch/features/list_adder/components/account.jsx +7 -4
@@ 1,10 1,13 @@
import { connect } from 'react-redux';
import { makeGetAccount } from '../../../selectors';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { Avatar } from '../../../components/avatar';
import { DisplayName } from '../../../components/display_name';
import { injectIntl } from 'react-intl';
import { makeGetAccount } from '../../../selectors';


const makeMapStateToProps = () => {
  const getAccount = makeGetAccount();

M app/javascript/flavours/glitch/features/list_adder/components/list.jsx => app/javascript/flavours/glitch/features/list_adder/components/list.jsx +9 -5
@@ 1,12 1,16 @@
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { IconButton } from '../../../components/icon_button';

import { defineMessages, injectIntl } from 'react-intl';
import { removeFromListAdder, addToListAdder } from '../../../actions/lists';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { Icon } from 'flavours/glitch/components/icon';

import { removeFromListAdder, addToListAdder } from '../../../actions/lists';
import { IconButton } from '../../../components/icon_button';

const messages = defineMessages({
  remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },
  add: { id: 'lists.account.add', defaultMessage: 'Add to list' },

M app/javascript/flavours/glitch/features/list_adder/index.jsx => app/javascript/flavours/glitch/features/list_adder/index.jsx +9 -5
@@ 1,13 1,17 @@
import PropTypes from 'prop-types';

import { injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { injectIntl } from 'react-intl';
import { setupListAdder, resetListAdder } from '../../actions/lists';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import List from './components/list';
import Account from './components/account';

import { setupListAdder, resetListAdder } from '../../actions/lists';
import NewListForm from '../lists/components/new_list_form';

import Account from './components/account';
import List from './components/list';
// hack

const getOrderedLists = createSelector([state => state.get('lists')], lists => {

M app/javascript/flavours/glitch/features/list_editor/components/account.jsx => app/javascript/flavours/glitch/features/list_editor/components/account.jsx +6 -2
@@ 1,10 1,14 @@
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { defineMessages } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { defineMessages } from 'react-intl';


const messages = defineMessages({
  remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },

M app/javascript/flavours/glitch/features/list_editor/components/edit_list_form.jsx => app/javascript/flavours/glitch/features/list_editor/components/edit_list_form.jsx +6 -2
@@ 1,9 1,13 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { changeListEditorTitle, submitListEditor } from 'flavours/glitch/actions/lists';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { defineMessages, injectIntl } from 'react-intl';


const messages = defineMessages({
  title: { id: 'lists.edit.submit', defaultMessage: 'Change title' },

M app/javascript/flavours/glitch/features/list_editor/components/search.jsx => app/javascript/flavours/glitch/features/list_editor/components/search.jsx +4 -1
@@ 1,7 1,10 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages } from 'react-intl';

import classNames from 'classnames';

import { Icon } from 'flavours/glitch/components/icon';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/list_editor/containers/account_container.js => app/javascript/flavours/glitch/features/list_editor/containers/account_container.js +5 -2
@@ 1,7 1,10 @@
import { connect } from 'react-redux';
import { makeGetAccount } from 'flavours/glitch/selectors';
import { injectIntl } from 'react-intl';

import { connect } from 'react-redux';

import { removeFromListEditor, addToListEditor } from 'flavours/glitch/actions/lists';
import { makeGetAccount } from 'flavours/glitch/selectors';

import Account from '../components/account';

const makeMapStateToProps = () => {

M app/javascript/flavours/glitch/features/list_editor/containers/search_container.js => app/javascript/flavours/glitch/features/list_editor/containers/search_container.js +3 -1
@@ 1,5 1,7 @@
import { connect } from 'react-redux';
import { injectIntl } from 'react-intl';

import { connect } from 'react-redux';

import { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists';
import Search from '../components/search';


M app/javascript/flavours/glitch/features/list_editor/index.jsx => app/javascript/flavours/glitch/features/list_editor/index.jsx +12 -5
@@ 1,14 1,21 @@
import PropTypes from 'prop-types';

import { injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { injectIntl } from 'react-intl';
import { connect } from 'react-redux';

import spring from 'react-motion/lib/spring';

import { setupListEditor, clearListSuggestions, resetListEditor } from 'flavours/glitch/actions/lists';

import Motion from '../ui/util/optional_motion';

import EditListForm from './components/edit_list_form';
import AccountContainer from './containers/account_container';
import SearchContainer from './containers/search_container';
import EditListForm from './components/edit_list_form';
import Motion from '../ui/util/optional_motion';
import spring from 'react-motion/lib/spring';


const mapStateToProps = state => ({
  accountIds: state.getIn(['listEditor', 'accounts', 'items']),

M app/javascript/flavours/glitch/features/list_timeline/index.jsx => app/javascript/flavours/glitch/features/list_timeline/index.jsx +6 -2
@@ 1,9 1,13 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { fetchList, deleteList, updateList } from 'flavours/glitch/actions/lists';
import { openModal } from 'flavours/glitch/actions/modal';


@@ 14,8 18,8 @@ import ColumnHeader from 'flavours/glitch/components/column_header';
import { Icon } from 'flavours/glitch/components/icon';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { RadioButton } from 'flavours/glitch/components/radio_button';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';

const messages = defineMessages({
  deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' },

M app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx => app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx +6 -2
@@ 1,9 1,13 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { changeListEditorTitle, submitListEditor } from 'flavours/glitch/actions/lists';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { defineMessages, injectIntl } from 'react-intl';


const messages = defineMessages({
  label: { id: 'lists.new.title_placeholder', defaultMessage: 'New list title' },

M app/javascript/flavours/glitch/features/lists/index.jsx => app/javascript/flavours/glitch/features/lists/index.jsx +6 -1
@@ 1,10 1,14 @@
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';

import { fetchLists } from 'flavours/glitch/actions/lists';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';


@@ 12,6 16,7 @@ import ScrollableList from 'flavours/glitch/components/scrollable_list';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';

import NewListForm from './components/new_list_form';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/local_settings/index.jsx => app/javascript/flavours/glitch/features/local_settings/index.jsx +6 -4
@@ 1,14 1,16 @@
//  Package imports.
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

//  Our imports
import LocalSettingsPage from './page';
import LocalSettingsNavigation from './navigation';
import { closeModal } from 'flavours/glitch/actions/modal';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import { closeModal } from 'flavours/glitch/actions/modal';

import LocalSettingsNavigation from './navigation';
import LocalSettingsPage from './page';

const mapStateToProps = state => ({
  settings: state.get('local_settings'),

M app/javascript/flavours/glitch/features/local_settings/navigation/index.jsx => app/javascript/flavours/glitch/features/local_settings/navigation/index.jsx +4 -2
@@ 1,12 1,14 @@
//  Package imports
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

//  Our imports
import LocalSettingsNavigationItem from './item';
import { preferencesLink } from 'flavours/glitch/utils/backend_links';

import LocalSettingsNavigationItem from './item';

//  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

const messages = defineMessages({

M app/javascript/flavours/glitch/features/local_settings/navigation/item/index.jsx => app/javascript/flavours/glitch/features/local_settings/navigation/item/index.jsx +2 -1
@@ 1,6 1,7 @@
//  Package imports
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import { Icon } from 'flavours/glitch/components/icon';

M app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.jsx => app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.jsx +1 -1
@@ 1,6 1,6 @@
//  Package imports
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

//  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


M app/javascript/flavours/glitch/features/local_settings/page/index.jsx => app/javascript/flavours/glitch/features/local_settings/page/index.jsx +7 -3
@@ 1,14 1,18 @@
//  Package imports
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';


//  Our imports
import { expandSpoilers } from 'flavours/glitch/initial_state';
import { preferenceLink } from 'flavours/glitch/utils/backend_links';
import LocalSettingsPageItem from './item';

import DeprecatedLocalSettingsPageItem from './deprecated_item';
import LocalSettingsPageItem from './item';

//  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


M app/javascript/flavours/glitch/features/local_settings/page/item/index.jsx => app/javascript/flavours/glitch/features/local_settings/page/item/index.jsx +2 -1
@@ 1,6 1,7 @@
//  Package imports
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';

//  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

M app/javascript/flavours/glitch/features/mutes/index.jsx => app/javascript/flavours/glitch/features/mutes/index.jsx +16 -8
@@ 1,16 1,24 @@
import { connect } from 'react-redux';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { debounce } from 'lodash';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import AccountContainer from 'flavours/glitch/containers/account_container';

import { fetchMutes, expandMutes } from 'flavours/glitch/actions/mutes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { Helmet } from 'react-helmet';
import AccountContainer from 'flavours/glitch/containers/account_container';
import Column from 'flavours/glitch/features/ui/components/column';




const messages = defineMessages({
  heading: { id: 'column.mutes', defaultMessage: 'Muted users' },

M app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx => app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx +10 -3
@@ 1,15 1,22 @@
//  Package imports.
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { HotKeys } from 'react-hotkeys';
import classNames from 'classnames';


// Our imports.
import { Icon } from 'flavours/glitch/components/icon';
import Permalink from 'flavours/glitch/components/permalink';

import NotificationOverlayContainer from '../containers/overlay_container';
import { Icon } from 'flavours/glitch/components/icon';

import Report from './report';

export default class AdminReport extends ImmutablePureComponent {

M app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx => app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx +9 -3
@@ 1,16 1,22 @@
//  Package imports.
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { HotKeys } from 'react-hotkeys';
import classNames from 'classnames';


// Our imports.
import { Icon } from 'flavours/glitch/components/icon';
import Permalink from 'flavours/glitch/components/permalink';
import AccountContainer from 'flavours/glitch/containers/account_container';

import NotificationOverlayContainer from '../containers/overlay_container';
import { Icon } from 'flavours/glitch/components/icon';

export default class NotificationFollow extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/notifications/components/clear_column_button.jsx => app/javascript/flavours/glitch/features/notifications/components/clear_column_button.jsx +3 -1
@@ 1,6 1,8 @@
import { Component } from 'react';
import PropTypes from 'prop-types';
import { Component } from 'react';

import { FormattedMessage } from 'react-intl';

import { Icon } from 'flavours/glitch/components/icon';

export default class ClearColumnButton extends Component {

M app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx => app/javascript/flavours/glitch/features/notifications/components/column_settings.jsx +8 -4
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'flavours/glitch/permissions';

import ClearColumnButton from './clear_column_button';
import GrantPermissionButton from './grant_permission_button';
import SettingToggle from './setting_toggle';
import PillBarButton from './pill_bar_button';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'flavours/glitch/permissions';
import SettingToggle from './setting_toggle';

export default class ColumnSettings extends PureComponent {


M app/javascript/flavours/glitch/features/notifications/components/filter_bar.jsx => app/javascript/flavours/glitch/features/notifications/components/filter_bar.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Icon } from 'flavours/glitch/components/icon';

const tooltips = defineMessages({

M app/javascript/flavours/glitch/features/notifications/components/follow.jsx => app/javascript/flavours/glitch/features/notifications/components/follow.jsx +9 -3
@@ 1,16 1,22 @@
//  Package imports.
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { HotKeys } from 'react-hotkeys';
import classNames from 'classnames';


// Our imports.
import { Icon } from 'flavours/glitch/components/icon';
import Permalink from 'flavours/glitch/components/permalink';
import AccountContainer from 'flavours/glitch/containers/account_container';

import NotificationOverlayContainer from '../containers/overlay_container';
import { Icon } from 'flavours/glitch/components/icon';

export default class NotificationFollow extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx => app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx +16 -7
@@ 1,15 1,24 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import Permalink from 'flavours/glitch/components/permalink';
import { IconButton } from 'flavours/glitch/components/icon_button';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import NotificationOverlayContainer from '../containers/overlay_container';

import { HotKeys } from 'react-hotkeys';

import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import { Icon } from 'flavours/glitch/components/icon';
import classNames from 'classnames';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Permalink from 'flavours/glitch/components/permalink';

import NotificationOverlayContainer from '../containers/overlay_container';




const messages = defineMessages({
  authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },

M app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.jsx => app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.jsx +2 -1
@@ 1,5 1,6 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

export default class GrantPermissionButton extends PureComponent {

M app/javascript/flavours/glitch/features/notifications/components/notification.jsx => app/javascript/flavours/glitch/features/notifications/components/notification.jsx +6 -2
@@ 1,14 1,18 @@
//  Package imports.
import PropTypes from 'prop-types';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

//  Our imports,
import StatusContainer from 'flavours/glitch/containers/status_container';
import NotificationFollow from './follow';

import NotificationAdminReportContainer from '../containers/admin_report_container';
import NotificationFollowRequestContainer from '../containers/follow_request_container';

import NotificationAdminSignup from './admin_signup';
import NotificationAdminReportContainer from '../containers/admin_report_container';
import NotificationFollow from './follow';


export default class Notification extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.jsx => app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.jsx +11 -6
@@ 1,12 1,17 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { Icon } from 'flavours/glitch/components/icon';
import Button from 'flavours/glitch/components/button';
import { IconButton } from 'flavours/glitch/components/icon_button';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import { requestBrowserPermission } from 'flavours/glitch/actions/notifications';
import { changeSetting } from 'flavours/glitch/actions/settings';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import Button from 'flavours/glitch/components/button';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';



const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },

M app/javascript/flavours/glitch/features/notifications/components/overlay.jsx => app/javascript/flavours/glitch/features/notifications/components/overlay.jsx +5 -2
@@ 4,10 4,13 @@


//  Package imports.
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { defineMessages, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { Icon } from 'flavours/glitch/components/icon';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/notifications/components/pill_bar_button.jsx => app/javascript/flavours/glitch/features/notifications/components/pill_bar_button.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';


export default class PillBarButton extends PureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/notifications/components/report.jsx => app/javascript/flavours/glitch/features/notifications/components/report.jsx +4 -1
@@ 1,7 1,10 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import AvatarOverlay from 'flavours/glitch/components/avatar_overlay';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';


M app/javascript/flavours/glitch/features/notifications/components/setting_toggle.jsx => app/javascript/flavours/glitch/features/notifications/components/setting_toggle.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';

import Toggle from 'react-toggle';

export default class SettingToggle extends PureComponent {

M app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js => app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js +2 -0
@@ 1,5 1,7 @@
import { connect } from 'react-redux';

import { makeGetReport } from 'flavours/glitch/selectors';

import AdminReport from '../components/admin_report';

const mapStateToProps = (state, { notification }) => {

M app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js => app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js +9 -5
@@ 1,11 1,15 @@
import { connect } from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';
import ColumnSettings from '../components/column_settings';
import { changeSetting } from 'flavours/glitch/actions/settings';

import { connect } from 'react-redux';

import { showAlert } from 'flavours/glitch/actions/alerts';
import { openModal } from 'flavours/glitch/actions/modal';
import { setFilter, clearNotifications, requestBrowserPermission } from 'flavours/glitch/actions/notifications';
import { changeAlerts as changePushNotifications } from 'flavours/glitch/actions/push_notifications';
import { openModal } from 'flavours/glitch/actions/modal';
import { showAlert } from 'flavours/glitch/actions/alerts';
import { changeSetting } from 'flavours/glitch/actions/settings';

import ColumnSettings from '../components/column_settings';


const messages = defineMessages({
  clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },

M app/javascript/flavours/glitch/features/notifications/containers/filter_bar_container.js => app/javascript/flavours/glitch/features/notifications/containers/filter_bar_container.js +2 -1
@@ 1,6 1,7 @@
import { connect } from 'react-redux';
import FilterBar from '../components/filter_bar';

import { setFilter } from '../../../actions/notifications';
import FilterBar from '../components/filter_bar';

const makeMapStateToProps = state => ({
  selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),

M app/javascript/flavours/glitch/features/notifications/containers/follow_request_container.js => app/javascript/flavours/glitch/features/notifications/containers/follow_request_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import FollowRequest from '../components/follow_request';

import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts';

import FollowRequest from '../components/follow_request';

const mapDispatchToProps = (dispatch, { account }) => ({
  onAuthorize () {
    dispatch(authorizeFollowRequest(account.get('id')));

M app/javascript/flavours/glitch/features/notifications/containers/notification_container.js => app/javascript/flavours/glitch/features/notifications/containers/notification_container.js +2 -1
@@ 2,9 2,10 @@
import { connect } from 'react-redux';

//  Our imports.
import { mentionCompose } from 'flavours/glitch/actions/compose';
import { makeGetNotification } from 'flavours/glitch/selectors';

import Notification from '../components/notification';
import { mentionCompose } from 'flavours/glitch/actions/compose';

const makeMapStateToProps = () => {
  const getNotification = makeGetNotification();

M app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js => app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js +2 -1
@@ 2,9 2,10 @@
import { connect } from 'react-redux';

//  Our imports.
import NotificationOverlay from '../components/overlay';
import { markNotificationForDelete } from 'flavours/glitch/actions/notifications';

import NotificationOverlay from '../components/overlay';

const mapDispatchToProps = dispatch => ({
  onMarkForDelete(id, yes) {
    dispatch(markNotificationForDelete(id, yes));

M app/javascript/flavours/glitch/features/notifications/index.jsx => app/javascript/flavours/glitch/features/notifications/index.jsx +29 -19
@@ 1,10 1,20 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { connect } from 'react-redux';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';
import PropTypes from 'prop-types';
import { Helmet } from 'react-helmet';

import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';

import { debounce } from 'lodash';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { submitMarkers } from 'flavours/glitch/actions/markers';
import {
  enterNotificationClearingMode,
  expandNotifications,


@@ 14,25 24,25 @@ import {
  unmountNotifications,
  markNotificationsAsRead,
} from 'flavours/glitch/actions/notifications';
import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { submitMarkers } from 'flavours/glitch/actions/markers';
import NotificationContainer from './containers/notification_container';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ColumnSettingsContainer from './containers/column_settings_container';
import FilterBarContainer from './containers/filter_bar_container';
import { createSelector } from 'reselect';
import { List as ImmutableList } from 'immutable';
import { debounce } from 'lodash';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import LoadGap from 'flavours/glitch/components/load_gap';
import { Icon } from 'flavours/glitch/components/icon';
import { compareId } from 'flavours/glitch/compare_id';
import NotificationsPermissionBanner from './components/notifications_permission_banner';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { Icon } from 'flavours/glitch/components/icon';
import LoadGap from 'flavours/glitch/components/load_gap';
import { NotSignedInIndicator } from 'flavours/glitch/components/not_signed_in_indicator';
import { Helmet } from 'react-helmet';

import ScrollableList from 'flavours/glitch/components/scrollable_list';
import NotificationPurgeButtonsContainer from 'flavours/glitch/containers/notification_purge_buttons_container';

import NotificationsPermissionBanner from './components/notifications_permission_banner';
import ColumnSettingsContainer from './containers/column_settings_container';
import FilterBarContainer from './containers/filter_bar_container';
import NotificationContainer from './containers/notification_container';






const messages = defineMessages({
  title: { id: 'column.notifications', defaultMessage: 'Notifications' },
  enterNotifCleaning : { id: 'notification_purge.start', defaultMessage: 'Enter notification cleaning mode' },

M app/javascript/flavours/glitch/features/picture_in_picture/components/footer.jsx => app/javascript/flavours/glitch/features/picture_in_picture/components/footer.jsx +12 -8
@@ 1,16 1,20 @@
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { IconButton } from 'flavours/glitch/components/icon_button';
import classNames from 'classnames';
import { me, boostModal } from 'flavours/glitch/initial_state';

import { defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { initBoostModal } from 'flavours/glitch/actions/boosts';
import { replyCompose } from 'flavours/glitch/actions/compose';
import { reblog, favourite, unreblog, unfavourite } from 'flavours/glitch/actions/interactions';
import { makeGetStatus } from 'flavours/glitch/selectors';
import { openModal } from 'flavours/glitch/actions/modal';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { me, boostModal } from 'flavours/glitch/initial_state';
import { makeGetStatus } from 'flavours/glitch/selectors';

const messages = defineMessages({
  reply: { id: 'status.reply', defaultMessage: 'Reply' },

M app/javascript/flavours/glitch/features/picture_in_picture/components/header.jsx => app/javascript/flavours/glitch/features/picture_in_picture/components/header.jsx +11 -5
@@ 1,12 1,18 @@
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import { IconButton } from 'flavours/glitch/components/icon_button';

import { defineMessages, injectIntl } from 'react-intl';

import { Link } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import { defineMessages, injectIntl } from 'react-intl';
import { IconButton } from 'flavours/glitch/components/icon_button';



const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },

M app/javascript/flavours/glitch/features/picture_in_picture/index.jsx => app/javascript/flavours/glitch/features/picture_in_picture/index.jsx +9 -5
@@ 1,12 1,16 @@
import PropTypes from 'prop-types';
import { Component } from 'react';

import classNames from 'classnames';

import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import Video from 'flavours/glitch/features/video';
import Audio from 'flavours/glitch/features/audio';

import { removePictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
import Header from './components/header';
import Audio from 'flavours/glitch/features/audio';
import Video from 'flavours/glitch/features/video';

import Footer from './components/footer';
import classNames from 'classnames';
import Header from './components/header';

const mapStateToProps = state => ({
  ...state.get('picture_in_picture'),

M app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js => app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js +4 -2
@@ 1,8 1,10 @@
import { connect } from 'react-redux';
import { makeGetAccount } from 'flavours/glitch/selectors';
import { injectIntl } from 'react-intl';

import { connect } from 'react-redux';

import { pinAccount, unpinAccount } from 'flavours/glitch/actions/accounts';
import Account from 'flavours/glitch/features/list_editor/components/account';
import { makeGetAccount } from 'flavours/glitch/selectors';

const makeMapStateToProps = () => {
  const getAccount = makeGetAccount();

M app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js => app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js +6 -2
@@ 1,11 1,15 @@
import { connect } from 'react-redux';
import { injectIntl } from 'react-intl';

import { connect } from 'react-redux';

import Search from 'flavours/glitch/features/list_editor/components/search';

import {
  fetchPinnedAccountsSuggestions,
  clearPinnedAccountsSuggestions,
  changePinnedAccountsSuggestions,
} from '../../../actions/accounts';
import Search from 'flavours/glitch/features/list_editor/components/search';


const mapStateToProps = state => ({
  value: state.getIn(['pinnedAccountsEditor', 'suggestions', 'value']),

M app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx => app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx +10 -4
@@ 1,13 1,19 @@
import PropTypes from 'prop-types';

import { injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';

import spring from 'react-motion/lib/spring';

import { fetchPinnedAccounts, clearPinnedAccountsSuggestions, resetPinnedAccountsEditor } from 'flavours/glitch/actions/accounts';
import Motion from 'flavours/glitch/features/ui/util/optional_motion';

import AccountContainer from './containers/account_container';
import SearchContainer from './containers/search_container';
import Motion from 'flavours/glitch/features/ui/util/optional_motion';
import spring from 'react-motion/lib/spring';


const mapStateToProps = state => ({
  accountIds: state.getIn(['pinnedAccountsEditor', 'accounts', 'items']),

M app/javascript/flavours/glitch/features/pinned_statuses/index.jsx => app/javascript/flavours/glitch/features/pinned_statuses/index.jsx +12 -5
@@ 1,13 1,20 @@
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { fetchPinnedStatuses } from 'flavours/glitch/actions/pin_statuses';
import Column from 'flavours/glitch/features/ui/components/column';
import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
import StatusList from 'flavours/glitch/components/status_list';
import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { Helmet } from 'react-helmet';
import Column from 'flavours/glitch/features/ui/components/column';




const messages = defineMessages({
  heading: { id: 'column.pins', defaultMessage: 'Pinned post' },

M app/javascript/flavours/glitch/features/privacy_policy/index.jsx => app/javascript/flavours/glitch/features/privacy_policy/index.jsx +6 -3
@@ 1,9 1,12 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { Helmet } from 'react-helmet';
import { PureComponent } from 'react';

import { FormattedMessage, FormattedDate, injectIntl, defineMessages } from 'react-intl';
import Column from 'flavours/glitch/components/column';

import { Helmet } from 'react-helmet';

import api from 'flavours/glitch/api';
import Column from 'flavours/glitch/components/column';
import { Skeleton } from 'flavours/glitch/components/skeleton';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/public_timeline/components/column_settings.jsx => app/javascript/flavours/glitch/features/public_timeline/components/column_settings.jsx +5 -2
@@ 1,7 1,10 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';

import SettingText from 'flavours/glitch/components/setting_text';
import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle';


M app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js => app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js +4 -2
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import ColumnSettings from '../components/column_settings';
import { changeSetting } from 'flavours/glitch/actions/settings';

import { changeColumnParams } from 'flavours/glitch/actions/columns';
import { changeSetting } from 'flavours/glitch/actions/settings';

import ColumnSettings from '../components/column_settings';

const mapStateToProps = (state, { columnId }) => {
  const uuid = columnId;

M app/javascript/flavours/glitch/features/public_timeline/index.jsx => app/javascript/flavours/glitch/features/public_timeline/index.jsx +13 -8
@@ 1,16 1,21 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { connect } from 'react-redux';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { expandPublicTimeline } from 'flavours/glitch/actions/timelines';

import { Helmet } from 'react-helmet';

import { connect } from 'react-redux';

import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import ColumnSettingsContainer from './containers/column_settings_container';
import { connectPublicStream } from 'flavours/glitch/actions/streaming';
import { Helmet } from 'react-helmet';
import { expandPublicTimeline } from 'flavours/glitch/actions/timelines';
import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import DismissableBanner from 'flavours/glitch/components/dismissable_banner';
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';

import ColumnSettingsContainer from './containers/column_settings_container';

const messages = defineMessages({
  title: { id: 'column.public', defaultMessage: 'Federated timeline' },

M app/javascript/flavours/glitch/features/reblogs/index.jsx => app/javascript/flavours/glitch/features/reblogs/index.jsx +16 -8
@@ 1,16 1,24 @@
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { Helmet } from 'react-helmet';

import ImmutablePropTypes from 'react-immutable-proptypes';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { fetchReblogs } from 'flavours/glitch/actions/interactions';
import AccountContainer from 'flavours/glitch/containers/account_container';
import Column from 'flavours/glitch/features/ui/components/column';
import { Icon } from 'flavours/glitch/components/icon';
import ColumnHeader from 'flavours/glitch/components/column_header';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { Icon } from 'flavours/glitch/components/icon';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import ScrollableList from 'flavours/glitch/components/scrollable_list';
import { Helmet } from 'react-helmet';
import AccountContainer from 'flavours/glitch/containers/account_container';
import Column from 'flavours/glitch/features/ui/components/column';





const messages = defineMessages({
  heading: { id: 'column.reblogged_by', defaultMessage: 'Boosted by' },

M app/javascript/flavours/glitch/features/report/category.jsx => app/javascript/flavours/glitch/features/report/category.jsx +8 -3
@@ 1,11 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import Button from 'flavours/glitch/components/button';

import Option from './components/option';
import { List as ImmutableList } from 'immutable';


const messages = defineMessages({
  dislike: { id: 'report.reasons.dislike', defaultMessage: 'I don\'t like it' },

M app/javascript/flavours/glitch/features/report/comment.jsx => app/javascript/flavours/glitch/features/report/comment.jsx +5 -2
@@ 1,9 1,12 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
import Button from 'flavours/glitch/components/button';

import Toggle from 'react-toggle';

import Button from 'flavours/glitch/components/button';

const messages = defineMessages({
  placeholder: { id: 'report.placeholder', defaultMessage: 'Type or paste additional comments' },
});

M app/javascript/flavours/glitch/features/report/components/option.jsx => app/javascript/flavours/glitch/features/report/components/option.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import Check from 'flavours/glitch/components/check';

export default class Option extends PureComponent {

M app/javascript/flavours/glitch/features/report/components/status_check_box.jsx => app/javascript/flavours/glitch/features/report/components/status_check_box.jsx +7 -4
@@ 1,14 1,17 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';
import StatusContent from 'flavours/glitch/components/status_content';

import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import Option from './option';
import MediaAttachments from 'flavours/glitch/components/media_attachments';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import StatusContent from 'flavours/glitch/components/status_content';
import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';

import Option from './option';

export default class StatusCheckBox extends PureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js => app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import StatusCheckBox from '../components/status_check_box';

import { makeGetStatus } from 'flavours/glitch/selectors';

import StatusCheckBox from '../components/status_check_box';

const makeMapStateToProps = () => {
  const getStatus = makeGetStatus();


M app/javascript/flavours/glitch/features/report/rules.jsx => app/javascript/flavours/glitch/features/report/rules.jsx +6 -2
@@ 1,9 1,13 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';

import Button from 'flavours/glitch/components/button';

import Option from './components/option';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/report/statuses.jsx => app/javascript/flavours/glitch/features/report/statuses.jsx +8 -4
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import { OrderedSet } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';
import { OrderedSet } from 'immutable';
import { FormattedMessage } from 'react-intl';

import Button from 'flavours/glitch/components/button';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';


const mapStateToProps = (state, { accountId }) => ({
  availableStatusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])),

M app/javascript/flavours/glitch/features/report/thanks.jsx => app/javascript/flavours/glitch/features/report/thanks.jsx +6 -3
@@ 1,14 1,17 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';
import Button from 'flavours/glitch/components/button';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

import {
  unfollowAccount,
  muteAccount,
  blockAccount,
} from 'flavours/glitch/actions/accounts';
import Button from 'flavours/glitch/components/button';

const mapStateToProps = () => ({});


M app/javascript/flavours/glitch/features/standalone/compose/index.jsx => app/javascript/flavours/glitch/features/standalone/compose/index.jsx +2 -1
@@ 1,8 1,9 @@
import { PureComponent } from 'react';

import ComposeFormContainer from 'flavours/glitch/features/compose/containers/compose_form_container';
import NotificationsContainer from 'flavours/glitch/features/ui/containers/notifications_container';
import LoadingBarContainer from 'flavours/glitch/features/ui/containers/loading_bar_container';
import ModalContainer from 'flavours/glitch/features/ui/containers/modal_container';
import NotificationsContainer from 'flavours/glitch/features/ui/containers/notifications_container';

export default class Compose extends PureComponent {


M app/javascript/flavours/glitch/features/status/components/action_bar.jsx => app/javascript/flavours/glitch/features/status/components/action_bar.jsx +10 -5
@@ 1,13 1,18 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';

import { IconButton } from 'flavours/glitch/components/icon_button';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import { defineMessages, injectIntl } from 'react-intl';
import { me } from 'flavours/glitch/initial_state';
import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';
import classNames from 'classnames';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';


const messages = defineMessages({
  delete: { id: 'status.delete', defaultMessage: 'Delete' },

M app/javascript/flavours/glitch/features/status/components/card.jsx => app/javascript/flavours/glitch/features/status/components/card.jsx +9 -5
@@ 1,13 1,17 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import Immutable from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import classnames from 'classnames';
import { decode as decodeIDNA } from 'flavours/glitch/utils/idna';

import Immutable from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';

import { Blurhash } from 'flavours/glitch/components/blurhash';
import { Icon } from 'flavours/glitch/components/icon';
import { useBlurhash } from 'flavours/glitch/initial_state';
import { Blurhash } from 'flavours/glitch/components/blurhash';
import { decode as decodeIDNA } from 'flavours/glitch/utils/idna';

const getHostname = url => {
  const parser = document.createElement('a');

M app/javascript/flavours/glitch/features/status/components/detailed_status.jsx => app/javascript/flavours/glitch/features/status/components/detailed_status.jsx +23 -14
@@ 1,24 1,33 @@
import PropTypes from 'prop-types';

import { injectIntl, FormattedDate } from 'react-intl';

import classNames from 'classnames';
import { Link } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { AnimatedNumber } from 'flavours/glitch/components/animated_number';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Avatar } from 'flavours/glitch/components/avatar';
import { DisplayName } from 'flavours/glitch/components/display_name';
import StatusContent from 'flavours/glitch/components/status_content';
import EditedTimestamp from 'flavours/glitch/components/edited_timestamp';
import { Icon } from 'flavours/glitch/components/icon';
import MediaGallery from 'flavours/glitch/components/media_gallery';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Link } from 'react-router-dom';
import { injectIntl, FormattedDate } from 'react-intl';
import Card from './card';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Video from 'flavours/glitch/features/video';
import Audio from 'flavours/glitch/features/audio';
import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';
import StatusContent from 'flavours/glitch/components/status_content';
import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';
import scheduleIdleTask from '../../ui/util/schedule_idle_task';
import classNames from 'classnames';
import PollContainer from 'flavours/glitch/containers/poll_container';
import { Icon } from 'flavours/glitch/components/icon';
import { AnimatedNumber } from 'flavours/glitch/components/animated_number';
import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';
import EditedTimestamp from 'flavours/glitch/components/edited_timestamp';
import Audio from 'flavours/glitch/features/audio';
import Video from 'flavours/glitch/features/video';

import scheduleIdleTask from '../../ui/util/schedule_idle_task';

import Card from './card';




class DetailedStatus extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js => app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js +12 -9
@@ 1,6 1,10 @@
import { defineMessages, injectIntl } from 'react-intl';

import { connect } from 'react-redux';
import DetailedStatus from '../components/detailed_status';
import { makeGetStatus } from 'flavours/glitch/selectors';

import { showAlertForError } from 'flavours/glitch/actions/alerts';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import {
  replyCompose,
  mentionCompose,


@@ 14,19 18,18 @@ import {
  pin,
  unpin,
} from 'flavours/glitch/actions/interactions';
import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initReport } from 'flavours/glitch/actions/reports';
import {
  muteStatus,
  unmuteStatus,
  deleteStatus,
} from 'flavours/glitch/actions/statuses';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import { openModal } from 'flavours/glitch/actions/modal';
import { defineMessages, injectIntl } from 'react-intl';
import { boostModal, deleteModal } from 'flavours/glitch/initial_state';
import { showAlertForError } from 'flavours/glitch/actions/alerts';
import { makeGetStatus } from 'flavours/glitch/selectors';

import DetailedStatus from '../components/detailed_status';

const messages = defineMessages({
  deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },

M app/javascript/flavours/glitch/features/status/index.jsx => app/javascript/flavours/glitch/features/status/index.jsx +41 -34
@@ 1,24 1,25 @@
import Immutable from 'immutable';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';
import { Helmet } from 'react-helmet';

import Immutable from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';

import { HotKeys } from 'react-hotkeys';

import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import {
  fetchStatus,
  muteStatus,
  unmuteStatus,
  deleteStatus,
  editStatus,
  hideStatus,
  revealStatus,
  translateStatus,
  undoStatusTranslation,
} from 'flavours/glitch/actions/statuses';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import DetailedStatus from './components/detailed_status';
import ActionBar from './components/action_bar';
import Column from 'flavours/glitch/features/ui/components/column';
  replyCompose,
  mentionCompose,
  directCompose,
} from 'flavours/glitch/actions/compose';
import {
  favourite,
  unfavourite,


@@ 29,31 30,37 @@ import {
  pin,
  unpin,
} from 'flavours/glitch/actions/interactions';
import {
  replyCompose,
  mentionCompose,
  directCompose,
} from 'flavours/glitch/actions/compose';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
import { initBoostModal } from 'flavours/glitch/actions/boosts';
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
import {
  fetchStatus,
  muteStatus,
  unmuteStatus,
  deleteStatus,
  editStatus,
  hideStatus,
  revealStatus,
  translateStatus,
  undoStatusTranslation,
} from 'flavours/glitch/actions/statuses';
import { Icon } from 'flavours/glitch/components/icon';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
import ColumnHeader from '../../components/column_header';
import StatusContainer from 'flavours/glitch/containers/status_container';
import { openModal } from 'flavours/glitch/actions/modal';
import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { HotKeys } from 'react-hotkeys';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import Column from 'flavours/glitch/features/ui/components/column';
import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/initial_state';
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
import { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';
import { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status';
import { Icon } from 'flavours/glitch/components/icon';
import { Helmet } from 'react-helmet';
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';

import ColumnHeader from '../../components/column_header';
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';

import ActionBar from './components/action_bar';
import DetailedStatus from './components/detailed_status';

const messages = defineMessages({
  deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },

M app/javascript/flavours/glitch/features/subscribed_languages_modal/index.jsx => app/javascript/flavours/glitch/features/subscribed_languages_modal/index.jsx +11 -7
@@ 1,15 1,19 @@
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import { is, List as ImmutableList, Set as ImmutableSet } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { is, List as ImmutableList, Set as ImmutableSet } from 'immutable';
import { languages as preloadedLanguages } from 'flavours/glitch/initial_state';
import Option from 'flavours/glitch/features/report/components/option';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Button from 'flavours/glitch/components/button';

import { followAccount } from 'flavours/glitch/actions/accounts';
import Button from 'flavours/glitch/components/button';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Option from 'flavours/glitch/features/report/components/option';
import { languages as preloadedLanguages } from 'flavours/glitch/initial_state';


const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },

M app/javascript/flavours/glitch/features/ui/components/actions_modal.jsx => app/javascript/flavours/glitch/features/ui/components/actions_modal.jsx +6 -3
@@ 1,12 1,15 @@
import PropTypes from 'prop-types';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import StatusContent from 'flavours/glitch/components/status_content';

import { Avatar } from 'flavours/glitch/components/avatar';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import { DisplayName } from 'flavours/glitch/components/display_name';
import classNames from 'classnames';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import StatusContent from 'flavours/glitch/components/status_content';

export default class ActionsModal extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx => app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx +5 -3
@@ 1,8 1,10 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import Audio from 'flavours/glitch/features/audio';
import { connect } from 'react-redux';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import Audio from 'flavours/glitch/features/audio';
import Footer from 'flavours/glitch/features/picture_in_picture/components/footer';

const mapStateToProps = (state, { statusId }) => ({

M app/javascript/flavours/glitch/features/ui/components/block_modal.jsx => app/javascript/flavours/glitch/features/ui/components/block_modal.jsx +8 -5
@@ 1,12 1,15 @@
import { PureComponent } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, FormattedMessage } from 'react-intl';
import { makeGetAccount } from '../../../selectors';
import Button from '../../../components/button';
import { closeModal } from '../../../actions/modal';

import { connect } from 'react-redux';

import { blockAccount } from '../../../actions/accounts';
import { closeModal } from '../../../actions/modal';
import { initReport } from '../../../actions/reports';
import Button from '../../../components/button';
import { makeGetAccount } from '../../../selectors';


const makeMapStateToProps = () => {

M app/javascript/flavours/glitch/features/ui/components/boost_modal.jsx => app/javascript/flavours/glitch/features/ui/components/boost_modal.jsx +14 -10
@@ 1,19 1,23 @@
import { connect } from 'react-redux';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import Button from 'flavours/glitch/components/button';
import StatusContent from 'flavours/glitch/components/status_content';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { changeBoostPrivacy } from 'flavours/glitch/actions/boosts';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Avatar } from 'flavours/glitch/components/avatar';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import Button from 'flavours/glitch/components/button';
import { DisplayName } from 'flavours/glitch/components/display_name';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Icon } from 'flavours/glitch/components/icon';
import ImmutablePureComponent from 'react-immutable-pure-component';
import PrivacyDropdown from 'flavours/glitch/features/compose/components/privacy_dropdown';
import classNames from 'classnames';
import { changeBoostPrivacy } from 'flavours/glitch/actions/boosts';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import StatusContent from 'flavours/glitch/components/status_content';
import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';
import PrivacyDropdown from 'flavours/glitch/features/compose/components/privacy_dropdown';

const messages = defineMessages({
  cancel_reblog: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },

M app/javascript/flavours/glitch/features/ui/components/bundle.jsx => app/javascript/flavours/glitch/features/ui/components/bundle.jsx +1 -1
@@ 1,5 1,5 @@
import { Component } from 'react';
import PropTypes from 'prop-types';
import { Component } from 'react';

const emptyComponent = () => null;
const noop = () => { };

M app/javascript/flavours/glitch/features/ui/components/bundle_column_error.jsx => app/javascript/flavours/glitch/features/ui/components/bundle_column_error.jsx +7 -4
@@ 1,11 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, FormattedMessage } from 'react-intl';
import Column from 'flavours/glitch/components/column';
import Button from 'flavours/glitch/components/button';

import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';
import classNames from 'classnames';

import Button from 'flavours/glitch/components/button';
import Column from 'flavours/glitch/components/column';
import { autoPlayGif } from 'flavours/glitch/initial_state';

class GIF extends PureComponent {

M app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.jsx => app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.jsx +2 -1
@@ 1,5 1,6 @@
import { Component } from 'react';
import PropTypes from 'prop-types';
import { Component } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import { IconButton } from 'flavours/glitch/components/icon_button';

M app/javascript/flavours/glitch/features/ui/components/column.jsx => app/javascript/flavours/glitch/features/ui/components/column.jsx +6 -3
@@ 1,9 1,12 @@
import { PureComponent } from 'react';
import ColumnHeader from './column_header';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { debounce } from 'lodash';
import { scrollTop } from 'flavours/glitch/scroll';

import { isMobile } from 'flavours/glitch/is_mobile';
import { scrollTop } from 'flavours/glitch/scroll';

import ColumnHeader from './column_header';

export default class Column extends PureComponent {


M app/javascript/flavours/glitch/features/ui/components/column_header.jsx => app/javascript/flavours/glitch/features/ui/components/column_header.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import { Icon } from 'flavours/glitch/components/icon';

export default class ColumnHeader extends PureComponent {

M app/javascript/flavours/glitch/features/ui/components/column_link.jsx => app/javascript/flavours/glitch/features/ui/components/column_link.jsx +3 -1
@@ 1,7 1,9 @@
import PropTypes from 'prop-types';

import classNames from 'classnames';
import { NavLink } from 'react-router-dom';

import { Icon } from 'flavours/glitch/components/icon';
import classNames from 'classnames';

const ColumnLink = ({ icon, text, to, onClick, href, method, badge, transparent, ...other }) => {
  const className = classNames('column-link', { 'column-link--transparent': transparent });

M app/javascript/flavours/glitch/features/ui/components/column_loading.jsx => app/javascript/flavours/glitch/features/ui/components/column_loading.jsx +2 -1
@@ 1,8 1,9 @@
import PropTypes from 'prop-types';

import ImmutablePureComponent from 'react-immutable-pure-component';

import Column from 'flavours/glitch/components/column';
import ColumnHeader from 'flavours/glitch/components/column_header';
import ImmutablePureComponent from 'react-immutable-pure-component';

export default class ColumnLoading extends ImmutablePureComponent {


M app/javascript/flavours/glitch/features/ui/components/columns_area.jsx => app/javascript/flavours/glitch/features/ui/components/columns_area.jsx +11 -6
@@ 1,11 1,14 @@
import { Children, cloneElement } from 'react';
import PropTypes from 'prop-types';
import { Children, cloneElement } from 'react';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { supportsPassiveEvents } from 'detect-passive-events';

import { scrollRight } from 'flavours/glitch/scroll';

import BundleContainer from '../containers/bundle_container';
import ColumnLoading from './column_loading';
import DrawerLoading from './drawer_loading';
import BundleColumnError from './bundle_column_error';
import {
  Compose,
  Notifications,


@@ 19,11 22,13 @@ import {
  ListTimeline,
  Directory,
} from '../util/async-components';

import BundleColumnError from './bundle_column_error';
import ColumnLoading from './column_loading';
import ComposePanel from './compose_panel';
import DrawerLoading from './drawer_loading';
import NavigationPanel from './navigation_panel';

import { supportsPassiveEvents } from 'detect-passive-events';
import { scrollRight } from 'flavours/glitch/scroll';

const componentMap = {
  'COMPOSE': Compose,

M app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx => app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx +10 -6
@@ 1,15 1,19 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';
import { closeModal } from 'flavours/glitch/actions/modal';
import emojify from 'flavours/glitch/features/emoji/emoji';

import escapeTextContentForBrowser from 'escape-html';
import InlineAccount from 'flavours/glitch/components/inline_account';

import { closeModal } from 'flavours/glitch/actions/modal';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import InlineAccount from 'flavours/glitch/components/inline_account';
import MediaAttachments from 'flavours/glitch/components/media_attachments';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import emojify from 'flavours/glitch/features/emoji/emoji';

const mapStateToProps = (state, { statusId }) => ({
  language: state.getIn(['statuses', statusId, 'language']),

M app/javascript/flavours/glitch/features/ui/components/compose_panel.jsx => app/javascript/flavours/glitch/features/ui/components/compose_panel.jsx +8 -4
@@ 1,12 1,16 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import SearchContainer from 'flavours/glitch/features/compose/containers/search_container';

import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose';
import ServerBanner from 'flavours/glitch/components/server_banner';
import ComposeFormContainer from 'flavours/glitch/features/compose/containers/compose_form_container';
import NavigationContainer from 'flavours/glitch/features/compose/containers/navigation_container';
import SearchContainer from 'flavours/glitch/features/compose/containers/search_container';

import LinkFooter from './link_footer';
import ServerBanner from 'flavours/glitch/components/server_banner';
import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose';


class ComposePanel extends PureComponent {


M app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx => app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx +3 -1
@@ 1,6 1,8 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { injectIntl, FormattedMessage } from 'react-intl';

import Button from 'flavours/glitch/components/button';

class ConfirmationModal extends PureComponent {

M app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.jsx => app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.jsx +6 -3
@@ 1,11 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { preferenceLink } from 'flavours/glitch/utils/backend_links';

import ImmutablePropTypes from 'react-immutable-proptypes';

import Button from 'flavours/glitch/components/button';
import { Icon } from 'flavours/glitch/components/icon';
import illustration from 'flavours/glitch/images/logo_warn_glitch.svg';
import { preferenceLink } from 'flavours/glitch/utils/backend_links';

const messages = defineMessages({
  discardChanges: { id: 'confirmations.deprecated_settings.confirm', defaultMessage: 'Use Mastodon preferences' },

M app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx => app/javascript/flavours/glitch/features/ui/components/disabled_account_banner.jsx +8 -4
@@ 1,10 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { PureComponent } from 'react';

import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
import { disabledAccountId, movedToAccountId, domain } from 'flavours/glitch/initial_state';

import { Link } from 'react-router-dom';

import { connect } from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import { disabledAccountId, movedToAccountId, domain } from 'flavours/glitch/initial_state';
import { logOut } from 'flavours/glitch/utils/log_out';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/ui/components/doodle_modal.jsx => app/javascript/flavours/glitch/features/ui/components/doodle_modal.jsx +11 -5
@@ 1,13 1,19 @@
import PropTypes from 'prop-types';
import Button from 'flavours/glitch/components/button';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Atrament from 'atrament'; // the doodling library
import { connect } from 'react-redux';
import ImmutablePropTypes from 'react-immutable-proptypes';

import Atrament from 'atrament'; // the doodling library
import { debounce, mapValues } from 'lodash';

import { doodleSet, uploadCompose } from 'flavours/glitch/actions/compose';
import Button from 'flavours/glitch/components/button';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { debounce, mapValues } from 'lodash';
import classNames from 'classnames';



// palette nicked from MyPaint, CC0
const palette = [

M app/javascript/flavours/glitch/features/ui/components/embed_modal.jsx => app/javascript/flavours/glitch/features/ui/components/embed_modal.jsx +4 -1
@@ 1,6 1,9 @@
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import ImmutablePureComponent from 'react-immutable-pure-component';

import api from 'flavours/glitch/api';
import { IconButton } from 'flavours/glitch/components/icon_button';


M app/javascript/flavours/glitch/features/ui/components/favourite_modal.jsx => app/javascript/flavours/glitch/features/ui/components/favourite_modal.jsx +11 -7
@@ 1,15 1,19 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import Button from 'flavours/glitch/components/button';
import StatusContent from 'flavours/glitch/components/status_content';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Avatar } from 'flavours/glitch/components/avatar';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import Button from 'flavours/glitch/components/button';
import { DisplayName } from 'flavours/glitch/components/display_name';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import { Icon } from 'flavours/glitch/components/icon';
import ImmutablePureComponent from 'react-immutable-pure-component';
import classNames from 'classnames';
import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';
import StatusContent from 'flavours/glitch/components/status_content';
import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/ui/components/filter_modal.jsx => app/javascript/flavours/glitch/features/ui/components/filter_modal.jsx +7 -4
@@ 1,12 1,15 @@
import { connect } from 'react-redux';
import { fetchStatus } from 'flavours/glitch/actions/statuses';
import { fetchFilters, createFilter, createFilterStatus } from 'flavours/glitch/actions/filters';
import PropTypes from 'prop-types';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { fetchFilters, createFilter, createFilterStatus } from 'flavours/glitch/actions/filters';
import { fetchStatus } from 'flavours/glitch/actions/statuses';
import { IconButton } from 'flavours/glitch/components/icon_button';
import SelectFilter from 'flavours/glitch/features/filters/select_filter';
import AddedToFilter from 'flavours/glitch/features/filters/added_to_filter';
import SelectFilter from 'flavours/glitch/features/filters/select_filter';

const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },

M app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx => app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx +20 -14
@@ 1,28 1,34 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import classNames from 'classnames';
import { changeUploadCompose, uploadThumbnail, onChangeMediaDescription, onChangeMediaFocus } from '../../../actions/compose';
import Video, { getPointerPosition } from 'flavours/glitch/features/video';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
import { IconButton } from 'flavours/glitch/components/icon_button';

import Textarea from 'react-textarea-autosize';
import { length } from 'stringz';
// eslint-disable-next-line import/extensions
import tesseractWorkerPath from 'tesseract.js/dist/worker.min.js';
// eslint-disable-next-line import/no-extraneous-dependencies
import tesseractCorePath from 'tesseract.js-core/tesseract-core.wasm.js';

import Button from 'flavours/glitch/components/button';
import { GIFV } from 'flavours/glitch/components/gifv';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Audio from 'flavours/glitch/features/audio';
import Textarea from 'react-textarea-autosize';
import UploadProgress from 'flavours/glitch/features/compose/components/upload_progress';
import CharacterCounter from 'flavours/glitch/features/compose/components/character_counter';
import { length } from 'stringz';
import UploadProgress from 'flavours/glitch/features/compose/components/upload_progress';
import { Tesseract as fetchTesseract } from 'flavours/glitch/features/ui/util/async-components';
import { GIFV } from 'flavours/glitch/components/gifv';
import Video, { getPointerPosition } from 'flavours/glitch/features/video';
import { me } from 'flavours/glitch/initial_state';
// eslint-disable-next-line import/no-extraneous-dependencies
import tesseractCorePath from 'tesseract.js-core/tesseract-core.wasm.js';
// eslint-disable-next-line import/extensions
import tesseractWorkerPath from 'tesseract.js/dist/worker.min.js';
import { assetHost } from 'flavours/glitch/utils/config';

import { changeUploadCompose, uploadThumbnail, onChangeMediaDescription, onChangeMediaFocus } from '../../../actions/compose';

const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },
  apply: { id: 'upload_modal.apply', defaultMessage: 'Apply' },

M app/javascript/flavours/glitch/features/ui/components/follow_requests_column_link.jsx => app/javascript/flavours/glitch/features/ui/components/follow_requests_column_link.jsx +10 -5
@@ 1,11 1,16 @@
import { Component } from 'react';
import PropTypes from 'prop-types';
import { fetchFollowRequests } from 'flavours/glitch/actions/accounts';
import { Component } from 'react';

import { injectIntl, defineMessages } from 'react-intl';

import { List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';
import ColumnLink from 'flavours/glitch/features/ui/components/column_link';

import { fetchFollowRequests } from 'flavours/glitch/actions/accounts';
import { IconWithBadge } from 'flavours/glitch/components/icon_with_badge';
import { List as ImmutableList } from 'immutable';
import { injectIntl, defineMessages } from 'react-intl';
import ColumnLink from 'flavours/glitch/features/ui/components/column_link';



const messages = defineMessages({
  text: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },

M app/javascript/flavours/glitch/features/ui/components/header.jsx => app/javascript/flavours/glitch/features/ui/components/header.jsx +10 -6
@@ 1,13 1,17 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { WordmarkLogo, SymbolLogo } from 'flavours/glitch/components/logo';
import { Link, withRouter } from 'react-router-dom';

import { FormattedMessage } from 'react-intl';
import { registrationsOpen, me } from 'flavours/glitch/initial_state';
import { Avatar } from 'flavours/glitch/components/avatar';
import Permalink from 'flavours/glitch/components/permalink';
import PropTypes from 'prop-types';

import { Link, withRouter } from 'react-router-dom';

import { connect } from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import { Avatar } from 'flavours/glitch/components/avatar';
import { WordmarkLogo, SymbolLogo } from 'flavours/glitch/components/logo';
import Permalink from 'flavours/glitch/components/permalink';
import { registrationsOpen, me } from 'flavours/glitch/initial_state';

const Account = connect(state => ({
  account: state.getIn(['accounts', me]),

M app/javascript/flavours/glitch/features/ui/components/image_loader.jsx => app/javascript/flavours/glitch/features/ui/components/image_loader.jsx +4 -1
@@ 1,7 1,10 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import classNames from 'classnames';

import { LoadingBar } from 'react-redux-loading-bar';

import ZoomableImage from './zoomable_image';

export default class ImageLoader extends PureComponent {

M app/javascript/flavours/glitch/features/ui/components/image_modal.jsx => app/javascript/flavours/glitch/features/ui/components/image_modal.jsx +6 -2
@@ 1,8 1,12 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import classNames from 'classnames';

import { IconButton } from 'flavours/glitch/components/icon_button';

import ImageLoader from './image_loader';

const messages = defineMessages({

M app/javascript/flavours/glitch/features/ui/components/link_footer.jsx => app/javascript/flavours/glitch/features/ui/components/link_footer.jsx +8 -4
@@ 1,12 1,16 @@
import { connect } from 'react-redux';
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';

import { Link } from 'react-router-dom';
import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'flavours/glitch/initial_state';
import { logOut } from 'flavours/glitch/utils/log_out';

import { connect } from 'react-redux';

import { openModal } from 'flavours/glitch/actions/modal';
import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'flavours/glitch/initial_state';
import { PERMISSION_INVITE_USERS } from 'flavours/glitch/permissions';
import { logOut } from 'flavours/glitch/utils/log_out';

const messages = defineMessages({
  logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },

M app/javascript/flavours/glitch/features/ui/components/list_panel.jsx => app/javascript/flavours/glitch/features/ui/components/list_panel.jsx +6 -2
@@ 1,10 1,14 @@
import PropTypes from 'prop-types';
import { createSelector } from 'reselect';

import { withRouter } from 'react-router-dom';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import { createSelector } from 'reselect';

import { fetchLists } from 'flavours/glitch/actions/lists';

import ColumnLink from './column_link';

const getOrderedLists = createSelector([state => state.get('lists')], lists => {

M app/javascript/flavours/glitch/features/ui/components/media_modal.jsx => app/javascript/flavours/glitch/features/ui/components/media_modal.jsx +14 -8
@@ 1,18 1,24 @@
import ReactSwipeableViews from 'react-swipeable-views';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import Video from 'flavours/glitch/features/video';
import classNames from 'classnames';

import { defineMessages, injectIntl } from 'react-intl';
import { IconButton } from 'flavours/glitch/components/icon_button';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImageLoader from './image_loader';
import { Icon } from 'flavours/glitch/components/icon';

import ReactSwipeableViews from 'react-swipeable-views';

import { getAverageFromBlurhash } from 'flavours/glitch/blurhash';
import { GIFV } from 'flavours/glitch/components/gifv';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Footer from 'flavours/glitch/features/picture_in_picture/components/footer';
import { getAverageFromBlurhash } from 'flavours/glitch/blurhash';
import Video from 'flavours/glitch/features/video';
import { disableSwiping } from 'flavours/glitch/initial_state';

import ImageLoader from './image_loader';

const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },
  previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },

M app/javascript/flavours/glitch/features/ui/components/modal_root.jsx => app/javascript/flavours/glitch/features/ui/components/modal_root.jsx +23 -17
@@ 1,21 1,9 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { getScrollbarWidth } from 'flavours/glitch/utils/scrollbar';
import { PureComponent } from 'react';

import { Helmet } from 'react-helmet';

import Base from 'flavours/glitch/components/modal_root';
import BundleContainer from '../containers/bundle_container';
import BundleModalError from './bundle_modal_error';
import ModalLoading from './modal_loading';
import ActionsModal from './actions_modal';
import MediaModal from './media_modal';
import VideoModal from './video_modal';
import BoostModal from './boost_modal';
import FavouriteModal from './favourite_modal';
import AudioModal from './audio_modal';
import DoodleModal from './doodle_modal';
import ConfirmationModal from './confirmation_modal';
import FocalPointModal from './focal_point_modal';
import DeprecatedSettingsModal from './deprecated_settings_modal';
import ImageModal from './image_modal';
import {
  OnboardingModal,
  MuteModal,


@@ 32,7 20,25 @@ import {
  SubscribedLanguagesModal,
  ClosedRegistrationsModal,
} from 'flavours/glitch/features/ui/util/async-components';
import { Helmet } from 'react-helmet';
import { getScrollbarWidth } from 'flavours/glitch/utils/scrollbar';

import BundleContainer from '../containers/bundle_container';

import ActionsModal from './actions_modal';
import AudioModal from './audio_modal';
import BoostModal from './boost_modal';
import BundleModalError from './bundle_modal_error';
import ConfirmationModal from './confirmation_modal';
import DeprecatedSettingsModal from './deprecated_settings_modal';
import DoodleModal from './doodle_modal';
import FavouriteModal from './favourite_modal';
import FocalPointModal from './focal_point_modal';
import ImageModal from './image_modal';
import MediaModal from './media_modal';
import ModalLoading from './modal_loading';
import VideoModal from './video_modal';



const MODAL_COMPONENTS = {
  'MEDIA': () => Promise.resolve({ default: MediaModal }),

M app/javascript/flavours/glitch/features/ui/components/mute_modal.jsx => app/javascript/flavours/glitch/features/ui/components/mute_modal.jsx +8 -4
@@ 1,12 1,16 @@
import { PureComponent } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import { connect } from 'react-redux';

import Toggle from 'react-toggle';
import Button from 'flavours/glitch/components/button';
import { closeModal } from 'flavours/glitch/actions/modal';

import { muteAccount } from 'flavours/glitch/actions/accounts';
import { closeModal } from 'flavours/glitch/actions/modal';
import { toggleHideNotifications, changeMuteDuration } from 'flavours/glitch/actions/mutes';
import Button from 'flavours/glitch/components/button';

const messages = defineMessages({
  minutes: { id: 'intervals.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}}' },

M app/javascript/flavours/glitch/features/ui/components/navigation_panel.jsx => app/javascript/flavours/glitch/features/ui/components/navigation_panel.jsx +6 -3
@@ 1,15 1,18 @@
import { Component } from 'react';
import PropTypes from 'prop-types';
import { Component } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import NavigationPortal from 'flavours/glitch/components/navigation_portal';
import { timelinePreview, showTrends } from 'flavours/glitch/initial_state';
import { preferencesLink } from 'flavours/glitch/utils/backend_links';

import ColumnLink from './column_link';
import DisabledAccountBanner from './disabled_account_banner';
import FollowRequestsColumnLink from './follow_requests_column_link';
import ListPanel from './list_panel';
import NotificationsCounterIcon from './notifications_counter_icon';
import SignInBanner from './sign_in_banner';
import { preferencesLink } from 'flavours/glitch/utils/backend_links';
import NavigationPortal from 'flavours/glitch/components/navigation_portal';

const messages = defineMessages({
  home: { id: 'tabs_bar.home', defaultMessage: 'Home' },

M app/javascript/flavours/glitch/features/ui/components/notifications_counter_icon.js => app/javascript/flavours/glitch/features/ui/components/notifications_counter_icon.js +1 -0
@@ 1,4 1,5 @@
import { connect } from 'react-redux';

import { IconWithBadge } from 'flavours/glitch/components/icon_with_badge';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/ui/components/onboarding_modal.jsx => app/javascript/flavours/glitch/features/ui/components/onboarding_modal.jsx +11 -5
@@ 1,17 1,23 @@
import { PureComponent } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import ReactSwipeableViews from 'react-swipeable-views';

import classNames from 'classnames';

import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

import ReactSwipeableViews from 'react-swipeable-views';

import Permalink from 'flavours/glitch/components/permalink';
import ComposeForm from 'flavours/glitch/features/compose/components/compose_form';
import DrawerAccount from 'flavours/glitch/features/compose/components/navigation_bar';
import Search from 'flavours/glitch/features/compose/components/search';
import ColumnHeader from './column_header';
import { me, source_url } from 'flavours/glitch/initial_state';

import ColumnHeader from './column_header';

const noop = () => { };

const messages = defineMessages({

M app/javascript/flavours/glitch/features/ui/components/report_modal.jsx => app/javascript/flavours/glitch/features/ui/components/report_modal.jsx +12 -9
@@ 1,20 1,23 @@
import { connect } from 'react-redux';
import { submitReport } from 'flavours/glitch/actions/reports';
import { expandAccountTimeline } from 'flavours/glitch/actions/timelines';
import { fetchServer } from 'flavours/glitch/actions/server';
import { fetchRelationships } from 'flavours/glitch/actions/accounts';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { makeGetAccount } from 'flavours/glitch/selectors';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import { OrderedSet } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';

import { fetchRelationships } from 'flavours/glitch/actions/accounts';
import { submitReport } from 'flavours/glitch/actions/reports';
import { fetchServer } from 'flavours/glitch/actions/server';
import { expandAccountTimeline } from 'flavours/glitch/actions/timelines';
import { IconButton } from 'flavours/glitch/components/icon_button';
import Category from 'flavours/glitch/features/report/category';
import Statuses from 'flavours/glitch/features/report/statuses';
import Rules from 'flavours/glitch/features/report/rules';
import Comment from 'flavours/glitch/features/report/comment';
import Rules from 'flavours/glitch/features/report/rules';
import Statuses from 'flavours/glitch/features/report/statuses';
import Thanks from 'flavours/glitch/features/report/thanks';
import { makeGetAccount } from 'flavours/glitch/selectors';

const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },

M app/javascript/flavours/glitch/features/ui/components/sign_in_banner.jsx => app/javascript/flavours/glitch/features/ui/components/sign_in_banner.jsx +4 -2
@@ 1,8 1,10 @@
import { useCallback } from 'react';

import { FormattedMessage } from 'react-intl';
import { useAppDispatch, useAppSelector } from 'flavours/glitch/store';
import { registrationsOpen } from 'flavours/glitch/initial_state';

import { openModal } from 'flavours/glitch/actions/modal';
import { registrationsOpen } from 'flavours/glitch/initial_state';
import { useAppDispatch, useAppSelector } from 'flavours/glitch/store';

const SignInBanner = () => {
  const dispatch = useAppDispatch();

M app/javascript/flavours/glitch/features/ui/components/upload_area.jsx => app/javascript/flavours/glitch/features/ui/components/upload_area.jsx +8 -3
@@ 1,9 1,14 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import Motion from '../util/optional_motion';
import spring from 'react-motion/lib/spring';
import { PureComponent } from 'react';

import { FormattedMessage } from 'react-intl';

import spring from 'react-motion/lib/spring';

import Motion from '../util/optional_motion';



export default class UploadArea extends PureComponent {

  static propTypes = {

M app/javascript/flavours/glitch/features/ui/components/video_modal.jsx => app/javascript/flavours/glitch/features/ui/components/video_modal.jsx +6 -4
@@ 1,10 1,12 @@
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import Video from 'flavours/glitch/features/video';
import { connect } from 'react-redux';

import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Footer from 'flavours/glitch/features/picture_in_picture/components/footer';
import { connect } from 'react-redux';

import { getAverageFromBlurhash } from 'flavours/glitch/blurhash';
import Footer from 'flavours/glitch/features/picture_in_picture/components/footer';
import Video from 'flavours/glitch/features/video';

const mapStateToProps = (state, { statusId }) => ({
  language: state.getIn(['statuses', statusId, 'language']),

M app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx => app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx +5 -2
@@ 1,8 1,11 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { IconButton } from 'flavours/glitch/components/icon_button';
import { PureComponent } from 'react';

import { defineMessages, injectIntl } from 'react-intl';

import { IconButton } from 'flavours/glitch/components/icon_button';


const messages = defineMessages({
  compress: { id: 'lightbox.compress', defaultMessage: 'Compress image view box' },
  expand: { id: 'lightbox.expand', defaultMessage: 'Expand image view box' },

M app/javascript/flavours/glitch/features/ui/containers/bundle_container.js => app/javascript/flavours/glitch/features/ui/containers/bundle_container.js +2 -1
@@ 1,8 1,9 @@
import { connect } from 'react-redux';

import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'flavours/glitch/actions/bundles';

import Bundle from '../components/bundle';

import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'flavours/glitch/actions/bundles';

const mapDispatchToProps = dispatch => ({
  onFetch () {

M app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js => app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js +3 -1
@@ 1,7 1,9 @@
import { connect } from 'react-redux';
import ColumnsArea from '../components/columns_area';

import { openModal } from 'flavours/glitch/actions/modal';

import ColumnsArea from '../components/columns_area';

const mapStateToProps = state => ({
  columns: state.getIn(['settings', 'columns']),
});

M app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js => app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js +1 -0
@@ 1,4 1,5 @@
import { connect }    from 'react-redux';

import LoadingBar from 'react-redux-loading-bar';

const mapStateToProps = (state, ownProps) => ({

M app/javascript/flavours/glitch/features/ui/containers/modal_container.js => app/javascript/flavours/glitch/features/ui/containers/modal_container.js +2 -0
@@ 1,5 1,7 @@
import { connect } from 'react-redux';

import { openModal, closeModal } from 'flavours/glitch/actions/modal';

import ModalRoot from '../components/modal_root';

const mapStateToProps = state => ({

M app/javascript/flavours/glitch/features/ui/containers/notifications_container.js => app/javascript/flavours/glitch/features/ui/containers/notifications_container.js +3 -0
@@ 1,6 1,9 @@
import { injectIntl } from 'react-intl';

import { connect } from 'react-redux';

import { NotificationStack } from 'react-notification';

import { dismissAlert } from 'flavours/glitch/actions/alerts';
import { getAlerts } from 'flavours/glitch/selectors';


M app/javascript/flavours/glitch/features/ui/containers/status_list_container.js => app/javascript/flavours/glitch/features/ui/containers/status_list_container.js +5 -3
@@ 1,9 1,11 @@
import { connect } from 'react-redux';
import StatusList from 'flavours/glitch/components/status_list';
import { scrollTopTimeline, loadPending } from 'flavours/glitch/actions/timelines';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';

import { debounce } from 'lodash';

import { scrollTopTimeline, loadPending } from 'flavours/glitch/actions/timelines';
import StatusList from 'flavours/glitch/components/status_list';
import { me } from 'flavours/glitch/initial_state';

const getRegex = createSelector([

M app/javascript/flavours/glitch/features/ui/index.jsx => app/javascript/flavours/glitch/features/ui/index.jsx +26 -20
@@ 1,27 1,37 @@
import { PureComponent, Component } from 'react';
import NotificationsContainer from './containers/notifications_container';
import PropTypes from 'prop-types';
import LoadingBarContainer from './containers/loading_bar_container';
import ModalContainer from './containers/modal_container';
import { connect } from 'react-redux';
import { PureComponent, Component } from 'react';

import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';

import classNames from 'classnames';
import { Redirect, Route, withRouter } from 'react-router-dom';
import { layoutFromWindow } from 'flavours/glitch/is_mobile';

import { connect } from 'react-redux';

import Favico from 'favico.js';
import { debounce } from 'lodash';
import { HotKeys } from 'react-hotkeys';

import { changeLayout } from 'flavours/glitch/actions/app';
import { uploadCompose, resetCompose, changeComposeSpoilerness } from 'flavours/glitch/actions/compose';
import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
import { expandNotifications, notificationsSetVisibility } from 'flavours/glitch/actions/notifications';
import { fetchServer, fetchServerTranslationLanguages } from 'flavours/glitch/actions/server';
import { clearHeight } from 'flavours/glitch/actions/height_cache';
import { changeLayout } from 'flavours/glitch/actions/app';
import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'flavours/glitch/actions/markers';
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
import { expandNotifications, notificationsSetVisibility } from 'flavours/glitch/actions/notifications';
import { fetchServer, fetchServerTranslationLanguages } from 'flavours/glitch/actions/server';
import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
import PermaLink from 'flavours/glitch/components/permalink';
import PictureInPicture from 'flavours/glitch/features/picture_in_picture';
import { layoutFromWindow } from 'flavours/glitch/is_mobile';

import initialState, { me, owner, singleUserMode, showTrends, trendsAsLanding } from '../../initial_state';

import BundleColumnError from './components/bundle_column_error';
import Header from './components/header';
import UploadArea from './components/upload_area';
import PermaLink from 'flavours/glitch/components/permalink';
import ColumnsAreaContainer from './containers/columns_area_container';
import classNames from 'classnames';
import Favico from 'favico.js';
import PictureInPicture from 'flavours/glitch/features/picture_in_picture';
import LoadingBarContainer from './containers/loading_bar_container';
import ModalContainer from './containers/modal_container';
import NotificationsContainer from './containers/notifications_container';
import {
  Compose,
  Status,


@@ 56,11 66,7 @@ import {
  About,
  PrivacyPolicy,
} from './util/async-components';
import { HotKeys } from 'react-hotkeys';
import initialState, { me, owner, singleUserMode, showTrends, trendsAsLanding } from '../../initial_state';
// TODO: import { closeOnboarding, INTRODUCTION_VERSION } from 'flavours/glitch/actions/onboarding';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import Header from './components/header';
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';

// Dummy import, to make sure that <Status /> ends up in the application bundle.
// Without this it ends up in ~8 very commonly used bundles.

M app/javascript/flavours/glitch/features/ui/util/optional_motion.js => app/javascript/flavours/glitch/features/ui/util/optional_motion.js +3 -1
@@ 1,5 1,7 @@
import Motion from 'react-motion/lib/Motion';

import { reduceMotion } from 'flavours/glitch/initial_state';

import ReducedMotion from './reduced_motion';
import Motion from 'react-motion/lib/Motion';

export default reduceMotion ? ReducedMotion : Motion;

M app/javascript/flavours/glitch/features/ui/util/react_router_helpers.jsx => app/javascript/flavours/glitch/features/ui/util/react_router_helpers.jsx +5 -2
@@ 1,9 1,12 @@
import * as React from 'react';
import PropTypes from 'prop-types';
import * as React from 'react';

import { Switch, Route } from 'react-router-dom';

import StackTrace from 'stacktrace-js';
import ColumnLoading from 'flavours/glitch/features/ui/components/column_loading';

import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
import ColumnLoading from 'flavours/glitch/features/ui/components/column_loading';
import BundleContainer from 'flavours/glitch/features/ui/containers/bundle_container';

// Small wrapper to pass multiColumn to the route components

M app/javascript/flavours/glitch/features/ui/util/reduced_motion.jsx => app/javascript/flavours/glitch/features/ui/util/reduced_motion.jsx +2 -1
@@ 1,8 1,9 @@
// Like react-motion's Motion, but reduces all animations to cross-fades
// for the benefit of users with motion sickness.
import PropTypes from 'prop-types';
import { Component } from 'react';

import Motion from 'react-motion/lib/Motion';
import PropTypes from 'prop-types';

const stylesToKeep = ['opacity', 'backgroundOpacity'];


M app/javascript/flavours/glitch/features/video/index.jsx => app/javascript/flavours/glitch/features/video/index.jsx +12 -5
@@ 1,13 1,20 @@
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { PureComponent } from 'react';

import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';

import classNames from 'classnames';

import { is } from 'immutable';

import { throttle } from 'lodash';
import classNames from 'classnames';
import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';
import { Icon } from 'flavours/glitch/components/icon';

import { Blurhash } from 'flavours/glitch/components/blurhash';
import { Icon } from 'flavours/glitch/components/icon';
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';

import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';


const messages = defineMessages({
  play: { id: 'video.play', defaultMessage: 'Play' },

M app/javascript/flavours/glitch/main.jsx => app/javascript/flavours/glitch/main.jsx +3 -3
@@ 1,11 1,11 @@
import { createRoot } from 'react-dom/client';

import { setupBrowserNotifications } from 'flavours/glitch/actions/notifications';
import Mastodon from 'flavours/glitch/containers/mastodon';
import { store } from 'flavours/glitch/store';
import { me } from 'flavours/glitch/initial_state';
import ready from 'flavours/glitch/ready';

import * as perf from 'flavours/glitch/performance';
import ready from 'flavours/glitch/ready';
import { store } from 'flavours/glitch/store';

/**
 * @returns {Promise<void>}

M app/javascript/flavours/glitch/packs/admin.jsx => app/javascript/flavours/glitch/packs/admin.jsx +2 -1
@@ 1,7 1,8 @@
import 'packs/public-path';
import ready from 'flavours/glitch/ready';
import { createRoot } from 'react-dom/client';

import ready from 'flavours/glitch/ready';

ready(() => {
  [].forEach.call(document.querySelectorAll('[data-admin-component]'), element => {
    const componentName  = element.getAttribute('data-admin-component');

M app/javascript/flavours/glitch/packs/public.jsx => app/javascript/flavours/glitch/packs/public.jsx +13 -8
@@ 1,17 1,22 @@
import 'packs/public-path';
import { loadPolyfills } from 'flavours/glitch/polyfills';
import ready from 'flavours/glitch/ready';
import loadKeyboardExtensions from 'flavours/glitch/load_keyboard_extensions';
import { createRoot }  from 'react-dom/client';

import * as IntlMessageFormat  from 'intl-messageformat';
import { defineMessages } from 'react-intl';

import { delegate }  from '@rails/ujs';
import axios from 'axios';
import { createBrowserHistory }  from 'history';
import { throttle } from 'lodash';
import { defineMessages } from 'react-intl';
import * as IntlMessageFormat  from 'intl-messageformat';

import { timeAgoString }  from 'flavours/glitch/components/relative_timestamp';
import { delegate }  from '@rails/ujs';
import emojify  from 'flavours/glitch/features/emoji/emoji';
import loadKeyboardExtensions from 'flavours/glitch/load_keyboard_extensions';
import { loadPolyfills } from 'flavours/glitch/polyfills';
import ready from 'flavours/glitch/ready';
import { getLocale }  from 'locales';
import { createRoot }  from 'react-dom/client';
import { createBrowserHistory }  from 'history';



const messages = defineMessages({
  usernameTaken: { id: 'username.taken', defaultMessage: 'That username is taken. Try another' },

M app/javascript/flavours/glitch/packs/settings.js => app/javascript/flavours/glitch/packs/settings.js +3 -2
@@ 1,7 1,8 @@
import 'packs/public-path';
import { loadPolyfills } from 'flavours/glitch/polyfills';
import loadKeyboardExtensions from 'flavours/glitch/load_keyboard_extensions';
import { delegate }  from '@rails/ujs';

import loadKeyboardExtensions from 'flavours/glitch/load_keyboard_extensions';
import { loadPolyfills } from 'flavours/glitch/polyfills';
import 'cocoon-js-vanilla';

function main() {

M app/javascript/flavours/glitch/packs/share.jsx => app/javascript/flavours/glitch/packs/share.jsx +3 -2
@@ 1,8 1,9 @@
import 'packs/public-path';
import { createRoot } from 'react-dom/client';

import ComposeContainer from 'flavours/glitch/containers/compose_container';
import { loadPolyfills } from 'flavours/glitch/polyfills';
import ready from 'flavours/glitch/ready';
import ComposeContainer from 'flavours/glitch/containers/compose_container';
import { createRoot } from 'react-dom/client';

function loaded() {
  const mountNode = document.getElementById('mastodon-compose');

M app/javascript/flavours/glitch/packs/sign_up.js => app/javascript/flavours/glitch/packs/sign_up.js +2 -1
@@ 1,7 1,8 @@
import 'packs/public-path';
import ready from 'flavours/glitch/ready';
import axios from 'axios';

import ready from 'flavours/glitch/ready';

ready(() => {
  setInterval(() => {
    axios.get('/api/v1/emails/check_confirmation').then((response) => {

M app/javascript/flavours/glitch/reducers/accounts.js => app/javascript/flavours/glitch/reducers/accounts.js +3 -2
@@ 1,7 1,8 @@
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'flavours/glitch/actions/importer';
import { ACCOUNT_REVEAL } from 'flavours/glitch/actions/accounts';
import { Map as ImmutableMap, fromJS } from 'immutable';

import { ACCOUNT_REVEAL } from 'flavours/glitch/actions/accounts';
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'flavours/glitch/actions/importer';

const initialState = ImmutableMap();

const normalizeAccount = (state, account) => {

M app/javascript/flavours/glitch/reducers/accounts_counters.js => app/javascript/flavours/glitch/reducers/accounts_counters.js +2 -1
@@ 1,9 1,10 @@
import { Map as ImmutableMap, fromJS } from 'immutable';

import {
  ACCOUNT_FOLLOW_SUCCESS,
  ACCOUNT_UNFOLLOW_SUCCESS,
} from '../actions/accounts';
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
import { Map as ImmutableMap, fromJS } from 'immutable';

const normalizeAccount = (state, account) => state.set(account.id, fromJS({
  followers_count: account.followers_count,

M app/javascript/flavours/glitch/reducers/accounts_map.js => app/javascript/flavours/glitch/reducers/accounts_map.js +3 -2
@@ 1,7 1,8 @@
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts';
import { Map as ImmutableMap } from 'immutable';

import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts';
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';

export const normalizeForLookup = str => str.toLowerCase();

const initialState = ImmutableMap();

M app/javascript/flavours/glitch/reducers/alerts.js => app/javascript/flavours/glitch/reducers/alerts.js +2 -1
@@ 1,9 1,10 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import {
  ALERT_SHOW,
  ALERT_DISMISS,
  ALERT_CLEAR,
} from 'flavours/glitch/actions/alerts';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

const initialState = ImmutableList([]);


M app/javascript/flavours/glitch/reducers/announcements.js => app/javascript/flavours/glitch/reducers/announcements.js +2 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import {
  ANNOUNCEMENTS_FETCH_REQUEST,
  ANNOUNCEMENTS_FETCH_SUCCESS,


@@ 12,7 14,6 @@ import {
  ANNOUNCEMENTS_DELETE,
  ANNOUNCEMENTS_DISMISS_SUCCESS,
} from '../actions/announcements';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

const initialState = ImmutableMap({
  items: ImmutableList(),

M app/javascript/flavours/glitch/reducers/compose.js => app/javascript/flavours/glitch/reducers/compose.js +9 -7
@@ 1,3 1,5 @@
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';

import {
  COMPOSE_MOUNT,
  COMPOSE_UNMOUNT,


@@ 50,16 52,16 @@ import {
  COMPOSE_CHANGE_MEDIA_FOCUS,
  COMPOSE_SET_STATUS,
} from 'flavours/glitch/actions/compose';
import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { REDRAFT } from 'flavours/glitch/actions/statuses';
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
import { uuid } from '../uuid';
import { privacyPreference } from 'flavours/glitch/utils/privacy_preference';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
import { me, defaultContentType } from 'flavours/glitch/initial_state';
import { overwrite } from 'flavours/glitch/utils/js_helpers';
import { unescapeHTML } from 'flavours/glitch/utils/html';
import { recoverHashtags } from 'flavours/glitch/utils/hashtag';
import { unescapeHTML } from 'flavours/glitch/utils/html';
import { overwrite } from 'flavours/glitch/utils/js_helpers';
import { privacyPreference } from 'flavours/glitch/utils/privacy_preference';

import { uuid } from '../uuid';

const totalElefriends = 3;


M app/javascript/flavours/glitch/reducers/contexts.js => app/javascript/flavours/glitch/reducers/contexts.js +3 -1
@@ 1,10 1,12 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import {
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import { CONTEXT_FETCH_SUCCESS } from 'flavours/glitch/actions/statuses';
import { TIMELINE_DELETE, TIMELINE_UPDATE } from 'flavours/glitch/actions/timelines';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import { compareId } from '../compare_id';

const initialState = ImmutableMap({

M app/javascript/flavours/glitch/reducers/conversations.js => app/javascript/flavours/glitch/reducers/conversations.js +4 -2
@@ 1,4 1,8 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS } from 'flavours/glitch/actions/accounts';
import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';

import {
  CONVERSATIONS_MOUNT,
  CONVERSATIONS_UNMOUNT,


@@ 9,8 13,6 @@ import {
  CONVERSATIONS_READ,
  CONVERSATIONS_DELETE_SUCCESS,
} from '../actions/conversations';
import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS } from 'flavours/glitch/actions/accounts';
import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';
import { compareId } from '../compare_id';

const initialState = ImmutableMap({

M app/javascript/flavours/glitch/reducers/custom_emojis.js => app/javascript/flavours/glitch/reducers/custom_emojis.js +2 -1
@@ 1,7 1,8 @@
import { List as ImmutableList, fromJS as ConvertToImmutable } from 'immutable';

import { CUSTOM_EMOJIS_FETCH_SUCCESS } from 'flavours/glitch/actions/custom_emojis';
import { search as emojiSearch } from 'flavours/glitch/features/emoji/emoji_mart_search_light';
import { buildCustomEmojis } from 'flavours/glitch/features/emoji/emoji';
import { search as emojiSearch } from 'flavours/glitch/features/emoji/emoji_mart_search_light';

const initialState = ImmutableList([]);


M app/javascript/flavours/glitch/reducers/domain_lists.js => app/javascript/flavours/glitch/reducers/domain_lists.js +2 -1
@@ 1,9 1,10 @@
import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable';

import {
  DOMAIN_BLOCKS_FETCH_SUCCESS,
  DOMAIN_BLOCKS_EXPAND_SUCCESS,
  DOMAIN_UNBLOCK_SUCCESS,
} from '../actions/domain_blocks';
import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable';

const initialState = ImmutableMap({
  blocks: ImmutableMap({

M app/javascript/flavours/glitch/reducers/dropdown_menu.js => app/javascript/flavours/glitch/reducers/dropdown_menu.js +1 -0
@@ 1,4 1,5 @@
import Immutable from 'immutable';

import {
  DROPDOWN_MENU_OPEN,
  DROPDOWN_MENU_CLOSE,

M app/javascript/flavours/glitch/reducers/filters.js => app/javascript/flavours/glitch/reducers/filters.js +3 -2
@@ 1,7 1,8 @@
import { FILTERS_IMPORT } from '../actions/importer';
import { FILTERS_FETCH_SUCCESS, FILTERS_CREATE_SUCCESS } from '../actions/filters';
import { Map as ImmutableMap, is, fromJS } from 'immutable';

import { FILTERS_FETCH_SUCCESS, FILTERS_CREATE_SUCCESS } from '../actions/filters';
import { FILTERS_IMPORT } from '../actions/importer';

const normalizeFilter = (state, filter) => {
  const normalizedFilter = fromJS({
    id: filter.id,

M app/javascript/flavours/glitch/reducers/followed_tags.js => app/javascript/flavours/glitch/reducers/followed_tags.js +2 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import {
  FOLLOWED_HASHTAGS_FETCH_REQUEST,
  FOLLOWED_HASHTAGS_FETCH_SUCCESS,


@@ 6,7 8,6 @@ import {
  FOLLOWED_HASHTAGS_EXPAND_SUCCESS,
  FOLLOWED_HASHTAGS_EXPAND_FAIL,
} from 'flavours/glitch/actions/tags';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

const initialState = ImmutableMap({
  items: ImmutableList(),

M app/javascript/flavours/glitch/reducers/height_cache.js => app/javascript/flavours/glitch/reducers/height_cache.js +1 -0
@@ 1,4 1,5 @@
import { Map as ImmutableMap } from 'immutable';

import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'flavours/glitch/actions/height_cache';

const initialState = ImmutableMap();

M app/javascript/flavours/glitch/reducers/history.js => app/javascript/flavours/glitch/reducers/history.js +2 -1
@@ 1,6 1,7 @@
import { HISTORY_FETCH_REQUEST, HISTORY_FETCH_SUCCESS, HISTORY_FETCH_FAIL } from 'flavours/glitch/actions/history';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import { HISTORY_FETCH_REQUEST, HISTORY_FETCH_SUCCESS, HISTORY_FETCH_FAIL } from 'flavours/glitch/actions/history';

const initialHistory = ImmutableMap({
  loading: false,
  items: ImmutableList(),

M app/javascript/flavours/glitch/reducers/list_adder.js => app/javascript/flavours/glitch/reducers/list_adder.js +1 -0
@@ 1,4 1,5 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import {
  LIST_ADDER_RESET,
  LIST_ADDER_SETUP,

M app/javascript/flavours/glitch/reducers/list_editor.js => app/javascript/flavours/glitch/reducers/list_editor.js +1 -0
@@ 1,4 1,5 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import {
  LIST_CREATE_REQUEST,
  LIST_CREATE_FAIL,

M app/javascript/flavours/glitch/reducers/lists.js => app/javascript/flavours/glitch/reducers/lists.js +2 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, fromJS } from 'immutable';

import {
  LIST_FETCH_SUCCESS,
  LIST_FETCH_FAIL,


@@ 6,7 8,6 @@ import {
  LIST_UPDATE_SUCCESS,
  LIST_DELETE_SUCCESS,
} from '../actions/lists';
import { Map as ImmutableMap, fromJS } from 'immutable';

const initialState = ImmutableMap();


M app/javascript/flavours/glitch/reducers/local_settings.js => app/javascript/flavours/glitch/reducers/local_settings.js +1 -1
@@ 2,8 2,8 @@
import { Map as ImmutableMap } from 'immutable';

//  Our imports.
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { LOCAL_SETTING_CHANGE, LOCAL_SETTING_DELETE } from 'flavours/glitch/actions/local_settings';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';

const initialState = ImmutableMap({
  layout    : 'auto',

M app/javascript/flavours/glitch/reducers/markers.js => app/javascript/flavours/glitch/reducers/markers.js +2 -1
@@ 1,8 1,9 @@
import { Map as ImmutableMap } from 'immutable';

import {
  MARKERS_SUBMIT_SUCCESS,
} from '../actions/markers';

import { Map as ImmutableMap } from 'immutable';

const initialState = ImmutableMap({
  home: '0',

M app/javascript/flavours/glitch/reducers/media_attachments.js => app/javascript/flavours/glitch/reducers/media_attachments.js +2 -1
@@ 1,6 1,7 @@
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { Map as ImmutableMap } from 'immutable';

import { STORE_HYDRATE } from 'flavours/glitch/actions/store';

const initialState = ImmutableMap({
  accept_content_types: [],
});

M app/javascript/flavours/glitch/reducers/meta.js => app/javascript/flavours/glitch/reducers/meta.js +3 -2
@@ 1,6 1,7 @@
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { changeLayout } from 'flavours/glitch/actions/app';
import { Map as ImmutableMap } from 'immutable';

import { changeLayout } from 'flavours/glitch/actions/app';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { layoutFromWindow } from 'flavours/glitch/is_mobile';

const initialState = ImmutableMap({

M app/javascript/flavours/glitch/reducers/modal.js => app/javascript/flavours/glitch/reducers/modal.js +3 -2
@@ 1,7 1,8 @@
import { Stack as ImmutableStack, Map as ImmutableMap } from 'immutable';

import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from 'flavours/glitch/actions/compose';
import { MODAL_OPEN, MODAL_CLOSE } from 'flavours/glitch/actions/modal';
import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines';
import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from 'flavours/glitch/actions/compose';
import { Stack as ImmutableStack, Map as ImmutableMap } from 'immutable';

const initialState = ImmutableMap({
  ignoreFocus: false,

M app/javascript/flavours/glitch/reducers/notifications.js => app/javascript/flavours/glitch/reducers/notifications.js +13 -11
@@ 1,3 1,15 @@
import { fromJS, Map as ImmutableMap, List as ImmutableList } from 'immutable';

import {
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
  FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
  FOLLOW_REQUEST_REJECT_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';
import {
  MARKERS_FETCH_SUCCESS,
} from 'flavours/glitch/actions/markers';
import {
  NOTIFICATIONS_MOUNT,
  NOTIFICATIONS_UNMOUNT,


@@ 20,18 32,8 @@ import {
  NOTIFICATIONS_SET_BROWSER_SUPPORT,
  NOTIFICATIONS_SET_BROWSER_PERMISSION,
} from 'flavours/glitch/actions/notifications';
import {
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
  FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
  FOLLOW_REQUEST_REJECT_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import {
  MARKERS_FETCH_SUCCESS,
} from 'flavours/glitch/actions/markers';
import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';
import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from 'flavours/glitch/actions/timelines';
import { fromJS, Map as ImmutableMap, List as ImmutableList } from 'immutable';

import { compareId } from '../compare_id';

const initialState = ImmutableMap({

M app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js => app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js +1 -0
@@ 1,4 1,5 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';

import {
  PINNED_ACCOUNTS_EDITOR_RESET,
  PINNED_ACCOUNTS_FETCH_REQUEST,

M app/javascript/flavours/glitch/reducers/polls.js => app/javascript/flavours/glitch/reducers/polls.js +2 -1
@@ 1,6 1,7 @@
import { POLLS_IMPORT } from 'flavours/glitch/actions/importer';
import { Map as ImmutableMap, fromJS } from 'immutable';

import { POLLS_IMPORT } from 'flavours/glitch/actions/importer';

const importPolls = (state, polls) => state.withMutations(map => polls.forEach(poll => map.set(poll.id, fromJS(poll))));

const initialState = ImmutableMap();

M app/javascript/flavours/glitch/reducers/push_notifications.js => app/javascript/flavours/glitch/reducers/push_notifications.js +3 -2
@@ 1,7 1,8 @@
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, SET_ALERTS } from 'flavours/glitch/actions/push_notifications';
import Immutable from 'immutable';

import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, SET_ALERTS } from 'flavours/glitch/actions/push_notifications';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';

const initialState = Immutable.Map({
  subscription: null,
  alerts: new Immutable.Map({

M app/javascript/flavours/glitch/reducers/relationships.js => app/javascript/flavours/glitch/reducers/relationships.js +8 -5
@@ 1,6 1,8 @@
import { Map as ImmutableMap, fromJS } from 'immutable';

import {
  NOTIFICATIONS_UPDATE,
} from '../actions/notifications';
  ACCOUNT_NOTE_SUBMIT_SUCCESS,
} from 'flavours/glitch/actions/account_notes';
import {
  ACCOUNT_FOLLOW_SUCCESS,
  ACCOUNT_FOLLOW_REQUEST,


@@ 22,10 24,11 @@ import {
  DOMAIN_BLOCK_SUCCESS,
  DOMAIN_UNBLOCK_SUCCESS,
} from 'flavours/glitch/actions/domain_blocks';

import {
  ACCOUNT_NOTE_SUBMIT_SUCCESS,
} from 'flavours/glitch/actions/account_notes';
import { Map as ImmutableMap, fromJS } from 'immutable';
  NOTIFICATIONS_UPDATE,
} from '../actions/notifications';


const normalizeRelationship = (state, relationship) => state.set(relationship.id, fromJS(relationship));


M app/javascript/flavours/glitch/reducers/search.js => app/javascript/flavours/glitch/reducers/search.js +7 -6
@@ 1,3 1,10 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import {
  COMPOSE_MENTION,
  COMPOSE_REPLY,
  COMPOSE_DIRECT,
} from 'flavours/glitch/actions/compose';
import {
  SEARCH_CHANGE,
  SEARCH_CLEAR,


@@ 7,12 14,6 @@ import {
  SEARCH_SHOW,
  SEARCH_EXPAND_SUCCESS,
} from 'flavours/glitch/actions/search';
import {
  COMPOSE_MENTION,
  COMPOSE_REPLY,
  COMPOSE_DIRECT,
} from 'flavours/glitch/actions/compose';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

const initialState = ImmutableMap({
  value: '',

M app/javascript/flavours/glitch/reducers/server.js => app/javascript/flavours/glitch/reducers/server.js +2 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import {
  SERVER_FETCH_REQUEST,
  SERVER_FETCH_SUCCESS,


@@ 12,7 14,6 @@ import {
  SERVER_DOMAIN_BLOCKS_FETCH_SUCCESS,
  SERVER_DOMAIN_BLOCKS_FETCH_FAIL,
} from 'flavours/glitch/actions/server';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

const initialState = ImmutableMap({
  server: ImmutableMap({

M app/javascript/flavours/glitch/reducers/settings.js => app/javascript/flavours/glitch/reducers/settings.js +6 -4
@@ 1,11 1,13 @@
import { SETTING_CHANGE, SETTING_SAVE } from 'flavours/glitch/actions/settings';
import { NOTIFICATIONS_FILTER_SET } from 'flavours/glitch/actions/notifications';
import { Map as ImmutableMap, fromJS } from 'immutable';

import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from 'flavours/glitch/actions/columns';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
import { EMOJI_USE } from 'flavours/glitch/actions/emojis';
import { LANGUAGE_USE } from 'flavours/glitch/actions/languages';
import { NOTIFICATIONS_FILTER_SET } from 'flavours/glitch/actions/notifications';
import { SETTING_CHANGE, SETTING_SAVE } from 'flavours/glitch/actions/settings';
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';

import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists';
import { Map as ImmutableMap, fromJS } from 'immutable';
import { uuid } from '../uuid';

const initialState = ImmutableMap({

M app/javascript/flavours/glitch/reducers/status_lists.js => app/javascript/flavours/glitch/reducers/status_lists.js +23 -20
@@ 1,11 1,9 @@
import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable';

import {
  FAVOURITED_STATUSES_FETCH_REQUEST,
  FAVOURITED_STATUSES_FETCH_SUCCESS,
  FAVOURITED_STATUSES_FETCH_FAIL,
  FAVOURITED_STATUSES_EXPAND_REQUEST,
  FAVOURITED_STATUSES_EXPAND_SUCCESS,
  FAVOURITED_STATUSES_EXPAND_FAIL,
} from 'flavours/glitch/actions/favourites';
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import {
  BOOKMARKED_STATUSES_FETCH_REQUEST,
  BOOKMARKED_STATUSES_FETCH_SUCCESS,


@@ 15,6 13,22 @@ import {
  BOOKMARKED_STATUSES_EXPAND_FAIL,
} from 'flavours/glitch/actions/bookmarks';
import {
  FAVOURITED_STATUSES_FETCH_REQUEST,
  FAVOURITED_STATUSES_FETCH_SUCCESS,
  FAVOURITED_STATUSES_FETCH_FAIL,
  FAVOURITED_STATUSES_EXPAND_REQUEST,
  FAVOURITED_STATUSES_EXPAND_SUCCESS,
  FAVOURITED_STATUSES_EXPAND_FAIL,
} from 'flavours/glitch/actions/favourites';
import {
  FAVOURITE_SUCCESS,
  UNFAVOURITE_SUCCESS,
  BOOKMARK_SUCCESS,
  UNBOOKMARK_SUCCESS,
  PIN_SUCCESS,
  UNPIN_SUCCESS,
} from 'flavours/glitch/actions/interactions';
import {
  PINNED_STATUSES_FETCH_SUCCESS,
} from 'flavours/glitch/actions/pin_statuses';
import {


@@ 25,19 39,8 @@ import {
  TRENDS_STATUSES_EXPAND_SUCCESS,
  TRENDS_STATUSES_EXPAND_FAIL,
} from 'flavours/glitch/actions/trends';
import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable';
import {
  FAVOURITE_SUCCESS,
  UNFAVOURITE_SUCCESS,
  BOOKMARK_SUCCESS,
  UNBOOKMARK_SUCCESS,
  PIN_SUCCESS,
  UNPIN_SUCCESS,
} from 'flavours/glitch/actions/interactions';
import {
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
} from 'flavours/glitch/actions/accounts';



const initialState = ImmutableMap({
  favourites: ImmutableMap({

M app/javascript/flavours/glitch/reducers/statuses.js => app/javascript/flavours/glitch/reducers/statuses.js +3 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, fromJS } from 'immutable';

import {
  REBLOG_REQUEST,
  REBLOG_FAIL,


@@ 21,8 23,8 @@ import {
import {
  TIMELINE_DELETE,
} from 'flavours/glitch/actions/timelines';

import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
import { Map as ImmutableMap, fromJS } from 'immutable';

const importStatus = (state, status) => state.set(status.id, fromJS(status));


M app/javascript/flavours/glitch/reducers/suggestions.js => app/javascript/flavours/glitch/reducers/suggestions.js +6 -3
@@ 1,12 1,15 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS } from 'flavours/glitch/actions/accounts';
import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';

import {
  SUGGESTIONS_FETCH_REQUEST,
  SUGGESTIONS_FETCH_SUCCESS,
  SUGGESTIONS_FETCH_FAIL,
  SUGGESTIONS_DISMISS,
} from '../actions/suggestions';
import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS } from 'flavours/glitch/actions/accounts';
import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';


const initialState = ImmutableMap({
  items: ImmutableList(),

M app/javascript/flavours/glitch/reducers/tags.js => app/javascript/flavours/glitch/reducers/tags.js +2 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, fromJS } from 'immutable';

import {
  HASHTAG_FETCH_SUCCESS,
  HASHTAG_FOLLOW_REQUEST,


@@ 5,7 7,6 @@ import {
  HASHTAG_UNFOLLOW_REQUEST,
  HASHTAG_UNFOLLOW_FAIL,
} from 'flavours/glitch/actions/tags';
import { Map as ImmutableMap, fromJS } from 'immutable';

const initialState = ImmutableMap();


M app/javascript/flavours/glitch/reducers/timelines.js => app/javascript/flavours/glitch/reducers/timelines.js +8 -6
@@ 1,3 1,10 @@
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';

import {
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
  ACCOUNT_UNFOLLOW_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import {
  TIMELINE_UPDATE,
  TIMELINE_DELETE,


@@ 11,12 18,7 @@ import {
  TIMELINE_LOAD_PENDING,
  TIMELINE_MARK_AS_PARTIAL,
} from 'flavours/glitch/actions/timelines';
import {
  ACCOUNT_BLOCK_SUCCESS,
  ACCOUNT_MUTE_SUCCESS,
  ACCOUNT_UNFOLLOW_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';

import { compareId } from '../compare_id';

const initialState = ImmutableMap();

M app/javascript/flavours/glitch/reducers/trends.js => app/javascript/flavours/glitch/reducers/trends.js +2 -1
@@ 1,3 1,5 @@
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import {
  TRENDS_TAGS_FETCH_REQUEST,
  TRENDS_TAGS_FETCH_SUCCESS,


@@ 6,7 8,6 @@ import {
  TRENDS_LINKS_FETCH_SUCCESS,
  TRENDS_LINKS_FETCH_FAIL,
} from 'flavours/glitch/actions/trends';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

const initialState = ImmutableMap({
  tags: ImmutableMap({

M app/javascript/flavours/glitch/reducers/user_lists.js => app/javascript/flavours/glitch/reducers/user_lists.js +19 -16
@@ 1,6 1,5 @@
import {
  NOTIFICATIONS_UPDATE,
} from '../actions/notifications';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';

import {
  FOLLOWERS_FETCH_REQUEST,
  FOLLOWERS_FETCH_SUCCESS,


@@ 24,10 23,6 @@ import {
  FOLLOW_REQUEST_REJECT_SUCCESS,
} from 'flavours/glitch/actions/accounts';
import {
  REBLOGS_FETCH_SUCCESS,
  FAVOURITES_FETCH_SUCCESS,
} from 'flavours/glitch/actions/interactions';
import {
  BLOCKS_FETCH_REQUEST,
  BLOCKS_FETCH_SUCCESS,
  BLOCKS_FETCH_FAIL,


@@ 36,14 31,6 @@ import {
  BLOCKS_EXPAND_FAIL,
} from 'flavours/glitch/actions/blocks';
import {
  MUTES_FETCH_REQUEST,
  MUTES_FETCH_SUCCESS,
  MUTES_FETCH_FAIL,
  MUTES_EXPAND_REQUEST,
  MUTES_EXPAND_SUCCESS,
  MUTES_EXPAND_FAIL,
} from 'flavours/glitch/actions/mutes';
import {
  DIRECTORY_FETCH_REQUEST,
  DIRECTORY_FETCH_SUCCESS,
  DIRECTORY_FETCH_FAIL,


@@ 56,7 43,23 @@ import {
  FEATURED_TAGS_FETCH_SUCCESS,
  FEATURED_TAGS_FETCH_FAIL,
} from 'flavours/glitch/actions/featured_tags';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
import {
  REBLOGS_FETCH_SUCCESS,
  FAVOURITES_FETCH_SUCCESS,
} from 'flavours/glitch/actions/interactions';
import {
  MUTES_FETCH_REQUEST,
  MUTES_FETCH_SUCCESS,
  MUTES_FETCH_FAIL,
  MUTES_EXPAND_REQUEST,
  MUTES_EXPAND_SUCCESS,
  MUTES_EXPAND_FAIL,
} from 'flavours/glitch/actions/mutes';

import {
  NOTIFICATIONS_UPDATE,
} from '../actions/notifications';


const initialListState = ImmutableMap({
  next: null,

M app/javascript/flavours/glitch/selectors/index.js => app/javascript/flavours/glitch/selectors/index.js +3 -2
@@ 1,7 1,8 @@
import { createSelector } from 'reselect';
import { List as ImmutableList, Map as ImmutableMap } from 'immutable';
import { toServerSideType } from 'flavours/glitch/utils/filters';
import { createSelector } from 'reselect';

import { me } from 'flavours/glitch/initial_state';
import { toServerSideType } from 'flavours/glitch/utils/filters';

const getAccountBase         = (state, id) => state.getIn(['accounts', id], null);
const getAccountCounters     = (state, id) => state.getIn(['accounts_counters', id], null);

M app/javascript/flavours/glitch/utils/log_out.js => app/javascript/flavours/glitch/utils/log_out.js +1 -0
@@ 1,4 1,5 @@
import Rails from '@rails/ujs';

import { signOutLink } from 'flavours/glitch/utils/backend_links';

export const logOut = () => {