From 1ff70886a12e05cdc2f0789e78dcdabccaef6d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Bijl?= Date: Sun, 12 Oct 2025 13:42:02 +0200 Subject: [PATCH] [build] upgrade eslint to 9.37.0 (#88) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: tobi Reviewed-on: https://codeberg.org/superseriousbusiness/masto-fe-standalone/pulls/88 Co-authored-by: Zoë Bijl Co-committed-by: Zoë Bijl --- .eslintignore | 13 - .eslintrc.js | 403 ----- .prettierrc.js | 4 +- Dockerfile | 10 +- app/javascript/core/admin.js | 158 +- app/javascript/core/auth.js | 6 +- app/javascript/core/common.js | 6 +- app/javascript/core/embed.js | 16 +- app/javascript/core/mailer.js | 4 +- .../core/remote_interaction_helper.ts | 52 +- app/javascript/core/settings.js | 20 +- .../core/two_factor_authentication.js | 88 +- .../flavours/glitch/actions/account_notes.js | 20 +- .../flavours/glitch/actions/accounts.js | 182 +-- .../flavours/glitch/actions/alerts.js | 24 +- .../flavours/glitch/actions/announcements.js | 44 +- app/javascript/flavours/glitch/actions/app.ts | 8 +- .../flavours/glitch/actions/blocks.js | 32 +- .../flavours/glitch/actions/bookmarks.js | 28 +- .../flavours/glitch/actions/boosts.js | 12 +- .../flavours/glitch/actions/bundles.js | 6 +- .../flavours/glitch/actions/columns.js | 10 +- .../flavours/glitch/actions/compose.js | 266 ++-- .../flavours/glitch/actions/conversations.js | 30 +- .../flavours/glitch/actions/custom_emojis.js | 10 +- .../flavours/glitch/actions/directory.js | 24 +- .../flavours/glitch/actions/domain_blocks.js | 46 +- .../flavours/glitch/actions/dropdown_menu.ts | 12 +- .../flavours/glitch/actions/emojis.js | 4 +- .../flavours/glitch/actions/favourites.js | 28 +- .../flavours/glitch/actions/featured_tags.js | 10 +- .../flavours/glitch/actions/filters.js | 46 +- .../flavours/glitch/actions/height_cache.js | 4 +- .../flavours/glitch/actions/history.js | 12 +- .../glitch/actions/identity_proofs.js | 8 +- .../flavours/glitch/actions/importer/index.js | 20 +- .../glitch/actions/importer/normalizer.js | 50 +- .../flavours/glitch/actions/interactions.js | 106 +- .../flavours/glitch/actions/languages.js | 4 +- .../flavours/glitch/actions/lists.js | 102 +- .../flavours/glitch/actions/local_settings.js | 24 +- .../flavours/glitch/actions/markers.js | 58 +- .../flavours/glitch/actions/modal.ts | 18 +- .../flavours/glitch/actions/mutes.js | 36 +- .../flavours/glitch/actions/notifications.js | 164 +-- .../flavours/glitch/actions/onboarding.js | 10 +- .../glitch/actions/picture_in_picture.js | 6 +- .../flavours/glitch/actions/pin_statuses.js | 12 +- .../flavours/glitch/actions/polls.js | 16 +- .../actions/push_notifications/index.js | 8 +- .../actions/push_notifications/registerer.js | 44 +- .../actions/push_notifications/setter.js | 8 +- .../flavours/glitch/actions/reports.js | 26 +- .../flavours/glitch/actions/search.js | 62 +- .../flavours/glitch/actions/server.js | 40 +- .../flavours/glitch/actions/settings.js | 12 +- .../flavours/glitch/actions/statuses.js | 74 +- .../flavours/glitch/actions/store.js | 22 +- .../flavours/glitch/actions/streaming.js | 80 +- .../flavours/glitch/actions/suggestions.js | 18 +- .../flavours/glitch/actions/tags.js | 40 +- .../flavours/glitch/actions/timelines.js | 92 +- .../flavours/glitch/actions/trends.js | 44 +- app/javascript/flavours/glitch/api.js | 16 +- app/javascript/flavours/glitch/blurhash.ts | 166 +-- .../flavours/glitch/components/account.jsx | 86 +- .../glitch/components/admin/Counter.jsx | 18 +- .../glitch/components/admin/Dimension.jsx | 16 +- .../glitch/components/admin/ImpactReport.jsx | 20 +- .../components/admin/ReportReasonSelector.jsx | 36 +- .../glitch/components/admin/Retention.jsx | 40 +- .../glitch/components/admin/Trends.jsx | 16 +- .../glitch/components/animated_number.tsx | 18 +- .../glitch/components/attachment_list.jsx | 22 +- .../glitch/components/autosuggest_emoji.jsx | 10 +- .../glitch/components/autosuggest_hashtag.tsx | 22 +- .../glitch/components/autosuggest_input.jsx | 86 +- .../components/autosuggest_textarea.jsx | 88 +- .../flavours/glitch/components/avatar.tsx | 30 +- .../glitch/components/avatar_composite.jsx | 42 +- .../glitch/components/avatar_overlay.jsx | 16 +- .../flavours/glitch/components/blurhash.tsx | 24 +- .../flavours/glitch/components/button.jsx | 16 +- .../glitch/components/circular_progress.tsx | 4 +- .../flavours/glitch/components/column.jsx | 26 +- .../glitch/components/column_back_button.jsx | 14 +- .../components/column_back_button_slim.jsx | 10 +- .../glitch/components/column_header.jsx | 44 +- .../flavours/glitch/components/counters.tsx | 4 +- .../glitch/components/dismissable_banner.tsx | 14 +- .../glitch/components/display_name.tsx | 52 +- .../flavours/glitch/components/domain.tsx | 16 +- .../glitch/components/dropdown_menu.jsx | 112 +- .../containers/dropdown_menu_container.js | 12 +- .../components/edited_timestamp/index.jsx | 30 +- .../glitch/components/error_boundary.jsx | 28 +- .../flavours/glitch/components/gifv.tsx | 22 +- .../flavours/glitch/components/hashtag.jsx | 38 +- .../flavours/glitch/components/icon.tsx | 14 +- .../glitch/components/icon_button.tsx | 83 +- .../glitch/components/icon_with_badge.tsx | 14 +- .../glitch/components/inline_account.jsx | 12 +- .../intersection_observer_article.jsx | 12 +- .../flavours/glitch/components/link.jsx | 14 +- .../flavours/glitch/components/load_gap.tsx | 14 +- .../flavours/glitch/components/load_more.tsx | 10 +- .../glitch/components/load_pending.tsx | 6 +- .../glitch/components/loading_indicator.tsx | 2 +- .../glitch/components/media_attachments.jsx | 50 +- .../glitch/components/media_gallery.jsx | 114 +- .../flavours/glitch/components/modal_root.jsx | 32 +- .../glitch/components/navigation_portal.jsx | 10 +- .../components/not_signed_in_indicator.tsx | 4 +- .../components/notification_purge_buttons.jsx | 22 +- .../flavours/glitch/components/permalink.jsx | 6 +- .../picture_in_picture_placeholder.jsx | 12 +- .../flavours/glitch/components/poll.jsx | 90 +- .../glitch/components/radio_button.tsx | 16 +- .../components/regeneration_indicator.jsx | 4 +- .../glitch/components/relative_timestamp.tsx | 104 +- .../flavours/glitch/components/router.tsx | 12 +- .../glitch/components/scrollable_list.jsx | 50 +- .../glitch/components/server_banner.jsx | 38 +- .../glitch/components/server_hero_image.tsx | 18 +- .../glitch/components/setting_text.jsx | 8 +- .../glitch/components/short_number.tsx | 80 +- .../flavours/glitch/components/skeleton.tsx | 6 +- .../flavours/glitch/components/status.jsx | 394 ++--- .../glitch/components/status_action_bar.jsx | 172 +-- .../glitch/components/status_content.jsx | 184 +-- .../glitch/components/status_header.jsx | 20 +- .../glitch/components/status_icons.jsx | 62 +- .../glitch/components/status_list.jsx | 18 +- .../glitch/components/status_prepend.jsx | 166 +-- .../components/status_visibility_icon.jsx | 26 +- .../glitch/components/timeline_hint.tsx | 8 +- .../glitch/containers/account_container.jsx | 42 +- .../glitch/containers/admin_component.jsx | 6 +- .../glitch/containers/compose_container.jsx | 16 +- .../glitch/containers/domain_container.jsx | 14 +- .../containers/dropdown_menu_container.js | 14 +- ...intersection_observer_article_container.js | 8 +- .../flavours/glitch/containers/mastodon.jsx | 36 +- .../glitch/containers/media_container.jsx | 44 +- .../notification_purge_buttons_container.js | 18 +- .../glitch/containers/poll_container.js | 10 +- .../glitch/containers/scroll_container.js | 2 +- .../glitch/containers/status_container.js | 146 +- .../glitch/containers/theme_component.jsx | 28 +- .../flavours/glitch/features/about/index.jsx | 91 +- .../account/components/account_note.jsx | 14 +- .../account/components/action_bar.jsx | 32 +- .../account/components/featured_tags.jsx | 30 +- .../components/follow_request_note.jsx | 10 +- .../features/account/components/header.jsx | 310 ++-- .../components/profile_column_header.jsx | 10 +- .../containers/account_note_container.js | 12 +- .../containers/featured_tags_container.js | 10 +- .../follow_request_note_container.js | 10 +- .../glitch/features/account/navigation.jsx | 12 +- .../account_gallery/components/media_item.jsx | 62 +- .../glitch/features/account_gallery/index.jsx | 78 +- .../account_timeline/components/header.jsx | 40 +- .../components/limited_account_hint.jsx | 14 +- .../components/memorial_note.jsx | 2 +- .../components/moved_note.jsx | 20 +- .../containers/header_container.jsx | 106 +- .../features/account_timeline/index.jsx | 58 +- .../flavours/glitch/features/audio/index.jsx | 176 +-- .../glitch/features/audio/visualizer.js | 2 +- .../flavours/glitch/features/blocks/index.jsx | 32 +- .../features/bookmarked_statuses/index.jsx | 36 +- .../closed_registrations_modal/index.jsx | 12 +- .../components/column_settings.jsx | 20 +- .../containers/column_settings_container.js | 16 +- .../features/community_timeline/index.jsx | 46 +- .../compose/components/action_bar.jsx | 56 +- .../components/autosuggest_account.jsx | 10 +- .../compose/components/character_counter.jsx | 6 +- .../compose/components/compose_form.jsx | 92 +- .../features/compose/components/dropdown.jsx | 58 +- .../compose/components/dropdown_menu.jsx | 76 +- .../components/emoji_picker_dropdown.jsx | 102 +- .../features/compose/components/header.jsx | 54 +- .../compose/components/language_dropdown.jsx | 152 +- .../compose/components/navigation_bar.jsx | 26 +- .../features/compose/components/options.jsx | 130 +- .../features/compose/components/poll_form.jsx | 54 +- .../compose/components/privacy_dropdown.jsx | 42 +- .../features/compose/components/publisher.jsx | 50 +- .../compose/components/reply_indicator.jsx | 26 +- .../features/compose/components/search.jsx | 206 +-- .../compose/components/search_results.jsx | 44 +- .../compose/components/text_icon_button.jsx | 8 +- .../compose/components/textarea_icons.jsx | 22 +- .../features/compose/components/upload.jsx | 26 +- .../compose/components/upload_form.jsx | 10 +- .../compose/components/upload_progress.jsx | 12 +- .../features/compose/components/warning.jsx | 8 +- .../autosuggest_account_container.js | 6 +- .../containers/compose_form_container.js | 98 +- .../compose/containers/dropdown_container.js | 10 +- .../emoji_picker_dropdown_container.js | 60 +- .../compose/containers/header_container.js | 24 +- .../containers/language_dropdown_container.js | 18 +- .../containers/navigation_container.js | 20 +- .../compose/containers/options_container.js | 28 +- .../compose/containers/poll_form_container.js | 16 +- .../containers/privacy_dropdown_container.js | 14 +- .../containers/reply_indicator_container.js | 12 +- .../compose/containers/search_container.js | 12 +- .../containers/search_results_container.js | 16 +- .../containers/sensitive_button_container.jsx | 34 +- .../compose/containers/upload_container.js | 8 +- .../containers/upload_form_container.js | 6 +- .../containers/upload_progress_container.js | 10 +- .../compose/containers/warning_container.jsx | 22 +- .../glitch/features/compose/index.jsx | 42 +- .../glitch/features/compose/util/counter.js | 6 +- .../glitch/features/compose/util/url_regex.js | 32 +- .../components/column_settings.jsx | 20 +- .../components/conversation.jsx | 74 +- .../components/conversations_list.jsx | 22 +- .../containers/column_settings_container.js | 10 +- .../containers/conversation_container.js | 46 +- .../conversations_list_container.js | 12 +- .../glitch/features/direct_timeline/index.jsx | 36 +- .../directory/components/account_card.jsx | 124 +- .../glitch/features/directory/index.jsx | 62 +- .../glitch/features/domain_blocks/index.jsx | 34 +- .../flavours/glitch/features/emoji/emoji.js | 84 +- .../features/emoji/emoji_compressed.d.ts | 20 +- .../glitch/features/emoji/emoji_compressed.js | 39 +- .../features/emoji/emoji_mart_data_light.ts | 22 +- .../features/emoji/emoji_mart_search_light.js | 23 +- .../glitch/features/emoji/emoji_picker.js | 4 +- .../emoji/emoji_unicode_mapping_light.js | 4 +- .../glitch/features/emoji/emoji_utils.js | 32 +- .../features/emoji/unicode_to_filename.js | 9 +- .../features/emoji/unicode_to_unified_name.js | 9 +- .../explore/components/search_section.jsx | 4 +- .../features/explore/components/story.jsx | 24 +- .../glitch/features/explore/index.jsx | 44 +- .../glitch/features/explore/links.jsx | 44 +- .../glitch/features/explore/results.jsx | 150 +- .../glitch/features/explore/statuses.jsx | 26 +- .../glitch/features/explore/suggestions.jsx | 22 +- .../flavours/glitch/features/explore/tags.jsx | 24 +- .../features/favourited_statuses/index.jsx | 36 +- .../glitch/features/favourites/index.jsx | 38 +- .../features/filters/added_to_filter.jsx | 24 +- .../glitch/features/filters/select_filter.jsx | 108 +- .../glitch/features/firehose/index.jsx | 134 +- .../components/account.jsx | 38 +- .../features/follow_recommendations/index.jsx | 52 +- .../components/account_authorize.jsx | 24 +- .../containers/account_authorize_container.js | 8 +- .../glitch/features/follow_requests/index.jsx | 38 +- .../glitch/features/followed_tags/index.jsx | 42 +- .../glitch/features/followers/index.jsx | 56 +- .../glitch/features/following/index.jsx | 56 +- .../components/announcements.jsx | 136 +- .../getting_started/components/trends.jsx | 16 +- .../containers/announcements_container.js | 14 +- .../containers/trends_container.js | 8 +- .../glitch/features/getting_started/index.jsx | 106 +- .../features/getting_started_misc/index.jsx | 42 +- .../components/column_settings.jsx | 54 +- .../components/hashtag_header.jsx | 24 +- .../containers/column_settings_container.js | 16 +- .../features/hashtag_timeline/index.jsx | 62 +- .../components/column_settings.tsx | 30 +- .../components/critical_update_banner.tsx | 4 +- .../components/explore_prompt.tsx | 8 +- .../glitch/features/home_timeline/index.jsx | 78 +- .../features/interaction_modal/index.jsx | 168 +-- .../features/keyboard_shortcuts/index.jsx | 18 +- .../list_adder/components/account.jsx | 14 +- .../features/list_adder/components/list.jsx | 26 +- .../glitch/features/list_adder/index.jsx | 26 +- .../list_editor/components/account.jsx | 18 +- .../list_editor/components/edit_list_form.jsx | 18 +- .../list_editor/components/search.jsx | 14 +- .../containers/account_container.js | 12 +- .../containers/search_container.js | 10 +- .../glitch/features/list_editor/index.jsx | 28 +- .../glitch/features/list_timeline/index.jsx | 72 +- .../lists/components/new_list_form.jsx | 22 +- .../flavours/glitch/features/lists/index.jsx | 40 +- .../glitch/features/local_settings/index.jsx | 18 +- .../local_settings/navigation/index.jsx | 22 +- .../local_settings/navigation/item/index.jsx | 56 +- .../page/deprecated_item/index.jsx | 32 +- .../features/local_settings/page/index.jsx | 216 +-- .../local_settings/page/item/index.jsx | 48 +- .../flavours/glitch/features/mutes/index.jsx | 34 +- .../notifications/components/admin_report.jsx | 48 +- .../notifications/components/admin_signup.jsx | 40 +- .../components/clear_column_button.jsx | 8 +- .../components/column_settings.jsx | 112 +- .../notifications/components/filter_bar.jsx | 56 +- .../notifications/components/follow.jsx | 40 +- .../components/follow_request.jsx | 52 +- .../components/grant_permission_button.jsx | 6 +- .../notifications/components/notification.jsx | 396 ++--- .../notifications_permission_banner.jsx | 22 +- .../notifications/components/overlay.jsx | 22 +- .../components/pill_bar_button.jsx | 12 +- .../notifications/components/report.jsx | 32 +- .../components/setting_toggle.jsx | 10 +- .../containers/admin_report_container.js | 8 +- .../containers/column_settings_container.js | 58 +- .../containers/filter_bar_container.js | 10 +- .../containers/follow_request_container.js | 10 +- .../containers/notification_container.js | 10 +- .../containers/overlay_container.js | 8 +- .../glitch/features/notifications/index.jsx | 120 +- .../picture_in_picture/components/footer.jsx | 108 +- .../picture_in_picture/components/header.jsx | 24 +- .../features/picture_in_picture/index.jsx | 28 +- .../containers/account_container.js | 12 +- .../containers/search_container.js | 10 +- .../features/pinned_accounts_editor/index.jsx | 26 +- .../glitch/features/pinned_statuses/index.jsx | 28 +- .../glitch/features/privacy_policy/index.jsx | 18 +- .../components/column_settings.jsx | 22 +- .../containers/column_settings_container.js | 16 +- .../glitch/features/public_timeline/index.jsx | 50 +- .../glitch/features/reblogs/index.jsx | 38 +- .../glitch/features/report/category.jsx | 68 +- .../glitch/features/report/comment.jsx | 34 +- .../features/report/components/option.jsx | 14 +- .../report/components/status_check_box.jsx | 30 +- .../containers/status_check_box_container.js | 6 +- .../flavours/glitch/features/report/rules.jsx | 26 +- .../glitch/features/report/statuses.jsx | 24 +- .../glitch/features/report/thanks.jsx | 34 +- .../features/standalone/compose/index.jsx | 10 +- .../features/status/components/action_bar.jsx | 128 +- .../features/status/components/card.jsx | 100 +- .../status/components/detailed_status.jsx | 214 +-- .../containers/detailed_status_container.js | 78 +- .../flavours/glitch/features/status/index.jsx | 275 ++-- .../subscribed_languages_modal/index.jsx | 36 +- .../features/ui/components/actions_modal.jsx | 36 +- .../features/ui/components/audio_modal.jsx | 34 +- .../features/ui/components/block_modal.jsx | 26 +- .../features/ui/components/boost_modal.jsx | 64 +- .../glitch/features/ui/components/bundle.jsx | 4 +- .../ui/components/bundle_column_error.jsx | 58 +- .../ui/components/bundle_modal_error.jsx | 14 +- .../glitch/features/ui/components/column.jsx | 20 +- .../features/ui/components/column_header.jsx | 12 +- .../features/ui/components/column_link.jsx | 14 +- .../features/ui/components/column_loading.jsx | 12 +- .../ui/components/column_subheading.jsx | 2 +- .../features/ui/components/columns_area.jsx | 76 +- .../ui/components/compare_history_modal.jsx | 52 +- .../features/ui/components/compose_panel.jsx | 18 +- .../ui/components/confirmation_modal.jsx | 10 +- .../components/deprecated_settings_modal.jsx | 18 +- .../ui/components/disabled_account_banner.jsx | 28 +- .../features/ui/components/doodle_modal.jsx | 288 ++-- .../features/ui/components/embed_modal.jsx | 16 +- .../ui/components/favourite_modal.jsx | 48 +- .../features/ui/components/filter_modal.jsx | 70 +- .../ui/components/focal_point_modal.jsx | 187 ++- .../follow_requests_column_link.jsx | 20 +- .../glitch/features/ui/components/header.jsx | 40 +- .../features/ui/components/image_loader.jsx | 44 +- .../features/ui/components/image_modal.jsx | 18 +- .../features/ui/components/link_footer.jsx | 28 +- .../features/ui/components/list_panel.jsx | 22 +- .../features/ui/components/media_modal.jsx | 110 +- .../features/ui/components/modal_loading.jsx | 2 +- .../features/ui/components/modal_root.jsx | 100 +- .../features/ui/components/mute_modal.jsx | 36 +- .../ui/components/navigation_panel.jsx | 62 +- .../components/notifications_counter_icon.js | 8 +- .../ui/components/onboarding_modal.jsx | 80 +- .../features/ui/components/report_modal.jsx | 150 +- .../features/ui/components/sign_in_banner.jsx | 14 +- .../features/ui/components/upload_area.jsx | 26 +- .../features/ui/components/video_modal.jsx | 32 +- .../features/ui/components/zoomable_image.jsx | 120 +- .../ui/containers/bundle_container.js | 6 +- .../ui/containers/columns_area_container.js | 20 +- .../ui/containers/loading_bar_container.js | 6 +- .../features/ui/containers/modal_container.js | 14 +- .../ui/containers/notifications_container.js | 14 +- .../ui/containers/status_list_container.js | 54 +- .../flavours/glitch/features/ui/index.jsx | 334 ++--- .../features/ui/util/async-components.js | 104 +- .../glitch/features/ui/util/fullscreen.js | 24 +- .../features/ui/util/get_rect_from_entry.js | 2 +- .../ui/util/intersection_observer_wrapper.js | 2 +- .../features/ui/util/optional_motion.js | 6 +- .../features/ui/util/react_router_helpers.jsx | 20 +- .../features/ui/util/reduced_motion.jsx | 10 +- .../features/ui/util/schedule_idle_task.js | 2 +- .../flavours/glitch/features/video/index.jsx | 230 +-- .../flavours/glitch/hooks/useHovering.ts | 10 +- .../flavours/glitch/initial_state.js | 84 +- app/javascript/flavours/glitch/is_mobile.ts | 26 +- .../glitch/load_keyboard_extensions.js | 2 +- .../flavours/glitch/locales/global_locale.ts | 10 +- .../flavours/glitch/locales/index.ts | 8 +- .../flavours/glitch/locales/intl_provider.tsx | 22 +- .../flavours/glitch/locales/load_locale.ts | 22 +- app/javascript/flavours/glitch/main.jsx | 32 +- .../flavours/glitch/packs/admin.jsx | 16 +- .../flavours/glitch/packs/common.js | 8 +- app/javascript/flavours/glitch/packs/error.js | 14 +- app/javascript/flavours/glitch/packs/home.js | 6 +- app/javascript/flavours/glitch/packs/login.js | 8 +- .../flavours/glitch/packs/public.jsx | 146 +- .../flavours/glitch/packs/settings.js | 32 +- .../flavours/glitch/packs/share.jsx | 18 +- .../flavours/glitch/packs/sign_up.js | 14 +- app/javascript/flavours/glitch/performance.js | 10 +- .../glitch/polyfills/base_polyfills.ts | 20 +- .../glitch/polyfills/extra_polyfills.ts | 4 +- .../flavours/glitch/polyfills/index.ts | 18 +- .../flavours/glitch/polyfills/intl.ts | 10 +- app/javascript/flavours/glitch/ready.js | 6 +- .../flavours/glitch/reducers/account_notes.js | 46 +- .../flavours/glitch/reducers/accounts.js | 24 +- .../glitch/reducers/accounts_counters.js | 28 +- .../flavours/glitch/reducers/accounts_map.js | 22 +- .../flavours/glitch/reducers/alerts.js | 30 +- .../flavours/glitch/reducers/announcements.js | 98 +- .../flavours/glitch/reducers/blocks.js | 16 +- .../flavours/glitch/reducers/boosts.js | 22 +- .../flavours/glitch/reducers/compose.js | 780 +++++----- .../flavours/glitch/reducers/contexts.js | 50 +- .../flavours/glitch/reducers/conversations.js | 82 +- .../flavours/glitch/reducers/custom_emojis.js | 10 +- .../flavours/glitch/reducers/domain_lists.js | 20 +- .../flavours/glitch/reducers/dropdown_menu.ts | 10 +- .../flavours/glitch/reducers/filters.js | 22 +- .../flavours/glitch/reducers/followed_tags.js | 48 +- .../flavours/glitch/reducers/height_cache.js | 16 +- .../flavours/glitch/reducers/history.js | 32 +- .../flavours/glitch/reducers/index.ts | 94 +- .../flavours/glitch/reducers/list_adder.js | 48 +- .../flavours/glitch/reducers/list_editor.js | 116 +- .../flavours/glitch/reducers/lists.js | 26 +- .../glitch/reducers/local_settings.js | 34 +- .../flavours/glitch/reducers/markers.js | 28 +- .../glitch/reducers/media_attachments.js | 12 +- .../flavours/glitch/reducers/meta.js | 26 +- .../flavours/glitch/reducers/modal.ts | 56 +- .../flavours/glitch/reducers/mutes.js | 26 +- .../flavours/glitch/reducers/notifications.js | 284 ++-- .../glitch/reducers/picture_in_picture.js | 20 +- .../glitch/reducers/pinned_accounts_editor.js | 60 +- .../flavours/glitch/reducers/polls.js | 30 +- .../glitch/reducers/push_notifications.js | 64 +- .../flavours/glitch/reducers/relationships.js | 76 +- .../flavours/glitch/reducers/search.js | 102 +- .../flavours/glitch/reducers/server.js | 32 +- .../flavours/glitch/reducers/settings.js | 138 +- .../flavours/glitch/reducers/status_lists.js | 134 +- .../flavours/glitch/reducers/statuses.js | 144 +- .../flavours/glitch/reducers/suggestions.js | 44 +- .../flavours/glitch/reducers/tags.js | 24 +- .../flavours/glitch/reducers/timelines.js | 152 +- .../flavours/glitch/reducers/trends.js | 44 +- .../flavours/glitch/reducers/user_lists.js | 208 +-- app/javascript/flavours/glitch/scroll.ts | 21 +- .../flavours/glitch/selectors/index.js | 92 +- app/javascript/flavours/glitch/settings.js | 11 +- app/javascript/flavours/glitch/store/index.ts | 16 +- .../glitch/store/middlewares/errors.ts | 28 +- .../glitch/store/middlewares/loading_bar.ts | 48 +- .../glitch/store/middlewares/sounds.ts | 34 +- app/javascript/flavours/glitch/stream.js | 54 +- .../flavours/glitch/types/resources.ts | 72 +- .../flavours/glitch/utils/backend_links.js | 18 +- .../flavours/glitch/utils/config.js | 8 +- .../flavours/glitch/utils/content_warning.js | 15 +- .../flavours/glitch/utils/dom_helpers.js | 2 +- .../flavours/glitch/utils/filters.ts | 16 +- .../flavours/glitch/utils/hashtag.js | 2 +- .../flavours/glitch/utils/hashtags.ts | 10 +- app/javascript/flavours/glitch/utils/html.js | 4 +- app/javascript/flavours/glitch/utils/idna.js | 8 +- .../flavours/glitch/utils/js_helpers.js | 2 +- .../flavours/glitch/utils/log_out.js | 30 +- .../flavours/glitch/utils/notifications.js | 2 +- .../flavours/glitch/utils/numbers.ts | 2 +- .../glitch/utils/privacy_preference.js | 2 +- .../flavours/glitch/utils/react_helpers.js | 2 +- .../flavours/glitch/utils/resize_image.js | 144 +- .../flavours/glitch/utils/scrollbar.js | 8 +- app/javascript/flavours/glitch/uuid.ts | 7 +- app/javascript/hooks/useHovering.ts | 10 +- .../mastodon/actions/account_notes.ts | 8 +- app/javascript/mastodon/actions/accounts.js | 158 +- app/javascript/mastodon/actions/alerts.js | 22 +- .../mastodon/actions/announcements.js | 44 +- app/javascript/mastodon/actions/app.ts | 12 +- app/javascript/mastodon/actions/blocks.js | 32 +- app/javascript/mastodon/actions/bookmarks.js | 28 +- app/javascript/mastodon/actions/boosts.js | 12 +- app/javascript/mastodon/actions/bundles.js | 6 +- app/javascript/mastodon/actions/columns.js | 10 +- app/javascript/mastodon/actions/compose.js | 250 ++-- .../mastodon/actions/conversations.js | 30 +- .../mastodon/actions/custom_emojis.js | 10 +- app/javascript/mastodon/actions/directory.js | 24 +- .../mastodon/actions/domain_blocks.js | 46 +- .../mastodon/actions/dropdown_menu.ts | 12 +- app/javascript/mastodon/actions/emojis.js | 4 +- app/javascript/mastodon/actions/favourites.js | 28 +- .../mastodon/actions/featured_tags.js | 10 +- app/javascript/mastodon/actions/filters.js | 46 +- .../mastodon/actions/height_cache.js | 4 +- app/javascript/mastodon/actions/history.js | 12 +- .../mastodon/actions/importer/index.js | 20 +- .../mastodon/actions/importer/normalizer.js | 54 +- .../mastodon/actions/interactions.js | 106 +- app/javascript/mastodon/actions/languages.js | 4 +- app/javascript/mastodon/actions/lists.js | 102 +- app/javascript/mastodon/actions/markers.js | 58 +- app/javascript/mastodon/actions/modal.ts | 18 +- app/javascript/mastodon/actions/mutes.js | 36 +- .../mastodon/actions/notifications.js | 142 +- app/javascript/mastodon/actions/onboarding.js | 4 +- .../mastodon/actions/picture_in_picture.js | 6 +- .../mastodon/actions/pin_statuses.js | 12 +- app/javascript/mastodon/actions/polls.js | 16 +- .../actions/push_notifications/index.js | 8 +- .../actions/push_notifications/registerer.js | 44 +- .../actions/push_notifications/setter.js | 8 +- app/javascript/mastodon/actions/reports.js | 26 +- app/javascript/mastodon/actions/search.js | 60 +- app/javascript/mastodon/actions/server.js | 34 +- app/javascript/mastodon/actions/settings.js | 16 +- app/javascript/mastodon/actions/statuses.js | 74 +- app/javascript/mastodon/actions/store.js | 12 +- app/javascript/mastodon/actions/streaming.js | 78 +- .../mastodon/actions/suggestions.js | 18 +- app/javascript/mastodon/actions/tags.js | 40 +- app/javascript/mastodon/actions/timelines.js | 90 +- app/javascript/mastodon/actions/trends.js | 44 +- app/javascript/mastodon/api.ts | 17 +- app/javascript/mastodon/api_types/accounts.ts | 70 +- .../mastodon/api_types/custom_emoji.ts | 10 +- .../mastodon/api_types/relationships.ts | 30 +- app/javascript/mastodon/blurhash.ts | 166 +-- app/javascript/mastodon/common.js | 6 +- .../__tests__/autosuggest_emoji-test.jsx | 20 +- .../components/__tests__/avatar-test.jsx | 26 +- .../__tests__/avatar_overlay-test.jsx | 30 +- .../components/__tests__/button-test.jsx | 38 +- .../__tests__/display_name-test.jsx | 16 +- .../components/__tests__/hashtag_bar.tsx | 124 +- .../mastodon/components/account.jsx | 90 +- .../mastodon/components/admin/Counter.jsx | 18 +- .../mastodon/components/admin/Dimension.jsx | 16 +- .../components/admin/ImpactReport.jsx | 20 +- .../components/admin/ReportReasonSelector.jsx | 36 +- .../mastodon/components/admin/Retention.jsx | 38 +- .../mastodon/components/admin/Trends.jsx | 16 +- .../mastodon/components/animated_number.tsx | 12 +- .../mastodon/components/attachment_list.jsx | 22 +- .../mastodon/components/autosuggest_emoji.jsx | 10 +- .../components/autosuggest_hashtag.tsx | 22 +- .../mastodon/components/autosuggest_input.jsx | 86 +- .../components/autosuggest_textarea.jsx | 88 +- app/javascript/mastodon/components/avatar.tsx | 28 +- .../mastodon/components/avatar_composite.jsx | 40 +- .../mastodon/components/avatar_overlay.tsx | 28 +- app/javascript/mastodon/components/badge.jsx | 10 +- .../mastodon/components/blurhash.tsx | 22 +- app/javascript/mastodon/components/button.jsx | 14 +- .../mastodon/components/circular_progress.tsx | 4 +- app/javascript/mastodon/components/column.jsx | 20 +- .../components/column_back_button.jsx | 14 +- .../components/column_back_button_slim.jsx | 6 +- .../mastodon/components/column_header.jsx | 44 +- .../mastodon/components/counters.tsx | 4 +- .../components/dismissable_banner.tsx | 14 +- .../mastodon/components/display_name.tsx | 44 +- app/javascript/mastodon/components/domain.tsx | 14 +- .../mastodon/components/dropdown_menu.jsx | 114 +- .../containers/dropdown_menu_container.js | 12 +- .../components/edited_timestamp/index.jsx | 30 +- .../mastodon/components/empty_account.tsx | 14 +- .../mastodon/components/error_boundary.jsx | 28 +- app/javascript/mastodon/components/gifv.tsx | 20 +- .../mastodon/components/hashtag.jsx | 34 +- .../mastodon/components/hashtag_bar.tsx | 114 +- app/javascript/mastodon/components/icon.tsx | 12 +- .../mastodon/components/icon_button.tsx | 75 +- .../mastodon/components/icon_with_badge.tsx | 12 +- .../mastodon/components/inline_account.jsx | 12 +- .../intersection_observer_article.jsx | 12 +- .../mastodon/components/load_gap.tsx | 14 +- .../mastodon/components/load_more.tsx | 10 +- .../mastodon/components/load_pending.tsx | 6 +- .../mastodon/components/loading_indicator.tsx | 2 +- .../mastodon/components/media_attachments.jsx | 50 +- .../mastodon/components/media_gallery.jsx | 88 +- .../mastodon/components/modal_root.jsx | 32 +- .../mastodon/components/navigation_portal.jsx | 10 +- .../components/not_signed_in_indicator.tsx | 2 +- .../picture_in_picture_placeholder.jsx | 12 +- app/javascript/mastodon/components/poll.jsx | 90 +- .../mastodon/components/radio_button.tsx | 14 +- .../components/regeneration_indicator.jsx | 4 +- .../components/relative_timestamp.tsx | 104 +- app/javascript/mastodon/components/router.tsx | 18 +- .../mastodon/components/scrollable_list.jsx | 50 +- .../mastodon/components/server_banner.jsx | 38 +- .../mastodon/components/server_hero_image.tsx | 16 +- .../mastodon/components/short_number.tsx | 75 +- .../mastodon/components/skeleton.tsx | 4 +- app/javascript/mastodon/components/status.jsx | 260 ++-- .../mastodon/components/status_action_bar.jsx | 206 +-- .../mastodon/components/status_content.jsx | 102 +- .../mastodon/components/status_list.jsx | 18 +- .../mastodon/components/timeline_hint.tsx | 7 +- .../mastodon/components/verified_badge.tsx | 16 +- .../mastodon/containers/account_container.jsx | 42 +- .../mastodon/containers/admin_component.jsx | 6 +- .../mastodon/containers/compose_container.jsx | 16 +- .../mastodon/containers/domain_container.jsx | 14 +- .../containers/dropdown_menu_container.js | 18 +- ...intersection_observer_article_container.js | 8 +- .../mastodon/containers/mastodon.jsx | 32 +- .../mastodon/containers/media_container.jsx | 44 +- .../mastodon/containers/poll_container.js | 10 +- .../mastodon/containers/scroll_container.js | 2 +- .../mastodon/containers/status_container.jsx | 128 +- .../mastodon/features/about/index.jsx | 90 +- .../account/components/account_note.jsx | 22 +- .../account/components/featured_tags.jsx | 28 +- .../components/follow_request_note.jsx | 10 +- .../features/account/components/header.jsx | 328 ++--- .../containers/account_note_container.js | 10 +- .../containers/featured_tags_container.js | 10 +- .../follow_request_note_container.js | 10 +- .../mastodon/features/account/navigation.jsx | 12 +- .../account_gallery/components/media_item.jsx | 62 +- .../features/account_gallery/index.jsx | 76 +- .../account_timeline/components/header.jsx | 38 +- .../components/limited_account_hint.jsx | 14 +- .../components/memorial_note.jsx | 2 +- .../components/moved_note.jsx | 18 +- .../containers/header_container.jsx | 106 +- .../features/account_timeline/index.jsx | 62 +- .../mastodon/features/audio/index.jsx | 176 +-- .../mastodon/features/audio/visualizer.js | 2 +- .../mastodon/features/blocks/index.jsx | 32 +- .../features/bookmarked_statuses/index.jsx | 36 +- .../closed_registrations_modal/index.jsx | 12 +- .../components/column_settings.jsx | 12 +- .../containers/column_settings_container.js | 16 +- .../features/community_timeline/index.jsx | 44 +- .../compose/components/action_bar.jsx | 60 +- .../components/autosuggest_account.jsx | 10 +- .../compose/components/character_counter.jsx | 6 +- .../compose/components/compose_form.jsx | 82 +- .../components/emoji_picker_dropdown.jsx | 100 +- .../compose/components/language_dropdown.jsx | 152 +- .../compose/components/navigation_bar.jsx | 18 +- .../compose/components/poll_button.jsx | 16 +- .../features/compose/components/poll_form.jsx | 48 +- .../compose/components/privacy_dropdown.jsx | 136 +- .../compose/components/reply_indicator.jsx | 32 +- .../features/compose/components/search.jsx | 202 +-- .../compose/components/search_results.jsx | 44 +- .../compose/components/text_icon_button.jsx | 8 +- .../features/compose/components/upload.jsx | 26 +- .../compose/components/upload_button.jsx | 24 +- .../compose/components/upload_form.jsx | 10 +- .../compose/components/upload_progress.jsx | 12 +- .../features/compose/components/warning.jsx | 8 +- .../autosuggest_account_container.js | 6 +- .../containers/compose_form_container.js | 36 +- .../emoji_picker_dropdown_container.js | 60 +- .../containers/language_dropdown_container.js | 18 +- .../containers/navigation_container.js | 20 +- .../containers/poll_button_container.js | 12 +- .../compose/containers/poll_form_container.js | 16 +- .../containers/privacy_dropdown_container.js | 14 +- .../containers/reply_indicator_container.js | 12 +- .../compose/containers/search_container.js | 12 +- .../containers/search_results_container.js | 16 +- .../containers/sensitive_button_container.jsx | 28 +- .../containers/spoiler_button_container.js | 20 +- .../containers/upload_button_container.js | 12 +- .../compose/containers/upload_container.js | 8 +- .../containers/upload_form_container.js | 6 +- .../containers/upload_progress_container.js | 10 +- .../compose/containers/warning_container.jsx | 18 +- .../mastodon/features/compose/index.jsx | 78 +- .../mastodon/features/compose/util/counter.js | 6 +- .../features/compose/util/url_regex.js | 32 +- .../components/conversation.jsx | 66 +- .../components/conversations_list.jsx | 22 +- .../containers/conversation_container.js | 44 +- .../conversations_list_container.js | 12 +- .../features/direct_timeline/index.jsx | 26 +- .../directory/components/account_card.jsx | 118 +- .../mastodon/features/directory/index.jsx | 62 +- .../mastodon/features/domain_blocks/index.jsx | 34 +- .../features/emoji/__tests__/emoji-test.js | 126 +- .../emoji/__tests__/emoji_index-test.js | 188 +-- .../mastodon/features/emoji/emoji.js | 84 +- .../features/emoji/emoji_compressed.d.ts | 20 +- .../features/emoji/emoji_compressed.js | 39 +- .../features/emoji/emoji_mart_data_light.ts | 22 +- .../features/emoji/emoji_mart_search_light.js | 23 +- .../mastodon/features/emoji/emoji_picker.js | 4 +- .../emoji/emoji_unicode_mapping_light.js | 4 +- .../mastodon/features/emoji/emoji_utils.js | 32 +- .../features/emoji/unicode_to_filename.js | 9 +- .../features/emoji/unicode_to_unified_name.js | 9 +- .../explore/components/search_section.jsx | 4 +- .../features/explore/components/story.jsx | 24 +- .../mastodon/features/explore/index.jsx | 44 +- .../mastodon/features/explore/links.jsx | 44 +- .../mastodon/features/explore/results.jsx | 150 +- .../mastodon/features/explore/statuses.jsx | 26 +- .../mastodon/features/explore/suggestions.jsx | 22 +- .../mastodon/features/explore/tags.jsx | 24 +- .../features/favourited_statuses/index.jsx | 36 +- .../mastodon/features/favourites/index.jsx | 36 +- .../features/filters/added_to_filter.jsx | 24 +- .../features/filters/select_filter.jsx | 108 +- .../mastodon/features/firehose/index.jsx | 122 +- .../components/account_authorize.jsx | 24 +- .../containers/account_authorize_container.js | 8 +- .../features/follow_requests/index.jsx | 38 +- .../mastodon/features/followed_tags/index.jsx | 42 +- .../mastodon/features/followers/index.jsx | 58 +- .../mastodon/features/following/index.jsx | 58 +- .../components/announcements.jsx | 136 +- .../getting_started/components/trends.jsx | 16 +- .../containers/announcements_container.js | 14 +- .../containers/trends_container.js | 8 +- .../features/getting_started/index.jsx | 78 +- .../components/column_settings.jsx | 54 +- .../components/hashtag_header.jsx | 24 +- .../containers/column_settings_container.js | 16 +- .../features/hashtag_timeline/index.jsx | 62 +- .../components/column_settings.tsx | 18 +- .../components/critical_update_banner.tsx | 4 +- .../components/explore_prompt.tsx | 8 +- .../mastodon/features/home_timeline/index.jsx | 78 +- .../features/interaction_modal/index.jsx | 170 +-- .../features/keyboard_shortcuts/index.jsx | 14 +- .../list_adder/components/account.jsx | 14 +- .../features/list_adder/components/list.jsx | 26 +- .../mastodon/features/list_adder/index.jsx | 26 +- .../list_editor/components/account.jsx | 26 +- .../list_editor/components/edit_list_form.jsx | 18 +- .../list_editor/components/search.jsx | 20 +- .../mastodon/features/list_editor/index.jsx | 28 +- .../mastodon/features/list_timeline/index.jsx | 72 +- .../lists/components/new_list_form.jsx | 22 +- .../mastodon/features/lists/index.jsx | 40 +- .../mastodon/features/mutes/index.jsx | 34 +- .../components/clear_column_button.jsx | 8 +- .../components/column_settings.jsx | 110 +- .../notifications/components/filter_bar.jsx | 56 +- .../components/follow_request.jsx | 26 +- .../components/grant_permission_button.jsx | 6 +- .../notifications/components/notification.jsx | 192 +-- .../notifications_permission_banner.jsx | 22 +- .../notifications/components/report.jsx | 32 +- .../components/setting_toggle.jsx | 10 +- .../containers/column_settings_container.js | 58 +- .../containers/filter_bar_container.js | 10 +- .../containers/follow_request_container.js | 8 +- .../containers/notification_container.js | 30 +- .../mastodon/features/notifications/index.jsx | 101 +- .../components/progress_indicator.jsx | 12 +- .../features/onboarding/components/step.jsx | 12 +- .../mastodon/features/onboarding/follows.jsx | 30 +- .../mastodon/features/onboarding/index.jsx | 68 +- .../mastodon/features/onboarding/share.jsx | 60 +- .../picture_in_picture/components/footer.jsx | 102 +- .../picture_in_picture/components/header.jsx | 24 +- .../features/picture_in_picture/index.jsx | 22 +- .../features/pinned_statuses/index.jsx | 28 +- .../features/privacy_policy/index.jsx | 18 +- .../components/column_settings.jsx | 14 +- .../containers/column_settings_container.js | 16 +- .../features/public_timeline/index.jsx | 46 +- .../mastodon/features/reblogs/index.jsx | 36 +- .../mastodon/features/report/category.jsx | 80 +- .../mastodon/features/report/comment.jsx | 34 +- .../features/report/components/option.jsx | 14 +- .../report/components/status_check_box.jsx | 50 +- .../containers/status_check_box_container.js | 6 +- .../mastodon/features/report/rules.jsx | 26 +- .../mastodon/features/report/statuses.jsx | 24 +- .../mastodon/features/report/thanks.jsx | 34 +- .../features/standalone/compose/index.jsx | 10 +- .../features/status/components/action_bar.jsx | 172 +-- .../features/status/components/card.jsx | 96 +- .../status/components/detailed_status.jsx | 200 +-- .../containers/detailed_status_container.js | 82 +- .../mastodon/features/status/index.jsx | 260 ++-- .../subscribed_languages_modal/index.jsx | 36 +- .../ui/components/__tests__/column-test.jsx | 20 +- .../features/ui/components/actions_modal.jsx | 16 +- .../features/ui/components/audio_modal.jsx | 34 +- .../features/ui/components/block_modal.jsx | 26 +- .../features/ui/components/boost_modal.jsx | 78 +- .../features/ui/components/bundle.jsx | 4 +- .../ui/components/bundle_column_error.jsx | 58 +- .../ui/components/bundle_modal_error.jsx | 14 +- .../features/ui/components/column.jsx | 20 +- .../features/ui/components/column_header.jsx | 12 +- .../features/ui/components/column_link.jsx | 14 +- .../features/ui/components/column_loading.jsx | 12 +- .../ui/components/column_subheading.jsx | 2 +- .../features/ui/components/columns_area.jsx | 78 +- .../ui/components/compare_history_modal.jsx | 52 +- .../features/ui/components/compose_panel.jsx | 18 +- .../ui/components/confirmation_modal.jsx | 8 +- .../ui/components/disabled_account_banner.jsx | 28 +- .../features/ui/components/embed_modal.jsx | 16 +- .../features/ui/components/filter_modal.jsx | 70 +- .../ui/components/focal_point_modal.jsx | 189 ++- .../follow_requests_column_link.jsx | 20 +- .../features/ui/components/header.jsx | 38 +- .../features/ui/components/image_loader.jsx | 44 +- .../features/ui/components/image_modal.jsx | 18 +- .../features/ui/components/link_footer.jsx | 42 +- .../features/ui/components/list_panel.jsx | 22 +- .../features/ui/components/media_modal.jsx | 112 +- .../features/ui/components/modal_loading.jsx | 2 +- .../features/ui/components/modal_root.jsx | 82 +- .../features/ui/components/mute_modal.jsx | 36 +- .../ui/components/navigation_panel.jsx | 62 +- .../components/notifications_counter_icon.js | 8 +- .../features/ui/components/report_modal.jsx | 148 +- .../features/ui/components/sign_in_banner.jsx | 14 +- .../features/ui/components/upload_area.jsx | 26 +- .../features/ui/components/video_modal.jsx | 34 +- .../features/ui/components/zoomable_image.jsx | 120 +- .../ui/containers/bundle_container.js | 6 +- .../ui/containers/columns_area_container.js | 8 +- .../ui/containers/loading_bar_container.js | 6 +- .../features/ui/containers/modal_container.js | 14 +- .../ui/containers/notifications_container.js | 12 +- .../ui/containers/status_list_container.js | 46 +- app/javascript/mastodon/features/ui/index.jsx | 284 ++-- .../features/ui/util/async-components.js | 96 +- .../mastodon/features/ui/util/fullscreen.js | 24 +- .../features/ui/util/get_rect_from_entry.js | 2 +- .../ui/util/intersection_observer_wrapper.js | 2 +- .../features/ui/util/optional_motion.js | 6 +- .../features/ui/util/react_router_helpers.jsx | 20 +- .../features/ui/util/reduced_motion.jsx | 10 +- .../features/ui/util/schedule_idle_task.js | 2 +- .../mastodon/features/video/index.jsx | 224 +-- app/javascript/mastodon/initial_state.js | 76 +- app/javascript/mastodon/is_mobile.ts | 16 +- .../mastodon/load_keyboard_extensions.js | 2 +- .../mastodon/locales/global_locale.ts | 10 +- app/javascript/mastodon/locales/index.ts | 8 +- .../mastodon/locales/intl_provider.tsx | 22 +- .../mastodon/locales/load_locale.ts | 18 +- app/javascript/mastodon/main.jsx | 32 +- app/javascript/mastodon/performance.js | 10 +- .../mastodon/polyfills/base_polyfills.ts | 20 +- .../mastodon/polyfills/extra_polyfills.ts | 4 +- app/javascript/mastodon/polyfills/index.ts | 18 +- app/javascript/mastodon/polyfills/intl.ts | 10 +- app/javascript/mastodon/ready.js | 6 +- app/javascript/mastodon/reducers/accounts.js | 24 +- .../mastodon/reducers/accounts_counters.js | 38 +- .../mastodon/reducers/accounts_map.js | 22 +- app/javascript/mastodon/reducers/alerts.js | 20 +- .../mastodon/reducers/announcements.js | 98 +- app/javascript/mastodon/reducers/blocks.js | 16 +- app/javascript/mastodon/reducers/boosts.js | 22 +- app/javascript/mastodon/reducers/compose.js | 638 ++++---- app/javascript/mastodon/reducers/contexts.js | 50 +- .../mastodon/reducers/conversations.js | 82 +- .../mastodon/reducers/custom_emojis.js | 10 +- .../mastodon/reducers/domain_lists.js | 20 +- .../mastodon/reducers/dropdown_menu.ts | 10 +- app/javascript/mastodon/reducers/filters.js | 22 +- .../mastodon/reducers/followed_tags.js | 48 +- .../mastodon/reducers/height_cache.js | 16 +- app/javascript/mastodon/reducers/history.js | 32 +- app/javascript/mastodon/reducers/index.ts | 88 +- .../mastodon/reducers/list_adder.js | 48 +- .../mastodon/reducers/list_editor.js | 116 +- app/javascript/mastodon/reducers/lists.js | 26 +- app/javascript/mastodon/reducers/markers.js | 28 +- .../mastodon/reducers/media_attachments.js | 12 +- app/javascript/mastodon/reducers/meta.js | 22 +- app/javascript/mastodon/reducers/modal.ts | 56 +- app/javascript/mastodon/reducers/mutes.js | 26 +- .../mastodon/reducers/notifications.js | 230 +-- .../mastodon/reducers/picture_in_picture.js | 20 +- app/javascript/mastodon/reducers/polls.js | 30 +- .../mastodon/reducers/push_notifications.js | 64 +- .../mastodon/reducers/relationships.js | 78 +- app/javascript/mastodon/reducers/search.js | 102 +- app/javascript/mastodon/reducers/server.js | 32 +- app/javascript/mastodon/reducers/settings.js | 134 +- .../mastodon/reducers/status_lists.js | 134 +- app/javascript/mastodon/reducers/statuses.js | 144 +- .../mastodon/reducers/suggestions.js | 44 +- app/javascript/mastodon/reducers/tags.js | 24 +- app/javascript/mastodon/reducers/timelines.js | 150 +- app/javascript/mastodon/reducers/trends.js | 44 +- .../mastodon/reducers/user_lists.js | 208 +-- app/javascript/mastodon/scroll.ts | 21 +- app/javascript/mastodon/selectors/index.js | 84 +- .../mastodon/service_worker/entry.js | 38 +- .../service_worker/web_push_locales.js | 43 +- .../service_worker/web_push_notifications.js | 72 +- app/javascript/mastodon/settings.js | 11 +- app/javascript/mastodon/store/index.ts | 6 +- .../mastodon/store/middlewares/errors.ts | 28 +- .../mastodon/store/middlewares/loading_bar.ts | 48 +- .../mastodon/store/middlewares/sounds.ts | 34 +- app/javascript/mastodon/store/store.ts | 12 +- .../mastodon/store/typed_functions.ts | 14 +- app/javascript/mastodon/stream.js | 54 +- app/javascript/mastodon/test_setup.js | 2 +- .../mastodon/utils/__tests__/base64-test.js | 10 +- .../mastodon/utils/__tests__/html-test.js | 12 +- app/javascript/mastodon/utils/config.js | 8 +- app/javascript/mastodon/utils/filters.ts | 16 +- app/javascript/mastodon/utils/hashtags.ts | 10 +- app/javascript/mastodon/utils/html.js | 4 +- app/javascript/mastodon/utils/log_out.js | 30 +- .../mastodon/utils/notifications.js | 2 +- app/javascript/mastodon/utils/numbers.ts | 2 +- app/javascript/mastodon/utils/scrollbar.js | 10 +- app/javascript/mastodon/uuid.ts | 7 +- app/javascript/packs/admin.jsx | 16 +- app/javascript/packs/application.js | 8 +- app/javascript/packs/common.js | 4 +- app/javascript/packs/error.js | 14 +- app/javascript/packs/public-path.js | 8 +- app/javascript/packs/public.jsx | 146 +- app/javascript/packs/share.jsx | 20 +- app/javascript/packs/sign_up.js | 14 +- app/javascript/types/image.d.ts | 13 +- app/javascript/types/resources.ts | 72 +- babel.config.js | 84 +- config/formatjs-formatter.js | 2 +- config/webpack/configuration.js | 30 +- config/webpack/development.js | 16 +- config/webpack/production.js | 48 +- config/webpack/rules/babel.js | 14 +- config/webpack/rules/css.js | 12 +- config/webpack/rules/file.js | 12 +- config/webpack/rules/index.js | 12 +- config/webpack/rules/mark.js | 4 +- config/webpack/rules/material_icons.js | 2 +- config/webpack/rules/node_modules.js | 12 +- config/webpack/rules/tesseract.js | 4 +- config/webpack/shared.js | 71 +- config/webpack/tests.js | 6 +- eslint.config.js | 173 +++ jest.config.js | 30 +- package.json | 23 +- postcss.config.js | 4 +- public/embed.js | 24 +- stylelint.config.js | 54 +- yarn.lock | 1302 +++++++++-------- 975 files changed, 22196 insertions(+), 21964 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index d4930e1f5..000000000 --- a/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -/build/** -/coverage/** -/db/** -/lib/** -/log/** -/node_modules/** -/nonobox/** -/public/** -!/public/embed.js -/spec/** -/tmp/** -/vendor/** -!.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 7720e6736..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,403 +0,0 @@ -module.exports = { - root: true, - - extends: [ - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended', - 'plugin:import/recommended', - 'plugin:promise/recommended', - 'plugin:jsdoc/recommended', - ], - - env: { - browser: true, - node: true, - es6: true, - }, - - globals: { - ATTACHMENT_HOST: false, - }, - - parser: '@typescript-eslint/parser', - - plugins: [ - 'react', - 'jsx-a11y', - 'import', - 'promise', - '@typescript-eslint', - 'formatjs', - ], - - parserOptions: { - sourceType: 'module', - ecmaFeatures: { - jsx: true, - }, - ecmaVersion: 2021, - requireConfigFile: false, - babelOptions: { - configFile: false, - presets: ['@babel/react', '@babel/env'], - }, - }, - - settings: { - react: { - version: 'detect', - }, - 'import/ignore': [ - 'node_modules', - '\\.(css|scss|json)$', - ], - 'import/resolver': { - typescript: {}, - }, - }, - - rules: { - 'consistent-return': 'error', - 'dot-notation': 'error', - eqeqeq: ['error', 'always', { 'null': 'ignore' }], - 'indent': ['error', 2], - 'jsx-quotes': ['error', 'prefer-single'], - 'semi': ['error', 'always'], - 'no-case-declarations': 'off', - 'no-catch-shadow': 'error', - 'no-console': [ - 'warn', - { - allow: [ - 'error', - 'warn', - ], - }, - ], - 'no-empty': 'off', - 'no-restricted-properties': [ - 'error', - { property: 'substring', message: 'Use .slice instead of .substring.' }, - { property: 'substr', message: 'Use .slice instead of .substr.' }, - ], - 'no-restricted-syntax': [ - 'error', - { - // eslint-disable-next-line no-restricted-syntax - selector: 'Literal[value=/•/], JSXText[value=/•/]', - // eslint-disable-next-line no-restricted-syntax - message: "Use '·' (middle dot) instead of '•' (bullet)", - }, - ], - 'no-self-assign': 'off', - 'no-unused-expressions': 'error', - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - vars: 'all', - args: 'after-used', - destructuredArrayIgnorePattern: '^_', - ignoreRestSiblings: true, - }, - ], - 'valid-typeof': 'error', - - 'react/jsx-filename-extension': ['error', { extensions: ['.jsx', 'tsx'] }], - 'react/jsx-boolean-value': 'error', - 'react/display-name': 'off', - 'react/jsx-fragments': ['error', 'syntax'], - 'react/jsx-equals-spacing': 'error', - 'react/jsx-no-bind': 'error', - 'react/jsx-no-useless-fragment': 'error', - 'react/jsx-no-target-blank': 'off', - 'react/jsx-tag-spacing': 'error', - 'react/jsx-uses-react': 'off', // not needed with new JSX transform - 'react/jsx-wrap-multilines': 'error', - 'react/no-deprecated': 'off', - 'react/no-unknown-property': 'off', - 'react/react-in-jsx-scope': 'off', // not needed with new JSX transform - 'react/self-closing-comp': 'error', - - // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/src/index.js - 'jsx-a11y/accessible-emoji': 'warn', - 'jsx-a11y/click-events-have-key-events': 'off', - 'jsx-a11y/label-has-associated-control': 'off', - 'jsx-a11y/media-has-caption': 'off', - 'jsx-a11y/no-autofocus': 'off', - // recommended rule is: - // 'jsx-a11y/no-interactive-element-to-noninteractive-role': [ - // 'error', - // { - // tr: ['none', 'presentation'], - // canvas: ['img'], - // }, - // ], - 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'off', - // recommended rule is: - // 'jsx-a11y/no-noninteractive-element-interactions': [ - // 'error', - // { - // body: ['onError', 'onLoad'], - // iframe: ['onError', 'onLoad'], - // img: ['onError', 'onLoad'], - // }, - // ], - 'jsx-a11y/no-noninteractive-element-interactions': [ - 'warn', - { - handlers: [ - 'onClick', - ], - }, - ], - // recommended rule is: - // 'jsx-a11y/no-noninteractive-tabindex': [ - // 'error', - // { - // tags: [], - // roles: ['tabpanel'], - // allowExpressionValues: true, - // }, - // ], - 'jsx-a11y/no-noninteractive-tabindex': 'off', - 'jsx-a11y/no-onchange': 'warn', - // recommended is full 'error' - 'jsx-a11y/no-static-element-interactions': [ - 'warn', - { - handlers: [ - 'onClick', - ], - }, - ], - - // See https://github.com/import-js/eslint-plugin-import/blob/main/config/recommended.js - 'import/extensions': [ - 'error', - 'always', - { - js: 'never', - jsx: 'never', - mjs: 'never', - mts: 'never', - ts: 'never', - tsx: 'never', - }, - ], - 'import/first': 'error', - 'import/newline-after-import': 'error', - 'import/no-anonymous-default-export': 'error', - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: [ - 'config/webpack/**', - 'app/javascript/mastodon/performance.js', - 'app/javascript/mastodon/test_setup.js', - 'app/javascript/**/__tests__/**', - ], - }, - ], - 'import/no-amd': 'error', - 'import/no-commonjs': 'error', - 'import/no-import-module-exports': 'error', - 'import/no-relative-packages': 'error', - 'import/no-self-import': 'error', - 'import/no-useless-path-segments': 'error', - 'import/no-webpack-loader-syntax': 'error', - - 'import/order': [ - 'error', - { - alphabetize: { order: 'asc' }, - 'newlines-between': 'always', - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - ['index', 'sibling'], - 'object', - ], - pathGroups: [ - // React core packages - { - pattern: '{react,react-dom,react-dom/client,prop-types}', - group: 'builtin', - position: 'after', - }, - // I18n - { - pattern: '{react-intl,intl-messageformat}', - group: 'builtin', - position: 'after', - }, - // Common React utilities - { - pattern: '{classnames,react-helmet,react-router-dom}', - group: 'external', - position: 'before', - }, - // Immutable / Redux / data store - { - pattern: '{immutable,react-redux,react-immutable-proptypes,react-immutable-pure-component,reselect}', - group: 'external', - position: 'before', - }, - // Internal packages - { - pattern: '{mastodon/**}', - group: 'internal', - position: 'after', - }, - { - pattern: '{flavours/glitch-soc/**}', - group: 'internal', - position: 'after', - }, - ], - pathGroupsExcludedImportTypes: [], - }, - ], - - // Forbid imports from vanilla in glitch flavour - 'import/no-restricted-paths': [ - 'error', - { - zones: [{ - target: 'app/javascript/flavours/glitch/', - from: 'app/javascript/mastodon/', - message: 'Import from /flavours/glitch/ instead' - }] - } - ], - - 'promise/always-return': 'off', - 'promise/catch-or-return': [ - 'error', - { - allowFinally: true, - }, - ], - 'promise/no-callback-in-promise': 'off', - 'promise/no-nesting': 'off', - 'promise/no-promise-in-callback': 'off', - - 'formatjs/blocklist-elements': 'error', - 'formatjs/enforce-default-message': ['error', 'literal'], - 'formatjs/enforce-description': 'off', // description values not currently used - 'formatjs/enforce-id': 'off', // Explicit IDs are used in the project - 'formatjs/enforce-placeholders': 'off', // Issues in short_number.jsx - 'formatjs/enforce-plural-rules': 'error', - 'formatjs/no-camel-case': 'off', // disabledAccount is only non-conforming - 'formatjs/no-complex-selectors': 'error', - 'formatjs/no-emoji': 'error', - 'formatjs/no-id': 'off', // IDs are used for translation keys - 'formatjs/no-invalid-icu': 'error', - 'formatjs/no-literal-string-in-jsx': 'off', // Should be looked at, but mainly flagging punctuation outside of strings - 'formatjs/no-multiple-plurals': 'off', // Only used by hashtag.jsx - 'formatjs/no-multiple-whitespaces': 'error', - 'formatjs/no-offset': 'error', - 'formatjs/no-useless-message': 'error', - 'formatjs/prefer-formatted-message': 'error', - 'formatjs/prefer-pound-in-plural': 'error', - - 'jsdoc/check-types': 'off', - 'jsdoc/no-undefined-types': 'off', - 'jsdoc/require-jsdoc': 'off', - 'jsdoc/require-param-description': 'off', - 'jsdoc/require-property-description': 'off', - 'jsdoc/require-returns-description': 'off', - 'jsdoc/require-returns': 'off', - }, - - overrides: [ - { - files: [ - '*.config.js', - '.*rc.js', - 'ide-helper.js', - 'config/webpack/**/*', - 'config/formatjs-formatter.js', - ], - - env: { - commonjs: true, - }, - - parserOptions: { - sourceType: 'script', - }, - - rules: { - 'import/no-commonjs': 'off', - }, - }, - { - files: [ - '**/*.ts', - '**/*.tsx', - ], - - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/strict-type-checked', - 'plugin:@typescript-eslint/stylistic-type-checked', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended', - 'plugin:import/recommended', - 'plugin:import/typescript', - 'plugin:promise/recommended', - 'plugin:jsdoc/recommended-typescript', - 'plugin:prettier/recommended', - ], - - parserOptions: { - project: true, - tsconfigRootDir: __dirname, - }, - - rules: { - 'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], - - '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'], - '@typescript-eslint/consistent-type-exports': 'error', - '@typescript-eslint/consistent-type-imports': 'error', - "@typescript-eslint/prefer-nullish-coalescing": ['error', {ignorePrimitives: {boolean: true}}], - - 'jsdoc/require-jsdoc': 'off', - - // Those rules set stricter rules for TS files - // to enforce better practices when converting from JS - 'import/no-default-export': 'warn', - 'react/prefer-stateless-function': 'warn', - 'react/function-component-definition': ['error', { namedComponents: 'arrow-function' }], - 'react/jsx-uses-react': 'off', // not needed with new JSX transform - 'react/react-in-jsx-scope': 'off', // not needed with new JSX transform - 'react/prop-types': 'off', - }, - }, - { - files: [ - '**/__tests__/*.js', - '**/__tests__/*.jsx', - ], - - env: { - jest: true, - }, - }, - { - files: [ - 'streaming/**/*', - ], - rules: { - 'import/no-commonjs': 'off', - }, - }, - ], -}; diff --git a/.prettierrc.js b/.prettierrc.js index af39b253f..94eaee9ae 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,4 @@ module.exports = { singleQuote: true, - jsxSingleQuote: true -} + jsxSingleQuote: true, +}; diff --git a/Dockerfile b/Dockerfile index 9f4423223..8b882311f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,10 +4,10 @@ FROM docker.io/superseriousbusiness/masto-fe-standalone-woodpecker-build:0.1.0 A # Prepare the build directory, copy # relevant source + config files over. WORKDIR /build -COPY app /build/app -COPY config /build/config -COPY public /build/public -COPY \ +COPY --chown=node:node app /build/app +COPY --chown=node:node config /build/config +COPY --chown=node:node public /build/public +COPY --chown=node:node \ .browserslistrc \ babel.config.js \ jsconfig.json \ @@ -20,7 +20,7 @@ COPY \ RUN yarn && yarn build:production ### RUNTIME IMAGE ### -FROM nginx:1.28.0-alpine AS runtime +FROM nginx:alpine AS runtime # Copy bigger nested stuff. COPY --from=builder /build/public/packs/js/flavours/glitch /usr/share/nginx/html/packs/js/flavours/glitch diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js index d256d7ec9..d0ce43b8b 100644 --- a/app/javascript/core/admin.js +++ b/app/javascript/core/admin.js @@ -1,49 +1,49 @@ // This file will be loaded on admin pages, regardless of theme. -import 'packs/public-path'; -import Rails from '@rails/ujs'; +import "packs/public-path"; +import Rails from "@rails/ujs"; -import ready from '../mastodon/ready'; +import ready from "../mastodon/ready"; const setAnnouncementEndsAttributes = (target) => { const valid = target?.value && target?.validity?.valid; - const element = document.querySelector('input[type="datetime-local"]#announcement_ends_at'); + const element = document.querySelector("input[type=\"datetime-local\"]#announcement_ends_at"); if (valid) { - element.classList.remove('optional'); + element.classList.remove("optional"); element.required = true; element.min = target.value; } else { - element.classList.add('optional'); - element.removeAttribute('required'); - element.removeAttribute('min'); + element.classList.add("optional"); + element.removeAttribute("required"); + element.removeAttribute("min"); } }; -Rails.delegate(document, 'input[type="datetime-local"]#announcement_starts_at', 'change', ({ target }) => { +Rails.delegate(document, "input[type=\"datetime-local\"]#announcement_starts_at", "change", ({ target }) => { setAnnouncementEndsAttributes(target); }); -const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]'; +const batchCheckboxClassName = ".batch-checkbox input[type=\"checkbox\"]"; const showSelectAll = () => { - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); - selectAllMatchingElement.classList.add('active'); + const selectAllMatchingElement = document.querySelector(".batch-table__select-all"); + selectAllMatchingElement.classList.add("active"); }; const hideSelectAll = () => { - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); - const hiddenField = document.querySelector('#select_all_matching'); - const selectedMsg = document.querySelector('.batch-table__select-all .selected'); - const notSelectedMsg = document.querySelector('.batch-table__select-all .not-selected'); + const selectAllMatchingElement = document.querySelector(".batch-table__select-all"); + const hiddenField = document.querySelector("#select_all_matching"); + const selectedMsg = document.querySelector(".batch-table__select-all .selected"); + const notSelectedMsg = document.querySelector(".batch-table__select-all .not-selected"); - selectAllMatchingElement.classList.remove('active'); - selectedMsg.classList.remove('active'); - notSelectedMsg.classList.add('active'); - hiddenField.value = '0'; + selectAllMatchingElement.classList.remove("active"); + selectedMsg.classList.remove("active"); + notSelectedMsg.classList.add("active"); + hiddenField.value = "0"; }; -Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); +Rails.delegate(document, "#batch_checkbox_all", "change", ({ target }) => { + const selectAllMatchingElement = document.querySelector(".batch-table__select-all"); [].forEach.call(document.querySelectorAll(batchCheckboxClassName), (content) => { content.checked = target.checked; @@ -58,26 +58,26 @@ Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { } }); -Rails.delegate(document, '.batch-table__select-all button', 'click', () => { - const hiddenField = document.querySelector('#select_all_matching'); - const active = hiddenField.value === '1'; - const selectedMsg = document.querySelector('.batch-table__select-all .selected'); - const notSelectedMsg = document.querySelector('.batch-table__select-all .not-selected'); +Rails.delegate(document, ".batch-table__select-all button", "click", () => { + const hiddenField = document.querySelector("#select_all_matching"); + const active = hiddenField.value === "1"; + const selectedMsg = document.querySelector(".batch-table__select-all .selected"); + const notSelectedMsg = document.querySelector(".batch-table__select-all .not-selected"); if (active) { - hiddenField.value = '0'; - selectedMsg.classList.remove('active'); - notSelectedMsg.classList.add('active'); + hiddenField.value = "0"; + selectedMsg.classList.remove("active"); + notSelectedMsg.classList.add("active"); } else { - hiddenField.value = '1'; - notSelectedMsg.classList.remove('active'); - selectedMsg.classList.add('active'); + hiddenField.value = "1"; + notSelectedMsg.classList.remove("active"); + selectedMsg.classList.add("active"); } }); -Rails.delegate(document, batchCheckboxClassName, 'change', () => { - const checkAllElement = document.querySelector('#batch_checkbox_all'); - const selectAllMatchingElement = document.querySelector('.batch-table__select-all'); +Rails.delegate(document, batchCheckboxClassName, "change", () => { + const checkAllElement = document.querySelector("#batch_checkbox_all"); + const selectAllMatchingElement = document.querySelector(".batch-table__select-all"); if (checkAllElement) { checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); @@ -93,78 +93,78 @@ Rails.delegate(document, batchCheckboxClassName, 'change', () => { } }); -Rails.delegate(document, '.media-spoiler-show-button', 'click', () => { - [].forEach.call(document.querySelectorAll('button.media-spoiler'), (element) => { +Rails.delegate(document, ".media-spoiler-show-button", "click", () => { + [].forEach.call(document.querySelectorAll("button.media-spoiler"), (element) => { element.click(); }); }); -Rails.delegate(document, '.media-spoiler-hide-button', 'click', () => { - [].forEach.call(document.querySelectorAll('.spoiler-button.spoiler-button--visible button'), (element) => { +Rails.delegate(document, ".media-spoiler-hide-button", "click", () => { + [].forEach.call(document.querySelectorAll(".spoiler-button.spoiler-button--visible button"), (element) => { element.click(); }); }); -Rails.delegate(document, '.filter-subset--with-select select', 'change', ({ target }) => { +Rails.delegate(document, ".filter-subset--with-select select", "change", ({ target }) => { target.form.submit(); }); const onDomainBlockSeverityChange = (target) => { - const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media'); - const rejectReportsDiv = document.querySelector('.input.with_label.domain_block_reject_reports'); + const rejectMediaDiv = document.querySelector(".input.with_label.domain_block_reject_media"); + const rejectReportsDiv = document.querySelector(".input.with_label.domain_block_reject_reports"); if (rejectMediaDiv) { - rejectMediaDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; + rejectMediaDiv.style.display = (target.value === "suspend") ? "none" : "block"; } if (rejectReportsDiv) { - rejectReportsDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; + rejectReportsDiv.style.display = (target.value === "suspend") ? "none" : "block"; } }; -Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target)); +Rails.delegate(document, "#domain_block_severity", "change", ({ target }) => onDomainBlockSeverityChange(target)); const onEnableBootstrapTimelineAccountsChange = (target) => { - const bootstrapTimelineAccountsField = document.querySelector('#form_admin_settings_bootstrap_timeline_accounts'); + const bootstrapTimelineAccountsField = document.querySelector("#form_admin_settings_bootstrap_timeline_accounts"); if (bootstrapTimelineAccountsField) { bootstrapTimelineAccountsField.disabled = !target.checked; if (target.checked) { - bootstrapTimelineAccountsField.parentElement.classList.remove('disabled'); - bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove('disabled'); + bootstrapTimelineAccountsField.parentElement.classList.remove("disabled"); + bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove("disabled"); } else { - bootstrapTimelineAccountsField.parentElement.classList.add('disabled'); - bootstrapTimelineAccountsField.parentElement.parentElement.classList.add('disabled'); + bootstrapTimelineAccountsField.parentElement.classList.add("disabled"); + bootstrapTimelineAccountsField.parentElement.parentElement.classList.add("disabled"); } } }; -Rails.delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target)); +Rails.delegate(document, "#form_admin_settings_enable_bootstrap_timeline_accounts", "change", ({ target }) => onEnableBootstrapTimelineAccountsChange(target)); const onChangeRegistrationMode = (target) => { - const enabled = target.value === 'approved'; + const enabled = target.value === "approved"; - [].forEach.call(document.querySelectorAll('#form_admin_settings_require_invite_text'), (input) => { + [].forEach.call(document.querySelectorAll("#form_admin_settings_require_invite_text"), (input) => { input.disabled = !enabled; if (enabled) { let element = input; do { - element.classList.remove('disabled'); + element.classList.remove("disabled"); element = element.parentElement; - } while (element && !element.classList.contains('fields-group')); + } while (element && !element.classList.contains("fields-group")); } else { let element = input; do { - element.classList.add('disabled'); + element.classList.add("disabled"); element = element.parentElement; - } while (element && !element.classList.contains('fields-group')); + } while (element && !element.classList.contains("fields-group")); } }); }; const convertUTCDateTimeToLocal = (value) => { - const date = new Date(value + 'Z'); - const twoChars = (x) => (x.toString().padStart(2, '0')); + const date = new Date(value + "Z"); + const twoChars = (x) => (x.toString().padStart(2, "0")); return `${date.getFullYear()}-${twoChars(date.getMonth()+1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`; }; @@ -173,38 +173,44 @@ const convertLocalDatetimeToUTC = (value) => { const match = re.exec(value); const date = new Date(match[1], match[2] - 1, match[3], match[4], match[5]); const fullISO8601 = date.toISOString(); - return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6); + return fullISO8601.slice(0, fullISO8601.indexOf("T") + 6); }; -Rails.delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target)); +Rails.delegate(document, "#form_admin_settings_registrations_mode", "change", ({ target }) => onChangeRegistrationMode(target)); ready(() => { - const domainBlockSeverityInput = document.getElementById('domain_block_severity'); - if (domainBlockSeverityInput) onDomainBlockSeverityChange(domainBlockSeverityInput); + const domainBlockSeverityInput = document.getElementById("domain_block_severity"); + if (domainBlockSeverityInput) { + onDomainBlockSeverityChange(domainBlockSeverityInput); + } - const enableBootstrapTimelineAccounts = document.getElementById('form_admin_settings_enable_bootstrap_timeline_accounts'); - if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts); + const enableBootstrapTimelineAccounts = document.getElementById("form_admin_settings_enable_bootstrap_timeline_accounts"); + if (enableBootstrapTimelineAccounts) { + onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts); + } - const registrationMode = document.getElementById('form_admin_settings_registrations_mode'); - if (registrationMode) onChangeRegistrationMode(registrationMode); + const registrationMode = document.getElementById("form_admin_settings_registrations_mode"); + if (registrationMode) { + onChangeRegistrationMode(registrationMode); + } - const checkAllElement = document.querySelector('#batch_checkbox_all'); + const checkAllElement = document.querySelector("#batch_checkbox_all"); if (checkAllElement) { checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); } - document.querySelector('a#add-instance-button')?.addEventListener('click', (e) => { - const domain = document.querySelector('input[type="text"]#by_domain')?.value; + document.querySelector("a#add-instance-button")?.addEventListener("click", (e) => { + const domain = document.querySelector("input[type=\"text\"]#by_domain")?.value; if (domain) { const url = new URL(event.target.href); - url.searchParams.set('_domain', domain); + url.searchParams.set("_domain", domain); e.target.href = url; } }); - [].forEach.call(document.querySelectorAll('input[type="datetime-local"]'), element => { + [].forEach.call(document.querySelectorAll("input[type=\"datetime-local\"]"), element => { if (element.value) { element.value = convertUTCDateTimeToLocal(element.value); } @@ -213,15 +219,15 @@ ready(() => { } }); - Rails.delegate(document, 'form', 'submit', ({ target }) => { - [].forEach.call(target.querySelectorAll('input[type="datetime-local"]'), element => { + Rails.delegate(document, "form", "submit", ({ target }) => { + [].forEach.call(target.querySelectorAll("input[type=\"datetime-local\"]"), element => { if (element.value && element.validity.valid) { element.value = convertLocalDatetimeToUTC(element.value); } }); }); - const announcementStartsAt = document.querySelector('input[type="datetime-local"]#announcement_starts_at'); + const announcementStartsAt = document.querySelector("input[type=\"datetime-local\"]#announcement_starts_at"); if (announcementStartsAt) { setAnnouncementEndsAttributes(announcementStartsAt); } diff --git a/app/javascript/core/auth.js b/app/javascript/core/auth.js index d1d14d99e..b971fbf7d 100644 --- a/app/javascript/core/auth.js +++ b/app/javascript/core/auth.js @@ -1,3 +1,3 @@ -import 'packs/public-path'; -import './settings'; -import './two_factor_authentication'; +import "packs/public-path"; +import "./settings"; +import "./two_factor_authentication"; diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js index 1cee2f603..2a6f1a530 100644 --- a/app/javascript/core/common.js +++ b/app/javascript/core/common.js @@ -1,6 +1,6 @@ // This file will be loaded on all pages, regardless of theme. -import 'packs/public-path'; -import 'font-awesome/css/font-awesome.css'; +import "packs/public-path"; +import "font-awesome/css/font-awesome.css"; -require.context('../images/', true); +require.context("../images/", true); diff --git a/app/javascript/core/embed.js b/app/javascript/core/embed.js index d1e8f6b10..eb02a9997 100644 --- a/app/javascript/core/embed.js +++ b/app/javascript/core/embed.js @@ -1,25 +1,25 @@ // This file will be loaded on embed pages, regardless of theme. -import 'packs/public-path'; +import "packs/public-path"; -window.addEventListener('message', e => { +window.addEventListener("message", e => { const data = e.data || {}; - if (!window.parent || data.type !== 'setHeight') { + if (!window.parent || data.type !== "setHeight") { return; } function setEmbedHeight () { window.parent.postMessage({ - type: 'setHeight', + type: "setHeight", id: data.id, - height: document.getElementsByTagName('html')[0].scrollHeight, - }, '*'); + height: document.getElementsByTagName("html")[0].scrollHeight, + }, "*"); } - if (['interactive', 'complete'].includes(document.readyState)) { + if (["interactive", "complete"].includes(document.readyState)) { setEmbedHeight(); } else { - document.addEventListener('DOMContentLoaded', setEmbedHeight); + document.addEventListener("DOMContentLoaded", setEmbedHeight); } }); diff --git a/app/javascript/core/mailer.js b/app/javascript/core/mailer.js index a2ad5e73a..016bbb8d8 100644 --- a/app/javascript/core/mailer.js +++ b/app/javascript/core/mailer.js @@ -1,3 +1,3 @@ -import '../styles/mailer.scss'; +import "../styles/mailer.scss"; -require.context('../icons'); +require.context("../icons"); diff --git a/app/javascript/core/remote_interaction_helper.ts b/app/javascript/core/remote_interaction_helper.ts index 4da4d49f6..6fa8dee75 100644 --- a/app/javascript/core/remote_interaction_helper.ts +++ b/app/javascript/core/remote_interaction_helper.ts @@ -8,29 +8,29 @@ and performs no other task. */ -import 'packs/public-path'; +import "packs/public-path"; -import axios from 'axios'; +import axios from "axios"; interface JRDLink { - rel: string; - template?: string; - href?: string; + rel: string, + template?: string, + href?: string, } const isJRDLink = (link: unknown): link is JRDLink => - typeof link === 'object' && + typeof link === "object" && link !== null && - 'rel' in link && - typeof link.rel === 'string' && - (!('template' in link) || typeof link.template === 'string') && - (!('href' in link) || typeof link.href === 'string'); + "rel" in link && + typeof link.rel === "string" && + (!("template" in link) || typeof link.template === "string") && + (!("href" in link) || typeof link.href === "string"); const findLink = (rel: string, data: unknown): JRDLink | undefined => { if ( - typeof data === 'object' && + typeof data === "object" && data !== null && - 'links' in data && + "links" in data && data.links instanceof Array ) { return data.links.find( @@ -42,7 +42,7 @@ const findLink = (rel: string, data: unknown): JRDLink | undefined => { }; const findTemplateLink = (data: unknown) => - findLink('http://ostatus.org/schema/1.0/subscribe', data)?.template; + findLink("http://ostatus.org/schema/1.0/subscribe", data)?.template; const fetchInteractionURLSuccess = ( uri_or_domain: string, @@ -50,7 +50,7 @@ const fetchInteractionURLSuccess = ( ) => { window.parent.postMessage( { - type: 'fetchInteractionURL-success', + type: "fetchInteractionURL-success", uri_or_domain, template, }, @@ -61,14 +61,14 @@ const fetchInteractionURLSuccess = ( const fetchInteractionURLFailure = () => { window.parent.postMessage( { - type: 'fetchInteractionURL-failure', + type: "fetchInteractionURL-failure", }, window.origin, ); }; const isValidDomain = (value: string) => { - const url = new URL('https:///path'); + const url = new URL("https:///path"); url.hostname = value; return url.hostname === value; }; @@ -112,9 +112,9 @@ const fromURL = (url: string) => { // Attempt to find a remote interaction URL from a `user@domain` string const fromAcct = (acct: string) => { - acct = acct.replace(/^@/, ''); + acct = acct.replace(/^@/, ""); - const segments = acct.split('@'); + const segments = acct.split("@"); if (segments.length !== 2 || !segments[0] || !isValidDomain(segments[1])) { fetchInteractionURLFailure(); @@ -140,18 +140,18 @@ const fromAcct = (acct: string) => { }; const fetchInteractionURL = (uri_or_domain: string) => { - if (uri_or_domain === '') { + if (uri_or_domain === "") { fetchInteractionURLFailure(); } else if (/^https?:\/\//.test(uri_or_domain)) { fromURL(uri_or_domain); - } else if (uri_or_domain.includes('@')) { + } else if (uri_or_domain.includes("@")) { fromAcct(uri_or_domain); } else { fromDomain(uri_or_domain); } }; -window.addEventListener('message', (event: MessageEvent) => { +window.addEventListener("message", (event: MessageEvent) => { // Check message origin if ( !window.origin || @@ -163,11 +163,11 @@ window.addEventListener('message', (event: MessageEvent) => { if ( event.data && - typeof event.data === 'object' && - 'type' in event.data && - event.data.type === 'fetchInteractionURL' && - 'uri_or_domain' in event.data && - typeof event.data.uri_or_domain === 'string' + typeof event.data === "object" && + "type" in event.data && + event.data.type === "fetchInteractionURL" && + "uri_or_domain" in event.data && + typeof event.data.uri_or_domain === "string" ) { fetchInteractionURL(event.data.uri_or_domain); } diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 23367d2d3..6b4ed345a 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -1,24 +1,24 @@ // This file will be loaded on settings pages, regardless of theme. -import 'packs/public-path'; -import Rails from '@rails/ujs'; +import "packs/public-path"; +import Rails from "@rails/ujs"; -Rails.delegate(document, '#edit_profile input[type=file]', 'change', ({ target }) => { - const avatar = document.getElementById(target.id + '-preview'); +Rails.delegate(document, "#edit_profile input[type=file]", "change", ({ target }) => { + const avatar = document.getElementById(target.id + "-preview"); const [file] = target.files || []; const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; avatar.src = url; }); -Rails.delegate(document, '.input-copy input', 'click', ({ target }) => { +Rails.delegate(document, ".input-copy input", "click", ({ target }) => { target.focus(); target.select(); target.setSelectionRange(0, target.value.length); }); -Rails.delegate(document, '.input-copy button', 'click', ({ target }) => { - const input = target.parentNode.querySelector('.input-copy__wrapper input'); +Rails.delegate(document, ".input-copy button", "click", ({ target }) => { + const input = target.parentNode.querySelector(".input-copy__wrapper input"); const oldReadOnly = input.readonly; @@ -28,12 +28,12 @@ Rails.delegate(document, '.input-copy button', 'click', ({ target }) => { input.setSelectionRange(0, input.value.length); try { - if (document.execCommand('copy')) { + if (document.execCommand("copy")) { input.blur(); - target.parentNode.classList.add('copied'); + target.parentNode.classList.add("copied"); setTimeout(() => { - target.parentNode.classList.remove('copied'); + target.parentNode.classList.remove("copied"); }, 700); } } catch (err) { diff --git a/app/javascript/core/two_factor_authentication.js b/app/javascript/core/two_factor_authentication.js index e76700a48..f2cea9efa 100644 --- a/app/javascript/core/two_factor_authentication.js +++ b/app/javascript/core/two_factor_authentication.js @@ -1,40 +1,40 @@ -import 'packs/public-path'; +import "packs/public-path"; -import * as WebAuthnJSON from '@github/webauthn-json'; -import axios from 'axios'; +import * as WebAuthnJSON from "@github/webauthn-json"; +import axios from "axios"; -import ready from '../mastodon/ready'; -import 'regenerator-runtime/runtime'; +import ready from "../mastodon/ready"; +import "regenerator-runtime/runtime"; function getCSRFToken() { - var CSRFSelector = document.querySelector('meta[name="csrf-token"]'); + var CSRFSelector = document.querySelector("meta[name=\"csrf-token\"]"); if (CSRFSelector) { - return CSRFSelector.getAttribute('content'); + return CSRFSelector.getAttribute("content"); } else { return null; } } function hideFlashMessages() { - Array.from(document.getElementsByClassName('flash-message')).forEach(function(flashMessage) { - flashMessage.classList.add('hidden'); + Array.from(document.getElementsByClassName("flash-message")).forEach(function(flashMessage) { + flashMessage.classList.add("hidden"); }); } function callback(url, body) { axios.post(url, JSON.stringify(body), { headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'X-CSRF-Token': getCSRFToken(), + "Content-Type": "application/json", + "Accept": "application/json", + "X-CSRF-Token": getCSRFToken(), }, - credentials: 'same-origin', + credentials: "same-origin", }).then(function(response) { window.location.replace(response.data.redirect_path); }).catch(function(error) { if (error.response.status === 422) { - const errorMessage = document.getElementById('security-key-error-message'); - errorMessage.classList.remove('hidden'); + const errorMessage = document.getElementById("security-key-error-message"); + errorMessage.classList.remove("hidden"); console.error(error.response.data.error); } else { console.error(error); @@ -44,31 +44,31 @@ function callback(url, body) { ready(() => { if (!WebAuthnJSON.supported()) { - const unsupported_browser_message = document.getElementById('unsupported-browser-message'); + const unsupported_browser_message = document.getElementById("unsupported-browser-message"); if (unsupported_browser_message) { - unsupported_browser_message.classList.remove('hidden'); - document.querySelector('.btn.js-webauthn').disabled = true; + unsupported_browser_message.classList.remove("hidden"); + document.querySelector(".btn.js-webauthn").disabled = true; } } - const webAuthnCredentialRegistrationForm = document.getElementById('new_webauthn_credential'); + const webAuthnCredentialRegistrationForm = document.getElementById("new_webauthn_credential"); if (webAuthnCredentialRegistrationForm) { - webAuthnCredentialRegistrationForm.addEventListener('submit', (event) => { + webAuthnCredentialRegistrationForm.addEventListener("submit", (event) => { event.preventDefault(); - var nickname = event.target.querySelector('input[name="new_webauthn_credential[nickname]"]'); + var nickname = event.target.querySelector("input[name=\"new_webauthn_credential[nickname]\"]"); if (nickname.value) { - axios.get('/settings/security_keys/options') + axios.get("/settings/security_keys/options") .then((response) => { const credentialOptions = response.data; - WebAuthnJSON.create({ 'publicKey': credentialOptions }).then((credential) => { - var params = { 'credential': credential, 'nickname': nickname.value }; - callback('/settings/security_keys', params); + WebAuthnJSON.create({ "publicKey": credentialOptions }).then((credential) => { + var params = { "credential": credential, "nickname": nickname.value }; + callback("/settings/security_keys", params); }).catch((error) => { - const errorMessage = document.getElementById('security-key-error-message'); - errorMessage.classList.remove('hidden'); + const errorMessage = document.getElementById("security-key-error-message"); + errorMessage.classList.remove("hidden"); console.error(error); }); }).catch((error) => { @@ -80,21 +80,21 @@ ready(() => { }); } - const webAuthnCredentialAuthenticationForm = document.getElementById('webauthn-form'); + const webAuthnCredentialAuthenticationForm = document.getElementById("webauthn-form"); if (webAuthnCredentialAuthenticationForm) { - webAuthnCredentialAuthenticationForm.addEventListener('submit', (event) => { + webAuthnCredentialAuthenticationForm.addEventListener("submit", (event) => { event.preventDefault(); - axios.get('sessions/security_key_options') + axios.get("sessions/security_key_options") .then((response) => { const credentialOptions = response.data; - WebAuthnJSON.get({ 'publicKey': credentialOptions }).then((credential) => { - var params = { 'user': { 'credential': credential } }; - callback('sign_in', params); + WebAuthnJSON.get({ "publicKey": credentialOptions }).then((credential) => { + var params = { "user": { "credential": credential } }; + callback("sign_in", params); }).catch((error) => { - const errorMessage = document.getElementById('security-key-error-message'); - errorMessage.classList.remove('hidden'); + const errorMessage = document.getElementById("security-key-error-message"); + errorMessage.classList.remove("hidden"); console.error(error); }); }).catch((error) => { @@ -102,19 +102,19 @@ ready(() => { }); }); - const otpAuthenticationForm = document.getElementById('otp-authentication-form'); + const otpAuthenticationForm = document.getElementById("otp-authentication-form"); - const linkToOtp = document.getElementById('link-to-otp'); - linkToOtp.addEventListener('click', () => { - webAuthnCredentialAuthenticationForm.classList.add('hidden'); - otpAuthenticationForm.classList.remove('hidden'); + const linkToOtp = document.getElementById("link-to-otp"); + linkToOtp.addEventListener("click", () => { + webAuthnCredentialAuthenticationForm.classList.add("hidden"); + otpAuthenticationForm.classList.remove("hidden"); hideFlashMessages(); }); - const linkToWebAuthn = document.getElementById('link-to-webauthn'); - linkToWebAuthn.addEventListener('click', () => { - otpAuthenticationForm.classList.add('hidden'); - webAuthnCredentialAuthenticationForm.classList.remove('hidden'); + const linkToWebAuthn = document.getElementById("link-to-webauthn"); + linkToWebAuthn.addEventListener("click", () => { + otpAuthenticationForm.classList.add("hidden"); + webAuthnCredentialAuthenticationForm.classList.remove("hidden"); hideFlashMessages(); }); } diff --git a/app/javascript/flavours/glitch/actions/account_notes.js b/app/javascript/flavours/glitch/actions/account_notes.js index 62a6b4cbb..166a6af4a 100644 --- a/app/javascript/flavours/glitch/actions/account_notes.js +++ b/app/javascript/flavours/glitch/actions/account_notes.js @@ -1,22 +1,22 @@ -import api from '../api'; +import api from "../api"; -export const ACCOUNT_NOTE_SUBMIT_REQUEST = 'ACCOUNT_NOTE_SUBMIT_REQUEST'; -export const ACCOUNT_NOTE_SUBMIT_SUCCESS = 'ACCOUNT_NOTE_SUBMIT_SUCCESS'; -export const ACCOUNT_NOTE_SUBMIT_FAIL = 'ACCOUNT_NOTE_SUBMIT_FAIL'; +export const ACCOUNT_NOTE_SUBMIT_REQUEST = "ACCOUNT_NOTE_SUBMIT_REQUEST"; +export const ACCOUNT_NOTE_SUBMIT_SUCCESS = "ACCOUNT_NOTE_SUBMIT_SUCCESS"; +export const ACCOUNT_NOTE_SUBMIT_FAIL = "ACCOUNT_NOTE_SUBMIT_FAIL"; -export const ACCOUNT_NOTE_INIT_EDIT = 'ACCOUNT_NOTE_INIT_EDIT'; -export const ACCOUNT_NOTE_CANCEL = 'ACCOUNT_NOTE_CANCEL'; +export const ACCOUNT_NOTE_INIT_EDIT = "ACCOUNT_NOTE_INIT_EDIT"; +export const ACCOUNT_NOTE_CANCEL = "ACCOUNT_NOTE_CANCEL"; -export const ACCOUNT_NOTE_CHANGE_COMMENT = 'ACCOUNT_NOTE_CHANGE_COMMENT'; +export const ACCOUNT_NOTE_CHANGE_COMMENT = "ACCOUNT_NOTE_CHANGE_COMMENT"; export function submitAccountNote() { return (dispatch, getState) => { dispatch(submitAccountNoteRequest()); - const id = getState().getIn(['account_notes', 'edit', 'account_id']); + const id = getState().getIn(["account_notes", "edit", "account_id"]); api(getState).post(`/api/v1/accounts/${id}/note`, { - comment: getState().getIn(['account_notes', 'edit', 'comment']), + comment: getState().getIn(["account_notes", "edit", "comment"]), }).then(response => { dispatch(submitAccountNoteSuccess(response.data)); }).catch(error => dispatch(submitAccountNoteFail(error))); @@ -45,7 +45,7 @@ export function submitAccountNoteFail(error) { export function initEditAccountNote(account) { return (dispatch, getState) => { - const comment = getState().getIn(['relationships', account.get('id'), 'note']); + const comment = getState().getIn(["relationships", account.get("id"), "note"]); dispatch({ type: ACCOUNT_NOTE_INIT_EDIT, diff --git a/app/javascript/flavours/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js index d4f18ff2d..eae45c1c7 100644 --- a/app/javascript/flavours/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -1,104 +1,104 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { importFetchedAccount, importFetchedAccounts } from './importer'; +import { importFetchedAccount, importFetchedAccounts } from "./importer"; -export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST'; -export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS'; -export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL'; +export const ACCOUNT_FETCH_REQUEST = "ACCOUNT_FETCH_REQUEST"; +export const ACCOUNT_FETCH_SUCCESS = "ACCOUNT_FETCH_SUCCESS"; +export const ACCOUNT_FETCH_FAIL = "ACCOUNT_FETCH_FAIL"; -export const ACCOUNT_LOOKUP_REQUEST = 'ACCOUNT_LOOKUP_REQUEST'; -export const ACCOUNT_LOOKUP_SUCCESS = 'ACCOUNT_LOOKUP_SUCCESS'; -export const ACCOUNT_LOOKUP_FAIL = 'ACCOUNT_LOOKUP_FAIL'; +export const ACCOUNT_LOOKUP_REQUEST = "ACCOUNT_LOOKUP_REQUEST"; +export const ACCOUNT_LOOKUP_SUCCESS = "ACCOUNT_LOOKUP_SUCCESS"; +export const ACCOUNT_LOOKUP_FAIL = "ACCOUNT_LOOKUP_FAIL"; -export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST'; -export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS'; -export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL'; +export const ACCOUNT_FOLLOW_REQUEST = "ACCOUNT_FOLLOW_REQUEST"; +export const ACCOUNT_FOLLOW_SUCCESS = "ACCOUNT_FOLLOW_SUCCESS"; +export const ACCOUNT_FOLLOW_FAIL = "ACCOUNT_FOLLOW_FAIL"; -export const ACCOUNT_UNFOLLOW_REQUEST = 'ACCOUNT_UNFOLLOW_REQUEST'; -export const ACCOUNT_UNFOLLOW_SUCCESS = 'ACCOUNT_UNFOLLOW_SUCCESS'; -export const ACCOUNT_UNFOLLOW_FAIL = 'ACCOUNT_UNFOLLOW_FAIL'; +export const ACCOUNT_UNFOLLOW_REQUEST = "ACCOUNT_UNFOLLOW_REQUEST"; +export const ACCOUNT_UNFOLLOW_SUCCESS = "ACCOUNT_UNFOLLOW_SUCCESS"; +export const ACCOUNT_UNFOLLOW_FAIL = "ACCOUNT_UNFOLLOW_FAIL"; -export const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST'; -export const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS'; -export const ACCOUNT_BLOCK_FAIL = 'ACCOUNT_BLOCK_FAIL'; +export const ACCOUNT_BLOCK_REQUEST = "ACCOUNT_BLOCK_REQUEST"; +export const ACCOUNT_BLOCK_SUCCESS = "ACCOUNT_BLOCK_SUCCESS"; +export const ACCOUNT_BLOCK_FAIL = "ACCOUNT_BLOCK_FAIL"; -export const ACCOUNT_UNBLOCK_REQUEST = 'ACCOUNT_UNBLOCK_REQUEST'; -export const ACCOUNT_UNBLOCK_SUCCESS = 'ACCOUNT_UNBLOCK_SUCCESS'; -export const ACCOUNT_UNBLOCK_FAIL = 'ACCOUNT_UNBLOCK_FAIL'; +export const ACCOUNT_UNBLOCK_REQUEST = "ACCOUNT_UNBLOCK_REQUEST"; +export const ACCOUNT_UNBLOCK_SUCCESS = "ACCOUNT_UNBLOCK_SUCCESS"; +export const ACCOUNT_UNBLOCK_FAIL = "ACCOUNT_UNBLOCK_FAIL"; -export const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST'; -export const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS'; -export const ACCOUNT_MUTE_FAIL = 'ACCOUNT_MUTE_FAIL'; +export const ACCOUNT_MUTE_REQUEST = "ACCOUNT_MUTE_REQUEST"; +export const ACCOUNT_MUTE_SUCCESS = "ACCOUNT_MUTE_SUCCESS"; +export const ACCOUNT_MUTE_FAIL = "ACCOUNT_MUTE_FAIL"; -export const ACCOUNT_UNMUTE_REQUEST = 'ACCOUNT_UNMUTE_REQUEST'; -export const ACCOUNT_UNMUTE_SUCCESS = 'ACCOUNT_UNMUTE_SUCCESS'; -export const ACCOUNT_UNMUTE_FAIL = 'ACCOUNT_UNMUTE_FAIL'; +export const ACCOUNT_UNMUTE_REQUEST = "ACCOUNT_UNMUTE_REQUEST"; +export const ACCOUNT_UNMUTE_SUCCESS = "ACCOUNT_UNMUTE_SUCCESS"; +export const ACCOUNT_UNMUTE_FAIL = "ACCOUNT_UNMUTE_FAIL"; -export const ACCOUNT_PIN_REQUEST = 'ACCOUNT_PIN_REQUEST'; -export const ACCOUNT_PIN_SUCCESS = 'ACCOUNT_PIN_SUCCESS'; -export const ACCOUNT_PIN_FAIL = 'ACCOUNT_PIN_FAIL'; +export const ACCOUNT_PIN_REQUEST = "ACCOUNT_PIN_REQUEST"; +export const ACCOUNT_PIN_SUCCESS = "ACCOUNT_PIN_SUCCESS"; +export const ACCOUNT_PIN_FAIL = "ACCOUNT_PIN_FAIL"; -export const ACCOUNT_UNPIN_REQUEST = 'ACCOUNT_UNPIN_REQUEST'; -export const ACCOUNT_UNPIN_SUCCESS = 'ACCOUNT_UNPIN_SUCCESS'; -export const ACCOUNT_UNPIN_FAIL = 'ACCOUNT_UNPIN_FAIL'; +export const ACCOUNT_UNPIN_REQUEST = "ACCOUNT_UNPIN_REQUEST"; +export const ACCOUNT_UNPIN_SUCCESS = "ACCOUNT_UNPIN_SUCCESS"; +export const ACCOUNT_UNPIN_FAIL = "ACCOUNT_UNPIN_FAIL"; -export const FOLLOWERS_FETCH_REQUEST = 'FOLLOWERS_FETCH_REQUEST'; -export const FOLLOWERS_FETCH_SUCCESS = 'FOLLOWERS_FETCH_SUCCESS'; -export const FOLLOWERS_FETCH_FAIL = 'FOLLOWERS_FETCH_FAIL'; +export const FOLLOWERS_FETCH_REQUEST = "FOLLOWERS_FETCH_REQUEST"; +export const FOLLOWERS_FETCH_SUCCESS = "FOLLOWERS_FETCH_SUCCESS"; +export const FOLLOWERS_FETCH_FAIL = "FOLLOWERS_FETCH_FAIL"; -export const FOLLOWERS_EXPAND_REQUEST = 'FOLLOWERS_EXPAND_REQUEST'; -export const FOLLOWERS_EXPAND_SUCCESS = 'FOLLOWERS_EXPAND_SUCCESS'; -export const FOLLOWERS_EXPAND_FAIL = 'FOLLOWERS_EXPAND_FAIL'; +export const FOLLOWERS_EXPAND_REQUEST = "FOLLOWERS_EXPAND_REQUEST"; +export const FOLLOWERS_EXPAND_SUCCESS = "FOLLOWERS_EXPAND_SUCCESS"; +export const FOLLOWERS_EXPAND_FAIL = "FOLLOWERS_EXPAND_FAIL"; -export const FOLLOWING_FETCH_REQUEST = 'FOLLOWING_FETCH_REQUEST'; -export const FOLLOWING_FETCH_SUCCESS = 'FOLLOWING_FETCH_SUCCESS'; -export const FOLLOWING_FETCH_FAIL = 'FOLLOWING_FETCH_FAIL'; +export const FOLLOWING_FETCH_REQUEST = "FOLLOWING_FETCH_REQUEST"; +export const FOLLOWING_FETCH_SUCCESS = "FOLLOWING_FETCH_SUCCESS"; +export const FOLLOWING_FETCH_FAIL = "FOLLOWING_FETCH_FAIL"; -export const FOLLOWING_EXPAND_REQUEST = 'FOLLOWING_EXPAND_REQUEST'; -export const FOLLOWING_EXPAND_SUCCESS = 'FOLLOWING_EXPAND_SUCCESS'; -export const FOLLOWING_EXPAND_FAIL = 'FOLLOWING_EXPAND_FAIL'; +export const FOLLOWING_EXPAND_REQUEST = "FOLLOWING_EXPAND_REQUEST"; +export const FOLLOWING_EXPAND_SUCCESS = "FOLLOWING_EXPAND_SUCCESS"; +export const FOLLOWING_EXPAND_FAIL = "FOLLOWING_EXPAND_FAIL"; -export const RELATIONSHIPS_FETCH_REQUEST = 'RELATIONSHIPS_FETCH_REQUEST'; -export const RELATIONSHIPS_FETCH_SUCCESS = 'RELATIONSHIPS_FETCH_SUCCESS'; -export const RELATIONSHIPS_FETCH_FAIL = 'RELATIONSHIPS_FETCH_FAIL'; +export const RELATIONSHIPS_FETCH_REQUEST = "RELATIONSHIPS_FETCH_REQUEST"; +export const RELATIONSHIPS_FETCH_SUCCESS = "RELATIONSHIPS_FETCH_SUCCESS"; +export const RELATIONSHIPS_FETCH_FAIL = "RELATIONSHIPS_FETCH_FAIL"; -export const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST'; -export const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS'; -export const FOLLOW_REQUESTS_FETCH_FAIL = 'FOLLOW_REQUESTS_FETCH_FAIL'; +export const FOLLOW_REQUESTS_FETCH_REQUEST = "FOLLOW_REQUESTS_FETCH_REQUEST"; +export const FOLLOW_REQUESTS_FETCH_SUCCESS = "FOLLOW_REQUESTS_FETCH_SUCCESS"; +export const FOLLOW_REQUESTS_FETCH_FAIL = "FOLLOW_REQUESTS_FETCH_FAIL"; -export const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST'; -export const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS'; -export const FOLLOW_REQUESTS_EXPAND_FAIL = 'FOLLOW_REQUESTS_EXPAND_FAIL'; +export const FOLLOW_REQUESTS_EXPAND_REQUEST = "FOLLOW_REQUESTS_EXPAND_REQUEST"; +export const FOLLOW_REQUESTS_EXPAND_SUCCESS = "FOLLOW_REQUESTS_EXPAND_SUCCESS"; +export const FOLLOW_REQUESTS_EXPAND_FAIL = "FOLLOW_REQUESTS_EXPAND_FAIL"; -export const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUEST'; -export const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCESS'; -export const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL'; +export const FOLLOW_REQUEST_AUTHORIZE_REQUEST = "FOLLOW_REQUEST_AUTHORIZE_REQUEST"; +export const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = "FOLLOW_REQUEST_AUTHORIZE_SUCCESS"; +export const FOLLOW_REQUEST_AUTHORIZE_FAIL = "FOLLOW_REQUEST_AUTHORIZE_FAIL"; -export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST'; -export const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS'; -export const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL'; +export const FOLLOW_REQUEST_REJECT_REQUEST = "FOLLOW_REQUEST_REJECT_REQUEST"; +export const FOLLOW_REQUEST_REJECT_SUCCESS = "FOLLOW_REQUEST_REJECT_SUCCESS"; +export const FOLLOW_REQUEST_REJECT_FAIL = "FOLLOW_REQUEST_REJECT_FAIL"; -export const PINNED_ACCOUNTS_FETCH_REQUEST = 'PINNED_ACCOUNTS_FETCH_REQUEST'; -export const PINNED_ACCOUNTS_FETCH_SUCCESS = 'PINNED_ACCOUNTS_FETCH_SUCCESS'; -export const PINNED_ACCOUNTS_FETCH_FAIL = 'PINNED_ACCOUNTS_FETCH_FAIL'; +export const PINNED_ACCOUNTS_FETCH_REQUEST = "PINNED_ACCOUNTS_FETCH_REQUEST"; +export const PINNED_ACCOUNTS_FETCH_SUCCESS = "PINNED_ACCOUNTS_FETCH_SUCCESS"; +export const PINNED_ACCOUNTS_FETCH_FAIL = "PINNED_ACCOUNTS_FETCH_FAIL"; -export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST = 'PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST'; -export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS = 'PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS'; -export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL = 'PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL'; +export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST = "PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST"; +export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS = "PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS"; +export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL = "PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL"; -export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR = 'PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR'; -export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE = 'PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE'; +export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR = "PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR"; +export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE = "PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE"; -export const PINNED_ACCOUNTS_EDITOR_RESET = 'PINNED_ACCOUNTS_EDITOR_RESET'; +export const PINNED_ACCOUNTS_EDITOR_RESET = "PINNED_ACCOUNTS_EDITOR_RESET"; -export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL'; +export const ACCOUNT_REVEAL = "ACCOUNT_REVEAL"; export function fetchAccount(id) { return (dispatch, getState) => { dispatch(fetchRelationships([id])); - if (getState().getIn(['accounts', id], null) !== null) { + if (getState().getIn(["accounts", id], null) !== null) { return; } @@ -117,7 +117,7 @@ export function fetchAccount(id) { export const lookupAccount = acct => (dispatch, getState) => { dispatch(lookupAccountRequest(acct)); - api(getState).get('/api/v1/accounts/lookup', { params: { acct } }).then(response => { + api(getState).get("/api/v1/accounts/lookup", { params: { acct } }).then(response => { dispatch(fetchRelationships([response.data.id])); dispatch(importFetchedAccount(response.data)); dispatch(lookupAccountSuccess()); @@ -166,8 +166,8 @@ export function fetchAccountFail(id, error) { export function followAccount(id, options = { reblogs: true }) { return (dispatch, getState) => { - const alreadyFollowing = getState().getIn(['relationships', id, 'following']); - const locked = getState().getIn(['accounts', id, 'locked'], false); + const alreadyFollowing = getState().getIn(["relationships", id, "following"]); + const locked = getState().getIn(["accounts", id, "locked"], false); dispatch(followAccountRequest(id, locked)); @@ -184,7 +184,7 @@ export function unfollowAccount(id) { dispatch(unfollowAccountRequest(id)); api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => { - dispatch(unfollowAccountSuccess(response.data, getState().get('statuses'))); + dispatch(unfollowAccountSuccess(response.data, getState().get("statuses"))); }).catch(error => { dispatch(unfollowAccountFail(error)); }); @@ -249,7 +249,7 @@ export function blockAccount(id) { api(getState).post(`/api/v1/accounts/${id}/block`).then(response => { // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers - dispatch(blockAccountSuccess(response.data, getState().get('statuses'))); + dispatch(blockAccountSuccess(response.data, getState().get("statuses"))); }).catch(error => { dispatch(blockAccountFail(id, error)); }); @@ -318,7 +318,7 @@ export function muteAccount(id, notifications, duration=0) { api(getState).post(`/api/v1/accounts/${id}/mute`, { notifications, duration }).then(response => { // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers - dispatch(muteAccountSuccess(response.data, getState().get('statuses'))); + dispatch(muteAccountSuccess(response.data, getState().get("statuses"))); }).catch(error => { dispatch(muteAccountFail(id, error)); }); @@ -386,7 +386,7 @@ export function fetchFollowers(id) { dispatch(fetchFollowersRequest(id)); api(getState).get(`/api/v1/accounts/${id}/followers`).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchFollowersSuccess(id, response.data, next ? next.uri : null)); @@ -424,7 +424,7 @@ export function fetchFollowersFail(id, error) { export function expandFollowers(id) { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'followers', id, 'next']); + const url = getState().getIn(["user_lists", "followers", id, "next"]); if (url === null) { return; @@ -433,7 +433,7 @@ export function expandFollowers(id) { dispatch(expandFollowersRequest(id)); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandFollowersSuccess(id, response.data, next ? next.uri : null)); @@ -473,7 +473,7 @@ export function fetchFollowing(id) { dispatch(fetchFollowingRequest(id)); api(getState).get(`/api/v1/accounts/${id}/following`).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchFollowingSuccess(id, response.data, next ? next.uri : null)); @@ -511,7 +511,7 @@ export function fetchFollowingFail(id, error) { export function expandFollowing(id) { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'following', id, 'next']); + const url = getState().getIn(["user_lists", "following", id, "next"]); if (url === null) { return; @@ -520,7 +520,7 @@ export function expandFollowing(id) { dispatch(expandFollowingRequest(id)); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandFollowingSuccess(id, response.data, next ? next.uri : null)); @@ -558,9 +558,9 @@ export function expandFollowingFail(id, error) { export function fetchRelationships(accountIds) { return (dispatch, getState) => { const state = getState(); - const loadedRelationships = state.get('relationships'); + const loadedRelationships = state.get("relationships"); const newAccountIds = accountIds.filter(id => loadedRelationships.get(id, null) === null); - const signedIn = !!state.getIn(['meta', 'me']); + const signedIn = !!state.getIn(["meta", "me"]); if (!signedIn || newAccountIds.length === 0) { return; @@ -568,7 +568,7 @@ export function fetchRelationships(accountIds) { dispatch(fetchRelationshipsRequest(newAccountIds)); - api(getState).get(`/api/v1/accounts/relationships?${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => { + api(getState).get(`/api/v1/accounts/relationships?${newAccountIds.map(id => `id[]=${id}`).join("&")}`).then(response => { dispatch(fetchRelationshipsSuccess(response.data)); }).catch(error => { dispatch(fetchRelationshipsFail(error)); @@ -605,8 +605,8 @@ export function fetchFollowRequests() { return (dispatch, getState) => { dispatch(fetchFollowRequestsRequest()); - api(getState).get('/api/v1/follow_requests').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/follow_requests").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null)); }).catch(error => dispatch(fetchFollowRequestsFail(error))); @@ -636,7 +636,7 @@ export function fetchFollowRequestsFail(error) { export function expandFollowRequests() { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'follow_requests', 'next']); + const url = getState().getIn(["user_lists", "follow_requests", "next"]); if (url === null) { return; @@ -645,7 +645,7 @@ export function expandFollowRequests() { dispatch(expandFollowRequestsRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null)); }).catch(error => dispatch(expandFollowRequestsFail(error))); @@ -815,7 +815,7 @@ export function fetchPinnedAccounts() { return (dispatch, getState) => { dispatch(fetchPinnedAccountsRequest()); - api(getState).get('/api/v1/endorsements', { params: { limit: 0 } }).then(response => { + api(getState).get("/api/v1/endorsements", { params: { limit: 0 } }).then(response => { dispatch(importFetchedAccounts(response.data)); dispatch(fetchPinnedAccountsSuccess(response.data)); }).catch(err => dispatch(fetchPinnedAccountsFail(err))); @@ -854,7 +854,7 @@ export function fetchPinnedAccountsSuggestions(q) { following: true, }; - api(getState).get('/api/v1/accounts/search', { params }).then(response => { + api(getState).get("/api/v1/accounts/search", { params }).then(response => { dispatch(importFetchedAccounts(response.data)); dispatch(fetchPinnedAccountsSuggestionsSuccess(q, response.data)); }).catch(err => dispatch(fetchPinnedAccountsSuggestionsFail(err))); diff --git a/app/javascript/flavours/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js index 0220b0af5..2eaf0bcf1 100644 --- a/app/javascript/flavours/glitch/actions/alerts.js +++ b/app/javascript/flavours/glitch/actions/alerts.js @@ -1,16 +1,16 @@ -import { defineMessages } from 'react-intl'; +import { defineMessages } from "react-intl"; const messages = defineMessages({ - unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' }, - unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' }, - rateLimitedTitle: { id: 'alert.rate_limited.title', defaultMessage: 'Rate limited' }, - rateLimitedMessage: { id: 'alert.rate_limited.message', defaultMessage: 'Please retry after {retry_time, time, medium}.' }, + unexpectedTitle: { id: "alert.unexpected.title", defaultMessage: "Oops!" }, + unexpectedMessage: { id: "alert.unexpected.message", defaultMessage: "An unexpected error occurred." }, + rateLimitedTitle: { id: "alert.rate_limited.title", defaultMessage: "Rate limited" }, + rateLimitedMessage: { id: "alert.rate_limited.message", defaultMessage: "Please retry after {retry_time, time, medium}." }, }); -export const ALERT_SHOW = 'ALERT_SHOW'; -export const ALERT_DISMISS = 'ALERT_DISMISS'; -export const ALERT_CLEAR = 'ALERT_CLEAR'; -export const ALERT_NOOP = 'ALERT_NOOP'; +export const ALERT_SHOW = "ALERT_SHOW"; +export const ALERT_DISMISS = "ALERT_DISMISS"; +export const ALERT_CLEAR = "ALERT_CLEAR"; +export const ALERT_NOOP = "ALERT_NOOP"; export function dismissAlert(alert) { return { @@ -43,9 +43,9 @@ export function showAlertForError(error, skipNotFound = false) { return { type: ALERT_NOOP }; } - if (status === 429 && headers['x-ratelimit-reset']) { - const reset_date = new Date(headers['x-ratelimit-reset']); - return showAlert(messages.rateLimitedTitle, messages.rateLimitedMessage, { 'retry_time': reset_date }); + if (status === 429 && headers["x-ratelimit-reset"]) { + const reset_date = new Date(headers["x-ratelimit-reset"]); + return showAlert(messages.rateLimitedTitle, messages.rateLimitedMessage, { "retry_time": reset_date }); } let message = statusText; diff --git a/app/javascript/flavours/glitch/actions/announcements.js b/app/javascript/flavours/glitch/actions/announcements.js index 339c5f3ad..6298f3045 100644 --- a/app/javascript/flavours/glitch/actions/announcements.js +++ b/app/javascript/flavours/glitch/actions/announcements.js @@ -1,35 +1,35 @@ -import api from '../api'; +import api from "../api"; -import { normalizeAnnouncement } from './importer/normalizer'; +import { normalizeAnnouncement } from "./importer/normalizer"; -export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST'; -export const ANNOUNCEMENTS_FETCH_SUCCESS = 'ANNOUNCEMENTS_FETCH_SUCCESS'; -export const ANNOUNCEMENTS_FETCH_FAIL = 'ANNOUNCEMENTS_FETCH_FAIL'; -export const ANNOUNCEMENTS_UPDATE = 'ANNOUNCEMENTS_UPDATE'; -export const ANNOUNCEMENTS_DELETE = 'ANNOUNCEMENTS_DELETE'; +export const ANNOUNCEMENTS_FETCH_REQUEST = "ANNOUNCEMENTS_FETCH_REQUEST"; +export const ANNOUNCEMENTS_FETCH_SUCCESS = "ANNOUNCEMENTS_FETCH_SUCCESS"; +export const ANNOUNCEMENTS_FETCH_FAIL = "ANNOUNCEMENTS_FETCH_FAIL"; +export const ANNOUNCEMENTS_UPDATE = "ANNOUNCEMENTS_UPDATE"; +export const ANNOUNCEMENTS_DELETE = "ANNOUNCEMENTS_DELETE"; -export const ANNOUNCEMENTS_DISMISS_REQUEST = 'ANNOUNCEMENTS_DISMISS_REQUEST'; -export const ANNOUNCEMENTS_DISMISS_SUCCESS = 'ANNOUNCEMENTS_DISMISS_SUCCESS'; -export const ANNOUNCEMENTS_DISMISS_FAIL = 'ANNOUNCEMENTS_DISMISS_FAIL'; +export const ANNOUNCEMENTS_DISMISS_REQUEST = "ANNOUNCEMENTS_DISMISS_REQUEST"; +export const ANNOUNCEMENTS_DISMISS_SUCCESS = "ANNOUNCEMENTS_DISMISS_SUCCESS"; +export const ANNOUNCEMENTS_DISMISS_FAIL = "ANNOUNCEMENTS_DISMISS_FAIL"; -export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = 'ANNOUNCEMENTS_REACTION_ADD_REQUEST'; -export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = 'ANNOUNCEMENTS_REACTION_ADD_SUCCESS'; -export const ANNOUNCEMENTS_REACTION_ADD_FAIL = 'ANNOUNCEMENTS_REACTION_ADD_FAIL'; +export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = "ANNOUNCEMENTS_REACTION_ADD_REQUEST"; +export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = "ANNOUNCEMENTS_REACTION_ADD_SUCCESS"; +export const ANNOUNCEMENTS_REACTION_ADD_FAIL = "ANNOUNCEMENTS_REACTION_ADD_FAIL"; -export const ANNOUNCEMENTS_REACTION_REMOVE_REQUEST = 'ANNOUNCEMENTS_REACTION_REMOVE_REQUEST'; -export const ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS = 'ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS'; -export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL = 'ANNOUNCEMENTS_REACTION_REMOVE_FAIL'; +export const ANNOUNCEMENTS_REACTION_REMOVE_REQUEST = "ANNOUNCEMENTS_REACTION_REMOVE_REQUEST"; +export const ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS = "ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS"; +export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL = "ANNOUNCEMENTS_REACTION_REMOVE_FAIL"; -export const ANNOUNCEMENTS_REACTION_UPDATE = 'ANNOUNCEMENTS_REACTION_UPDATE'; +export const ANNOUNCEMENTS_REACTION_UPDATE = "ANNOUNCEMENTS_REACTION_UPDATE"; -export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW'; +export const ANNOUNCEMENTS_TOGGLE_SHOW = "ANNOUNCEMENTS_TOGGLE_SHOW"; const noOp = () => {}; export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => { dispatch(fetchAnnouncementsRequest()); - api(getState).get('/api/v1/announcements').then(response => { + api(getState).get("/api/v1/announcements").then(response => { dispatch(fetchAnnouncementsSuccess(response.data.map(x => normalizeAnnouncement(x)))); }).catch(error => { dispatch(fetchAnnouncementsFail(error)); @@ -88,13 +88,13 @@ export const dismissAnnouncementFail = (announcementId, error) => ({ }); export const addReaction = (announcementId, name) => (dispatch, getState) => { - const announcement = getState().getIn(['announcements', 'items']).find(x => x.get('id') === announcementId); + const announcement = getState().getIn(["announcements", "items"]).find(x => x.get("id") === announcementId); let alreadyAdded = false; if (announcement) { - const reaction = announcement.get('reactions').find(x => x.get('name') === name); - if (reaction && reaction.get('me')) { + const reaction = announcement.get("reactions").find(x => x.get("name") === name); + if (reaction && reaction.get("me")) { alreadyAdded = true; } } diff --git a/app/javascript/flavours/glitch/actions/app.ts b/app/javascript/flavours/glitch/actions/app.ts index 6fbfc07f6..c695046f9 100644 --- a/app/javascript/flavours/glitch/actions/app.ts +++ b/app/javascript/flavours/glitch/actions/app.ts @@ -1,9 +1,9 @@ -import { createAction } from '@reduxjs/toolkit'; +import { createAction } from "@reduxjs/toolkit"; -import type { LayoutType } from '../is_mobile'; +import { type LayoutType } from "../is_mobile"; interface ChangeLayoutPayload { - layout: LayoutType; + layout: LayoutType, } export const changeLayout = - createAction('APP_LAYOUT_CHANGE'); + createAction("APP_LAYOUT_CHANGE"); diff --git a/app/javascript/flavours/glitch/actions/blocks.js b/app/javascript/flavours/glitch/actions/blocks.js index e293657ad..fc0ce33fb 100644 --- a/app/javascript/flavours/glitch/actions/blocks.js +++ b/app/javascript/flavours/glitch/actions/blocks.js @@ -1,25 +1,25 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { fetchRelationships } from './accounts'; -import { importFetchedAccounts } from './importer'; -import { openModal } from './modal'; +import { fetchRelationships } from "./accounts"; +import { importFetchedAccounts } from "./importer"; +import { openModal } from "./modal"; -export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST'; -export const BLOCKS_FETCH_SUCCESS = 'BLOCKS_FETCH_SUCCESS'; -export const BLOCKS_FETCH_FAIL = 'BLOCKS_FETCH_FAIL'; +export const BLOCKS_FETCH_REQUEST = "BLOCKS_FETCH_REQUEST"; +export const BLOCKS_FETCH_SUCCESS = "BLOCKS_FETCH_SUCCESS"; +export const BLOCKS_FETCH_FAIL = "BLOCKS_FETCH_FAIL"; -export const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST'; -export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS'; -export const BLOCKS_EXPAND_FAIL = 'BLOCKS_EXPAND_FAIL'; +export const BLOCKS_EXPAND_REQUEST = "BLOCKS_EXPAND_REQUEST"; +export const BLOCKS_EXPAND_SUCCESS = "BLOCKS_EXPAND_SUCCESS"; +export const BLOCKS_EXPAND_FAIL = "BLOCKS_EXPAND_FAIL"; -export const BLOCKS_INIT_MODAL = 'BLOCKS_INIT_MODAL'; +export const BLOCKS_INIT_MODAL = "BLOCKS_INIT_MODAL"; export function fetchBlocks() { return (dispatch, getState) => { dispatch(fetchBlocksRequest()); - api(getState).get('/api/v1/blocks').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/blocks").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchBlocksSuccess(response.data, next ? next.uri : null)); dispatch(fetchRelationships(response.data.map(item => item.id))); @@ -50,7 +50,7 @@ export function fetchBlocksFail(error) { export function expandBlocks() { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'blocks', 'next']); + const url = getState().getIn(["user_lists", "blocks", "next"]); if (url === null) { return; @@ -59,7 +59,7 @@ export function expandBlocks() { dispatch(expandBlocksRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandBlocksSuccess(response.data, next ? next.uri : null)); dispatch(fetchRelationships(response.data.map(item => item.id))); @@ -95,6 +95,6 @@ export function initBlockModal(account) { account, }); - dispatch(openModal({ modalType: 'BLOCK' })); + dispatch(openModal({ modalType: "BLOCK" })); }; } diff --git a/app/javascript/flavours/glitch/actions/bookmarks.js b/app/javascript/flavours/glitch/actions/bookmarks.js index 0b16f61e6..efda13c5b 100644 --- a/app/javascript/flavours/glitch/actions/bookmarks.js +++ b/app/javascript/flavours/glitch/actions/bookmarks.js @@ -1,25 +1,25 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { importFetchedStatuses } from './importer'; +import { importFetchedStatuses } from "./importer"; -export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST'; -export const BOOKMARKED_STATUSES_FETCH_SUCCESS = 'BOOKMARKED_STATUSES_FETCH_SUCCESS'; -export const BOOKMARKED_STATUSES_FETCH_FAIL = 'BOOKMARKED_STATUSES_FETCH_FAIL'; +export const BOOKMARKED_STATUSES_FETCH_REQUEST = "BOOKMARKED_STATUSES_FETCH_REQUEST"; +export const BOOKMARKED_STATUSES_FETCH_SUCCESS = "BOOKMARKED_STATUSES_FETCH_SUCCESS"; +export const BOOKMARKED_STATUSES_FETCH_FAIL = "BOOKMARKED_STATUSES_FETCH_FAIL"; -export const BOOKMARKED_STATUSES_EXPAND_REQUEST = 'BOOKMARKED_STATUSES_EXPAND_REQUEST'; -export const BOOKMARKED_STATUSES_EXPAND_SUCCESS = 'BOOKMARKED_STATUSES_EXPAND_SUCCESS'; -export const BOOKMARKED_STATUSES_EXPAND_FAIL = 'BOOKMARKED_STATUSES_EXPAND_FAIL'; +export const BOOKMARKED_STATUSES_EXPAND_REQUEST = "BOOKMARKED_STATUSES_EXPAND_REQUEST"; +export const BOOKMARKED_STATUSES_EXPAND_SUCCESS = "BOOKMARKED_STATUSES_EXPAND_SUCCESS"; +export const BOOKMARKED_STATUSES_EXPAND_FAIL = "BOOKMARKED_STATUSES_EXPAND_FAIL"; export function fetchBookmarkedStatuses() { return (dispatch, getState) => { - if (getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) { + if (getState().getIn(["status_lists", "bookmarks", "isLoading"])) { return; } dispatch(fetchBookmarkedStatusesRequest()); - api(getState).get('/api/v1/bookmarks').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/bookmarks").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null)); }).catch(error => { @@ -51,16 +51,16 @@ export function fetchBookmarkedStatusesFail(error) { export function expandBookmarkedStatuses() { return (dispatch, getState) => { - const url = getState().getIn(['status_lists', 'bookmarks', 'next'], null); + const url = getState().getIn(["status_lists", "bookmarks", "next"], null); - if (url === null || getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) { + if (url === null || getState().getIn(["status_lists", "bookmarks", "isLoading"])) { return; } dispatch(expandBookmarkedStatusesRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null)); }).catch(error => { diff --git a/app/javascript/flavours/glitch/actions/boosts.js b/app/javascript/flavours/glitch/actions/boosts.js index 1fc2e391e..136abba59 100644 --- a/app/javascript/flavours/glitch/actions/boosts.js +++ b/app/javascript/flavours/glitch/actions/boosts.js @@ -1,13 +1,13 @@ -import { openModal } from './modal'; +import { openModal } from "./modal"; -export const BOOSTS_INIT_MODAL = 'BOOSTS_INIT_MODAL'; -export const BOOSTS_CHANGE_PRIVACY = 'BOOSTS_CHANGE_PRIVACY'; +export const BOOSTS_INIT_MODAL = "BOOSTS_INIT_MODAL"; +export const BOOSTS_CHANGE_PRIVACY = "BOOSTS_CHANGE_PRIVACY"; export function initBoostModal(props) { return (dispatch, getState) => { - const default_privacy = getState().getIn(['compose', 'default_privacy']); + const default_privacy = getState().getIn(["compose", "default_privacy"]); - const privacy = props.status.get('visibility') === 'private' ? 'private' : default_privacy; + const privacy = props.status.get("visibility") === "private" ? "private" : default_privacy; dispatch({ type: BOOSTS_INIT_MODAL, @@ -15,7 +15,7 @@ export function initBoostModal(props) { }); dispatch(openModal({ - modalType: 'BOOST', + modalType: "BOOST", modalProps: props, })); }; diff --git a/app/javascript/flavours/glitch/actions/bundles.js b/app/javascript/flavours/glitch/actions/bundles.js index ecc9c8f7d..d9a84021c 100644 --- a/app/javascript/flavours/glitch/actions/bundles.js +++ b/app/javascript/flavours/glitch/actions/bundles.js @@ -1,6 +1,6 @@ -export const BUNDLE_FETCH_REQUEST = 'BUNDLE_FETCH_REQUEST'; -export const BUNDLE_FETCH_SUCCESS = 'BUNDLE_FETCH_SUCCESS'; -export const BUNDLE_FETCH_FAIL = 'BUNDLE_FETCH_FAIL'; +export const BUNDLE_FETCH_REQUEST = "BUNDLE_FETCH_REQUEST"; +export const BUNDLE_FETCH_SUCCESS = "BUNDLE_FETCH_SUCCESS"; +export const BUNDLE_FETCH_FAIL = "BUNDLE_FETCH_FAIL"; export function fetchBundleRequest(skipLoading) { return { diff --git a/app/javascript/flavours/glitch/actions/columns.js b/app/javascript/flavours/glitch/actions/columns.js index 302c3f0f9..0cf50d43d 100644 --- a/app/javascript/flavours/glitch/actions/columns.js +++ b/app/javascript/flavours/glitch/actions/columns.js @@ -1,9 +1,9 @@ -import { saveSettings } from './settings'; +import { saveSettings } from "./settings"; -export const COLUMN_ADD = 'COLUMN_ADD'; -export const COLUMN_REMOVE = 'COLUMN_REMOVE'; -export const COLUMN_MOVE = 'COLUMN_MOVE'; -export const COLUMN_PARAMS_CHANGE = 'COLUMN_PARAMS_CHANGE'; +export const COLUMN_ADD = "COLUMN_ADD"; +export const COLUMN_REMOVE = "COLUMN_REMOVE"; +export const COLUMN_MOVE = "COLUMN_MOVE"; +export const COLUMN_PARAMS_CHANGE = "COLUMN_PARAMS_CHANGE"; export function addColumn(id, params) { return dispatch => { diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 9e02e308a..0d9dfa3d3 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -1,99 +1,99 @@ -import { defineMessages } from 'react-intl'; +import { defineMessages } from "react-intl"; -import axios from 'axios'; -import { throttle } from 'lodash'; +import axios from "axios"; +import { throttle } from "lodash"; -import api from 'flavours/glitch/api'; -import { search as emojiSearch } from 'flavours/glitch/features/emoji/emoji_mart_search_light'; -import { maxMediaAttachments } from 'flavours/glitch/initial_state'; -import { tagHistory } from 'flavours/glitch/settings'; -import { recoverHashtags } from 'flavours/glitch/utils/hashtag'; -import resizeImage from 'flavours/glitch/utils/resize_image'; +import api from "flavours/glitch/api"; +import { search as emojiSearch } from "flavours/glitch/features/emoji/emoji_mart_search_light"; +import { maxMediaAttachments } from "flavours/glitch/initial_state"; +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'; -import { openModal } from './modal'; -import { updateTimeline } from './timelines'; +import { showAlert, showAlertForError } from "./alerts"; +import { useEmoji } from "./emojis"; +import { importFetchedAccounts, importFetchedStatus } from "./importer"; +import { openModal } from "./modal"; +import { updateTimeline } from "./timelines"; /** @type {AbortController | undefined} */ let fetchComposeSuggestionsAccountsController; /** @type {AbortController | undefined} */ let fetchComposeSuggestionsTagsController; -export const COMPOSE_CHANGE = 'COMPOSE_CHANGE'; -export const COMPOSE_CYCLE_ELEFRIEND = 'COMPOSE_CYCLE_ELEFRIEND'; -export const COMPOSE_SUBMIT_REQUEST = 'COMPOSE_SUBMIT_REQUEST'; -export const COMPOSE_SUBMIT_SUCCESS = 'COMPOSE_SUBMIT_SUCCESS'; -export const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL'; -export const COMPOSE_REPLY = 'COMPOSE_REPLY'; -export const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL'; -export const COMPOSE_DIRECT = 'COMPOSE_DIRECT'; -export const COMPOSE_MENTION = 'COMPOSE_MENTION'; -export const COMPOSE_RESET = 'COMPOSE_RESET'; +export const COMPOSE_CHANGE = "COMPOSE_CHANGE"; +export const COMPOSE_CYCLE_ELEFRIEND = "COMPOSE_CYCLE_ELEFRIEND"; +export const COMPOSE_SUBMIT_REQUEST = "COMPOSE_SUBMIT_REQUEST"; +export const COMPOSE_SUBMIT_SUCCESS = "COMPOSE_SUBMIT_SUCCESS"; +export const COMPOSE_SUBMIT_FAIL = "COMPOSE_SUBMIT_FAIL"; +export const COMPOSE_REPLY = "COMPOSE_REPLY"; +export const COMPOSE_REPLY_CANCEL = "COMPOSE_REPLY_CANCEL"; +export const COMPOSE_DIRECT = "COMPOSE_DIRECT"; +export const COMPOSE_MENTION = "COMPOSE_MENTION"; +export const COMPOSE_RESET = "COMPOSE_RESET"; -export const COMPOSE_UPLOAD_REQUEST = 'COMPOSE_UPLOAD_REQUEST'; -export const COMPOSE_UPLOAD_SUCCESS = 'COMPOSE_UPLOAD_SUCCESS'; -export const COMPOSE_UPLOAD_FAIL = 'COMPOSE_UPLOAD_FAIL'; -export const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS'; -export const COMPOSE_UPLOAD_PROCESSING = 'COMPOSE_UPLOAD_PROCESSING'; -export const COMPOSE_UPLOAD_UNDO = 'COMPOSE_UPLOAD_UNDO'; +export const COMPOSE_UPLOAD_REQUEST = "COMPOSE_UPLOAD_REQUEST"; +export const COMPOSE_UPLOAD_SUCCESS = "COMPOSE_UPLOAD_SUCCESS"; +export const COMPOSE_UPLOAD_FAIL = "COMPOSE_UPLOAD_FAIL"; +export const COMPOSE_UPLOAD_PROGRESS = "COMPOSE_UPLOAD_PROGRESS"; +export const COMPOSE_UPLOAD_PROCESSING = "COMPOSE_UPLOAD_PROCESSING"; +export const COMPOSE_UPLOAD_UNDO = "COMPOSE_UPLOAD_UNDO"; -export const THUMBNAIL_UPLOAD_REQUEST = 'THUMBNAIL_UPLOAD_REQUEST'; -export const THUMBNAIL_UPLOAD_SUCCESS = 'THUMBNAIL_UPLOAD_SUCCESS'; -export const THUMBNAIL_UPLOAD_FAIL = 'THUMBNAIL_UPLOAD_FAIL'; -export const THUMBNAIL_UPLOAD_PROGRESS = 'THUMBNAIL_UPLOAD_PROGRESS'; +export const THUMBNAIL_UPLOAD_REQUEST = "THUMBNAIL_UPLOAD_REQUEST"; +export const THUMBNAIL_UPLOAD_SUCCESS = "THUMBNAIL_UPLOAD_SUCCESS"; +export const THUMBNAIL_UPLOAD_FAIL = "THUMBNAIL_UPLOAD_FAIL"; +export const THUMBNAIL_UPLOAD_PROGRESS = "THUMBNAIL_UPLOAD_PROGRESS"; -export const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR'; -export const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY'; -export const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT'; -export const COMPOSE_SUGGESTION_IGNORE = 'COMPOSE_SUGGESTION_IGNORE'; -export const COMPOSE_SUGGESTION_TAGS_UPDATE = 'COMPOSE_SUGGESTION_TAGS_UPDATE'; +export const COMPOSE_SUGGESTIONS_CLEAR = "COMPOSE_SUGGESTIONS_CLEAR"; +export const COMPOSE_SUGGESTIONS_READY = "COMPOSE_SUGGESTIONS_READY"; +export const COMPOSE_SUGGESTION_SELECT = "COMPOSE_SUGGESTION_SELECT"; +export const COMPOSE_SUGGESTION_IGNORE = "COMPOSE_SUGGESTION_IGNORE"; +export const COMPOSE_SUGGESTION_TAGS_UPDATE = "COMPOSE_SUGGESTION_TAGS_UPDATE"; -export const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE'; +export const COMPOSE_TAG_HISTORY_UPDATE = "COMPOSE_TAG_HISTORY_UPDATE"; -export const COMPOSE_MOUNT = 'COMPOSE_MOUNT'; -export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT'; +export const COMPOSE_MOUNT = "COMPOSE_MOUNT"; +export const COMPOSE_UNMOUNT = "COMPOSE_UNMOUNT"; -export const COMPOSE_ADVANCED_OPTIONS_CHANGE = 'COMPOSE_ADVANCED_OPTIONS_CHANGE'; -export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; -export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; -export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; -export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; -export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; -export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE'; -export const COMPOSE_LANGUAGE_CHANGE = 'COMPOSE_LANGUAGE_CHANGE'; +export const COMPOSE_ADVANCED_OPTIONS_CHANGE = "COMPOSE_ADVANCED_OPTIONS_CHANGE"; +export const COMPOSE_SENSITIVITY_CHANGE = "COMPOSE_SENSITIVITY_CHANGE"; +export const COMPOSE_SPOILERNESS_CHANGE = "COMPOSE_SPOILERNESS_CHANGE"; +export const COMPOSE_SPOILER_TEXT_CHANGE = "COMPOSE_SPOILER_TEXT_CHANGE"; +export const COMPOSE_VISIBILITY_CHANGE = "COMPOSE_VISIBILITY_CHANGE"; +export const COMPOSE_LISTABILITY_CHANGE = "COMPOSE_LISTABILITY_CHANGE"; +export const COMPOSE_CONTENT_TYPE_CHANGE = "COMPOSE_CONTENT_TYPE_CHANGE"; +export const COMPOSE_LANGUAGE_CHANGE = "COMPOSE_LANGUAGE_CHANGE"; -export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT'; +export const COMPOSE_EMOJI_INSERT = "COMPOSE_EMOJI_INSERT"; -export const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST'; -export const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS'; -export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL'; +export const COMPOSE_UPLOAD_CHANGE_REQUEST = "COMPOSE_UPLOAD_UPDATE_REQUEST"; +export const COMPOSE_UPLOAD_CHANGE_SUCCESS = "COMPOSE_UPLOAD_UPDATE_SUCCESS"; +export const COMPOSE_UPLOAD_CHANGE_FAIL = "COMPOSE_UPLOAD_UPDATE_FAIL"; -export const COMPOSE_DOODLE_SET = 'COMPOSE_DOODLE_SET'; +export const COMPOSE_DOODLE_SET = "COMPOSE_DOODLE_SET"; -export const COMPOSE_POLL_ADD = 'COMPOSE_POLL_ADD'; -export const COMPOSE_POLL_REMOVE = 'COMPOSE_POLL_REMOVE'; -export const COMPOSE_POLL_OPTION_ADD = 'COMPOSE_POLL_OPTION_ADD'; -export const COMPOSE_POLL_OPTION_CHANGE = 'COMPOSE_POLL_OPTION_CHANGE'; -export const COMPOSE_POLL_OPTION_REMOVE = 'COMPOSE_POLL_OPTION_REMOVE'; -export const COMPOSE_POLL_SETTINGS_CHANGE = 'COMPOSE_POLL_SETTINGS_CHANGE'; +export const COMPOSE_POLL_ADD = "COMPOSE_POLL_ADD"; +export const COMPOSE_POLL_REMOVE = "COMPOSE_POLL_REMOVE"; +export const COMPOSE_POLL_OPTION_ADD = "COMPOSE_POLL_OPTION_ADD"; +export const COMPOSE_POLL_OPTION_CHANGE = "COMPOSE_POLL_OPTION_CHANGE"; +export const COMPOSE_POLL_OPTION_REMOVE = "COMPOSE_POLL_OPTION_REMOVE"; +export const COMPOSE_POLL_SETTINGS_CHANGE = "COMPOSE_POLL_SETTINGS_CHANGE"; -export const INIT_MEDIA_EDIT_MODAL = 'INIT_MEDIA_EDIT_MODAL'; +export const INIT_MEDIA_EDIT_MODAL = "INIT_MEDIA_EDIT_MODAL"; -export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = 'COMPOSE_CHANGE_MEDIA_DESCRIPTION'; -export const COMPOSE_CHANGE_MEDIA_FOCUS = 'COMPOSE_CHANGE_MEDIA_FOCUS'; +export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = "COMPOSE_CHANGE_MEDIA_DESCRIPTION"; +export const COMPOSE_CHANGE_MEDIA_FOCUS = "COMPOSE_CHANGE_MEDIA_FOCUS"; -export const COMPOSE_SET_STATUS = 'COMPOSE_SET_STATUS'; +export const COMPOSE_SET_STATUS = "COMPOSE_SET_STATUS"; const messages = defineMessages({ - uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' }, - uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' }, + uploadErrorLimit: { id: "upload_error.limit", defaultMessage: "File upload limit exceeded." }, + uploadErrorPoll: { id: "upload_error.poll", defaultMessage: "File upload not allowed with polls." }, }); export const ensureComposeIsVisible = (getState, routerHistory) => { - if (!getState().getIn(['compose', 'mounted'])) { - routerHistory.push('/publish'); + if (!getState().getIn(["compose", "mounted"])) { + routerHistory.push("/publish"); } }; @@ -122,7 +122,7 @@ export function cycleElefriendCompose() { export function replyCompose(status, routerHistory) { return (dispatch, getState) => { - const prependCWRe = getState().getIn(['local_settings', 'prepend_cw_re']); + const prependCWRe = getState().getIn(["local_settings", "prepend_cw_re"]); dispatch({ type: COMPOSE_REPLY, status: status, @@ -169,11 +169,11 @@ export function directCompose(account, routerHistory) { export function submitCompose(routerHistory) { return function (dispatch, getState) { - let status = getState().getIn(['compose', 'text'], ''); - const media = getState().getIn(['compose', 'media_attachments']); - const statusId = getState().getIn(['compose', 'id'], null); - const spoilers = getState().getIn(['compose', 'spoiler']) || getState().getIn(['local_settings', 'always_show_spoilers_field']); - let spoilerText = spoilers ? getState().getIn(['compose', 'spoiler_text'], '') : ''; + let status = getState().getIn(["compose", "text"], ""); + const media = getState().getIn(["compose", "media_attachments"]); + const statusId = getState().getIn(["compose", "id"], null); + const spoilers = getState().getIn(["compose", "spoiler"]) || getState().getIn(["local_settings", "always_show_spoilers_field"]); + let spoilerText = spoilers ? getState().getIn(["compose", "spoiler_text"], "") : ""; if ((!status || !status.length) && media.size === 0) { return; @@ -189,42 +189,42 @@ export function submitCompose(routerHistory) { media_attributes = media.map(item => { let focus; - if (item.getIn(['meta', 'focus'])) { - focus = `${item.getIn(['meta', 'focus', 'x']).toFixed(2)},${item.getIn(['meta', 'focus', 'y']).toFixed(2)}`; + if (item.getIn(["meta", "focus"])) { + focus = `${item.getIn(["meta", "focus", "x"]).toFixed(2)},${item.getIn(["meta", "focus", "y"]).toFixed(2)}`; } return { - id: item.get('id'), - description: item.get('description'), + id: item.get("id"), + description: item.get("description"), focus, }; }); } api(getState).request({ - url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`, - method: statusId === null ? 'post' : 'put', + url: statusId === null ? "/api/v1/statuses" : `/api/v1/statuses/${statusId}`, + method: statusId === null ? "post" : "put", data: { status, - content_type: getState().getIn(['compose', 'content_type']), - in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null), - media_ids: media.map(item => item.get('id')), + content_type: getState().getIn(["compose", "content_type"]), + in_reply_to_id: getState().getIn(["compose", "in_reply_to"], null), + media_ids: media.map(item => item.get("id")), media_attributes, - sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0), + sensitive: getState().getIn(["compose", "sensitive"]) || (spoilerText.length > 0 && media.size !== 0), spoiler_text: spoilerText, - visibility: getState().getIn(['compose', 'privacy']), - poll: getState().getIn(['compose', 'poll'], null), - language: getState().getIn(['compose', 'language']), - local_only: getState().getIn(['compose', 'advanced_options', 'do_not_federate']), + visibility: getState().getIn(["compose", "privacy"]), + poll: getState().getIn(["compose", "poll"], null), + language: getState().getIn(["compose", "language"]), + local_only: getState().getIn(["compose", "advanced_options", "do_not_federate"]), }, headers: { - 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), + "Idempotency-Key": getState().getIn(["compose", "idempotencyKey"]), }, }).then(function (response) { if (routerHistory - && (routerHistory.location.pathname === '/publish' || routerHistory.location.pathname === '/statuses/new') + && (routerHistory.location.pathname === "/publish" || routerHistory.location.pathname === "/statuses/new") && window.history.state - && !getState().getIn(['compose', 'advanced_options', 'threaded_mode'])) { + && !getState().getIn(["compose", "advanced_options", "threaded_mode"])) { routerHistory.goBack(); } @@ -239,9 +239,9 @@ export function submitCompose(routerHistory) { // To make the app more responsive, immediately get the status into the columns const insertIfOnline = (timelineId) => { - const timeline = getState().getIn(['timelines', timelineId]); + const timeline = getState().getIn(["timelines", timelineId]); - if (timeline && timeline.get('items').size > 0 && timeline.getIn(['items', 0]) !== null && timeline.get('online')) { + if (timeline && timeline.get("items").size > 0 && timeline.getIn(["items", 0]) !== null && timeline.get("online")) { dispatch(updateTimeline(timelineId, { ...response.data })); } }; @@ -251,16 +251,16 @@ export function submitCompose(routerHistory) { } if (statusId === null) { - insertIfOnline('home'); + insertIfOnline("home"); } - if (statusId === null && response.data.in_reply_to_id === null && response.data.visibility === 'public') { - insertIfOnline('community'); + if (statusId === null && response.data.in_reply_to_id === null && response.data.visibility === "public") { + insertIfOnline("community"); if (!response.data.local_only) { - insertIfOnline('public'); + insertIfOnline("public"); } - } else if (statusId === null && response.data.visibility === 'direct') { - insertIfOnline('direct'); + } else if (statusId === null && response.data.visibility === "direct") { + insertIfOnline("direct"); } }).catch(function (error) { dispatch(submitComposeFail(error)); @@ -298,8 +298,8 @@ export function doodleSet(options) { export function uploadCompose(files) { return function (dispatch, getState) { const uploadLimit = maxMediaAttachments; - const media = getState().getIn(['compose', 'media_attachments']); - const pending = getState().getIn(['compose', 'pending_media_attachments']); + const media = getState().getIn(["compose", "media_attachments"]); + const pending = getState().getIn(["compose", "pending_media_attachments"]); const progress = new Array(files.length).fill(0); let total = Array.from(files).reduce((a, v) => a + v.size, 0); @@ -308,7 +308,7 @@ export function uploadCompose(files) { return; } - if (getState().getIn(['compose', 'poll'])) { + if (getState().getIn(["compose", "poll"])) { dispatch(showAlert(undefined, messages.uploadErrorPoll)); return; } @@ -316,15 +316,17 @@ export function uploadCompose(files) { dispatch(uploadComposeRequest()); for (const [i, f] of Array.from(files).entries()) { - if (media.size + i >= uploadLimit) break; + if (media.size + i >= uploadLimit) { + break; + } resizeImage(f).then(file => { const data = new FormData(); - data.append('file', file); + data.append("file", file); // Account for disparity in size of original image and resized data total += file.size - f.size; - return api(getState).post('/api/v2/media', data, { + return api(getState).post("/api/v2/media", data, { onUploadProgress: function({ loaded }){ progress[i] = loaded; dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); @@ -370,7 +372,7 @@ export const uploadThumbnail = (id, file) => (dispatch, getState) => { const total = file.size; const data = new FormData(); - data.append('thumbnail', file); + data.append("thumbnail", file); api(getState).put(`/api/v1/media/${id}`, data, { onUploadProgress: ({ loaded }) => { @@ -415,7 +417,7 @@ export function initMediaEditModal(id) { }); dispatch(openModal({ - modalType: 'FOCAL_POINT', + modalType: "FOCAL_POINT", modalProps: { id }, })); }; @@ -440,16 +442,16 @@ export function changeUploadCompose(id, params) { return (dispatch, getState) => { dispatch(changeUploadComposeRequest()); - let media = getState().getIn(['compose', 'media_attachments']).find((item) => item.get('id') === id); + let media = getState().getIn(["compose", "media_attachments"]).find((item) => item.get("id") === id); // Editing already-attached media is deferred to editing the post itself. // For simplicity's sake, fake an API reply. - if (media && !media.get('unattached')) { + if (media && !media.get("unattached")) { const { focus, ...other } = params; const data = { ...media.toJS(), ...other }; if (focus) { - const [x, y] = focus.split(','); + const [x, y] = focus.split(","); data.meta = { focus: { x: parseFloat(x), y: parseFloat(y) } }; } @@ -543,7 +545,7 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => fetchComposeSuggestionsAccountsController = new AbortController(); - api(getState).get('/api/v1/accounts/search', { + api(getState).get("/api/v1/accounts/search", { signal: fetchComposeSuggestionsAccountsController.signal, params: { @@ -564,7 +566,7 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => }, 200, { leading: true, trailing: true }); const fetchComposeSuggestionsEmojis = (dispatch, getState, token) => { - const results = emojiSearch(token.replace(':', ''), { maxResults: 5 }); + const results = emojiSearch(token.replace(":", ""), { maxResults: 5 }); dispatch(readyComposeSuggestionsEmojis(token, results)); }; @@ -577,11 +579,11 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => { fetchComposeSuggestionsTagsController = new AbortController(); - api(getState).get('/api/v2/search', { + api(getState).get("/api/v2/search", { signal: fetchComposeSuggestionsTagsController.signal, params: { - type: 'hashtags', + type: "hashtags", q: token.slice(1), resolve: false, limit: 4, @@ -600,15 +602,15 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => { export function fetchComposeSuggestions(token) { return (dispatch, getState) => { switch (token[0]) { - case ':': - fetchComposeSuggestionsEmojis(dispatch, getState, token); - break; - case '#': - fetchComposeSuggestionsTags(dispatch, getState, token); - break; - default: - fetchComposeSuggestionsAccounts(dispatch, getState, token); - break; + case ":": + fetchComposeSuggestionsEmojis(dispatch, getState, token); + break; + case "#": + fetchComposeSuggestionsTags(dispatch, getState, token); + break; + default: + fetchComposeSuggestionsAccounts(dispatch, getState, token); + break; } }; } @@ -638,18 +640,18 @@ export const readyComposeSuggestionsTags = (token, tags) => ({ export function selectComposeSuggestion(position, token, suggestion, path) { return (dispatch, getState) => { let completion; - if (suggestion.type === 'emoji') { + if (suggestion.type === "emoji") { dispatch(useEmoji(suggestion)); completion = suggestion.native || suggestion.colons; - } else if (suggestion.type === 'hashtag') { + } else if (suggestion.type === "hashtag") { completion = `#${suggestion.name}`; - } else if (suggestion.type === 'account') { - completion = '@' + getState().getIn(['accounts', suggestion.id, 'acct']); + } else if (suggestion.type === "account") { + completion = "@" + getState().getIn(["accounts", suggestion.id, "acct"]); } // We don't want to replace hashtags that vary only in case due to accessibility, but we need to fire off an event so that // the suggestions are dismissed and the cursor moves forward. - if (suggestion.type !== 'hashtag' || token.slice(1).localeCompare(suggestion.name, undefined, { sensitivity: 'accent' }) !== 0) { + if (suggestion.type !== "hashtag" || token.slice(1).localeCompare(suggestion.name, undefined, { sensitivity: "accent" }) !== 0) { dispatch({ type: COMPOSE_SUGGESTION_SELECT, position, @@ -685,7 +687,7 @@ export function updateTagHistory(tags) { export function hydrateCompose() { return (dispatch, getState) => { - const me = getState().getIn(['meta', 'me']); + const me = getState().getIn(["meta", "me"]); const history = tagHistory.get(me); if (history !== null) { @@ -697,8 +699,8 @@ export function hydrateCompose() { function insertIntoTagHistory(recognizedTags, text) { return (dispatch, getState) => { const state = getState(); - const oldHistory = state.getIn(['compose', 'tagHistory']); - const me = state.getIn(['meta', 'me']); + const oldHistory = state.getIn(["compose", "tagHistory"]); + const me = state.getIn(["meta", "me"]); const names = recoverHashtags(recognizedTags, text); const intersectedOldHistory = oldHistory.filter(name => names.findIndex(newName => newName.toLowerCase() === name.toLowerCase()) === -1); diff --git a/app/javascript/flavours/glitch/actions/conversations.js b/app/javascript/flavours/glitch/actions/conversations.js index 8c4c4529f..61ab9419c 100644 --- a/app/javascript/flavours/glitch/actions/conversations.js +++ b/app/javascript/flavours/glitch/actions/conversations.js @@ -1,24 +1,24 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; import { importFetchedAccounts, importFetchedStatuses, importFetchedStatus, -} from './importer'; +} from "./importer"; -export const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT'; -export const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT'; +export const CONVERSATIONS_MOUNT = "CONVERSATIONS_MOUNT"; +export const CONVERSATIONS_UNMOUNT = "CONVERSATIONS_UNMOUNT"; -export const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST'; -export const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS'; -export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL'; -export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE'; +export const CONVERSATIONS_FETCH_REQUEST = "CONVERSATIONS_FETCH_REQUEST"; +export const CONVERSATIONS_FETCH_SUCCESS = "CONVERSATIONS_FETCH_SUCCESS"; +export const CONVERSATIONS_FETCH_FAIL = "CONVERSATIONS_FETCH_FAIL"; +export const CONVERSATIONS_UPDATE = "CONVERSATIONS_UPDATE"; -export const CONVERSATIONS_READ = 'CONVERSATIONS_READ'; +export const CONVERSATIONS_READ = "CONVERSATIONS_READ"; -export const CONVERSATIONS_DELETE_REQUEST = 'CONVERSATIONS_DELETE_REQUEST'; -export const CONVERSATIONS_DELETE_SUCCESS = 'CONVERSATIONS_DELETE_SUCCESS'; -export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL'; +export const CONVERSATIONS_DELETE_REQUEST = "CONVERSATIONS_DELETE_REQUEST"; +export const CONVERSATIONS_DELETE_SUCCESS = "CONVERSATIONS_DELETE_SUCCESS"; +export const CONVERSATIONS_DELETE_FAIL = "CONVERSATIONS_DELETE_FAIL"; export const mountConversations = () => ({ type: CONVERSATIONS_MOUNT, @@ -43,14 +43,14 @@ export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => { const params = { max_id: maxId }; if (!maxId) { - params.since_id = getState().getIn(['conversations', 'items', 0, 'last_status']); + params.since_id = getState().getIn(["conversations", "items", 0, "last_status"]); } const isLoadingRecent = !!params.since_id; - api(getState).get('/api/v1/conversations', { params }) + api(getState).get("/api/v1/conversations", { params }) .then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data.reduce((aggr, item) => aggr.concat(item.accounts), []))); dispatch(importFetchedStatuses(response.data.map(item => item.last_status).filter(x => !!x))); diff --git a/app/javascript/flavours/glitch/actions/custom_emojis.js b/app/javascript/flavours/glitch/actions/custom_emojis.js index 9ec8156b1..780e65fa5 100644 --- a/app/javascript/flavours/glitch/actions/custom_emojis.js +++ b/app/javascript/flavours/glitch/actions/custom_emojis.js @@ -1,14 +1,14 @@ -import api from '../api'; +import api from "../api"; -export const CUSTOM_EMOJIS_FETCH_REQUEST = 'CUSTOM_EMOJIS_FETCH_REQUEST'; -export const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS'; -export const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL'; +export const CUSTOM_EMOJIS_FETCH_REQUEST = "CUSTOM_EMOJIS_FETCH_REQUEST"; +export const CUSTOM_EMOJIS_FETCH_SUCCESS = "CUSTOM_EMOJIS_FETCH_SUCCESS"; +export const CUSTOM_EMOJIS_FETCH_FAIL = "CUSTOM_EMOJIS_FETCH_FAIL"; export function fetchCustomEmojis() { return (dispatch, getState) => { dispatch(fetchCustomEmojisRequest()); - api(getState).get('/api/v1/custom_emojis').then(response => { + api(getState).get("/api/v1/custom_emojis").then(response => { dispatch(fetchCustomEmojisSuccess(response.data)); }).catch(error => { dispatch(fetchCustomEmojisFail(error)); diff --git a/app/javascript/flavours/glitch/actions/directory.js b/app/javascript/flavours/glitch/actions/directory.js index cda63f2b5..f79b6fbd7 100644 --- a/app/javascript/flavours/glitch/actions/directory.js +++ b/app/javascript/flavours/glitch/actions/directory.js @@ -1,20 +1,20 @@ -import api from '../api'; +import api from "../api"; -import { fetchRelationships } from './accounts'; -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'; -export const DIRECTORY_FETCH_FAIL = 'DIRECTORY_FETCH_FAIL'; +export const DIRECTORY_FETCH_REQUEST = "DIRECTORY_FETCH_REQUEST"; +export const DIRECTORY_FETCH_SUCCESS = "DIRECTORY_FETCH_SUCCESS"; +export const DIRECTORY_FETCH_FAIL = "DIRECTORY_FETCH_FAIL"; -export const DIRECTORY_EXPAND_REQUEST = 'DIRECTORY_EXPAND_REQUEST'; -export const DIRECTORY_EXPAND_SUCCESS = 'DIRECTORY_EXPAND_SUCCESS'; -export const DIRECTORY_EXPAND_FAIL = 'DIRECTORY_EXPAND_FAIL'; +export const DIRECTORY_EXPAND_REQUEST = "DIRECTORY_EXPAND_REQUEST"; +export const DIRECTORY_EXPAND_SUCCESS = "DIRECTORY_EXPAND_SUCCESS"; +export const DIRECTORY_EXPAND_FAIL = "DIRECTORY_EXPAND_FAIL"; export const fetchDirectory = params => (dispatch, getState) => { dispatch(fetchDirectoryRequest()); - api(getState).get('/api/v1/directory', { params: { ...params, limit: 20 } }).then(({ data }) => { + api(getState).get("/api/v1/directory", { params: { ...params, limit: 20 } }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchDirectorySuccess(data)); dispatch(fetchRelationships(data.map(x => x.id))); @@ -38,9 +38,9 @@ export const fetchDirectoryFail = error => ({ export const expandDirectory = params => (dispatch, getState) => { dispatch(expandDirectoryRequest()); - const loadedItems = getState().getIn(['user_lists', 'directory', 'items']).size; + const loadedItems = getState().getIn(["user_lists", "directory", "items"]).size; - api(getState).get('/api/v1/directory', { params: { ...params, offset: loadedItems, limit: 20 } }).then(({ data }) => { + api(getState).get("/api/v1/directory", { params: { ...params, offset: loadedItems, limit: 20 } }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(expandDirectorySuccess(data)); dispatch(fetchRelationships(data.map(x => x.id))); diff --git a/app/javascript/flavours/glitch/actions/domain_blocks.js b/app/javascript/flavours/glitch/actions/domain_blocks.js index d06de20a2..764a02d5d 100644 --- a/app/javascript/flavours/glitch/actions/domain_blocks.js +++ b/app/javascript/flavours/glitch/actions/domain_blocks.js @@ -1,28 +1,28 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -export const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST'; -export const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS'; -export const DOMAIN_BLOCK_FAIL = 'DOMAIN_BLOCK_FAIL'; +export const DOMAIN_BLOCK_REQUEST = "DOMAIN_BLOCK_REQUEST"; +export const DOMAIN_BLOCK_SUCCESS = "DOMAIN_BLOCK_SUCCESS"; +export const DOMAIN_BLOCK_FAIL = "DOMAIN_BLOCK_FAIL"; -export const DOMAIN_UNBLOCK_REQUEST = 'DOMAIN_UNBLOCK_REQUEST'; -export const DOMAIN_UNBLOCK_SUCCESS = 'DOMAIN_UNBLOCK_SUCCESS'; -export const DOMAIN_UNBLOCK_FAIL = 'DOMAIN_UNBLOCK_FAIL'; +export const DOMAIN_UNBLOCK_REQUEST = "DOMAIN_UNBLOCK_REQUEST"; +export const DOMAIN_UNBLOCK_SUCCESS = "DOMAIN_UNBLOCK_SUCCESS"; +export const DOMAIN_UNBLOCK_FAIL = "DOMAIN_UNBLOCK_FAIL"; -export const DOMAIN_BLOCKS_FETCH_REQUEST = 'DOMAIN_BLOCKS_FETCH_REQUEST'; -export const DOMAIN_BLOCKS_FETCH_SUCCESS = 'DOMAIN_BLOCKS_FETCH_SUCCESS'; -export const DOMAIN_BLOCKS_FETCH_FAIL = 'DOMAIN_BLOCKS_FETCH_FAIL'; +export const DOMAIN_BLOCKS_FETCH_REQUEST = "DOMAIN_BLOCKS_FETCH_REQUEST"; +export const DOMAIN_BLOCKS_FETCH_SUCCESS = "DOMAIN_BLOCKS_FETCH_SUCCESS"; +export const DOMAIN_BLOCKS_FETCH_FAIL = "DOMAIN_BLOCKS_FETCH_FAIL"; -export const DOMAIN_BLOCKS_EXPAND_REQUEST = 'DOMAIN_BLOCKS_EXPAND_REQUEST'; -export const DOMAIN_BLOCKS_EXPAND_SUCCESS = 'DOMAIN_BLOCKS_EXPAND_SUCCESS'; -export const DOMAIN_BLOCKS_EXPAND_FAIL = 'DOMAIN_BLOCKS_EXPAND_FAIL'; +export const DOMAIN_BLOCKS_EXPAND_REQUEST = "DOMAIN_BLOCKS_EXPAND_REQUEST"; +export const DOMAIN_BLOCKS_EXPAND_SUCCESS = "DOMAIN_BLOCKS_EXPAND_SUCCESS"; +export const DOMAIN_BLOCKS_EXPAND_FAIL = "DOMAIN_BLOCKS_EXPAND_FAIL"; export function blockDomain(domain) { return (dispatch, getState) => { dispatch(blockDomainRequest(domain)); - api(getState).post('/api/v1/domain_blocks', { domain }).then(() => { - const at_domain = '@' + domain; - const accounts = getState().get('accounts').filter(item => item.get('acct').endsWith(at_domain)).valueSeq().map(item => item.get('id')); + api(getState).post("/api/v1/domain_blocks", { domain }).then(() => { + const at_domain = "@" + domain; + const accounts = getState().get("accounts").filter(item => item.get("acct").endsWith(at_domain)).valueSeq().map(item => item.get("id")); dispatch(blockDomainSuccess(domain, accounts)); }).catch(err => { @@ -58,9 +58,9 @@ export function unblockDomain(domain) { return (dispatch, getState) => { dispatch(unblockDomainRequest(domain)); - api(getState).delete('/api/v1/domain_blocks', { params: { domain } }).then(() => { - const at_domain = '@' + domain; - const accounts = getState().get('accounts').filter(item => item.get('acct').endsWith(at_domain)).valueSeq().map(item => item.get('id')); + api(getState).delete("/api/v1/domain_blocks", { params: { domain } }).then(() => { + const at_domain = "@" + domain; + const accounts = getState().get("accounts").filter(item => item.get("acct").endsWith(at_domain)).valueSeq().map(item => item.get("id")); dispatch(unblockDomainSuccess(domain, accounts)); }).catch(err => { dispatch(unblockDomainFail(domain, err)); @@ -95,8 +95,8 @@ export function fetchDomainBlocks() { return (dispatch, getState) => { dispatch(fetchDomainBlocksRequest()); - api(getState).get('/api/v1/domain_blocks').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/domain_blocks").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(fetchDomainBlocksSuccess(response.data, next ? next.uri : null)); }).catch(err => { dispatch(fetchDomainBlocksFail(err)); @@ -127,7 +127,7 @@ export function fetchDomainBlocksFail(error) { export function expandDomainBlocks() { return (dispatch, getState) => { - const url = getState().getIn(['domain_lists', 'blocks', 'next']); + const url = getState().getIn(["domain_lists", "blocks", "next"]); if (!url) { return; @@ -136,7 +136,7 @@ export function expandDomainBlocks() { dispatch(expandDomainBlocksRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(expandDomainBlocksSuccess(response.data, next ? next.uri : null)); }).catch(err => { dispatch(expandDomainBlocksFail(err)); diff --git a/app/javascript/flavours/glitch/actions/dropdown_menu.ts b/app/javascript/flavours/glitch/actions/dropdown_menu.ts index 3694df1ae..981b028dc 100644 --- a/app/javascript/flavours/glitch/actions/dropdown_menu.ts +++ b/app/javascript/flavours/glitch/actions/dropdown_menu.ts @@ -1,11 +1,11 @@ -import { createAction } from '@reduxjs/toolkit'; +import { createAction } from "@reduxjs/toolkit"; export const openDropdownMenu = createAction<{ - id: string; - keyboard: boolean; - scrollKey: string; -}>('dropdownMenu/open'); + id: string, + keyboard: boolean, + scrollKey: string, +}>("dropdownMenu/open"); export const closeDropdownMenu = createAction<{ id: string }>( - 'dropdownMenu/close', + "dropdownMenu/close", ); diff --git a/app/javascript/flavours/glitch/actions/emojis.js b/app/javascript/flavours/glitch/actions/emojis.js index 3b5d53996..166081640 100644 --- a/app/javascript/flavours/glitch/actions/emojis.js +++ b/app/javascript/flavours/glitch/actions/emojis.js @@ -1,6 +1,6 @@ -import { saveSettings } from './settings'; +import { saveSettings } from "./settings"; -export const EMOJI_USE = 'EMOJI_USE'; +export const EMOJI_USE = "EMOJI_USE"; export function useEmoji(emoji) { return dispatch => { diff --git a/app/javascript/flavours/glitch/actions/favourites.js b/app/javascript/flavours/glitch/actions/favourites.js index 2d4d4e620..0c89e5f21 100644 --- a/app/javascript/flavours/glitch/actions/favourites.js +++ b/app/javascript/flavours/glitch/actions/favourites.js @@ -1,25 +1,25 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { importFetchedStatuses } from './importer'; +import { importFetchedStatuses } from "./importer"; -export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST'; -export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS'; -export const FAVOURITED_STATUSES_FETCH_FAIL = 'FAVOURITED_STATUSES_FETCH_FAIL'; +export const FAVOURITED_STATUSES_FETCH_REQUEST = "FAVOURITED_STATUSES_FETCH_REQUEST"; +export const FAVOURITED_STATUSES_FETCH_SUCCESS = "FAVOURITED_STATUSES_FETCH_SUCCESS"; +export const FAVOURITED_STATUSES_FETCH_FAIL = "FAVOURITED_STATUSES_FETCH_FAIL"; -export const FAVOURITED_STATUSES_EXPAND_REQUEST = 'FAVOURITED_STATUSES_EXPAND_REQUEST'; -export const FAVOURITED_STATUSES_EXPAND_SUCCESS = 'FAVOURITED_STATUSES_EXPAND_SUCCESS'; -export const FAVOURITED_STATUSES_EXPAND_FAIL = 'FAVOURITED_STATUSES_EXPAND_FAIL'; +export const FAVOURITED_STATUSES_EXPAND_REQUEST = "FAVOURITED_STATUSES_EXPAND_REQUEST"; +export const FAVOURITED_STATUSES_EXPAND_SUCCESS = "FAVOURITED_STATUSES_EXPAND_SUCCESS"; +export const FAVOURITED_STATUSES_EXPAND_FAIL = "FAVOURITED_STATUSES_EXPAND_FAIL"; export function fetchFavouritedStatuses() { return (dispatch, getState) => { - if (getState().getIn(['status_lists', 'favourites', 'isLoading'])) { + if (getState().getIn(["status_lists", "favourites", "isLoading"])) { return; } dispatch(fetchFavouritedStatusesRequest()); - api(getState).get('/api/v1/favourites').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/favourites").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(fetchFavouritedStatusesSuccess(response.data, next ? next.uri : null)); }).catch(error => { @@ -54,16 +54,16 @@ export function fetchFavouritedStatusesFail(error) { export function expandFavouritedStatuses() { return (dispatch, getState) => { - const url = getState().getIn(['status_lists', 'favourites', 'next'], null); + const url = getState().getIn(["status_lists", "favourites", "next"], null); - if (url === null || getState().getIn(['status_lists', 'favourites', 'isLoading'])) { + if (url === null || getState().getIn(["status_lists", "favourites", "isLoading"])) { return; } dispatch(expandFavouritedStatusesRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(expandFavouritedStatusesSuccess(response.data, next ? next.uri : null)); }).catch(error => { diff --git a/app/javascript/flavours/glitch/actions/featured_tags.js b/app/javascript/flavours/glitch/actions/featured_tags.js index 18bb61539..05c5d5aa0 100644 --- a/app/javascript/flavours/glitch/actions/featured_tags.js +++ b/app/javascript/flavours/glitch/actions/featured_tags.js @@ -1,11 +1,11 @@ -import api from '../api'; +import api from "../api"; -export const FEATURED_TAGS_FETCH_REQUEST = 'FEATURED_TAGS_FETCH_REQUEST'; -export const FEATURED_TAGS_FETCH_SUCCESS = 'FEATURED_TAGS_FETCH_SUCCESS'; -export const FEATURED_TAGS_FETCH_FAIL = 'FEATURED_TAGS_FETCH_FAIL'; +export const FEATURED_TAGS_FETCH_REQUEST = "FEATURED_TAGS_FETCH_REQUEST"; +export const FEATURED_TAGS_FETCH_SUCCESS = "FEATURED_TAGS_FETCH_SUCCESS"; +export const FEATURED_TAGS_FETCH_FAIL = "FEATURED_TAGS_FETCH_FAIL"; export const fetchFeaturedTags = (id) => (dispatch, getState) => { - if (getState().getIn(['user_lists', 'featured_tags', id, 'items'])) { + if (getState().getIn(["user_lists", "featured_tags", id, "items"])) { return; } diff --git a/app/javascript/flavours/glitch/actions/filters.js b/app/javascript/flavours/glitch/actions/filters.js index a11956ac5..9066724f0 100644 --- a/app/javascript/flavours/glitch/actions/filters.js +++ b/app/javascript/flavours/glitch/actions/filters.js @@ -1,24 +1,24 @@ -import api from '../api'; +import api from "../api"; -import { openModal } from './modal'; +import { openModal } from "./modal"; -export const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST'; -export const FILTERS_FETCH_SUCCESS = 'FILTERS_FETCH_SUCCESS'; -export const FILTERS_FETCH_FAIL = 'FILTERS_FETCH_FAIL'; +export const FILTERS_FETCH_REQUEST = "FILTERS_FETCH_REQUEST"; +export const FILTERS_FETCH_SUCCESS = "FILTERS_FETCH_SUCCESS"; +export const FILTERS_FETCH_FAIL = "FILTERS_FETCH_FAIL"; -export const FILTERS_STATUS_CREATE_REQUEST = 'FILTERS_STATUS_CREATE_REQUEST'; -export const FILTERS_STATUS_CREATE_SUCCESS = 'FILTERS_STATUS_CREATE_SUCCESS'; -export const FILTERS_STATUS_CREATE_FAIL = 'FILTERS_STATUS_CREATE_FAIL'; +export const FILTERS_STATUS_CREATE_REQUEST = "FILTERS_STATUS_CREATE_REQUEST"; +export const FILTERS_STATUS_CREATE_SUCCESS = "FILTERS_STATUS_CREATE_SUCCESS"; +export const FILTERS_STATUS_CREATE_FAIL = "FILTERS_STATUS_CREATE_FAIL"; -export const FILTERS_CREATE_REQUEST = 'FILTERS_CREATE_REQUEST'; -export const FILTERS_CREATE_SUCCESS = 'FILTERS_CREATE_SUCCESS'; -export const FILTERS_CREATE_FAIL = 'FILTERS_CREATE_FAIL'; +export const FILTERS_CREATE_REQUEST = "FILTERS_CREATE_REQUEST"; +export const FILTERS_CREATE_SUCCESS = "FILTERS_CREATE_SUCCESS"; +export const FILTERS_CREATE_FAIL = "FILTERS_CREATE_FAIL"; export const initAddFilter = (status, { contextType }) => dispatch => dispatch(openModal({ - modalType: 'FILTER', + modalType: "FILTER", modalProps: { - statusId: status?.get('id'), + statusId: status?.get("id"), contextType: contextType, }, })); @@ -30,7 +30,7 @@ export const fetchFilters = () => (dispatch, getState) => { }); api(getState) - .get('/api/v2/filters') + .get("/api/v2/filters") .then(({ data }) => dispatch({ type: FILTERS_FETCH_SUCCESS, filters: data, @@ -49,10 +49,14 @@ export const createFilterStatus = (params, onSuccess, onFail) => (dispatch, getS api(getState).post(`/api/v2/filters/${params.filter_id}/statuses`, params).then(response => { dispatch(createFilterStatusSuccess(response.data)); - if (onSuccess) onSuccess(); + if (onSuccess) { + onSuccess(); + } }).catch(error => { dispatch(createFilterStatusFail(error)); - if (onFail) onFail(); + if (onFail) { + onFail(); + } }); }; @@ -73,12 +77,16 @@ export const createFilterStatusFail = error => ({ export const createFilter = (params, onSuccess, onFail) => (dispatch, getState) => { dispatch(createFilterRequest()); - api(getState).post('/api/v2/filters', params).then(response => { + api(getState).post("/api/v2/filters", params).then(response => { dispatch(createFilterSuccess(response.data)); - if (onSuccess) onSuccess(response.data); + if (onSuccess) { + onSuccess(response.data); + } }).catch(error => { dispatch(createFilterFail(error)); - if (onFail) onFail(); + if (onFail) { + onFail(); + } }); }; diff --git a/app/javascript/flavours/glitch/actions/height_cache.js b/app/javascript/flavours/glitch/actions/height_cache.js index a8645410c..46310a8be 100644 --- a/app/javascript/flavours/glitch/actions/height_cache.js +++ b/app/javascript/flavours/glitch/actions/height_cache.js @@ -1,5 +1,5 @@ -export const HEIGHT_CACHE_SET = 'HEIGHT_CACHE_SET'; -export const HEIGHT_CACHE_CLEAR = 'HEIGHT_CACHE_CLEAR'; +export const HEIGHT_CACHE_SET = "HEIGHT_CACHE_SET"; +export const HEIGHT_CACHE_CLEAR = "HEIGHT_CACHE_CLEAR"; export function setHeight (key, id, height) { return { diff --git a/app/javascript/flavours/glitch/actions/history.js b/app/javascript/flavours/glitch/actions/history.js index 52401b7dc..8a72cac5f 100644 --- a/app/javascript/flavours/glitch/actions/history.js +++ b/app/javascript/flavours/glitch/actions/history.js @@ -1,13 +1,13 @@ -import api from '../api'; +import api from "../api"; -import { importFetchedAccounts } from './importer'; +import { importFetchedAccounts } from "./importer"; -export const HISTORY_FETCH_REQUEST = 'HISTORY_FETCH_REQUEST'; -export const HISTORY_FETCH_SUCCESS = 'HISTORY_FETCH_SUCCESS'; -export const HISTORY_FETCH_FAIL = 'HISTORY_FETCH_FAIL'; +export const HISTORY_FETCH_REQUEST = "HISTORY_FETCH_REQUEST"; +export const HISTORY_FETCH_SUCCESS = "HISTORY_FETCH_SUCCESS"; +export const HISTORY_FETCH_FAIL = "HISTORY_FETCH_FAIL"; export const fetchHistory = statusId => (dispatch, getState) => { - const loading = getState().getIn(['history', statusId, 'loading']); + const loading = getState().getIn(["history", statusId, "loading"]); if (loading) { return; diff --git a/app/javascript/flavours/glitch/actions/identity_proofs.js b/app/javascript/flavours/glitch/actions/identity_proofs.js index 103983956..31d431c00 100644 --- a/app/javascript/flavours/glitch/actions/identity_proofs.js +++ b/app/javascript/flavours/glitch/actions/identity_proofs.js @@ -1,8 +1,8 @@ -import api from '../api'; +import api from "../api"; -export const IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST = 'IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST'; -export const IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS = 'IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS'; -export const IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL = 'IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL'; +export const IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST = "IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST"; +export const IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS = "IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS"; +export const IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL = "IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL"; export const fetchAccountIdentityProofs = accountId => (dispatch, getState) => { dispatch(fetchAccountIdentityProofsRequest(accountId)); diff --git a/app/javascript/flavours/glitch/actions/importer/index.js b/app/javascript/flavours/glitch/actions/importer/index.js index 3d01a96dd..d3601c810 100644 --- a/app/javascript/flavours/glitch/actions/importer/index.js +++ b/app/javascript/flavours/glitch/actions/importer/index.js @@ -1,11 +1,11 @@ -import { normalizeAccount, normalizeStatus, normalizePoll } from './normalizer'; +import { normalizeAccount, normalizeStatus, normalizePoll } from "./normalizer"; -export const ACCOUNT_IMPORT = 'ACCOUNT_IMPORT'; -export const ACCOUNTS_IMPORT = 'ACCOUNTS_IMPORT'; -export const STATUS_IMPORT = 'STATUS_IMPORT'; -export const STATUSES_IMPORT = 'STATUSES_IMPORT'; -export const POLLS_IMPORT = 'POLLS_IMPORT'; -export const FILTERS_IMPORT = 'FILTERS_IMPORT'; +export const ACCOUNT_IMPORT = "ACCOUNT_IMPORT"; +export const ACCOUNTS_IMPORT = "ACCOUNTS_IMPORT"; +export const STATUS_IMPORT = "STATUS_IMPORT"; +export const STATUSES_IMPORT = "STATUSES_IMPORT"; +export const POLLS_IMPORT = "POLLS_IMPORT"; +export const FILTERS_IMPORT = "FILTERS_IMPORT"; function pushUnique(array, object) { if (array.every(element => element.id !== object.id)) { @@ -69,7 +69,7 @@ export function importFetchedStatuses(statuses) { const filters = []; function processStatus(status) { - pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id]), getState().get('local_settings'))); + pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(["statuses", status.id]), getState().get("local_settings"))); pushUnique(accounts, status.account); if (status.filtered) { @@ -81,7 +81,7 @@ export function importFetchedStatuses(statuses) { } if (status.poll && status.poll.id) { - pushUnique(polls, normalizePoll(status.poll, getState().getIn(['polls', status.poll.id]))); + pushUnique(polls, normalizePoll(status.poll, getState().getIn(["polls", status.poll.id]))); } } @@ -96,6 +96,6 @@ export function importFetchedStatuses(statuses) { export function importFetchedPoll(poll) { return (dispatch, getState) => { - dispatch(importPolls([normalizePoll(poll, getState().getIn(['polls', poll.id]))])); + dispatch(importPolls([normalizePoll(poll, getState().getIn(["polls", poll.id]))])); }; } diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js index f30e193c4..9ad1804d8 100644 --- a/app/javascript/flavours/glitch/actions/importer/normalizer.js +++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js @@ -1,8 +1,8 @@ -import escapeTextContentForBrowser from 'escape-html'; +import escapeTextContentForBrowser from "escape-html"; -import emojify from 'flavours/glitch/features/emoji/emoji'; -import { autoHideCW } from 'flavours/glitch/utils/content_warning'; -import { unescapeHTML } from 'flavours/glitch/utils/html'; +import emojify from "flavours/glitch/features/emoji/emoji"; +import { autoHideCW } from "flavours/glitch/utils/content_warning"; +import { unescapeHTML } from "flavours/glitch/utils/html"; const domParser = new DOMParser(); @@ -12,9 +12,9 @@ const makeEmojiMap = emojis => emojis.reduce((obj, emoji) => { }, {}); export function searchTextFromRawStatus (status) { - const spoilerText = status.spoiler_text || ''; - const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(//g, '\n').replace(/<\/p>

/g, '\n\n'); - return domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; + const spoilerText = status.spoiler_text || ""; + const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join("\n\n").replace(//g, "\n").replace(/<\/p>

/g, "\n\n"); + return domParser.parseFromString(searchContent, "text/html").documentElement.textContent; } export function normalizeAccount(account) { @@ -70,33 +70,33 @@ export function normalizeStatus(status, normalOldStatus, settings) { // Only calculate these values when status first encountered and // when the underlying values change. Otherwise keep the ones // already in the reducer - if (normalOldStatus && normalOldStatus.get('content') === normalStatus.content && normalOldStatus.get('spoiler_text') === normalStatus.spoiler_text) { - normalStatus.search_index = normalOldStatus.get('search_index'); - normalStatus.contentHtml = normalOldStatus.get('contentHtml'); - normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml'); - normalStatus.hidden = normalOldStatus.get('hidden'); + if (normalOldStatus && normalOldStatus.get("content") === normalStatus.content && normalOldStatus.get("spoiler_text") === normalStatus.spoiler_text) { + normalStatus.search_index = normalOldStatus.get("search_index"); + normalStatus.contentHtml = normalOldStatus.get("contentHtml"); + normalStatus.spoilerHtml = normalOldStatus.get("spoilerHtml"); + normalStatus.hidden = normalOldStatus.get("hidden"); - if (normalOldStatus.get('translation')) { - normalStatus.translation = normalOldStatus.get('translation'); + if (normalOldStatus.get("translation")) { + normalStatus.translation = normalOldStatus.get("translation"); } } else { - const spoilerText = normalStatus.spoiler_text || ''; - const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(//g, '\n').replace(/<\/p>

/g, '\n\n'); + const spoilerText = normalStatus.spoiler_text || ""; + const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join("\n\n").replace(//g, "\n").replace(/<\/p>

/g, "\n\n"); const emojiMap = makeEmojiMap(normalStatus.emojis); - normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; + normalStatus.search_index = domParser.parseFromString(searchContent, "text/html").documentElement.textContent; normalStatus.contentHtml = emojify(normalStatus.content, emojiMap); normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap); normalStatus.hidden = (spoilerText.length > 0 || normalStatus.sensitive) && autoHideCW(settings, spoilerText); } if (normalOldStatus) { - const list = normalOldStatus.get('media_attachments'); + const list = normalOldStatus.get("media_attachments"); if (normalStatus.media_attachments && list) { normalStatus.media_attachments.forEach(item => { - const oldItem = list.find(i => i.get('id') === item.id); - if (oldItem && oldItem.get('description') === item.description) { - item.translation = oldItem.get('translation'); + const oldItem = list.find(i => i.get("id") === item.id); + if (oldItem && oldItem.get("description") === item.description) { + item.translation = oldItem.get("translation"); } }); } @@ -106,7 +106,7 @@ export function normalizeStatus(status, normalOldStatus, settings) { } export function normalizeStatusTranslation(translation, status) { - const emojiMap = makeEmojiMap(status.get('emojis').toJS()); + const emojiMap = makeEmojiMap(status.get("emojis").toJS()); const normalTranslation = { detected_source_language: translation.detected_source_language, @@ -131,8 +131,8 @@ export function normalizePoll(poll, normalOldPoll) { titleHtml: emojify(escapeTextContentForBrowser(option.title), emojiMap), }; - if (normalOldPoll && normalOldPoll.getIn(['options', index, 'title']) === option.title) { - normalOption.translation = normalOldPoll.getIn(['options', index, 'translation']); + if (normalOldPoll && normalOldPoll.getIn(["options", index, "title"]) === option.title) { + normalOption.translation = normalOldPoll.getIn(["options", index, "translation"]); } return normalOption; @@ -142,7 +142,7 @@ export function normalizePoll(poll, normalOldPoll) { } export function normalizePollOptionTranslation(translation, poll) { - const emojiMap = makeEmojiMap(poll.get('emojis').toJS()); + const emojiMap = makeEmojiMap(poll.get("emojis").toJS()); const normalTranslation = { ...translation, diff --git a/app/javascript/flavours/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js index 095fb3155..842137f7c 100644 --- a/app/javascript/flavours/glitch/actions/interactions.js +++ b/app/javascript/flavours/glitch/actions/interactions.js @@ -1,61 +1,61 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { fetchRelationships } from './accounts'; -import { importFetchedAccounts, importFetchedStatus } from './importer'; +import { fetchRelationships } from "./accounts"; +import { importFetchedAccounts, importFetchedStatus } from "./importer"; -export const REBLOG_REQUEST = 'REBLOG_REQUEST'; -export const REBLOG_SUCCESS = 'REBLOG_SUCCESS'; -export const REBLOG_FAIL = 'REBLOG_FAIL'; +export const REBLOG_REQUEST = "REBLOG_REQUEST"; +export const REBLOG_SUCCESS = "REBLOG_SUCCESS"; +export const REBLOG_FAIL = "REBLOG_FAIL"; -export const REBLOGS_EXPAND_REQUEST = 'REBLOGS_EXPAND_REQUEST'; -export const REBLOGS_EXPAND_SUCCESS = 'REBLOGS_EXPAND_SUCCESS'; -export const REBLOGS_EXPAND_FAIL = 'REBLOGS_EXPAND_FAIL'; +export const REBLOGS_EXPAND_REQUEST = "REBLOGS_EXPAND_REQUEST"; +export const REBLOGS_EXPAND_SUCCESS = "REBLOGS_EXPAND_SUCCESS"; +export const REBLOGS_EXPAND_FAIL = "REBLOGS_EXPAND_FAIL"; -export const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST'; -export const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS'; -export const FAVOURITE_FAIL = 'FAVOURITE_FAIL'; +export const FAVOURITE_REQUEST = "FAVOURITE_REQUEST"; +export const FAVOURITE_SUCCESS = "FAVOURITE_SUCCESS"; +export const FAVOURITE_FAIL = "FAVOURITE_FAIL"; -export const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST'; -export const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS'; -export const UNREBLOG_FAIL = 'UNREBLOG_FAIL'; +export const UNREBLOG_REQUEST = "UNREBLOG_REQUEST"; +export const UNREBLOG_SUCCESS = "UNREBLOG_SUCCESS"; +export const UNREBLOG_FAIL = "UNREBLOG_FAIL"; -export const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST'; -export const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS'; -export const UNFAVOURITE_FAIL = 'UNFAVOURITE_FAIL'; +export const UNFAVOURITE_REQUEST = "UNFAVOURITE_REQUEST"; +export const UNFAVOURITE_SUCCESS = "UNFAVOURITE_SUCCESS"; +export const UNFAVOURITE_FAIL = "UNFAVOURITE_FAIL"; -export const REBLOGS_FETCH_REQUEST = 'REBLOGS_FETCH_REQUEST'; -export const REBLOGS_FETCH_SUCCESS = 'REBLOGS_FETCH_SUCCESS'; -export const REBLOGS_FETCH_FAIL = 'REBLOGS_FETCH_FAIL'; +export const REBLOGS_FETCH_REQUEST = "REBLOGS_FETCH_REQUEST"; +export const REBLOGS_FETCH_SUCCESS = "REBLOGS_FETCH_SUCCESS"; +export const REBLOGS_FETCH_FAIL = "REBLOGS_FETCH_FAIL"; -export const FAVOURITES_FETCH_REQUEST = 'FAVOURITES_FETCH_REQUEST'; -export const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS'; -export const FAVOURITES_FETCH_FAIL = 'FAVOURITES_FETCH_FAIL'; +export const FAVOURITES_FETCH_REQUEST = "FAVOURITES_FETCH_REQUEST"; +export const FAVOURITES_FETCH_SUCCESS = "FAVOURITES_FETCH_SUCCESS"; +export const FAVOURITES_FETCH_FAIL = "FAVOURITES_FETCH_FAIL"; -export const FAVOURITES_EXPAND_REQUEST = 'FAVOURITES_EXPAND_REQUEST'; -export const FAVOURITES_EXPAND_SUCCESS = 'FAVOURITES_EXPAND_SUCCESS'; -export const FAVOURITES_EXPAND_FAIL = 'FAVOURITES_EXPAND_FAIL'; +export const FAVOURITES_EXPAND_REQUEST = "FAVOURITES_EXPAND_REQUEST"; +export const FAVOURITES_EXPAND_SUCCESS = "FAVOURITES_EXPAND_SUCCESS"; +export const FAVOURITES_EXPAND_FAIL = "FAVOURITES_EXPAND_FAIL"; -export const PIN_REQUEST = 'PIN_REQUEST'; -export const PIN_SUCCESS = 'PIN_SUCCESS'; -export const PIN_FAIL = 'PIN_FAIL'; +export const PIN_REQUEST = "PIN_REQUEST"; +export const PIN_SUCCESS = "PIN_SUCCESS"; +export const PIN_FAIL = "PIN_FAIL"; -export const UNPIN_REQUEST = 'UNPIN_REQUEST'; -export const UNPIN_SUCCESS = 'UNPIN_SUCCESS'; -export const UNPIN_FAIL = 'UNPIN_FAIL'; +export const UNPIN_REQUEST = "UNPIN_REQUEST"; +export const UNPIN_SUCCESS = "UNPIN_SUCCESS"; +export const UNPIN_FAIL = "UNPIN_FAIL"; -export const BOOKMARK_REQUEST = 'BOOKMARK_REQUEST'; -export const BOOKMARK_SUCCESS = 'BOOKMARKED_SUCCESS'; -export const BOOKMARK_FAIL = 'BOOKMARKED_FAIL'; +export const BOOKMARK_REQUEST = "BOOKMARK_REQUEST"; +export const BOOKMARK_SUCCESS = "BOOKMARKED_SUCCESS"; +export const BOOKMARK_FAIL = "BOOKMARKED_FAIL"; -export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST'; -export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS'; -export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL'; +export const UNBOOKMARK_REQUEST = "UNBOOKMARKED_REQUEST"; +export const UNBOOKMARK_SUCCESS = "UNBOOKMARKED_SUCCESS"; +export const UNBOOKMARK_FAIL = "UNBOOKMARKED_FAIL"; export function reblog(status, visibility) { return function (dispatch, getState) { dispatch(reblogRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`, { visibility }).then(function (response) { + api(getState).post(`/api/v1/statuses/${status.get("id")}/reblog`, { visibility }).then(function (response) { // The reblog API method returns a new status wrapped around the original. In this case we are only // interested in how the original is modified, hence passing it skipping the wrapper dispatch(importFetchedStatus(response.data.reblog)); @@ -70,7 +70,7 @@ export function unreblog(status) { return (dispatch, getState) => { dispatch(unreblogRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => { + api(getState).post(`/api/v1/statuses/${status.get("id")}/unreblog`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unreblogSuccess(status)); }).catch(error => { @@ -127,7 +127,7 @@ export function favourite(status) { return function (dispatch, getState) { dispatch(favouriteRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) { + api(getState).post(`/api/v1/statuses/${status.get("id")}/favourite`).then(function (response) { dispatch(importFetchedStatus(response.data)); dispatch(favouriteSuccess(status)); }).catch(function (error) { @@ -140,7 +140,7 @@ export function unfavourite(status) { return (dispatch, getState) => { dispatch(unfavouriteRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => { + api(getState).post(`/api/v1/statuses/${status.get("id")}/unfavourite`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unfavouriteSuccess(status)); }).catch(error => { @@ -197,7 +197,7 @@ export function bookmark(status) { return function (dispatch, getState) { dispatch(bookmarkRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) { + api(getState).post(`/api/v1/statuses/${status.get("id")}/bookmark`).then(function (response) { dispatch(importFetchedStatus(response.data)); dispatch(bookmarkSuccess(status)); }).catch(function (error) { @@ -210,7 +210,7 @@ export function unbookmark(status) { return (dispatch, getState) => { dispatch(unbookmarkRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => { + api(getState).post(`/api/v1/statuses/${status.get("id")}/unbookmark`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unbookmarkSuccess(status)); }).catch(error => { @@ -268,7 +268,7 @@ export function fetchReblogs(id) { dispatch(fetchReblogsRequest(id)); api(getState).get(`/api/v1/statuses/${id}/reblogged_by`).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchReblogsSuccess(id, response.data, next ? next.uri : null)); dispatch(fetchRelationships(response.data.map(item => item.id))); @@ -304,7 +304,7 @@ export function fetchReblogsFail(id, error) { export function expandReblogs(id) { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'reblogged_by', id, 'next']); + const url = getState().getIn(["user_lists", "reblogged_by", id, "next"]); if (url === null) { return; } @@ -312,7 +312,7 @@ export function expandReblogs(id) { dispatch(expandReblogsRequest(id)); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandReblogsSuccess(id, response.data, next ? next.uri : null)); @@ -350,7 +350,7 @@ export function fetchFavourites(id) { dispatch(fetchFavouritesRequest(id)); api(getState).get(`/api/v1/statuses/${id}/favourited_by`).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchFavouritesSuccess(id, response.data, next ? next.uri : null)); dispatch(fetchRelationships(response.data.map(item => item.id))); @@ -386,7 +386,7 @@ export function fetchFavouritesFail(id, error) { export function expandFavourites(id) { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'favourited_by', id, 'next']); + const url = getState().getIn(["user_lists", "favourited_by", id, "next"]); if (url === null) { return; } @@ -394,7 +394,7 @@ export function expandFavourites(id) { dispatch(expandFavouritesRequest(id)); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandFavouritesSuccess(id, response.data, next ? next.uri : null)); @@ -431,7 +431,7 @@ export function pin(status) { return (dispatch, getState) => { dispatch(pinRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/pin`).then(response => { + api(getState).post(`/api/v1/statuses/${status.get("id")}/pin`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(pinSuccess(status)); }).catch(error => { @@ -466,7 +466,7 @@ export function unpin (status) { return (dispatch, getState) => { dispatch(unpinRequest(status)); - api(getState).post(`/api/v1/statuses/${status.get('id')}/unpin`).then(response => { + api(getState).post(`/api/v1/statuses/${status.get("id")}/unpin`).then(response => { dispatch(importFetchedStatus(response.data)); dispatch(unpinSuccess(status)); }).catch(error => { diff --git a/app/javascript/flavours/glitch/actions/languages.js b/app/javascript/flavours/glitch/actions/languages.js index ad186ba0c..636861d14 100644 --- a/app/javascript/flavours/glitch/actions/languages.js +++ b/app/javascript/flavours/glitch/actions/languages.js @@ -1,6 +1,6 @@ -import { saveSettings } from './settings'; +import { saveSettings } from "./settings"; -export const LANGUAGE_USE = 'LANGUAGE_USE'; +export const LANGUAGE_USE = "LANGUAGE_USE"; export const useLanguage = language => dispatch => { dispatch({ diff --git a/app/javascript/flavours/glitch/actions/lists.js b/app/javascript/flavours/glitch/actions/lists.js index b0789cd42..d90af43eb 100644 --- a/app/javascript/flavours/glitch/actions/lists.js +++ b/app/javascript/flavours/glitch/actions/lists.js @@ -1,57 +1,57 @@ -import api from '../api'; +import api from "../api"; -import { showAlertForError } from './alerts'; -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'; -export const LIST_FETCH_FAIL = 'LIST_FETCH_FAIL'; +export const LIST_FETCH_REQUEST = "LIST_FETCH_REQUEST"; +export const LIST_FETCH_SUCCESS = "LIST_FETCH_SUCCESS"; +export const LIST_FETCH_FAIL = "LIST_FETCH_FAIL"; -export const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST'; -export const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS'; -export const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL'; +export const LISTS_FETCH_REQUEST = "LISTS_FETCH_REQUEST"; +export const LISTS_FETCH_SUCCESS = "LISTS_FETCH_SUCCESS"; +export const LISTS_FETCH_FAIL = "LISTS_FETCH_FAIL"; -export const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE'; -export const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET'; -export const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP'; +export const LIST_EDITOR_TITLE_CHANGE = "LIST_EDITOR_TITLE_CHANGE"; +export const LIST_EDITOR_RESET = "LIST_EDITOR_RESET"; +export const LIST_EDITOR_SETUP = "LIST_EDITOR_SETUP"; -export const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST'; -export const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS'; -export const LIST_CREATE_FAIL = 'LIST_CREATE_FAIL'; +export const LIST_CREATE_REQUEST = "LIST_CREATE_REQUEST"; +export const LIST_CREATE_SUCCESS = "LIST_CREATE_SUCCESS"; +export const LIST_CREATE_FAIL = "LIST_CREATE_FAIL"; -export const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST'; -export const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS'; -export const LIST_UPDATE_FAIL = 'LIST_UPDATE_FAIL'; +export const LIST_UPDATE_REQUEST = "LIST_UPDATE_REQUEST"; +export const LIST_UPDATE_SUCCESS = "LIST_UPDATE_SUCCESS"; +export const LIST_UPDATE_FAIL = "LIST_UPDATE_FAIL"; -export const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST'; -export const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS'; -export const LIST_DELETE_FAIL = 'LIST_DELETE_FAIL'; +export const LIST_DELETE_REQUEST = "LIST_DELETE_REQUEST"; +export const LIST_DELETE_SUCCESS = "LIST_DELETE_SUCCESS"; +export const LIST_DELETE_FAIL = "LIST_DELETE_FAIL"; -export const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST'; -export const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS'; -export const LIST_ACCOUNTS_FETCH_FAIL = 'LIST_ACCOUNTS_FETCH_FAIL'; +export const LIST_ACCOUNTS_FETCH_REQUEST = "LIST_ACCOUNTS_FETCH_REQUEST"; +export const LIST_ACCOUNTS_FETCH_SUCCESS = "LIST_ACCOUNTS_FETCH_SUCCESS"; +export const LIST_ACCOUNTS_FETCH_FAIL = "LIST_ACCOUNTS_FETCH_FAIL"; -export const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE'; -export const LIST_EDITOR_SUGGESTIONS_READY = 'LIST_EDITOR_SUGGESTIONS_READY'; -export const LIST_EDITOR_SUGGESTIONS_CLEAR = 'LIST_EDITOR_SUGGESTIONS_CLEAR'; +export const LIST_EDITOR_SUGGESTIONS_CHANGE = "LIST_EDITOR_SUGGESTIONS_CHANGE"; +export const LIST_EDITOR_SUGGESTIONS_READY = "LIST_EDITOR_SUGGESTIONS_READY"; +export const LIST_EDITOR_SUGGESTIONS_CLEAR = "LIST_EDITOR_SUGGESTIONS_CLEAR"; -export const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST'; -export const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS'; -export const LIST_EDITOR_ADD_FAIL = 'LIST_EDITOR_ADD_FAIL'; +export const LIST_EDITOR_ADD_REQUEST = "LIST_EDITOR_ADD_REQUEST"; +export const LIST_EDITOR_ADD_SUCCESS = "LIST_EDITOR_ADD_SUCCESS"; +export const LIST_EDITOR_ADD_FAIL = "LIST_EDITOR_ADD_FAIL"; -export const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST'; -export const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS'; -export const LIST_EDITOR_REMOVE_FAIL = 'LIST_EDITOR_REMOVE_FAIL'; +export const LIST_EDITOR_REMOVE_REQUEST = "LIST_EDITOR_REMOVE_REQUEST"; +export const LIST_EDITOR_REMOVE_SUCCESS = "LIST_EDITOR_REMOVE_SUCCESS"; +export const LIST_EDITOR_REMOVE_FAIL = "LIST_EDITOR_REMOVE_FAIL"; -export const LIST_ADDER_RESET = 'LIST_ADDER_RESET'; -export const LIST_ADDER_SETUP = 'LIST_ADDER_SETUP'; +export const LIST_ADDER_RESET = "LIST_ADDER_RESET"; +export const LIST_ADDER_SETUP = "LIST_ADDER_SETUP"; -export const LIST_ADDER_LISTS_FETCH_REQUEST = 'LIST_ADDER_LISTS_FETCH_REQUEST'; -export const LIST_ADDER_LISTS_FETCH_SUCCESS = 'LIST_ADDER_LISTS_FETCH_SUCCESS'; -export const LIST_ADDER_LISTS_FETCH_FAIL = 'LIST_ADDER_LISTS_FETCH_FAIL'; +export const LIST_ADDER_LISTS_FETCH_REQUEST = "LIST_ADDER_LISTS_FETCH_REQUEST"; +export const LIST_ADDER_LISTS_FETCH_SUCCESS = "LIST_ADDER_LISTS_FETCH_SUCCESS"; +export const LIST_ADDER_LISTS_FETCH_FAIL = "LIST_ADDER_LISTS_FETCH_FAIL"; export const fetchList = id => (dispatch, getState) => { - if (getState().getIn(['lists', id])) { + if (getState().getIn(["lists", id])) { return; } @@ -81,7 +81,7 @@ export const fetchListFail = (id, error) => ({ export const fetchLists = () => (dispatch, getState) => { dispatch(fetchListsRequest()); - api(getState).get('/api/v1/lists') + api(getState).get("/api/v1/lists") .then(({ data }) => dispatch(fetchListsSuccess(data))) .catch(err => dispatch(fetchListsFail(err))); }; @@ -101,8 +101,8 @@ export const fetchListsFail = error => ({ }); export const submitListEditor = shouldReset => (dispatch, getState) => { - const listId = getState().getIn(['listEditor', 'listId']); - const title = getState().getIn(['listEditor', 'title']); + const listId = getState().getIn(["listEditor", "listId"]); + const title = getState().getIn(["listEditor", "title"]); if (listId === null) { dispatch(createList(title, shouldReset)); @@ -114,7 +114,7 @@ export const submitListEditor = shouldReset => (dispatch, getState) => { export const setupListEditor = listId => (dispatch, getState) => { dispatch({ type: LIST_EDITOR_SETUP, - list: getState().getIn(['lists', listId]), + list: getState().getIn(["lists", listId]), }); dispatch(fetchListAccounts(listId)); @@ -128,7 +128,7 @@ export const changeListEditorTitle = value => ({ export const createList = (title, shouldReset) => (dispatch, getState) => { dispatch(createListRequest()); - api(getState).post('/api/v1/lists', { title }).then(({ data }) => { + api(getState).post("/api/v1/lists", { title }).then(({ data }) => { dispatch(createListSuccess(data)); if (shouldReset) { @@ -154,7 +154,7 @@ export const createListFail = error => ({ export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch, getState) => { dispatch(updateListRequest(id)); - api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => { + api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === "undefined" ? undefined : !!isExclusive }).then(({ data }) => { dispatch(updateListSuccess(data)); if (shouldReset) { @@ -242,7 +242,7 @@ export const fetchListSuggestions = q => (dispatch, getState) => { following: true, }; - api(getState).get('/api/v1/accounts/search', { params }).then(({ data }) => { + api(getState).get("/api/v1/accounts/search", { params }).then(({ data }) => { dispatch(importFetchedAccounts(data)); dispatch(fetchListSuggestionsReady(q, data)); }).catch(error => dispatch(showAlertForError(error))); @@ -264,7 +264,7 @@ export const changeListSuggestions = value => ({ }); export const addToListEditor = accountId => (dispatch, getState) => { - dispatch(addToList(getState().getIn(['listEditor', 'listId']), accountId)); + dispatch(addToList(getState().getIn(["listEditor", "listId"]), accountId)); }; export const addToList = (listId, accountId) => (dispatch, getState) => { @@ -295,7 +295,7 @@ export const addToListFail = (listId, accountId, error) => ({ }); export const removeFromListEditor = accountId => (dispatch, getState) => { - dispatch(removeFromList(getState().getIn(['listEditor', 'listId']), accountId)); + dispatch(removeFromList(getState().getIn(["listEditor", "listId"]), accountId)); }; export const removeFromList = (listId, accountId) => (dispatch, getState) => { @@ -332,7 +332,7 @@ export const resetListAdder = () => ({ export const setupListAdder = accountId => (dispatch, getState) => { dispatch({ type: LIST_ADDER_SETUP, - account: getState().getIn(['accounts', accountId]), + account: getState().getIn(["accounts", accountId]), }); dispatch(fetchLists()); dispatch(fetchAccountLists(accountId)); @@ -364,10 +364,10 @@ export const fetchAccountListsFail = (id, err) => ({ }); export const addToListAdder = listId => (dispatch, getState) => { - dispatch(addToList(listId, getState().getIn(['listAdder', 'accountId']))); + dispatch(addToList(listId, getState().getIn(["listAdder", "accountId"]))); }; export const removeFromListAdder = listId => (dispatch, getState) => { - dispatch(removeFromList(listId, getState().getIn(['listAdder', 'accountId']))); + dispatch(removeFromList(listId, getState().getIn(["listAdder", "accountId"]))); }; diff --git a/app/javascript/flavours/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js index da7033b75..eeb81ecf9 100644 --- a/app/javascript/flavours/glitch/actions/local_settings.js +++ b/app/javascript/flavours/glitch/actions/local_settings.js @@ -1,26 +1,26 @@ -import { disableSwiping } from 'flavours/glitch/initial_state'; +import { disableSwiping } from "flavours/glitch/initial_state"; -import { openModal } from './modal'; +import { openModal } from "./modal"; -export const LOCAL_SETTING_CHANGE = 'LOCAL_SETTING_CHANGE'; -export const LOCAL_SETTING_DELETE = 'LOCAL_SETTING_DELETE'; +export const LOCAL_SETTING_CHANGE = "LOCAL_SETTING_CHANGE"; +export const LOCAL_SETTING_DELETE = "LOCAL_SETTING_DELETE"; export function checkDeprecatedLocalSettings() { return (dispatch, getState) => { - const local_swipe_to_change_columns = getState().getIn(['local_settings', 'swipe_to_change_columns']); + const local_swipe_to_change_columns = getState().getIn(["local_settings", "swipe_to_change_columns"]); let changed_settings = []; if (local_swipe_to_change_columns !== null && local_swipe_to_change_columns !== undefined) { if (local_swipe_to_change_columns === !disableSwiping) { - dispatch(deleteLocalSetting(['swipe_to_change_columns'])); + dispatch(deleteLocalSetting(["swipe_to_change_columns"])); } else { - changed_settings.push('user_setting_disable_swiping'); + changed_settings.push("user_setting_disable_swiping"); } } if (changed_settings.length > 0) { dispatch(openModal({ - modalType: 'DEPRECATED_SETTINGS', + modalType: "DEPRECATED_SETTINGS", modalProps: { settings: changed_settings, onConfirm: () => dispatch(clearDeprecatedLocalSettings()), @@ -32,8 +32,8 @@ export function checkDeprecatedLocalSettings() { export function clearDeprecatedLocalSettings() { return (dispatch) => { - dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold'])); - dispatch(deleteLocalSetting(['swipe_to_change_columns'])); + dispatch(deleteLocalSetting(["content_warnings", "auto_unfold"])); + dispatch(deleteLocalSetting(["swipe_to_change_columns"])); }; } @@ -66,7 +66,7 @@ export function deleteLocalSetting(key) { // their *own* local settings. export function saveLocalSettings() { return (_, getState) => { - const localSettings = getState().get('local_settings').toJS(); - localStorage.setItem('mastodon-settings', JSON.stringify(localSettings)); + const localSettings = getState().get("local_settings").toJS(); + localStorage.setItem("mastodon-settings", JSON.stringify(localSettings)); }; } diff --git a/app/javascript/flavours/glitch/actions/markers.js b/app/javascript/flavours/glitch/actions/markers.js index ccb1b23d6..638ac9bda 100644 --- a/app/javascript/flavours/glitch/actions/markers.js +++ b/app/javascript/flavours/glitch/actions/markers.js @@ -1,33 +1,33 @@ -import { List as ImmutableList } from 'immutable'; +import { List as ImmutableList } from "immutable"; -import { debounce } from 'lodash'; +import { debounce } from "lodash"; -import api from '../api'; -import { compareId } from '../compare_id'; +import api from "../api"; +import { compareId } from "../compare_id"; -export const MARKERS_FETCH_REQUEST = 'MARKERS_FETCH_REQUEST'; -export const MARKERS_FETCH_SUCCESS = 'MARKERS_FETCH_SUCCESS'; -export const MARKERS_FETCH_FAIL = 'MARKERS_FETCH_FAIL'; -export const MARKERS_SUBMIT_SUCCESS = 'MARKERS_SUBMIT_SUCCESS'; +export const MARKERS_FETCH_REQUEST = "MARKERS_FETCH_REQUEST"; +export const MARKERS_FETCH_SUCCESS = "MARKERS_FETCH_SUCCESS"; +export const MARKERS_FETCH_FAIL = "MARKERS_FETCH_FAIL"; +export const MARKERS_SUBMIT_SUCCESS = "MARKERS_SUBMIT_SUCCESS"; export const synchronouslySubmitMarkers = () => (dispatch, getState) => { - const accessToken = getState().getIn(['meta', 'access_token'], ''); + const accessToken = getState().getIn(["meta", "access_token"], ""); const params = _buildParams(getState()); - if (Object.keys(params).length === 0 || accessToken === '') { + if (Object.keys(params).length === 0 || accessToken === "") { return; } // The Fetch API allows us to perform requests that will be carried out // after the page closes. But that only works if the `keepalive` attribute // is supported. - if (window.fetch && 'keepalive' in new Request('')) { - fetch('/api/v1/markers', { + if (window.fetch && "keepalive" in new Request("")) { + fetch("/api/v1/markers", { keepalive: true, - method: 'POST', + method: "POST", headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${accessToken}`, + "Content-Type": "application/json", + "Authorization": `Bearer ${accessToken}`, }, body: JSON.stringify(params), }); @@ -38,13 +38,13 @@ export const synchronouslySubmitMarkers = () => (dispatch, getState) => { // FormData for DoorKeeper to recognize the token. const formData = new FormData(); - formData.append('bearer_token', accessToken); + formData.append("bearer_token", accessToken); for (const [id, value] of Object.entries(params)) { formData.append(`${id}[last_read_id]`, value.last_read_id); } - if (navigator.sendBeacon('/api/v1/markers', formData)) { + if (navigator.sendBeacon("/api/v1/markers", formData)) { return; } } @@ -54,9 +54,9 @@ export const synchronouslySubmitMarkers = () => (dispatch, getState) => { try { const client = new XMLHttpRequest(); - client.open('POST', '/api/v1/markers', false); - client.setRequestHeader('Content-Type', 'application/json'); - client.setRequestHeader('Authorization', `Bearer ${accessToken}`); + client.open("POST", "/api/v1/markers", false); + client.setRequestHeader("Content-Type", "application/json"); + client.setRequestHeader("Authorization", `Bearer ${accessToken}`); client.send(JSON.stringify(params)); } catch (e) { // Do not make the BeforeUnload handler error out @@ -66,16 +66,16 @@ export const synchronouslySubmitMarkers = () => (dispatch, getState) => { const _buildParams = (state) => { const params = {}; - const lastHomeId = state.getIn(['timelines', 'home', 'items'], ImmutableList()).find(item => item !== null); - const lastNotificationId = state.getIn(['notifications', 'lastReadId']); + const lastHomeId = state.getIn(["timelines", "home", "items"], ImmutableList()).find(item => item !== null); + const lastNotificationId = state.getIn(["notifications", "lastReadId"]); - if (lastHomeId && compareId(lastHomeId, state.getIn(['markers', 'home'])) > 0) { + if (lastHomeId && compareId(lastHomeId, state.getIn(["markers", "home"])) > 0) { params.home = { last_read_id: lastHomeId, }; } - if (lastNotificationId && lastNotificationId !== '0' && compareId(lastNotificationId, state.getIn(['markers', 'notifications'])) > 0) { + if (lastNotificationId && lastNotificationId !== "0" && compareId(lastNotificationId, state.getIn(["markers", "notifications"])) > 0) { params.notifications = { last_read_id: lastNotificationId, }; @@ -85,14 +85,14 @@ const _buildParams = (state) => { }; const debouncedSubmitMarkers = debounce((dispatch, getState) => { - const accessToken = getState().getIn(['meta', 'access_token'], ''); + const accessToken = getState().getIn(["meta", "access_token"], ""); const params = _buildParams(getState()); - if (Object.keys(params).length === 0 || accessToken === '') { + if (Object.keys(params).length === 0 || accessToken === "") { return; } - api(getState).post('/api/v1/markers', params).then(() => { + api(getState).post("/api/v1/markers", params).then(() => { dispatch(submitMarkersSuccess(params)); }).catch(() => {}); }, 300000, { leading: true, trailing: true }); @@ -116,11 +116,11 @@ export function submitMarkers(params = {}) { } export const fetchMarkers = () => (dispatch, getState) => { - const params = { timeline: ['notifications'] }; + const params = { timeline: ["notifications"] }; dispatch(fetchMarkersRequest()); - api(getState).get('/api/v1/markers', { params }).then(response => { + api(getState).get("/api/v1/markers", { params }).then(response => { dispatch(fetchMarkersSuccess(response.data)); }).catch(error => { dispatch(fetchMarkersFail(error)); diff --git a/app/javascript/flavours/glitch/actions/modal.ts b/app/javascript/flavours/glitch/actions/modal.ts index 01a95051e..531b80b4a 100644 --- a/app/javascript/flavours/glitch/actions/modal.ts +++ b/app/javascript/flavours/glitch/actions/modal.ts @@ -1,19 +1,19 @@ -import { createAction } from '@reduxjs/toolkit'; +import { createAction } from "@reduxjs/toolkit"; -import type { ModalProps } from 'flavours/glitch/reducers/modal'; +import { type ModalProps } from "flavours/glitch/reducers/modal"; -import type { MODAL_COMPONENTS } from '../features/ui/components/modal_root'; +import { type MODAL_COMPONENTS } from "../features/ui/components/modal_root"; export type ModalType = keyof typeof MODAL_COMPONENTS; interface OpenModalPayload { - modalType: ModalType; - modalProps: ModalProps; + modalType: ModalType, + modalProps: ModalProps, } -export const openModal = createAction('MODAL_OPEN'); +export const openModal = createAction("MODAL_OPEN"); interface CloseModalPayload { - modalType: ModalType | undefined; - ignoreFocus: boolean; + modalType: ModalType | undefined, + ignoreFocus: boolean, } -export const closeModal = createAction('MODAL_CLOSE'); +export const closeModal = createAction("MODAL_CLOSE"); diff --git a/app/javascript/flavours/glitch/actions/mutes.js b/app/javascript/flavours/glitch/actions/mutes.js index 4af927d93..5667bc499 100644 --- a/app/javascript/flavours/glitch/actions/mutes.js +++ b/app/javascript/flavours/glitch/actions/mutes.js @@ -1,28 +1,28 @@ -import { openModal } from 'flavours/glitch/actions/modal'; +import { openModal } from "flavours/glitch/actions/modal"; -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { fetchRelationships } from './accounts'; -import { importFetchedAccounts } from './importer'; +import { fetchRelationships } from "./accounts"; +import { importFetchedAccounts } from "./importer"; -export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST'; -export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS'; -export const MUTES_FETCH_FAIL = 'MUTES_FETCH_FAIL'; +export const MUTES_FETCH_REQUEST = "MUTES_FETCH_REQUEST"; +export const MUTES_FETCH_SUCCESS = "MUTES_FETCH_SUCCESS"; +export const MUTES_FETCH_FAIL = "MUTES_FETCH_FAIL"; -export const MUTES_EXPAND_REQUEST = 'MUTES_EXPAND_REQUEST'; -export const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS'; -export const MUTES_EXPAND_FAIL = 'MUTES_EXPAND_FAIL'; +export const MUTES_EXPAND_REQUEST = "MUTES_EXPAND_REQUEST"; +export const MUTES_EXPAND_SUCCESS = "MUTES_EXPAND_SUCCESS"; +export const MUTES_EXPAND_FAIL = "MUTES_EXPAND_FAIL"; -export const MUTES_INIT_MODAL = 'MUTES_INIT_MODAL'; -export const MUTES_TOGGLE_HIDE_NOTIFICATIONS = 'MUTES_TOGGLE_HIDE_NOTIFICATIONS'; -export const MUTES_CHANGE_DURATION = 'MUTES_CHANGE_DURATION'; +export const MUTES_INIT_MODAL = "MUTES_INIT_MODAL"; +export const MUTES_TOGGLE_HIDE_NOTIFICATIONS = "MUTES_TOGGLE_HIDE_NOTIFICATIONS"; +export const MUTES_CHANGE_DURATION = "MUTES_CHANGE_DURATION"; export function fetchMutes() { return (dispatch, getState) => { dispatch(fetchMutesRequest()); - api(getState).get('/api/v1/mutes').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/mutes").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(fetchMutesSuccess(response.data, next ? next.uri : null)); dispatch(fetchRelationships(response.data.map(item => item.id))); @@ -53,7 +53,7 @@ export function fetchMutesFail(error) { export function expandMutes() { return (dispatch, getState) => { - const url = getState().getIn(['user_lists', 'mutes', 'next']); + const url = getState().getIn(["user_lists", "mutes", "next"]); if (url === null) { return; @@ -62,7 +62,7 @@ export function expandMutes() { dispatch(expandMutesRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data)); dispatch(expandMutesSuccess(response.data, next ? next.uri : null)); dispatch(fetchRelationships(response.data.map(item => item.id))); @@ -98,7 +98,7 @@ export function initMuteModal(account) { account, }); - dispatch(openModal({ modalType: 'MUTE' })); + dispatch(openModal({ modalType: "MUTE" })); }; } diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index 81b8045d7..2651fea2d 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -1,69 +1,69 @@ -import { IntlMessageFormat } from 'intl-messageformat'; -import { defineMessages } from 'react-intl'; +import { IntlMessageFormat } from "intl-messageformat"; +import { defineMessages } from "react-intl"; -import { List as ImmutableList } from 'immutable'; +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 { 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 api, { getLinks } from "../api"; -import { fetchFollowRequests, fetchRelationships } from './accounts'; +import { fetchFollowRequests, fetchRelationships } from "./accounts"; import { importFetchedAccount, importFetchedAccounts, importFetchedStatus, importFetchedStatuses, -} from './importer'; -import { submitMarkers } from './markers'; -import { register as registerPushNotifications } from './push_notifications'; -import { saveSettings } from './settings'; +} from "./importer"; +import { submitMarkers } from "./markers"; +import { register as registerPushNotifications } from "./push_notifications"; +import { saveSettings } from "./settings"; -export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; -export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP'; +export const NOTIFICATIONS_UPDATE = "NOTIFICATIONS_UPDATE"; +export const NOTIFICATIONS_UPDATE_NOOP = "NOTIFICATIONS_UPDATE_NOOP"; // tracking the notif cleaning request -export const NOTIFICATIONS_DELETE_MARKED_REQUEST = 'NOTIFICATIONS_DELETE_MARKED_REQUEST'; -export const NOTIFICATIONS_DELETE_MARKED_SUCCESS = 'NOTIFICATIONS_DELETE_MARKED_SUCCESS'; -export const NOTIFICATIONS_DELETE_MARKED_FAIL = 'NOTIFICATIONS_DELETE_MARKED_FAIL'; -export const NOTIFICATIONS_MARK_ALL_FOR_DELETE = 'NOTIFICATIONS_MARK_ALL_FOR_DELETE'; -export const NOTIFICATIONS_ENTER_CLEARING_MODE = 'NOTIFICATIONS_ENTER_CLEARING_MODE'; // arg: yes +export const NOTIFICATIONS_DELETE_MARKED_REQUEST = "NOTIFICATIONS_DELETE_MARKED_REQUEST"; +export const NOTIFICATIONS_DELETE_MARKED_SUCCESS = "NOTIFICATIONS_DELETE_MARKED_SUCCESS"; +export const NOTIFICATIONS_DELETE_MARKED_FAIL = "NOTIFICATIONS_DELETE_MARKED_FAIL"; +export const NOTIFICATIONS_MARK_ALL_FOR_DELETE = "NOTIFICATIONS_MARK_ALL_FOR_DELETE"; +export const NOTIFICATIONS_ENTER_CLEARING_MODE = "NOTIFICATIONS_ENTER_CLEARING_MODE"; // arg: yes // Unmark notifications (when the cleaning mode is left) -export const NOTIFICATIONS_UNMARK_ALL_FOR_DELETE = 'NOTIFICATIONS_UNMARK_ALL_FOR_DELETE'; +export const NOTIFICATIONS_UNMARK_ALL_FOR_DELETE = "NOTIFICATIONS_UNMARK_ALL_FOR_DELETE"; // Mark one for delete -export const NOTIFICATION_MARK_FOR_DELETE = 'NOTIFICATION_MARK_FOR_DELETE'; +export const NOTIFICATION_MARK_FOR_DELETE = "NOTIFICATION_MARK_FOR_DELETE"; -export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST'; -export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS'; -export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL'; +export const NOTIFICATIONS_EXPAND_REQUEST = "NOTIFICATIONS_EXPAND_REQUEST"; +export const NOTIFICATIONS_EXPAND_SUCCESS = "NOTIFICATIONS_EXPAND_SUCCESS"; +export const NOTIFICATIONS_EXPAND_FAIL = "NOTIFICATIONS_EXPAND_FAIL"; -export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET'; +export const NOTIFICATIONS_FILTER_SET = "NOTIFICATIONS_FILTER_SET"; -export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; -export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; -export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING'; +export const NOTIFICATIONS_CLEAR = "NOTIFICATIONS_CLEAR"; +export const NOTIFICATIONS_SCROLL_TOP = "NOTIFICATIONS_SCROLL_TOP"; +export const NOTIFICATIONS_LOAD_PENDING = "NOTIFICATIONS_LOAD_PENDING"; -export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT'; -export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT'; +export const NOTIFICATIONS_MOUNT = "NOTIFICATIONS_MOUNT"; +export const NOTIFICATIONS_UNMOUNT = "NOTIFICATIONS_UNMOUNT"; -export const NOTIFICATIONS_SET_VISIBILITY = 'NOTIFICATIONS_SET_VISIBILITY'; +export const NOTIFICATIONS_SET_VISIBILITY = "NOTIFICATIONS_SET_VISIBILITY"; -export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ'; +export const NOTIFICATIONS_MARK_AS_READ = "NOTIFICATIONS_MARK_AS_READ"; -export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT'; -export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION'; +export const NOTIFICATIONS_SET_BROWSER_SUPPORT = "NOTIFICATIONS_SET_BROWSER_SUPPORT"; +export const NOTIFICATIONS_SET_BROWSER_PERMISSION = "NOTIFICATIONS_SET_BROWSER_PERMISSION"; defineMessages({ - mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, + mention: { id: "notification.mention", defaultMessage: "{name} mentioned you" }, }); const fetchRelatedRelationships = (dispatch, notifications) => { - const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id); + const accountIds = notifications.filter(item => ["follow", "follow_request", "admin.sign_up"].indexOf(item.type) !== -1).map(item => item.account.id); if (accountIds > 0) { dispatch(fetchRelationships(accountIds)); @@ -76,24 +76,24 @@ export const loadPending = () => ({ export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { - const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); - const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type; - const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); - const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); + const activeFilter = getState().getIn(["settings", "notifications", "quickFilter", "active"]); + const showInColumn = activeFilter === "all" ? getState().getIn(["settings", "notifications", "shows", notification.type], true) : activeFilter === notification.type; + const showAlert = getState().getIn(["settings", "notifications", "alerts", notification.type], true); + const playSound = getState().getIn(["settings", "notifications", "sounds", notification.type], true); let filtered = false; - if (['mention', 'status'].includes(notification.type) && notification.status.filtered) { - const filters = notification.status.filtered.filter(result => result.filter.context.includes('notifications')); + if (["mention", "status"].includes(notification.type) && notification.status.filtered) { + const filters = notification.status.filtered.filter(result => result.filter.context.includes("notifications")); - if (filters.some(result => result.filter.filter_action === 'hide')) { + if (filters.some(result => result.filter.filter_action === "hide")) { return; } filtered = filters.length > 0; } - if (['follow_request'].includes(notification.type)) { + if (["follow_request"].includes(notification.type)) { dispatch(fetchFollowRequests()); } @@ -114,24 +114,24 @@ export function updateNotifications(notification, intlMessages, intlLocale) { type: NOTIFICATIONS_UPDATE, notification, usePendingItems: preferPendingItems, - meta: (playSound && !filtered) ? { sound: 'boop' } : undefined, + meta: (playSound && !filtered) ? { sound: "boop" } : undefined, }); fetchRelatedRelationships(dispatch, [notification]); } else if (playSound && !filtered) { dispatch({ type: NOTIFICATIONS_UPDATE_NOOP, - meta: { sound: 'boop' }, + meta: { sound: "boop" }, }); } // Desktop notifications - if (typeof window.Notification !== 'undefined' && showAlert && !filtered) { + if (typeof window.Notification !== "undefined" && showAlert && !filtered) { const title = new IntlMessageFormat(intlMessages[`notification.${notification.type}`], intlLocale).format({ name: notification.account.display_name.length > 0 ? notification.account.display_name : notification.account.username }); - const body = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : unescapeHTML(notification.status ? notification.status.content : ''); + const body = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : unescapeHTML(notification.status ? notification.status.content : ""); const notify = new Notification(title, { body, icon: notification.account.avatar, tag: notification.id }); - notify.addEventListener('click', () => { + notify.addEventListener("click", () => { window.focus(); notify.close(); }); @@ -139,21 +139,21 @@ export function updateNotifications(notification, intlMessages, intlLocale) { }; } -const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS(); +const excludeTypesFromSettings = state => state.getIn(["settings", "notifications", "shows"]).filter(enabled => !enabled).keySeq().toJS(); const excludeTypesFromFilter = filter => { const allTypes = ImmutableList([ - 'follow', - 'follow_request', - 'favourite', - 'reblog', - 'mention', - 'poll', - 'status', - 'update', - 'admin.sign_up', - 'admin.report', + "follow", + "follow_request", + "favourite", + "reblog", + "mention", + "poll", + "status", + "update", + "admin.sign_up", + "admin.report", ]); return allTypes.filterNot(item => item === filter).toJS(); @@ -165,11 +165,11 @@ let expandNotificationsController = new AbortController(); export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { return (dispatch, getState) => { - const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); - const notifications = getState().get('notifications'); + const activeFilter = getState().getIn(["settings", "notifications", "quickFilter", "active"]); + const notifications = getState().get("notifications"); const isLoadingMore = !!maxId; - if (notifications.get('isLoading')) { + if (notifications.get("isLoading")) { if (forceLoad) { expandNotificationsController.abort(); expandNotificationsController = new AbortController(); @@ -181,14 +181,14 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { const params = { max_id: maxId, - exclude_types: activeFilter === 'all' + exclude_types: activeFilter === "all" ? excludeTypesFromSettings(getState()) : excludeTypesFromFilter(activeFilter), }; - if (!params.max_id && (notifications.get('items', ImmutableList()).size + notifications.get('pendingItems', ImmutableList()).size) > 0) { - const a = notifications.getIn(['pendingItems', 0, 'id']); - const b = notifications.getIn(['items', 0, 'id']); + if (!params.max_id && (notifications.get("items", ImmutableList()).size + notifications.get("pendingItems", ImmutableList()).size) > 0) { + const a = notifications.getIn(["pendingItems", 0, "id"]); + const b = notifications.getIn(["items", 0, "id"]); if (a && b && compareId(a, b) > 0) { params.since_id = a; @@ -201,8 +201,8 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { dispatch(expandNotificationsRequest(isLoadingMore)); - api(getState).get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/notifications", { params, signal: expandNotificationsController.signal }).then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); @@ -242,7 +242,7 @@ export function expandNotificationsFail(error, isLoadingMore) { type: NOTIFICATIONS_EXPAND_FAIL, error, skipLoading: !isLoadingMore, - skipAlert: !isLoadingMore || error.name === 'AbortError', + skipAlert: !isLoadingMore || error.name === "AbortError", }; } @@ -252,7 +252,7 @@ export function clearNotifications() { type: NOTIFICATIONS_CLEAR, }); - api(getState).post('/api/v1/notifications/clear'); + api(getState).post("/api/v1/notifications/clear"); }; } @@ -268,9 +268,9 @@ export function deleteMarkedNotifications() { dispatch(deleteMarkedNotificationsRequest()); let ids = []; - getState().getIn(['notifications', 'items']).forEach((n) => { - if (n.get('markedForDelete')) { - ids.push(n.get('id')); + getState().getIn(["notifications", "items"]).forEach((n) => { + if (n.get("markedForDelete")) { + ids.push(n.get("id")); } }); @@ -278,7 +278,7 @@ export function deleteMarkedNotifications() { return; } - api(getState).delete(`/api/v1/notifications/destroy_multiple?ids[]=${ids.join('&ids[]=')}`).then(() => { + api(getState).delete(`/api/v1/notifications/destroy_multiple?ids[]=${ids.join("&ids[]=")}`).then(() => { dispatch(deleteMarkedNotificationsSuccess()); }).catch(error => { console.error(error); @@ -350,7 +350,7 @@ export function setFilter (filterType) { return dispatch => { dispatch({ type: NOTIFICATIONS_FILTER_SET, - path: ['notifications', 'quickFilter', 'active'], + path: ["notifications", "quickFilter", "active"], value: filterType, }); dispatch(expandNotifications({ forceLoad: true })); @@ -367,13 +367,13 @@ export function markNotificationsAsRead() { // Browser support export function setupBrowserNotifications() { return dispatch => { - dispatch(setBrowserSupport('Notification' in window)); - if ('Notification' in window) { + dispatch(setBrowserSupport("Notification" in window)); + if ("Notification" in window) { dispatch(setBrowserPermission(Notification.permission)); } - if ('Notification' in window && 'permissions' in navigator) { - navigator.permissions.query({ name: 'notifications' }).then((status) => { + if ("Notification" in window && "permissions" in navigator) { + navigator.permissions.query({ name: "notifications" }).then((status) => { status.onchange = () => dispatch(setBrowserPermission(Notification.permission)); }).catch(console.warn); } @@ -386,7 +386,7 @@ export function requestBrowserPermission(callback = noOp) { dispatch(setBrowserPermission(permission)); callback(permission); - if (permission === 'granted') { + if (permission === "granted") { dispatch(registerPushNotifications()); } }); diff --git a/app/javascript/flavours/glitch/actions/onboarding.js b/app/javascript/flavours/glitch/actions/onboarding.js index a4a525c42..d2a284286 100644 --- a/app/javascript/flavours/glitch/actions/onboarding.js +++ b/app/javascript/flavours/glitch/actions/onboarding.js @@ -1,15 +1,15 @@ -import { openModal } from './modal'; -import { changeSetting, saveSettings } from './settings'; +import { openModal } from "./modal"; +import { changeSetting, saveSettings } from "./settings"; export function showOnboardingOnce() { return (dispatch, getState) => { - const alreadySeen = getState().getIn(['settings', 'onboarded']); + const alreadySeen = getState().getIn(["settings", "onboarded"]); if (!alreadySeen) { dispatch(openModal({ - modalType: 'ONBOARDING', + modalType: "ONBOARDING", })); - dispatch(changeSetting(['onboarded'], true)); + dispatch(changeSetting(["onboarded"], true)); dispatch(saveSettings()); } }; diff --git a/app/javascript/flavours/glitch/actions/picture_in_picture.js b/app/javascript/flavours/glitch/actions/picture_in_picture.js index 898375abe..f8b4ed687 100644 --- a/app/javascript/flavours/glitch/actions/picture_in_picture.js +++ b/app/javascript/flavours/glitch/actions/picture_in_picture.js @@ -1,7 +1,7 @@ // @ts-check -export const PICTURE_IN_PICTURE_DEPLOY = 'PICTURE_IN_PICTURE_DEPLOY'; -export const PICTURE_IN_PICTURE_REMOVE = 'PICTURE_IN_PICTURE_REMOVE'; +export const PICTURE_IN_PICTURE_DEPLOY = "PICTURE_IN_PICTURE_DEPLOY"; +export const PICTURE_IN_PICTURE_REMOVE = "PICTURE_IN_PICTURE_REMOVE"; /** * @typedef MediaProps @@ -26,7 +26,7 @@ export const deployPictureInPicture = (statusId, accountId, playerType, props) = // @ts-expect-error return (dispatch, getState) => { // Do not open a player for a toot that does not exist - if (getState().hasIn(['statuses', statusId])) { + if (getState().hasIn(["statuses", statusId])) { dispatch({ type: PICTURE_IN_PICTURE_DEPLOY, statusId, diff --git a/app/javascript/flavours/glitch/actions/pin_statuses.js b/app/javascript/flavours/glitch/actions/pin_statuses.js index 8aca199e9..795db2fc6 100644 --- a/app/javascript/flavours/glitch/actions/pin_statuses.js +++ b/app/javascript/flavours/glitch/actions/pin_statuses.js @@ -1,13 +1,13 @@ -import { me } from 'flavours/glitch/initial_state'; +import { me } from "flavours/glitch/initial_state"; -import api from '../api'; +import api from "../api"; -import { importFetchedStatuses } from './importer'; +import { importFetchedStatuses } from "./importer"; -export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST'; -export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS'; -export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL'; +export const PINNED_STATUSES_FETCH_REQUEST = "PINNED_STATUSES_FETCH_REQUEST"; +export const PINNED_STATUSES_FETCH_SUCCESS = "PINNED_STATUSES_FETCH_SUCCESS"; +export const PINNED_STATUSES_FETCH_FAIL = "PINNED_STATUSES_FETCH_FAIL"; export function fetchPinnedStatuses() { return (dispatch, getState) => { diff --git a/app/javascript/flavours/glitch/actions/polls.js b/app/javascript/flavours/glitch/actions/polls.js index a37410dc9..f19f690dc 100644 --- a/app/javascript/flavours/glitch/actions/polls.js +++ b/app/javascript/flavours/glitch/actions/polls.js @@ -1,14 +1,14 @@ -import api from '../api'; +import api from "../api"; -import { importFetchedPoll } from './importer'; +import { importFetchedPoll } from "./importer"; -export const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST'; -export const POLL_VOTE_SUCCESS = 'POLL_VOTE_SUCCESS'; -export const POLL_VOTE_FAIL = 'POLL_VOTE_FAIL'; +export const POLL_VOTE_REQUEST = "POLL_VOTE_REQUEST"; +export const POLL_VOTE_SUCCESS = "POLL_VOTE_SUCCESS"; +export const POLL_VOTE_FAIL = "POLL_VOTE_FAIL"; -export const POLL_FETCH_REQUEST = 'POLL_FETCH_REQUEST'; -export const POLL_FETCH_SUCCESS = 'POLL_FETCH_SUCCESS'; -export const POLL_FETCH_FAIL = 'POLL_FETCH_FAIL'; +export const POLL_FETCH_REQUEST = "POLL_FETCH_REQUEST"; +export const POLL_FETCH_SUCCESS = "POLL_FETCH_SUCCESS"; +export const POLL_FETCH_FAIL = "POLL_FETCH_FAIL"; export const vote = (pollId, choices) => (dispatch, getState) => { dispatch(voteRequest()); diff --git a/app/javascript/flavours/glitch/actions/push_notifications/index.js b/app/javascript/flavours/glitch/actions/push_notifications/index.js index 46b63867f..0fdd920cb 100644 --- a/app/javascript/flavours/glitch/actions/push_notifications/index.js +++ b/app/javascript/flavours/glitch/actions/push_notifications/index.js @@ -1,5 +1,5 @@ -import { saveSettings } from './registerer'; -import { setAlerts } from './setter'; +import { saveSettings } from "./registerer"; +import { setAlerts } from "./setter"; export function changeAlerts(path, value) { return dispatch => { @@ -13,5 +13,5 @@ export { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, SET_ALERTS, -} from './setter'; -export { register } from './registerer'; +} from "./setter"; +export { register } from "./registerer"; diff --git a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js index 336bbc686..62aa97290 100644 --- a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js +++ b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js @@ -1,14 +1,14 @@ -import api from '../../api'; -import { pushNotificationsSetting } from '../../settings'; +import api from "../../api"; +import { pushNotificationsSetting } from "../../settings"; -import { setBrowserSupport, setSubscription, clearSubscription } from './setter'; +import { setBrowserSupport, setSubscription, clearSubscription } from "./setter"; // Taken from https://www.npmjs.com/package/web-push const urlBase64ToUint8Array = (base64String) => { - const padding = '='.repeat((4 - base64String.length % 4) % 4); + const padding = "=".repeat((4 - base64String.length % 4) % 4); const base64 = (base64String + padding) - .replace(/-/g, '+') - .replace(/_/g, '/'); + .replace(/-/g, "+") + .replace(/_/g, "/"); const rawData = window.atob(base64); const outputArray = new Uint8Array(rawData.length); @@ -19,7 +19,7 @@ const urlBase64ToUint8Array = (base64String) => { return outputArray; }; -const getApplicationServerKey = () => document.querySelector('[name="applicationServerKey"]').getAttribute('content'); +const getApplicationServerKey = () => document.querySelector("[name=\"applicationServerKey\"]").getAttribute("content"); const getRegistration = () => navigator.serviceWorker.ready; @@ -46,20 +46,20 @@ const sendSubscriptionToBackend = (getState, subscription, me) => { } } - return api(getState).post('/api/web/push_subscriptions', params).then(response => response.data); + return api(getState).post("/api/web/push_subscriptions", params).then(response => response.data); }; // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload -const supportsPushNotifications = ('serviceWorker' in navigator && 'PushManager' in window && 'getKey' in PushSubscription.prototype); +const supportsPushNotifications = ("serviceWorker" in navigator && "PushManager" in window && "getKey" in PushSubscription.prototype); export function register () { return (dispatch, getState) => { dispatch(setBrowserSupport(supportsPushNotifications)); - const me = getState().getIn(['meta', 'me']); + const me = getState().getIn(["meta", "me"]); if (supportsPushNotifications) { if (!getApplicationServerKey()) { - console.error('The VAPID public key is not set. You will not be able to receive Web Push Notifications.'); + console.error("The VAPID public key is not set. You will not be able to receive Web Push Notifications."); return; } @@ -70,7 +70,7 @@ export function register () { // We have a subscription, check if it is still valid const currentServerKey = (new Uint8Array(subscription.options.applicationServerKey)).toString(); const subscriptionServerKey = urlBase64ToUint8Array(getApplicationServerKey()).toString(); - const serverEndpoint = getState().getIn(['push_notifications', 'subscription', 'endpoint']); + const serverEndpoint = getState().getIn(["push_notifications", "subscription", "endpoint"]); // If the VAPID public key did not change and the endpoint corresponds // to the endpoint saved in the backend, the subscription is valid @@ -98,10 +98,10 @@ export function register () { } }) .catch(error => { - if (error.code === 20 && error.name === 'AbortError') { - console.warn('Your browser supports Web Push Notifications, but does not seem to implement the VAPID protocol.'); - } else if (error.code === 5 && error.name === 'InvalidCharacterError') { - console.error('The VAPID public key seems to be invalid:', getApplicationServerKey()); + if (error.code === 20 && error.name === "AbortError") { + console.warn("Your browser supports Web Push Notifications, but does not seem to implement the VAPID protocol."); + } else if (error.code === 5 && error.name === "InvalidCharacterError") { + console.error("The VAPID public key seems to be invalid:", getApplicationServerKey()); } // Clear alerts and hide UI settings @@ -116,22 +116,22 @@ export function register () { }) .catch(console.warn); } else { - console.warn('Your browser does not support Web Push Notifications.'); + console.warn("Your browser does not support Web Push Notifications."); } }; } export function saveSettings() { return (_, getState) => { - const state = getState().get('push_notifications'); - const subscription = state.get('subscription'); - const alerts = state.get('alerts'); + const state = getState().get("push_notifications"); + const subscription = state.get("subscription"); + const alerts = state.get("alerts"); const data = { alerts }; - api(getState).put(`/api/web/push_subscriptions/${subscription.get('id')}`, { + api(getState).put(`/api/web/push_subscriptions/${subscription.get("id")}`, { data, }).then(() => { - const me = getState().getIn(['meta', 'me']); + const me = getState().getIn(["meta", "me"]); if (me) { pushNotificationsSetting.set(me, data); } diff --git a/app/javascript/flavours/glitch/actions/push_notifications/setter.js b/app/javascript/flavours/glitch/actions/push_notifications/setter.js index 5561766bf..b68d2976e 100644 --- a/app/javascript/flavours/glitch/actions/push_notifications/setter.js +++ b/app/javascript/flavours/glitch/actions/push_notifications/setter.js @@ -1,7 +1,7 @@ -export const SET_BROWSER_SUPPORT = 'PUSH_NOTIFICATIONS_SET_BROWSER_SUPPORT'; -export const SET_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_SET_SUBSCRIPTION'; -export const CLEAR_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_CLEAR_SUBSCRIPTION'; -export const SET_ALERTS = 'PUSH_NOTIFICATIONS_SET_ALERTS'; +export const SET_BROWSER_SUPPORT = "PUSH_NOTIFICATIONS_SET_BROWSER_SUPPORT"; +export const SET_SUBSCRIPTION = "PUSH_NOTIFICATIONS_SET_SUBSCRIPTION"; +export const CLEAR_SUBSCRIPTION = "PUSH_NOTIFICATIONS_CLEAR_SUBSCRIPTION"; +export const SET_ALERTS = "PUSH_NOTIFICATIONS_SET_ALERTS"; export function setBrowserSupport (value) { return { diff --git a/app/javascript/flavours/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js index 756b8cd05..f7fc6676c 100644 --- a/app/javascript/flavours/glitch/actions/reports.js +++ b/app/javascript/flavours/glitch/actions/reports.js @@ -1,29 +1,33 @@ -import api from '../api'; +import api from "../api"; -import { openModal } from './modal'; +import { openModal } from "./modal"; -export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST'; -export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS'; -export const REPORT_SUBMIT_FAIL = 'REPORT_SUBMIT_FAIL'; +export const REPORT_SUBMIT_REQUEST = "REPORT_SUBMIT_REQUEST"; +export const REPORT_SUBMIT_SUCCESS = "REPORT_SUBMIT_SUCCESS"; +export const REPORT_SUBMIT_FAIL = "REPORT_SUBMIT_FAIL"; export const initReport = (account, status) => dispatch => dispatch(openModal({ - modalType: 'REPORT', + modalType: "REPORT", modalProps: { - accountId: account.get('id'), - statusId: status?.get('id'), + accountId: account.get("id"), + statusId: status?.get("id"), }, })); export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => { dispatch(submitReportRequest()); - api(getState).post('/api/v1/reports', params).then(response => { + api(getState).post("/api/v1/reports", params).then(response => { dispatch(submitReportSuccess(response.data)); - if (onSuccess) onSuccess(); + if (onSuccess) { + onSuccess(); + } }).catch(error => { dispatch(submitReportFail(error)); - if (onFail) onFail(); + if (onFail) { + onFail(); + } }); }; diff --git a/app/javascript/flavours/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js index 5bb3aa3a7..1ef511ff2 100644 --- a/app/javascript/flavours/glitch/actions/search.js +++ b/app/javascript/flavours/glitch/actions/search.js @@ -1,25 +1,25 @@ -import { fromJS } from 'immutable'; +import { fromJS } from "immutable"; -import { searchHistory } from 'flavours/glitch/settings'; +import { searchHistory } from "flavours/glitch/settings"; -import api from '../api'; +import api from "../api"; -import { fetchRelationships } from './accounts'; -import { importFetchedAccounts, importFetchedStatuses } from './importer'; +import { fetchRelationships } from "./accounts"; +import { importFetchedAccounts, importFetchedStatuses } from "./importer"; -export const SEARCH_CHANGE = 'SEARCH_CHANGE'; -export const SEARCH_CLEAR = 'SEARCH_CLEAR'; -export const SEARCH_SHOW = 'SEARCH_SHOW'; +export const SEARCH_CHANGE = "SEARCH_CHANGE"; +export const SEARCH_CLEAR = "SEARCH_CLEAR"; +export const SEARCH_SHOW = "SEARCH_SHOW"; -export const SEARCH_FETCH_REQUEST = 'SEARCH_FETCH_REQUEST'; -export const SEARCH_FETCH_SUCCESS = 'SEARCH_FETCH_SUCCESS'; -export const SEARCH_FETCH_FAIL = 'SEARCH_FETCH_FAIL'; +export const SEARCH_FETCH_REQUEST = "SEARCH_FETCH_REQUEST"; +export const SEARCH_FETCH_SUCCESS = "SEARCH_FETCH_SUCCESS"; +export const SEARCH_FETCH_FAIL = "SEARCH_FETCH_FAIL"; -export const SEARCH_EXPAND_REQUEST = 'SEARCH_EXPAND_REQUEST'; -export const SEARCH_EXPAND_SUCCESS = 'SEARCH_EXPAND_SUCCESS'; -export const SEARCH_EXPAND_FAIL = 'SEARCH_EXPAND_FAIL'; +export const SEARCH_EXPAND_REQUEST = "SEARCH_EXPAND_REQUEST"; +export const SEARCH_EXPAND_SUCCESS = "SEARCH_EXPAND_SUCCESS"; +export const SEARCH_EXPAND_FAIL = "SEARCH_EXPAND_FAIL"; -export const SEARCH_HISTORY_UPDATE = 'SEARCH_HISTORY_UPDATE'; +export const SEARCH_HISTORY_UPDATE = "SEARCH_HISTORY_UPDATE"; export function changeSearch(value) { return { @@ -36,17 +36,17 @@ export function clearSearch() { export function submitSearch(type) { return (dispatch, getState) => { - const value = getState().getIn(['search', 'value']); - const signedIn = !!getState().getIn(['meta', 'me']); + const value = getState().getIn(["search", "value"]); + const signedIn = !!getState().getIn(["meta", "me"]); if (value.length === 0) { - dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '', type)); + dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, "", type)); return; } dispatch(fetchSearchRequest(type)); - api(getState).get('/api/v2/search', { + api(getState).get("/api/v2/search", { params: { q: value, resolve: signedIn, @@ -94,12 +94,12 @@ export function fetchSearchFail(error) { } export const expandSearch = type => (dispatch, getState) => { - const value = getState().getIn(['search', 'value']); - const offset = getState().getIn(['search', 'results', type]).size - 1; + const value = getState().getIn(["search", "value"]); + const offset = getState().getIn(["search", "results", type]).size - 1; dispatch(expandSearchRequest(type)); - api(getState).get('/api/v2/search', { + api(getState).get("/api/v2/search", { params: { q: value, type, @@ -144,8 +144,8 @@ export const showSearch = () => ({ }); export const openURL = routerHistory => (dispatch, getState) => { - const value = getState().getIn(['search', 'value']); - const signedIn = !!getState().getIn(['meta', 'me']); + const value = getState().getIn(["search", "value"]); + const signedIn = !!getState().getIn(["meta", "me"]); if (!signedIn) { return; @@ -153,7 +153,7 @@ export const openURL = routerHistory => (dispatch, getState) => { dispatch(fetchSearchRequest()); - api(getState).get('/api/v2/search', { params: { q: value, resolve: true } }).then(response => { + api(getState).get("/api/v2/search", { params: { q: value, resolve: true } }).then(response => { if (response.data.accounts?.length > 0) { dispatch(importFetchedAccounts(response.data.accounts)); routerHistory.push(`/@${response.data.accounts[0].acct}`); @@ -169,8 +169,8 @@ export const openURL = routerHistory => (dispatch, getState) => { }; export const clickSearchResult = (q, type) => (dispatch, getState) => { - const previous = getState().getIn(['search', 'recent']); - const me = getState().getIn(['meta', 'me']); + const previous = getState().getIn(["search", "recent"]); + const me = getState().getIn(["meta", "me"]); const current = previous.add(fromJS({ type, q })).takeLast(4); searchHistory.set(me, current.toJS()); @@ -178,9 +178,9 @@ export const clickSearchResult = (q, type) => (dispatch, getState) => { }; export const forgetSearchResult = q => (dispatch, getState) => { - const previous = getState().getIn(['search', 'recent']); - const me = getState().getIn(['meta', 'me']); - const current = previous.filterNot(result => result.get('q') === q); + const previous = getState().getIn(["search", "recent"]); + const me = getState().getIn(["meta", "me"]); + const current = previous.filterNot(result => result.get("q") === q); searchHistory.set(me, current.toJS()); dispatch(updateSearchHistory(current)); @@ -192,7 +192,7 @@ export const updateSearchHistory = recent => ({ }); export const hydrateSearch = () => (dispatch, getState) => { - const me = getState().getIn(['meta', 'me']); + const me = getState().getIn(["meta", "me"]); const history = searchHistory.get(me); if (history !== null) { diff --git a/app/javascript/flavours/glitch/actions/server.js b/app/javascript/flavours/glitch/actions/server.js index eb4c572a9..19b4d78bf 100644 --- a/app/javascript/flavours/glitch/actions/server.js +++ b/app/javascript/flavours/glitch/actions/server.js @@ -1,21 +1,21 @@ -import api from '../api'; +import api from "../api"; -import { importFetchedAccount } from './importer'; +import { importFetchedAccount } from "./importer"; -export const SERVER_FETCH_REQUEST = 'Server_FETCH_REQUEST'; -export const SERVER_FETCH_SUCCESS = 'Server_FETCH_SUCCESS'; -export const SERVER_FETCH_FAIL = 'Server_FETCH_FAIL'; +export const SERVER_FETCH_REQUEST = "Server_FETCH_REQUEST"; +export const SERVER_FETCH_SUCCESS = "Server_FETCH_SUCCESS"; +export const SERVER_FETCH_FAIL = "Server_FETCH_FAIL"; -export const EXTENDED_DESCRIPTION_REQUEST = 'EXTENDED_DESCRIPTION_REQUEST'; -export const EXTENDED_DESCRIPTION_SUCCESS = 'EXTENDED_DESCRIPTION_SUCCESS'; -export const EXTENDED_DESCRIPTION_FAIL = 'EXTENDED_DESCRIPTION_FAIL'; +export const EXTENDED_DESCRIPTION_REQUEST = "EXTENDED_DESCRIPTION_REQUEST"; +export const EXTENDED_DESCRIPTION_SUCCESS = "EXTENDED_DESCRIPTION_SUCCESS"; +export const EXTENDED_DESCRIPTION_FAIL = "EXTENDED_DESCRIPTION_FAIL"; -export const SERVER_DOMAIN_BLOCKS_FETCH_REQUEST = 'SERVER_DOMAIN_BLOCKS_FETCH_REQUEST'; -export const SERVER_DOMAIN_BLOCKS_FETCH_SUCCESS = 'SERVER_DOMAIN_BLOCKS_FETCH_SUCCESS'; -export const SERVER_DOMAIN_BLOCKS_FETCH_FAIL = 'SERVER_DOMAIN_BLOCKS_FETCH_FAIL'; +export const SERVER_DOMAIN_BLOCKS_FETCH_REQUEST = "SERVER_DOMAIN_BLOCKS_FETCH_REQUEST"; +export const SERVER_DOMAIN_BLOCKS_FETCH_SUCCESS = "SERVER_DOMAIN_BLOCKS_FETCH_SUCCESS"; +export const SERVER_DOMAIN_BLOCKS_FETCH_FAIL = "SERVER_DOMAIN_BLOCKS_FETCH_FAIL"; export const fetchServer = () => (dispatch, getState) => { - if (getState().getIn(['server', 'server', 'isLoading'])) { + if (getState().getIn(["server", "server", "isLoading"])) { return; } @@ -24,15 +24,19 @@ export const fetchServer = () => (dispatch, getState) => { /* global data */ try { api(getState) - .get('/api/v2/instance').then({ data }).catch(error => { + .get("/api/v2/instance").then({ data }).catch(error => { console.error(error); }); - if (data.contact.account) dispatch(importFetchedAccount(data.contact.account)); + if (data.contact.account) { + dispatch(importFetchedAccount(data.contact.account)); + } dispatch(fetchServerSuccess(data)); } catch (e) { api(getState) - .get('/api/v1/instance').then(({ data }) => { - if (data.contact_account) dispatch(importFetchedAccount(data.contact_account)); + .get("/api/v1/instance").then(({ data }) => { + if (data.contact_account) { + dispatch(importFetchedAccount(data.contact_account)); + } dispatch(fetchServerSuccess(data)); }).catch(err => dispatch(fetchServerFail(err))); } @@ -53,14 +57,14 @@ const fetchServerFail = error => ({ }); export const fetchDomainBlocks = () => (dispatch, getState) => { - if (getState().getIn(['server', 'domainBlocks', 'isLoading'])) { + if (getState().getIn(["server", "domainBlocks", "isLoading"])) { return; } dispatch(fetchDomainBlocksRequest()); api(getState) - .get('/api/v1/instance/domain_blocks') + .get("/api/v1/instance/domain_blocks") .then(({ data }) => dispatch(fetchDomainBlocksSuccess(true, data))) .catch(err => { if (err.response.status === 404) { diff --git a/app/javascript/flavours/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js index 6c3e0b52c..b115bbc94 100644 --- a/app/javascript/flavours/glitch/actions/settings.js +++ b/app/javascript/flavours/glitch/actions/settings.js @@ -1,7 +1,7 @@ -import { debounce } from 'lodash'; +import { debounce } from "lodash"; -export const SETTING_CHANGE = 'SETTING_CHANGE'; -export const SETTING_SAVE = 'SETTING_SAVE'; +export const SETTING_CHANGE = "SETTING_CHANGE"; +export const SETTING_SAVE = "SETTING_SAVE"; export function changeSetting(path, value) { return dispatch => { @@ -16,13 +16,13 @@ export function changeSetting(path, value) { } const debouncedSave = debounce((dispatch, getState) => { - if (getState().getIn(['settings', 'saved'])) { + if (getState().getIn(["settings", "saved"])) { return; } - const data = getState().get('settings').filter((_, path) => path !== 'saved').toJS(); + const data = getState().get("settings").filter((_, path) => path !== "saved").toJS(); - localStorage.setItem('web_settings', JSON.stringify(data)); + localStorage.setItem("web_settings", JSON.stringify(data)); dispatch({ type: SETTING_SAVE }); }, 5000, { trailing: true }); diff --git a/app/javascript/flavours/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js index 5bdd31c34..056493023 100644 --- a/app/javascript/flavours/glitch/actions/statuses.js +++ b/app/javascript/flavours/glitch/actions/statuses.js @@ -1,43 +1,43 @@ -import api from '../api'; +import api from "../api"; -import { ensureComposeIsVisible, setComposeToStatus } from './compose'; -import { importFetchedStatus, importFetchedStatuses } from './importer'; -import { deleteFromTimelines } from './timelines'; +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'; -export const STATUS_FETCH_FAIL = 'STATUS_FETCH_FAIL'; +export const STATUS_FETCH_REQUEST = "STATUS_FETCH_REQUEST"; +export const STATUS_FETCH_SUCCESS = "STATUS_FETCH_SUCCESS"; +export const STATUS_FETCH_FAIL = "STATUS_FETCH_FAIL"; -export const STATUS_DELETE_REQUEST = 'STATUS_DELETE_REQUEST'; -export const STATUS_DELETE_SUCCESS = 'STATUS_DELETE_SUCCESS'; -export const STATUS_DELETE_FAIL = 'STATUS_DELETE_FAIL'; +export const STATUS_DELETE_REQUEST = "STATUS_DELETE_REQUEST"; +export const STATUS_DELETE_SUCCESS = "STATUS_DELETE_SUCCESS"; +export const STATUS_DELETE_FAIL = "STATUS_DELETE_FAIL"; -export const CONTEXT_FETCH_REQUEST = 'CONTEXT_FETCH_REQUEST'; -export const CONTEXT_FETCH_SUCCESS = 'CONTEXT_FETCH_SUCCESS'; -export const CONTEXT_FETCH_FAIL = 'CONTEXT_FETCH_FAIL'; +export const CONTEXT_FETCH_REQUEST = "CONTEXT_FETCH_REQUEST"; +export const CONTEXT_FETCH_SUCCESS = "CONTEXT_FETCH_SUCCESS"; +export const CONTEXT_FETCH_FAIL = "CONTEXT_FETCH_FAIL"; -export const STATUS_MUTE_REQUEST = 'STATUS_MUTE_REQUEST'; -export const STATUS_MUTE_SUCCESS = 'STATUS_MUTE_SUCCESS'; -export const STATUS_MUTE_FAIL = 'STATUS_MUTE_FAIL'; +export const STATUS_MUTE_REQUEST = "STATUS_MUTE_REQUEST"; +export const STATUS_MUTE_SUCCESS = "STATUS_MUTE_SUCCESS"; +export const STATUS_MUTE_FAIL = "STATUS_MUTE_FAIL"; -export const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST'; -export const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS'; -export const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL'; +export const STATUS_UNMUTE_REQUEST = "STATUS_UNMUTE_REQUEST"; +export const STATUS_UNMUTE_SUCCESS = "STATUS_UNMUTE_SUCCESS"; +export const STATUS_UNMUTE_FAIL = "STATUS_UNMUTE_FAIL"; -export const STATUS_REVEAL = 'STATUS_REVEAL'; -export const STATUS_HIDE = 'STATUS_HIDE'; -export const STATUS_COLLAPSE = 'STATUS_COLLAPSE'; +export const STATUS_REVEAL = "STATUS_REVEAL"; +export const STATUS_HIDE = "STATUS_HIDE"; +export const STATUS_COLLAPSE = "STATUS_COLLAPSE"; -export const REDRAFT = 'REDRAFT'; +export const REDRAFT = "REDRAFT"; -export const STATUS_FETCH_SOURCE_REQUEST = 'STATUS_FETCH_SOURCE_REQUEST'; -export const STATUS_FETCH_SOURCE_SUCCESS = 'STATUS_FETCH_SOURCE_SUCCESS'; -export const STATUS_FETCH_SOURCE_FAIL = 'STATUS_FETCH_SOURCE_FAIL'; +export const STATUS_FETCH_SOURCE_REQUEST = "STATUS_FETCH_SOURCE_REQUEST"; +export const STATUS_FETCH_SOURCE_SUCCESS = "STATUS_FETCH_SOURCE_SUCCESS"; +export const STATUS_FETCH_SOURCE_FAIL = "STATUS_FETCH_SOURCE_FAIL"; -export const STATUS_TRANSLATE_REQUEST = 'STATUS_TRANSLATE_REQUEST'; -export const STATUS_TRANSLATE_SUCCESS = 'STATUS_TRANSLATE_SUCCESS'; -export const STATUS_TRANSLATE_FAIL = 'STATUS_TRANSLATE_FAIL'; -export const STATUS_TRANSLATE_UNDO = 'STATUS_TRANSLATE_UNDO'; +export const STATUS_TRANSLATE_REQUEST = "STATUS_TRANSLATE_REQUEST"; +export const STATUS_TRANSLATE_SUCCESS = "STATUS_TRANSLATE_SUCCESS"; +export const STATUS_TRANSLATE_FAIL = "STATUS_TRANSLATE_FAIL"; +export const STATUS_TRANSLATE_UNDO = "STATUS_TRANSLATE_UNDO"; export function fetchStatusRequest(id, skipLoading) { return { @@ -49,7 +49,7 @@ export function fetchStatusRequest(id, skipLoading) { export function fetchStatus(id, forceFetch = false) { return (dispatch, getState) => { - const skipLoading = !forceFetch && getState().getIn(['statuses', id], null) !== null; + const skipLoading = !forceFetch && getState().getIn(["statuses", id], null) !== null; dispatch(fetchContext(id)); @@ -95,10 +95,10 @@ export function redraft(status, raw_text, content_type) { } export const editStatus = (id, routerHistory) => (dispatch, getState) => { - let status = getState().getIn(['statuses', id]); + let status = getState().getIn(["statuses", id]); - if (status.get('poll')) { - status = status.set('poll', getState().getIn(['polls', status.get('poll')])); + if (status.get("poll")) { + status = status.set("poll", getState().getIn(["polls", status.get("poll")])); } dispatch(fetchStatusSourceRequest()); @@ -127,10 +127,10 @@ export const fetchStatusSourceFail = error => ({ export function deleteStatus(id, routerHistory, withRedraft = false) { return (dispatch, getState) => { - let status = getState().getIn(['statuses', id]); + let status = getState().getIn(["statuses", id]); - if (status.get('poll')) { - status = status.set('poll', getState().getIn(['polls', status.get('poll')])); + if (status.get("poll")) { + status = status.set("poll", getState().getIn(["polls", status.get("poll")])); } dispatch(deleteStatusRequest(id)); diff --git a/app/javascript/flavours/glitch/actions/store.js b/app/javascript/flavours/glitch/actions/store.js index da07142b3..7a8b0a12f 100644 --- a/app/javascript/flavours/glitch/actions/store.js +++ b/app/javascript/flavours/glitch/actions/store.js @@ -1,12 +1,12 @@ -import { Iterable, fromJS } from 'immutable'; +import { Iterable, fromJS } from "immutable"; -import { hydrateCompose } from './compose'; -import { importFetchedAccounts } from './importer'; -import { hydrateSearch } from './search'; -import { saveSettings } from './settings'; +import { hydrateCompose } from "./compose"; +import { importFetchedAccounts } from "./importer"; +import { hydrateSearch } from "./search"; +import { saveSettings } from "./settings"; -export const STORE_HYDRATE = 'STORE_HYDRATE'; -export const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY'; +export const STORE_HYDRATE = "STORE_HYDRATE"; +export const STORE_HYDRATE_LAZY = "STORE_HYDRATE_LAZY"; const convertState = rawState => fromJS(rawState, (k, v) => @@ -15,12 +15,12 @@ const convertState = rawState => const applyMigrations = (state) => { return state.withMutations(state => { // Migrate glitch-soc local-only “Show unread marker” setting to Mastodon's setting - if (state.getIn(['local_settings', 'notifications', 'show_unread']) !== undefined) { + if (state.getIn(["local_settings", "notifications", "show_unread"]) !== undefined) { // Only change if the Mastodon setting does not deviate from default - if (state.getIn(['settings', 'notifications', 'showUnread']) !== false) { - state.setIn(['settings', 'notifications', 'showUnread'], state.getIn(['local_settings', 'notifications', 'show_unread'])); + if (state.getIn(["settings", "notifications", "showUnread"]) !== false) { + state.setIn(["settings", "notifications", "showUnread"], state.getIn(["local_settings", "notifications", "show_unread"])); } - state.removeIn(['local_settings', 'notifications', 'show_unread']); + state.removeIn(["local_settings", "notifications", "show_unread"]); } }); }; diff --git a/app/javascript/flavours/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js index f1c44d2e2..c8f3a022d 100644 --- a/app/javascript/flavours/glitch/actions/streaming.js +++ b/app/javascript/flavours/glitch/actions/streaming.js @@ -1,18 +1,18 @@ // @ts-check -import { getLocale } from 'flavours/glitch/locales'; +import { getLocale } from "flavours/glitch/locales"; -import { connectStream } from '../stream'; +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'; +} from "./announcements"; +import { updateConversations } from "./conversations"; +import { updateNotifications, expandNotifications } from "./notifications"; +import { updateStatus } from "./statuses"; import { updateTimeline, deleteFromTimelines, @@ -23,7 +23,7 @@ import { fillPublicTimelineGaps, fillCommunityTimelineGaps, fillListTimelineGaps, -} from './timelines'; +} from "./timelines"; /** * @param {number} max @@ -46,7 +46,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti const { messages } = getLocale(); return connectStream(channelName, params, (dispatch, getState) => { - const locale = getState().getIn(['meta', 'locale']); + const locale = getState().getIn(["meta", "locale"]); // @ts-expect-error let pollingId; @@ -57,7 +57,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti const useFallback = fallback => { fallback(dispatch, () => { - // eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook + // eslint-disable-next-line react-hooks/rules-of-hooks pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000)); }); }; @@ -88,36 +88,36 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti onReceive (data) { switch(data.event) { - case 'update': + case "update": // @ts-expect-error - dispatch(updateTimeline(timelineId, JSON.parse(data.payload), options.accept)); - break; - case 'status.update': + dispatch(updateTimeline(timelineId, JSON.parse(data.payload), options.accept)); + break; + case "status.update": // @ts-expect-error - dispatch(updateStatus(JSON.parse(data.payload))); - break; - case 'delete': - dispatch(deleteFromTimelines(data.payload)); - break; - case 'notification': + dispatch(updateStatus(JSON.parse(data.payload))); + break; + case "delete": + dispatch(deleteFromTimelines(data.payload)); + break; + case "notification": // @ts-expect-error - dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); - break; - case 'conversation': + dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); + break; + case "conversation": // @ts-expect-error - dispatch(updateConversations(JSON.parse(data.payload))); - break; - case 'announcement': + dispatch(updateConversations(JSON.parse(data.payload))); + break; + case "announcement": // @ts-expect-error - dispatch(updateAnnouncements(JSON.parse(data.payload))); - break; - case 'announcement.reaction': + dispatch(updateAnnouncements(JSON.parse(data.payload))); + break; + case "announcement.reaction": // @ts-expect-error - dispatch(updateAnnouncementsReaction(JSON.parse(data.payload))); - break; - case 'announcement.delete': - dispatch(deleteAnnouncement(data.payload)); - break; + dispatch(updateAnnouncementsReaction(JSON.parse(data.payload))); + break; + case "announcement.delete": + dispatch(deleteAnnouncement(data.payload)); + break; } }, }; @@ -129,9 +129,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti * @param {function(): void} done */ const refreshHomeTimelineAndNotification = (dispatch, done) => { - // @ts-expect-error dispatch(expandHomeTimeline({}, () => - // @ts-expect-error dispatch(expandNotifications({}, () => dispatch(fetchAnnouncements(done)))))); }; @@ -141,7 +139,7 @@ const refreshHomeTimelineAndNotification = (dispatch, done) => { */ export const connectUserStream = () => // @ts-expect-error - connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps }); + connectTimelineStream("home", "user", {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps }); /** * @param {Object} options @@ -149,7 +147,7 @@ export const connectUserStream = () => * @returns {function(): void} */ export const connectCommunityStream = ({ onlyMedia } = {}) => - connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`, {}, { fillGaps: () => (fillCommunityTimelineGaps({ onlyMedia })) }); + connectTimelineStream(`community${onlyMedia ? ":media" : ""}`, `public:local${onlyMedia ? ":media" : ""}`, {}, { fillGaps: () => (fillCommunityTimelineGaps({ onlyMedia })) }); /** * @param {Object} options @@ -159,7 +157,7 @@ export const connectCommunityStream = ({ onlyMedia } = {}) => * @returns {function(): void} */ export const connectPublicStream = ({ onlyMedia, onlyRemote, allowLocalOnly } = {}) => - connectTimelineStream(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, {}, { fillGaps: () => fillPublicTimelineGaps({ onlyMedia, onlyRemote, allowLocalOnly }) }); + connectTimelineStream(`public${onlyRemote ? ":remote" : (allowLocalOnly ? ":allow_local_only" : "")}${onlyMedia ? ":media" : ""}`, `public${onlyRemote ? ":remote" : (allowLocalOnly ? ":allow_local_only" : "")}${onlyMedia ? ":media" : ""}`, {}, { fillGaps: () => fillPublicTimelineGaps({ onlyMedia, onlyRemote, allowLocalOnly }) }); /** * @param {string} columnId @@ -169,17 +167,17 @@ export const connectPublicStream = ({ onlyMedia, onlyRemote, allowLocalOnly } = * @returns {function(): void} */ export const connectHashtagStream = (columnId, tagName, onlyLocal, accept) => - connectTimelineStream(`hashtag:${columnId}${onlyLocal ? ':local' : ''}`, `hashtag${onlyLocal ? ':local' : ''}`, { tag: tagName }, { accept }); + connectTimelineStream(`hashtag:${columnId}${onlyLocal ? ":local" : ""}`, `hashtag${onlyLocal ? ":local" : ""}`, { tag: tagName }, { accept }); /** * @returns {function(): void} */ export const connectDirectStream = () => - connectTimelineStream('direct', 'direct'); + connectTimelineStream("direct", "direct"); /** * @param {string} listId * @returns {function(): void} */ export const connectListStream = listId => - connectTimelineStream(`list:${listId}`, 'list', { list: listId }, { fillGaps: () => fillListTimelineGaps(listId) }); + connectTimelineStream(`list:${listId}`, "list", { list: listId }, { fillGaps: () => fillListTimelineGaps(listId) }); diff --git a/app/javascript/flavours/glitch/actions/suggestions.js b/app/javascript/flavours/glitch/actions/suggestions.js index 870a31102..5af0ca77c 100644 --- a/app/javascript/flavours/glitch/actions/suggestions.js +++ b/app/javascript/flavours/glitch/actions/suggestions.js @@ -1,19 +1,19 @@ -import api from '../api'; +import api from "../api"; -import { fetchRelationships } from './accounts'; -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'; -export const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL'; +export const SUGGESTIONS_FETCH_REQUEST = "SUGGESTIONS_FETCH_REQUEST"; +export const SUGGESTIONS_FETCH_SUCCESS = "SUGGESTIONS_FETCH_SUCCESS"; +export const SUGGESTIONS_FETCH_FAIL = "SUGGESTIONS_FETCH_FAIL"; -export const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS'; +export const SUGGESTIONS_DISMISS = "SUGGESTIONS_DISMISS"; export function fetchSuggestions(withRelationships = false) { return (dispatch, getState) => { dispatch(fetchSuggestionsRequest()); - api(getState).get('/api/v2/suggestions', { params: { limit: 20 } }).then(response => { + api(getState).get("/api/v2/suggestions", { params: { limit: 20 } }).then(response => { dispatch(importFetchedAccounts(response.data.map(x => x.account))); dispatch(fetchSuggestionsSuccess(response.data)); @@ -57,7 +57,7 @@ export const dismissSuggestion = accountId => (dispatch, getState) => { api(getState).delete(`/api/v1/suggestions/${accountId}`).then(() => { dispatch(fetchSuggestionsRequest()); - api(getState).get('/api/v2/suggestions').then(response => { + api(getState).get("/api/v2/suggestions").then(response => { dispatch(importFetchedAccounts(response.data.map(x => x.account))); dispatch(fetchSuggestionsSuccess(response.data)); }).catch(error => dispatch(fetchSuggestionsFail(error))); diff --git a/app/javascript/flavours/glitch/actions/tags.js b/app/javascript/flavours/glitch/actions/tags.js index dda8c924b..09ecb7d9e 100644 --- a/app/javascript/flavours/glitch/actions/tags.js +++ b/app/javascript/flavours/glitch/actions/tags.js @@ -1,24 +1,24 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -export const HASHTAG_FETCH_REQUEST = 'HASHTAG_FETCH_REQUEST'; -export const HASHTAG_FETCH_SUCCESS = 'HASHTAG_FETCH_SUCCESS'; -export const HASHTAG_FETCH_FAIL = 'HASHTAG_FETCH_FAIL'; +export const HASHTAG_FETCH_REQUEST = "HASHTAG_FETCH_REQUEST"; +export const HASHTAG_FETCH_SUCCESS = "HASHTAG_FETCH_SUCCESS"; +export const HASHTAG_FETCH_FAIL = "HASHTAG_FETCH_FAIL"; -export const FOLLOWED_HASHTAGS_FETCH_REQUEST = 'FOLLOWED_HASHTAGS_FETCH_REQUEST'; -export const FOLLOWED_HASHTAGS_FETCH_SUCCESS = 'FOLLOWED_HASHTAGS_FETCH_SUCCESS'; -export const FOLLOWED_HASHTAGS_FETCH_FAIL = 'FOLLOWED_HASHTAGS_FETCH_FAIL'; +export const FOLLOWED_HASHTAGS_FETCH_REQUEST = "FOLLOWED_HASHTAGS_FETCH_REQUEST"; +export const FOLLOWED_HASHTAGS_FETCH_SUCCESS = "FOLLOWED_HASHTAGS_FETCH_SUCCESS"; +export const FOLLOWED_HASHTAGS_FETCH_FAIL = "FOLLOWED_HASHTAGS_FETCH_FAIL"; -export const FOLLOWED_HASHTAGS_EXPAND_REQUEST = 'FOLLOWED_HASHTAGS_EXPAND_REQUEST'; -export const FOLLOWED_HASHTAGS_EXPAND_SUCCESS = 'FOLLOWED_HASHTAGS_EXPAND_SUCCESS'; -export const FOLLOWED_HASHTAGS_EXPAND_FAIL = 'FOLLOWED_HASHTAGS_EXPAND_FAIL'; +export const FOLLOWED_HASHTAGS_EXPAND_REQUEST = "FOLLOWED_HASHTAGS_EXPAND_REQUEST"; +export const FOLLOWED_HASHTAGS_EXPAND_SUCCESS = "FOLLOWED_HASHTAGS_EXPAND_SUCCESS"; +export const FOLLOWED_HASHTAGS_EXPAND_FAIL = "FOLLOWED_HASHTAGS_EXPAND_FAIL"; -export const HASHTAG_FOLLOW_REQUEST = 'HASHTAG_FOLLOW_REQUEST'; -export const HASHTAG_FOLLOW_SUCCESS = 'HASHTAG_FOLLOW_SUCCESS'; -export const HASHTAG_FOLLOW_FAIL = 'HASHTAG_FOLLOW_FAIL'; +export const HASHTAG_FOLLOW_REQUEST = "HASHTAG_FOLLOW_REQUEST"; +export const HASHTAG_FOLLOW_SUCCESS = "HASHTAG_FOLLOW_SUCCESS"; +export const HASHTAG_FOLLOW_FAIL = "HASHTAG_FOLLOW_FAIL"; -export const HASHTAG_UNFOLLOW_REQUEST = 'HASHTAG_UNFOLLOW_REQUEST'; -export const HASHTAG_UNFOLLOW_SUCCESS = 'HASHTAG_UNFOLLOW_SUCCESS'; -export const HASHTAG_UNFOLLOW_FAIL = 'HASHTAG_UNFOLLOW_FAIL'; +export const HASHTAG_UNFOLLOW_REQUEST = "HASHTAG_UNFOLLOW_REQUEST"; +export const HASHTAG_UNFOLLOW_SUCCESS = "HASHTAG_UNFOLLOW_SUCCESS"; +export const HASHTAG_UNFOLLOW_FAIL = "HASHTAG_UNFOLLOW_FAIL"; export const fetchHashtag = name => (dispatch, getState) => { dispatch(fetchHashtagRequest()); @@ -48,8 +48,8 @@ export const fetchHashtagFail = error => ({ export const fetchFollowedHashtags = () => (dispatch, getState) => { dispatch(fetchFollowedHashtagsRequest()); - api(getState).get('/api/v1/followed_tags').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/followed_tags").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(fetchFollowedHashtagsSuccess(response.data, next ? next.uri : null)); }).catch(err => { dispatch(fetchFollowedHashtagsFail(err)); @@ -79,7 +79,7 @@ export function fetchFollowedHashtagsFail(error) { export function expandFollowedHashtags() { return (dispatch, getState) => { - const url = getState().getIn(['followed_tags', 'next']); + const url = getState().getIn(["followed_tags", "next"]); if (url === null) { return; @@ -88,7 +88,7 @@ export function expandFollowedHashtags() { dispatch(expandFollowedHashtagsRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(expandFollowedHashtagsSuccess(response.data, next ? next.uri : null)); }).catch(error => { dispatch(expandFollowedHashtagsFail(error)); diff --git a/app/javascript/flavours/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js index fa69bca98..b355ad298 100644 --- a/app/javascript/flavours/glitch/actions/timelines.js +++ b/app/javascript/flavours/glitch/actions/timelines.js @@ -1,27 +1,27 @@ -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +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 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'; +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'; +export const TIMELINE_UPDATE = "TIMELINE_UPDATE"; +export const TIMELINE_DELETE = "TIMELINE_DELETE"; +export const TIMELINE_CLEAR = "TIMELINE_CLEAR"; -export const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST'; -export const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS'; -export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL'; +export const TIMELINE_EXPAND_REQUEST = "TIMELINE_EXPAND_REQUEST"; +export const TIMELINE_EXPAND_SUCCESS = "TIMELINE_EXPAND_SUCCESS"; +export const TIMELINE_EXPAND_FAIL = "TIMELINE_EXPAND_FAIL"; -export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP'; -export const TIMELINE_LOAD_PENDING = 'TIMELINE_LOAD_PENDING'; -export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'; -export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'; +export const TIMELINE_SCROLL_TOP = "TIMELINE_SCROLL_TOP"; +export const TIMELINE_LOAD_PENDING = "TIMELINE_LOAD_PENDING"; +export const TIMELINE_DISCONNECT = "TIMELINE_DISCONNECT"; +export const TIMELINE_CONNECT = "TIMELINE_CONNECT"; -export const TIMELINE_MARK_AS_PARTIAL = 'TIMELINE_MARK_AS_PARTIAL'; +export const TIMELINE_MARK_AS_PARTIAL = "TIMELINE_MARK_AS_PARTIAL"; export const loadPending = timeline => ({ type: TIMELINE_LOAD_PENDING, @@ -30,11 +30,11 @@ export const loadPending = timeline => ({ export function updateTimeline(timeline, status, accept) { return (dispatch, getState) => { - if (typeof accept === 'function' && !accept(status)) { + if (typeof accept === "function" && !accept(status)) { return; } - if (getState().getIn(['timelines', timeline, 'isPartial'])) { + if (getState().getIn(["timelines", timeline, "isPartial"])) { // Prevent new items from being added to a partial timeline, // since it will be reloaded anyway @@ -60,7 +60,7 @@ export function updateTimeline(timeline, status, accept) { filtered, }); - if (timeline === 'home') { + if (timeline === "home") { dispatch(submitMarkers()); } }; @@ -68,9 +68,9 @@ export function updateTimeline(timeline, status, accept) { export function deleteFromTimelines(id) { return (dispatch, getState) => { - const accountId = getState().getIn(['statuses', id, 'account']); - const references = getState().get('statuses').filter(status => status.get('reblog') === id).map(status => status.get('id')); - const reblogOf = getState().getIn(['statuses', id, 'reblog'], null); + const accountId = getState().getIn(["statuses", id, "account"]); + const references = getState().get("statuses").filter(status => status.get("reblog") === id).map(status => status.get("id")); + const reblogOf = getState().getIn(["statuses", id, "reblog"], null); dispatch({ type: TIMELINE_DELETE, @@ -98,17 +98,17 @@ const parseTags = (tags = {}, mode) => { export function expandTimeline(timelineId, path, params = {}, done = noOp) { return (dispatch, getState) => { - const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); + const timeline = getState().getIn(["timelines", timelineId], ImmutableMap()); const isLoadingMore = !!params.max_id; - if (timeline.get('isLoading')) { + if (timeline.get("isLoading")) { done(); return; } - if (!params.max_id && !params.pinned && (timeline.get('items', ImmutableList()).size + timeline.get('pendingItems', ImmutableList()).size) > 0) { - const a = timeline.getIn(['pendingItems', 0]); - const b = timeline.getIn(['items', 0]); + if (!params.max_id && !params.pinned && (timeline.get("items", ImmutableList()).size + timeline.get("pendingItems", ImmutableList()).size) > 0) { + const a = timeline.getIn(["pendingItems", 0]); + const b = timeline.getIn(["items", 0]); if (a && b && compareId(a, b) > 0) { params.since_id = a; @@ -122,11 +122,11 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { dispatch(expandTimelineRequest(timelineId, isLoadingMore)); api(getState).get(path, { params }).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore, isLoadingRecent && preferPendingItems)); - if (timelineId === 'home') { + if (timelineId === "home") { dispatch(submitMarkers()); } }).catch(error => { @@ -139,8 +139,8 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) { return (dispatch, getState) => { - const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); - const items = timeline.get('items'); + const timeline = getState().getIn(["timelines", timelineId], ImmutableMap()); + const items = timeline.get("items"); const nullIndexes = items.map((statusId, index) => statusId === null ? index : null); const gaps = nullIndexes.map(index => index > 0 ? items.get(index - 1) : null); @@ -153,27 +153,27 @@ export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) { }; } -export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }, done); -export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => expandTimeline(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, allow_local_only: !!allowLocalOnly, max_id: maxId, only_media: !!onlyMedia }, done); -export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }, done); -export const expandDirectTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('direct', '/api/v1/timelines/direct', { max_id: maxId }, done); -export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, exclude_reblogs: withReplies, tagged, max_id: maxId }); +export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => expandTimeline("home", "/api/v1/timelines/home", { max_id: maxId }, done); +export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => expandTimeline(`public${onlyRemote ? ":remote" : (allowLocalOnly ? ":allow_local_only" : "")}${onlyMedia ? ":media" : ""}`, "/api/v1/timelines/public", { remote: !!onlyRemote, allow_local_only: !!allowLocalOnly, max_id: maxId, only_media: !!onlyMedia }, done); +export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ":media" : ""}`, "/api/v1/timelines/public", { local: true, max_id: maxId, only_media: !!onlyMedia }, done); +export const expandDirectTimeline = ({ maxId } = {}, done = noOp) => expandTimeline("direct", "/api/v1/timelines/direct", { max_id: maxId }, done); +export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ":with_replies" : ""}${tagged ? `:${tagged}` : ""}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, exclude_reblogs: withReplies, tagged, max_id: maxId }); export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => { - return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { + return expandTimeline(`hashtag:${hashtag}${local ? ":local" : ""}`, `/api/v1/timelines/tag/${hashtag}`, { max_id: maxId, - any: parseTags(tags, 'any'), - all: parseTags(tags, 'all'), - none: parseTags(tags, 'none'), + any: parseTags(tags, "any"), + all: parseTags(tags, "all"), + none: parseTags(tags, "none"), local: local, }, done); }; -export const fillHomeTimelineGaps = (done = noOp) => fillTimelineGaps('home', '/api/v1/timelines/home', {}, done); -export const fillPublicTimelineGaps = ({ onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => fillTimelineGaps(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, only_media: !!onlyMedia, allow_local_only: !!allowLocalOnly }, done); -export const fillCommunityTimelineGaps = ({ onlyMedia } = {}, done = noOp) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia }, done); +export const fillHomeTimelineGaps = (done = noOp) => fillTimelineGaps("home", "/api/v1/timelines/home", {}, done); +export const fillPublicTimelineGaps = ({ onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => fillTimelineGaps(`public${onlyRemote ? ":remote" : (allowLocalOnly ? ":allow_local_only" : "")}${onlyMedia ? ":media" : ""}`, "/api/v1/timelines/public", { remote: !!onlyRemote, only_media: !!onlyMedia, allow_local_only: !!allowLocalOnly }, done); +export const fillCommunityTimelineGaps = ({ onlyMedia } = {}, done = noOp) => fillTimelineGaps(`community${onlyMedia ? ":media" : ""}`, "/api/v1/timelines/public", { local: true, only_media: !!onlyMedia }, done); export const fillListTimelineGaps = (id, done = noOp) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {}, done); export function expandTimelineRequest(timeline, isLoadingMore) { @@ -203,7 +203,7 @@ export function expandTimelineFail(timeline, error, isLoadingMore) { timeline, error, skipLoading: !isLoadingMore, - skipNotFound: timeline.startsWith('account:'), + skipNotFound: timeline.startsWith("account:"), }; } diff --git a/app/javascript/flavours/glitch/actions/trends.js b/app/javascript/flavours/glitch/actions/trends.js index d31442388..6e72cd6c4 100644 --- a/app/javascript/flavours/glitch/actions/trends.js +++ b/app/javascript/flavours/glitch/actions/trends.js @@ -1,28 +1,28 @@ -import api, { getLinks } from '../api'; +import api, { getLinks } from "../api"; -import { importFetchedStatuses } from './importer'; +import { importFetchedStatuses } from "./importer"; -export const TRENDS_TAGS_FETCH_REQUEST = 'TRENDS_TAGS_FETCH_REQUEST'; -export const TRENDS_TAGS_FETCH_SUCCESS = 'TRENDS_TAGS_FETCH_SUCCESS'; -export const TRENDS_TAGS_FETCH_FAIL = 'TRENDS_TAGS_FETCH_FAIL'; +export const TRENDS_TAGS_FETCH_REQUEST = "TRENDS_TAGS_FETCH_REQUEST"; +export const TRENDS_TAGS_FETCH_SUCCESS = "TRENDS_TAGS_FETCH_SUCCESS"; +export const TRENDS_TAGS_FETCH_FAIL = "TRENDS_TAGS_FETCH_FAIL"; -export const TRENDS_LINKS_FETCH_REQUEST = 'TRENDS_LINKS_FETCH_REQUEST'; -export const TRENDS_LINKS_FETCH_SUCCESS = 'TRENDS_LINKS_FETCH_SUCCESS'; -export const TRENDS_LINKS_FETCH_FAIL = 'TRENDS_LINKS_FETCH_FAIL'; +export const TRENDS_LINKS_FETCH_REQUEST = "TRENDS_LINKS_FETCH_REQUEST"; +export const TRENDS_LINKS_FETCH_SUCCESS = "TRENDS_LINKS_FETCH_SUCCESS"; +export const TRENDS_LINKS_FETCH_FAIL = "TRENDS_LINKS_FETCH_FAIL"; -export const TRENDS_STATUSES_FETCH_REQUEST = 'TRENDS_STATUSES_FETCH_REQUEST'; -export const TRENDS_STATUSES_FETCH_SUCCESS = 'TRENDS_STATUSES_FETCH_SUCCESS'; -export const TRENDS_STATUSES_FETCH_FAIL = 'TRENDS_STATUSES_FETCH_FAIL'; +export const TRENDS_STATUSES_FETCH_REQUEST = "TRENDS_STATUSES_FETCH_REQUEST"; +export const TRENDS_STATUSES_FETCH_SUCCESS = "TRENDS_STATUSES_FETCH_SUCCESS"; +export const TRENDS_STATUSES_FETCH_FAIL = "TRENDS_STATUSES_FETCH_FAIL"; -export const TRENDS_STATUSES_EXPAND_REQUEST = 'TRENDS_STATUSES_EXPAND_REQUEST'; -export const TRENDS_STATUSES_EXPAND_SUCCESS = 'TRENDS_STATUSES_EXPAND_SUCCESS'; -export const TRENDS_STATUSES_EXPAND_FAIL = 'TRENDS_STATUSES_EXPAND_FAIL'; +export const TRENDS_STATUSES_EXPAND_REQUEST = "TRENDS_STATUSES_EXPAND_REQUEST"; +export const TRENDS_STATUSES_EXPAND_SUCCESS = "TRENDS_STATUSES_EXPAND_SUCCESS"; +export const TRENDS_STATUSES_EXPAND_FAIL = "TRENDS_STATUSES_EXPAND_FAIL"; export const fetchTrendingHashtags = () => (dispatch, getState) => { dispatch(fetchTrendingHashtagsRequest()); api(getState) - .get('/api/v1/trends/tags') + .get("/api/v1/trends/tags") .then(({ data }) => dispatch(fetchTrendingHashtagsSuccess(data))) .catch(err => dispatch(fetchTrendingHashtagsFail(err))); }; @@ -49,7 +49,7 @@ export const fetchTrendingLinks = () => (dispatch, getState) => { dispatch(fetchTrendingLinksRequest()); api(getState) - .get('/api/v1/trends/links') + .get("/api/v1/trends/links") .then(({ data }) => dispatch(fetchTrendingLinksSuccess(data))) .catch(err => dispatch(fetchTrendingLinksFail(err))); }; @@ -73,14 +73,14 @@ export const fetchTrendingLinksFail = error => ({ }); export const fetchTrendingStatuses = () => (dispatch, getState) => { - if (getState().getIn(['status_lists', 'trending', 'isLoading'])) { + if (getState().getIn(["status_lists", "trending", "isLoading"])) { return; } dispatch(fetchTrendingStatusesRequest()); - api(getState).get('/api/v1/trends/statuses').then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + api(getState).get("/api/v1/trends/statuses").then(response => { + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(fetchTrendingStatusesSuccess(response.data, next ? next.uri : null)); }).catch(err => dispatch(fetchTrendingStatusesFail(err))); @@ -107,16 +107,16 @@ export const fetchTrendingStatusesFail = error => ({ export const expandTrendingStatuses = () => (dispatch, getState) => { - const url = getState().getIn(['status_lists', 'trending', 'next'], null); + const url = getState().getIn(["status_lists", "trending", "next"], null); - if (url === null || getState().getIn(['status_lists', 'trending', 'isLoading'])) { + if (url === null || getState().getIn(["status_lists", "trending", "isLoading"])) { return; } dispatch(expandTrendingStatusesRequest()); api(getState).get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); + const next = getLinks(response).refs.find(link => link.rel === "next"); dispatch(importFetchedStatuses(response.data)); dispatch(expandTrendingStatusesSuccess(response.data, next ? next.uri : null)); }).catch(error => { diff --git a/app/javascript/flavours/glitch/api.js b/app/javascript/flavours/glitch/api.js index cb263ac58..b35d4b171 100644 --- a/app/javascript/flavours/glitch/api.js +++ b/app/javascript/flavours/glitch/api.js @@ -1,9 +1,9 @@ // @ts-check -import axios from 'axios'; -import LinkHeader from 'http-link-header'; +import axios from "axios"; +import LinkHeader from "http-link-header"; -import ready from './ready'; +import ready from "./ready"; /** * @param {import('axios').AxiosResponse} response * @returns {LinkHeader} @@ -26,10 +26,10 @@ const csrfHeader = {}; */ const setCSRFHeader = () => { /** @type {HTMLMetaElement | null} */ - const csrfToken = document.querySelector('meta[name=csrf-token]'); + const csrfToken = document.querySelector("meta[name=csrf-token]"); if (csrfToken) { - csrfHeader['X-CSRF-Token'] = csrfToken.content; + csrfHeader["X-CSRF-Token"] = csrfToken.content; } }; @@ -40,14 +40,14 @@ ready(setCSRFHeader); * @returns {import('axios').RawAxiosRequestHeaders} */ const authorizationHeaderFromState = getState => { - const accessToken = getState && getState().getIn(['meta', 'access_token'], ''); + const accessToken = getState && getState().getIn(["meta", "access_token"], ""); if (!accessToken) { return {}; } return { - 'Authorization': `Bearer ${accessToken}`, + "Authorization": `Bearer ${accessToken}`, }; }; @@ -56,7 +56,7 @@ const authorizationHeaderFromState = getState => { * @returns {string} */ const baseUrlFromState = getState => { - const baseUrl = getState && getState().getIn(['meta', 'base_url'], ''); + const baseUrl = getState && getState().getIn(["meta", "base_url"], ""); return `${baseUrl}`; }; diff --git a/app/javascript/flavours/glitch/blurhash.ts b/app/javascript/flavours/glitch/blurhash.ts index cafe7b12d..76618d80b 100644 --- a/app/javascript/flavours/glitch/blurhash.ts +++ b/app/javascript/flavours/glitch/blurhash.ts @@ -1,87 +1,87 @@ const DIGIT_CHARACTERS = [ - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', - 'G', - 'H', - 'I', - 'J', - 'K', - 'L', - 'M', - 'N', - 'O', - 'P', - 'Q', - 'R', - 'S', - 'T', - 'U', - 'V', - 'W', - 'X', - 'Y', - 'Z', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - '#', - '$', - '%', - '*', - '+', - ',', - '-', - '.', - ':', - ';', - '=', - '?', - '@', - '[', - ']', - '^', - '_', - '{', - '|', - '}', - '~', + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "#", + "$", + "%", + "*", + "+", + ",", + "-", + ".", + ":", + ";", + "=", + "?", + "@", + "[", + "]", + "^", + "_", + "{", + "|", + "}", + "~", ]; export const decode83 = (str: string) => { diff --git a/app/javascript/flavours/glitch/components/account.jsx b/app/javascript/flavours/glitch/components/account.jsx index 518464b04..bf09ec76c 100644 --- a/app/javascript/flavours/glitch/components/account.jsx +++ b/app/javascript/flavours/glitch/components/account.jsx @@ -1,30 +1,30 @@ -import PropTypes from 'prop-types'; +import PropTypes from "prop-types"; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages, injectIntl } from "react-intl"; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; +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 { 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 { Avatar } from "./avatar"; +import { DisplayName } from "./display_name"; +import { IconButton } from "./icon_button"; +import Permalink from "./permalink"; +import { RelativeTimestamp } from "./relative_timestamp"; const messages = defineMessages({ - follow: { id: 'account.follow', defaultMessage: 'Follow' }, - unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, - requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' }, - unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, - unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, - mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'Mute notifications from @{name}' }, - unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'Unmute notifications from @{name}' }, - mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, - block: { id: 'account.block', defaultMessage: 'Block @{name}' }, + follow: { id: "account.follow", defaultMessage: "Follow" }, + unfollow: { id: "account.unfollow", defaultMessage: "Unfollow" }, + requested: { id: "account.requested", defaultMessage: "Awaiting approval. Click to cancel follow request" }, + unblock: { id: "account.unblock", defaultMessage: "Unblock @{name}" }, + unmute: { id: "account.unmute", defaultMessage: "Unmute @{name}" }, + mute_notifications: { id: "account.mute_notifications", defaultMessage: "Mute notifications from @{name}" }, + unmute_notifications: { id: "account.unmute_notifications", defaultMessage: "Unmute notifications from @{name}" }, + mute: { id: "account.mute", defaultMessage: "Mute @{name}" }, + block: { id: "account.block", defaultMessage: "Block @{name}" }, }); class Account extends ImmutablePureComponent { @@ -102,8 +102,8 @@ class Account extends ImmutablePureComponent { if (hidden) { return ( <> - {account.get('display_name')} - {account.get('username')} + {account.get("display_name")} + {account.get("username")} ); } @@ -114,48 +114,48 @@ class Account extends ImmutablePureComponent { if (actionIcon) { buttons = ; } - } else if (account.get('id') !== me && !small && account.get('relationship', null) !== null) { - const following = account.getIn(['relationship', 'following']); - const requested = account.getIn(['relationship', 'requested']); - const blocking = account.getIn(['relationship', 'blocking']); - const muting = account.getIn(['relationship', 'muting']); + } else if (account.get("id") !== me && !small && account.get("relationship", null) !== null) { + const following = account.getIn(["relationship", "following"]); + const requested = account.getIn(["relationship", "requested"]); + const blocking = account.getIn(["relationship", "blocking"]); + const muting = account.getIn(["relationship", "muting"]); if (requested) { buttons = ; } else if (blocking) { - buttons = ; + buttons = ; } else if (muting) { let hidingNotificationsButton; - if (account.getIn(['relationship', 'muting_notifications'])) { - hidingNotificationsButton = ; + if (account.getIn(["relationship", "muting_notifications"])) { + hidingNotificationsButton = ; } else { - hidingNotificationsButton = ; + hidingNotificationsButton = ; } buttons = ( <> - + {hidingNotificationsButton} ); - } else if (defaultAction === 'mute') { - buttons = ; - } else if (defaultAction === 'block') { - buttons = ; - } else if (!account.get('moved') || following) { - buttons = ; + } else if (defaultAction === "mute") { + buttons = ; + } else if (defaultAction === "block") { + buttons = ; + } else if (!account.get("moved") || following) { + buttons = ; } } let mute_expires_at; - if (account.get('mute_expires_at')) { - mute_expires_at =

; + if (account.get("mute_expires_at")) { + mute_expires_at =
; } return small ? (
- +
{mute_expires_at} diff --git a/app/javascript/flavours/glitch/components/admin/Counter.jsx b/app/javascript/flavours/glitch/components/admin/Counter.jsx index 9bb792fc9..e0d634c82 100644 --- a/app/javascript/flavours/glitch/components/admin/Counter.jsx +++ b/app/javascript/flavours/glitch/components/admin/Counter.jsx @@ -1,14 +1,14 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import { FormattedNumber } from 'react-intl'; +import { FormattedNumber } from "react-intl"; -import classNames from 'classnames'; +import classNames from "classnames"; -import { Sparklines, SparklinesCurve } from 'react-sparklines'; +import { Sparklines, SparklinesCurve } from "react-sparklines"; -import api from 'flavours/glitch/api'; -import { Skeleton } from 'flavours/glitch/components/skeleton'; +import api from "flavours/glitch/api"; +import { Skeleton } from "flavours/glitch/components/skeleton"; const percIncrease = (a, b) => { let percent; @@ -48,7 +48,7 @@ export default class Counter extends PureComponent { componentDidMount () { const { measure, start_at, end_at, params } = this.props; - api().post('/api/v1/admin/measures', { keys: [measure], start_at, end_at, [measure]: params }).then(res => { + api().post("/api/v1/admin/measures", { keys: [measure], start_at, end_at, [measure]: params }).then(res => { this.setState({ loading: false, data: res.data, @@ -78,7 +78,7 @@ export default class Counter extends PureComponent { content = ( <> {measure.human_value || } - {measure.previous_total && ( 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'})} + {measure.previous_total && ( 0, negative: percentChange < 0 })}>{percentChange > 0 && "+"})} ); } diff --git a/app/javascript/flavours/glitch/components/admin/Dimension.jsx b/app/javascript/flavours/glitch/components/admin/Dimension.jsx index 793fe2dd7..6f7eb2ebf 100644 --- a/app/javascript/flavours/glitch/components/admin/Dimension.jsx +++ b/app/javascript/flavours/glitch/components/admin/Dimension.jsx @@ -1,11 +1,11 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import { FormattedNumber } from 'react-intl'; +import { FormattedNumber } from "react-intl"; -import api from 'flavours/glitch/api'; -import { Skeleton } from 'flavours/glitch/components/skeleton'; -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 { @@ -26,7 +26,7 @@ export default class Dimension extends PureComponent { componentDidMount () { const { start_at, end_at, dimension, limit, params } = this.props; - api().post('/api/v1/admin/dimensions', { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => { + api().post("/api/v1/admin/dimensions", { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => { this.setState({ loading: false, data: res.data, @@ -74,7 +74,7 @@ export default class Dimension extends PureComponent { - {typeof item.human_value !== 'undefined' ? item.human_value : } + {typeof item.human_value !== "undefined" ? item.human_value : } ))} diff --git a/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx b/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx index 9ec1460fc..67b307b83 100644 --- a/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx +++ b/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx @@ -1,12 +1,12 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import { FormattedNumber, FormattedMessage } from 'react-intl'; +import { FormattedNumber, FormattedMessage } from "react-intl"; -import classNames from 'classnames'; +import classNames from "classnames"; -import api from 'flavours/glitch/api'; -import { Skeleton } from 'flavours/glitch/components/skeleton'; +import api from "flavours/glitch/api"; +import { Skeleton } from "flavours/glitch/components/skeleton"; export default class ImpactReport extends PureComponent { @@ -27,8 +27,8 @@ export default class ImpactReport extends PureComponent { include_subdomains: true, }; - api().post('/api/v1/admin/measures', { - keys: ['instance_accounts', 'instance_follows', 'instance_followers'], + api().post("/api/v1/admin/measures", { + keys: ["instance_accounts", "instance_follows", "instance_followers"], start_at: null, end_at: null, instance_accounts: params, @@ -63,7 +63,7 @@ export default class ImpactReport extends PureComponent { - 0 })}> + 0 })}> @@ -73,7 +73,7 @@ export default class ImpactReport extends PureComponent { - 0 })}> + 0 })}> diff --git a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx index 542ca3e1b..e6e6c62e2 100644 --- a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx +++ b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx @@ -1,17 +1,17 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import { injectIntl, defineMessages } from 'react-intl'; +import { injectIntl, defineMessages } from "react-intl"; -import classNames from 'classnames'; +import classNames from "classnames"; -import api from 'flavours/glitch/api'; +import api from "flavours/glitch/api"; const messages = defineMessages({ - legal: { id: 'report.categories.legal', defaultMessage: 'Legal' }, - other: { id: 'report.categories.other', defaultMessage: 'Other' }, - spam: { id: 'report.categories.spam', defaultMessage: 'Spam' }, - violation: { id: 'report.categories.violation', defaultMessage: 'Content violates one or more server rules' }, + legal: { id: "report.categories.legal", defaultMessage: "Legal" }, + other: { id: "report.categories.other", defaultMessage: "Other" }, + spam: { id: "report.categories.spam", defaultMessage: "Spam" }, + violation: { id: "report.categories.violation", defaultMessage: "Content violates one or more server rules" }, }); class Category extends PureComponent { @@ -37,11 +37,11 @@ class Category extends PureComponent { const { id, text, disabled, selected, children } = this.props; return ( -
+
{selected && }
- + {text}
@@ -78,8 +78,8 @@ class Rule extends PureComponent { const { id, text, disabled, selected } = this.props; return ( -
- +
+ {selected && } {text}
@@ -105,7 +105,7 @@ class ReportReasonSelector extends PureComponent { }; componentDidMount() { - api().get('/api/v1/instance').then(res => { + api().get("/api/v1/instance").then(res => { this.setState({ rules: res.data.rules, }); @@ -150,10 +150,10 @@ class ReportReasonSelector extends PureComponent { return (
- - - - + + + + {rules.map(rule => )}
diff --git a/app/javascript/flavours/glitch/components/admin/Retention.jsx b/app/javascript/flavours/glitch/components/admin/Retention.jsx index 768dae155..9d69ec83a 100644 --- a/app/javascript/flavours/glitch/components/admin/Retention.jsx +++ b/app/javascript/flavours/glitch/components/admin/Retention.jsx @@ -1,20 +1,20 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import { FormattedMessage, FormattedNumber, FormattedDate } from 'react-intl'; +import { FormattedMessage, FormattedNumber, FormattedDate } from "react-intl"; -import classNames from 'classnames'; +import classNames from "classnames"; -import api from 'flavours/glitch/api'; -import { roundTo10 } from 'flavours/glitch/utils/numbers'; +import api from "flavours/glitch/api"; +import { roundTo10 } from "flavours/glitch/utils/numbers"; const dateForCohort = cohort => { - const timeZone = 'UTC'; + const timeZone = "UTC"; switch(cohort.frequency) { - case 'day': - return ; - default: - return ; + case "day": + return ; + default: + return ; } }; @@ -34,7 +34,7 @@ export default class Retention extends PureComponent { componentDidMount () { const { start_at, end_at, frequency } = this.props; - api().post('/api/v1/admin/retention', { start_at, end_at, frequency }).then(res => { + api().post("/api/v1/admin/retention", { start_at, end_at, frequency }).then(res => { this.setState({ loading: false, data: res.data, @@ -96,7 +96,7 @@ export default class Retention extends PureComponent { return ( -
+
@@ -122,7 +122,7 @@ export default class Retention extends PureComponent { {cohort.data.slice(1).map(retention => ( -
+
@@ -134,13 +134,13 @@ export default class Retention extends PureComponent { ); } - let title = null; + let title; switch(frequency) { - case 'day': - title = ; - break; - default: - title = ; + case "day": + title = ; + break; + default: + title = ; } return ( diff --git a/app/javascript/flavours/glitch/components/admin/Trends.jsx b/app/javascript/flavours/glitch/components/admin/Trends.jsx index 975ea6e0f..16abacf21 100644 --- a/app/javascript/flavours/glitch/components/admin/Trends.jsx +++ b/app/javascript/flavours/glitch/components/admin/Trends.jsx @@ -1,12 +1,12 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage } from "react-intl"; -import classNames from 'classnames'; +import classNames from "classnames"; -import api from 'flavours/glitch/api'; -import Hashtag from 'flavours/glitch/components/hashtag'; +import api from "flavours/glitch/api"; +import Hashtag from "flavours/glitch/components/hashtag"; export default class Trends extends PureComponent { @@ -22,7 +22,7 @@ export default class Trends extends PureComponent { componentDidMount () { const { limit } = this.props; - api().get('/api/v1/admin/trends/tags', { params: { limit } }).then(res => { + api().get("/api/v1/admin/trends/tags", { params: { limit } }).then(res => { this.setState({ loading: false, data: res.data, @@ -57,7 +57,7 @@ export default class Trends extends PureComponent { people={hashtag.history[0].accounts * 1 + hashtag.history[1].accounts * 1} uses={hashtag.history[0].uses * 1 + hashtag.history[1].uses * 1} history={hashtag.history.reverse().map(day => day.uses)} - className={classNames(hashtag.requires_review && 'trends__item--requires-review', !hashtag.trendable && !hashtag.requires_review && 'trends__item--disabled')} + className={classNames(hashtag.requires_review && "trends__item--requires-review", !hashtag.trendable && !hashtag.requires_review && "trends__item--disabled")} /> ))}
diff --git a/app/javascript/flavours/glitch/components/animated_number.tsx b/app/javascript/flavours/glitch/components/animated_number.tsx index 2beb6efbe..81826096e 100644 --- a/app/javascript/flavours/glitch/components/animated_number.tsx +++ b/app/javascript/flavours/glitch/components/animated_number.tsx @@ -1,11 +1,11 @@ -import { useCallback, useState } from 'react'; -import * as React from 'react'; +import { useCallback, useState } from "react"; +import * as React from "react"; -import { TransitionMotion, spring } from 'react-motion'; +import { TransitionMotion, spring } from "react-motion"; -import { reduceMotion } from '../initial_state'; +import { reduceMotion } from "../initial_state"; -import { ShortNumber } from './short_number'; +import { ShortNumber } from "./short_number"; const obfuscatedCount = (count: number) => { if (count < 0) { @@ -13,13 +13,13 @@ const obfuscatedCount = (count: number) => { } else if (count <= 1) { return count; } else { - return '1+'; + return "1+"; } }; interface Props { - value: number; - obfuscate?: boolean; + value: number, + obfuscate?: boolean, } export const AnimatedNumber: React.FC = ({ value, obfuscate }) => { const [previousValue, setPreviousValue] = useState(value); @@ -64,7 +64,7 @@ export const AnimatedNumber: React.FC = ({ value, obfuscate }) => { 0 ? 'absolute' : 'static', + position: direction * style.y > 0 ? "absolute" : "static", transform: `translateY(${style.y * 100}%)`, }} > diff --git a/app/javascript/flavours/glitch/components/attachment_list.jsx b/app/javascript/flavours/glitch/components/attachment_list.jsx index 173157b0d..093207353 100644 --- a/app/javascript/flavours/glitch/components/attachment_list.jsx +++ b/app/javascript/flavours/glitch/components/attachment_list.jsx @@ -1,15 +1,15 @@ -import PropTypes from 'prop-types'; +import PropTypes from "prop-types"; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage } from "react-intl"; -import classNames from 'classnames'; +import classNames from "classnames"; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; +import ImmutablePropTypes from "react-immutable-proptypes"; +import ImmutablePureComponent from "react-immutable-pure-component"; -import { Icon } from 'flavours/glitch/components/icon'; +import { Icon } from "flavours/glitch/components/icon"; -const filename = url => url.split('/').pop().split('#')[0].split('?')[0]; +const filename = url => url.split("/").pop().split("#")[0].split("?")[0]; export default class AttachmentList extends ImmutablePureComponent { @@ -22,7 +22,7 @@ export default class AttachmentList extends ImmutablePureComponent { const { media, compact } = this.props; return ( -
+
{!compact && (
@@ -31,13 +31,13 @@ export default class AttachmentList extends ImmutablePureComponent {
    {media.map(attachment => { - const displayUrl = attachment.get('remote_url') || attachment.get('url'); + const displayUrl = attachment.get("remote_url") || attachment.get("url"); return ( -
  • +
  • {compact && } - {compact && ' ' } + {compact && " " } {displayUrl ? filename(displayUrl) : }
  • diff --git a/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx b/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx index 32a996fd7..17fb73d5a 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx +++ b/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx @@ -1,8 +1,8 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; +import PropTypes from "prop-types"; +import { PureComponent } from "react"; -import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light'; -import { assetHost } from 'flavours/glitch/utils/config'; +import unicodeMapping from "flavours/glitch/features/emoji/emoji_unicode_mapping_light"; +import { assetHost } from "flavours/glitch/utils/config"; export default class AutosuggestEmoji extends PureComponent { @@ -17,7 +17,7 @@ export default class AutosuggestEmoji extends PureComponent { if (emoji.custom) { url = emoji.imageUrl; } else { - const mapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\uFE0F$/, '')]; + const mapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\uFE0F$/, "")]; if (!mapping) { return null; diff --git a/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx b/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx index 6da620014..416b093ed 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx +++ b/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx @@ -1,19 +1,19 @@ -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage } from "react-intl"; -import { ShortNumber } from 'flavours/glitch/components/short_number'; +import { ShortNumber } from "flavours/glitch/components/short_number"; interface Props { tag: { - name: string; - url?: string; + name: string, + url?: string, history?: { - uses: number; - accounts: string; - day: string; - }[]; - following?: boolean; - type: 'hashtag'; - }; + uses: number, + accounts: string, + day: string, + }[], + following?: boolean, + type: "hashtag", + }, } export const AutosuggestHashtag: React.FC = ({ tag }) => { diff --git a/app/javascript/flavours/glitch/components/autosuggest_input.jsx b/app/javascript/flavours/glitch/components/autosuggest_input.jsx index f0833c8c6..7336bbcbf 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_input.jsx +++ b/app/javascript/flavours/glitch/components/autosuggest_input.jsx @@ -1,14 +1,14 @@ -import PropTypes from 'prop-types'; +import PropTypes from "prop-types"; -import classNames from 'classnames'; +import classNames from "classnames"; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; +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 AutosuggestAccountContainer from "flavours/glitch/features/compose/containers/autosuggest_account_container"; -import AutosuggestEmoji from './autosuggest_emoji'; -import { AutosuggestHashtag } from './autosuggest_hashtag'; +import AutosuggestEmoji from "./autosuggest_emoji"; +import { AutosuggestHashtag } from "./autosuggest_hashtag"; const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => { let word; @@ -59,7 +59,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { static defaultProps = { autoFocus: true, - searchTokens: ['@', ':', '#'], + searchTokens: ["@", ":", "#"], }; state = { @@ -100,39 +100,39 @@ export default class AutosuggestInput extends ImmutablePureComponent { } switch(e.key) { - case 'Escape': - if (suggestions.size === 0 || suggestionsHidden) { - document.querySelector('.ui').parentElement.focus(); - } else { - e.preventDefault(); - this.setState({ suggestionsHidden: true }); - } + case "Escape": + if (suggestions.size === 0 || suggestionsHidden) { + document.querySelector(".ui").parentElement.focus(); + } else { + e.preventDefault(); + this.setState({ suggestionsHidden: true }); + } - break; - case 'ArrowDown': - if (suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) }); - } + break; + case "ArrowDown": + if (suggestions.size > 0 && !suggestionsHidden) { + e.preventDefault(); + this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) }); + } - break; - case 'ArrowUp': - if (suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) }); - } + break; + case "ArrowUp": + if (suggestions.size > 0 && !suggestionsHidden) { + e.preventDefault(); + this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) }); + } - break; - case 'Enter': - case 'Tab': + break; + case "Enter": + case "Tab": // Select suggestion - if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - e.stopPropagation(); - this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion)); - } + if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) { + e.preventDefault(); + e.stopPropagation(); + this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion)); + } - break; + break; } if (e.defaultPrevented || !this.props.onKeyDown) { @@ -151,7 +151,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { }; onSuggestionClick = (e) => { - const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index')); + const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute("data-index")); e.preventDefault(); this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion); this.input.focus(); @@ -171,19 +171,19 @@ export default class AutosuggestInput extends ImmutablePureComponent { const { selectedSuggestion } = this.state; let inner, key; - if (suggestion.type === 'emoji') { + if (suggestion.type === "emoji") { inner = ; key = suggestion.id; - } else if (suggestion.type ==='hashtag') { + } else if (suggestion.type ==="hashtag") { inner = ; key = suggestion.name; - } else if (suggestion.type === 'account') { + } else if (suggestion.type === "account") { inner = ; key = suggestion.id; } return ( -
    +
    {inner}
    ); @@ -196,7 +196,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { return (
    -
    +
    {suggestions.map(this.renderSuggestion)}
    diff --git a/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx b/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx index 25ca3fefa..86fe1fb06 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx +++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx @@ -1,16 +1,16 @@ -import PropTypes from 'prop-types'; +import PropTypes from "prop-types"; -import classNames from 'classnames'; +import classNames from "classnames"; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; +import ImmutablePropTypes from "react-immutable-proptypes"; +import ImmutablePureComponent from "react-immutable-pure-component"; -import Textarea from 'react-textarea-autosize'; +import Textarea from "react-textarea-autosize"; -import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container'; +import AutosuggestAccountContainer from "flavours/glitch/features/compose/containers/autosuggest_account_container"; -import AutosuggestEmoji from './autosuggest_emoji'; -import { AutosuggestHashtag } from './autosuggest_hashtag'; +import AutosuggestEmoji from "./autosuggest_emoji"; +import { AutosuggestHashtag } from "./autosuggest_hashtag"; const textAtCursorMatchesToken = (str, caretPosition) => { let word; @@ -24,7 +24,7 @@ const textAtCursorMatchesToken = (str, caretPosition) => { word = str.slice(left, right + caretPosition); } - if (!word || word.trim().length < 3 || ['@', ':', '#'].indexOf(word[0]) === -1) { + if (!word || word.trim().length < 3 || ["@", ":", "#"].indexOf(word[0]) === -1) { return [null, null]; } @@ -97,39 +97,39 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { } switch(e.key) { - case 'Escape': - if (suggestions.size === 0 || suggestionsHidden) { - document.querySelector('.ui').parentElement.focus(); - } else { - e.preventDefault(); - this.setState({ suggestionsHidden: true }); - } + case "Escape": + if (suggestions.size === 0 || suggestionsHidden) { + document.querySelector(".ui").parentElement.focus(); + } else { + e.preventDefault(); + this.setState({ suggestionsHidden: true }); + } - break; - case 'ArrowDown': - if (suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) }); - } + break; + case "ArrowDown": + if (suggestions.size > 0 && !suggestionsHidden) { + e.preventDefault(); + this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) }); + } - break; - case 'ArrowUp': - if (suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) }); - } + break; + case "ArrowUp": + if (suggestions.size > 0 && !suggestionsHidden) { + e.preventDefault(); + this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) }); + } - break; - case 'Enter': - case 'Tab': + break; + case "Enter": + case "Tab": // Select suggestion - if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) { - e.preventDefault(); - e.stopPropagation(); - this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion)); - } + if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) { + e.preventDefault(); + e.stopPropagation(); + this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion)); + } - break; + break; } if (e.defaultPrevented || !this.props.onKeyDown) { @@ -151,7 +151,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { }; onSuggestionClick = (e) => { - const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index')); + const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute("data-index")); e.preventDefault(); this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion); this.textarea.focus(); @@ -178,19 +178,19 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { const { selectedSuggestion } = this.state; let inner, key; - if (suggestion.type === 'emoji') { + if (suggestion.type === "emoji") { inner = ; key = suggestion.id; - } else if (suggestion.type === 'hashtag') { + } else if (suggestion.type === "hashtag") { inner = ; key = suggestion.name; - } else if (suggestion.type === 'account') { + } else if (suggestion.type === "account") { inner = ; key = suggestion.id; } return ( -
    +
    {inner}
    ); @@ -204,7 +204,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {