From 7295b0edcd6115986d4fbfbbf29de046188585c3 Mon Sep 17 00:00:00 2001 From: forenta Date: Thu, 10 Nov 2022 12:37:26 +0000 Subject: [PATCH 01/65] Update de.json --- app/soapbox/locales/de.json | 224 ++++++++++++++++++------------------ 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index dea27e5af..debb5b07d 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -55,7 +55,7 @@ "account.welcome": "Willkommen", "account_gallery.none": "Keine Medien vorhanden.", "account_note.hint": "You can keep notes about this user for yourself (this will not be shared with them):", - "account_note.placeholder": "No comment provided", + "account_note.placeholder": "Kein Kommentar hinterlegt", "account_note.save": "Speichern", "account_note.target": "Note for @{target}", "account_search.placeholder": "Nach einem Account suchen", @@ -362,12 +362,12 @@ "developers.navigation.network_error_label": "Network error", "developers.navigation.settings_store_label": "Settings store", "developers.navigation.test_timeline_label": "Test timeline", - "developers.settings_store.hint": "It is possible to directly edit your user settings here. BE CAREFUL! Editing this section can break your account, and you will only be able to recover through the API.", + "developers.settings_store.hint": "Hier können die Benutzereinstellungen direkt bearbeitet werden. VORSICHT! Die Bearbeitung dieses Abschnitts kann das Konto zerstören - eine Wiederherstellung ist ausschließlich per API möglich", "direct.search_placeholder": "Nachricht senden an…", "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", + "directory.local": "Ausschließlich von {domain}", "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "directory.recently_active": "Zuletzt aktiv", "edit_federation.followers_only": "Beitrag nur für Follower anzeigen", "edit_federation.force_nsfw": "Markierung aller Anhänge als heikel erzwingen", "edit_federation.media_removal": "Alle Medien entfernen", @@ -375,7 +375,7 @@ "edit_federation.save": "Speichern", "edit_federation.success": "{host} federation was updated", "edit_federation.unlisted": "Ungelistete Beiträge erzwingen", - "edit_password.header": "Change Password", + "edit_password.header": "Passwort ändern", "edit_profile.error": "Profil konnte nicht geändert werden", "edit_profile.fields.accepts_email_list_label": "Newsletter abonnieren", "edit_profile.fields.avatar_label": "Profilbild", @@ -384,24 +384,24 @@ "edit_profile.fields.birthday_label": "Geburtstag", "edit_profile.fields.birthday_placeholder": "Dein Geburtstag", "edit_profile.fields.bot_label": "Dieses Konto wird für einen Bot genutzt", - "edit_profile.fields.discoverable_label": "Allow account discovery", + "edit_profile.fields.discoverable_label": "Konto im Instanz-Verzeichnis eintragen", "edit_profile.fields.display_name_label": "Angezeigter Nutzername", "edit_profile.fields.display_name_placeholder": "Name", "edit_profile.fields.header_label": "Profilbanner", "edit_profile.fields.hide_network_label": "Follower und Nutzer, denen du folgst, nicht öffentlich anzeigen", - "edit_profile.fields.location_label": "Location", - "edit_profile.fields.location_placeholder": "Location", + "edit_profile.fields.location_label": "Wohnort", + "edit_profile.fields.location_placeholder": "Wohnort", "edit_profile.fields.locked_label": "Profil auf privat stellen", "edit_profile.fields.meta_fields.content_placeholder": "Content", "edit_profile.fields.meta_fields.label_placeholder": "Label", "edit_profile.fields.stranger_notifications_label": "Benachrichtigungen von Fremden blockieren", "edit_profile.fields.website_label": "Website", - "edit_profile.fields.website_placeholder": "Display a Link", - "edit_profile.header": "Edit Profile", - "edit_profile.hints.accepts_email_list": "Opt-in to news and marketing updates.", + "edit_profile.fields.website_placeholder": "Link anzeigen", + "edit_profile.header": "Profile bearbeiten", + "edit_profile.hints.accepts_email_list": "Status- und Werbenachrichten abonnieren.", "edit_profile.hints.avatar": "Erlaubte Formate sind PNG, GIF oder JPG. Die Datei darf nicht größer als 2 MB sein. Das Bild wird automatisch auf 400x400px verkleinert.", - "edit_profile.hints.bot": "This account mainly performs automated actions and might not be monitored", - "edit_profile.hints.discoverable": "Display account in profile directory and allow indexing by external services", + "edit_profile.hints.bot": "Dieses Konto ist ein Bot. Aktivitäten werden möglicherweise nicht moderiert.", + "edit_profile.hints.discoverable": "Konto im Verzeichnis listen und Indexierung durch externe Dienste ermöglichen", "edit_profile.hints.header": "Erlaubte Formate sind PNG, GIF oder JPG. Die Datei darf nicht größer als 2 MB sein. Das Bild wird automatisch auf 1500x500px verkleinert.", "edit_profile.hints.hide_network": "Deine Follower und wem du folgst wird nicht in deinem Profil angezeit.", "edit_profile.hints.locked": "Follower müssen einzeln bestätigt werden.", @@ -409,13 +409,13 @@ "edit_profile.save": "Speichern", "edit_profile.success": "Profil gespeichert", "email_passthru.confirmed.body": "Close this tab and continue the registration process on the {bold} from which you sent this email confirmation.", - "email_passthru.confirmed.heading": "Email Confirmed!", + "email_passthru.confirmed.heading": "E-Mail bestätigt!", "email_passthru.generic_fail.body": "Please request a new email confirmation.", - "email_passthru.generic_fail.heading": "Something Went Wrong", - "email_passthru.token_expired.body": "Your email token has expired. Please request a new email confirmation from the {bold} from which you sent this email confirmation.", - "email_passthru.token_expired.heading": "Token Expired", - "email_passthru.token_not_found.body": "Your email token was not found. Please request a new email confirmation from the {bold} from which you sent this email confirmation.", - "email_passthru.token_not_found.heading": "Invalid Token", + "email_passthru.generic_fail.heading": "Etwas ging schief", + "email_passthru.token_expired.body": "Die Bestätigungsnachricht ist abgelaufen. Bitte eine neue Bestätigung von {bold} beantragen, von wo du diese Nachricht erhalten hast.", + "email_passthru.token_expired.heading": "Token abgelaufen", + "email_passthru.token_not_found.body": "Bestätigungstoken nicht erkannt. Bitte beantrage ein neues Token von {bold} wo du diese Nachricht her hast.", + "email_passthru.token_not_found.heading": "Ungültiges Token", "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", "embed.preview": "Vorschau:", "emoji_button.activity": "Aktivitäten", @@ -446,7 +446,7 @@ "empty_column.favourited_statuses": "Du hast noch keine Beiträge favorisiert. Favorisierte Beiträge erscheinen hier.", "empty_column.favourites": "Diesen Beitrag hat noch niemand favorisiert. Sobald es jemand tut, wird das hier angezeigt.", "empty_column.filters": "Du hast keine Wörter stummgeschaltet.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", + "empty_column.follow_recommendations": "Sieht so aus, als gibt es gerade keine Vorschläge für dich. Versuche, über die Suche bekannte Personen zu finden oder schaue dich in aktuellen Hashtags um.", "empty_column.follow_requests": "Du hast noch keine Folgeanfragen. Sobald du eine erhältst, wird sie hier angezeigt.", "empty_column.group": "Diese Gruppe hat noch keine Beiträge. Sobald ein Gruppenmitglied einen Beitrag erstellt, wird er hier angezeigt.", "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.", @@ -459,9 +459,9 @@ "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Zeitleiste aufzufüllen", "empty_column.remote": "There is nothing here! Manually follow users from {instance} to fill it up.", "empty_column.scheduled_statuses": "Bisher wurden keine vorbereiteten Beiträge erstellt. Vorbereitete Beiträge werden hier angezeigt.", - "empty_column.search.accounts": "There are no people results for \"{term}\"", - "empty_column.search.hashtags": "There are no hashtags results for \"{term}\"", - "empty_column.search.statuses": "There are no posts results for \"{term}\"", + "empty_column.search.accounts": "Es wurden keine Nutzer unter \"{term}\" gefunden", + "empty_column.search.hashtags": "Es wurden keine Hashtags unter \"{term}\" gefunden", + "empty_column.search.statuses": "Es wurden keine Posts unter \"{term}\" gefunden", "export_data.actions.export": "Exportieren", "export_data.actions.export_blocks": "Liste geblockter Nutzer expotieren", "export_data.actions.export_follows": "Liste der Nutzer, denen du folgst, exportieren", @@ -481,10 +481,10 @@ "federation_restriction.media_nsfw": "Anhänge als NSFW markiert", "federation_restriction.partial_media_removal": "Partial media removal", "federation_restrictions.empty_message": "{siteTitle} has not restricted any instances.", - "federation_restrictions.explanation_box.message": "Normally servers on the Fediverse can communicate freely. {siteTitle} has imposed restrictions on the following servers.", + "federation_restrictions.explanation_box.message": "Üblicherweise föderieren Dienste im Fediverse. {siteTitle} hat die Föderation für die nachfolgenden Instanzen beschränkt.", "federation_restrictions.explanation_box.title": "Instance-specific policies", "federation_restrictions.not_disclosed_message": "{siteTitle} does not disclose federation restrictions through the API.", - "fediverse_tab.explanation_box.dismiss": "Don't show again", + "fediverse_tab.explanation_box.dismiss": "Nicht mehr anzeigen", "fediverse_tab.explanation_box.explanation": "{site_title} ist Teil des Fediverse, einem Sozialen Netzwerk, das aus tausenden unabhängigen Instanzen (aka \"Servern\") besteht. Die Beiträge, die du hier siehst, stammen überwiegend von anderen Servern. Du kannst auf alle Einträge reagieren oder jeden Server blockieren, der dir nicht gefällt. Die Bezeichnung hinter dem zweiten @-Symbol ist der Name des entsprechenden Servers. Um nur Beiträge von {site_title} zu sehen, wähle {local} aus.", "fediverse_tab.explanation_box.title": "Was ist das Fediverse?", "filters.added": "Filter hinzugefügt.", @@ -492,16 +492,16 @@ "filters.context_hint": "One or multiple contexts where the filter should apply", "filters.filters_list_context_label": "Filter contexts:", "filters.filters_list_delete": "Löschen", - "filters.filters_list_details_label": "Filter settings:", + "filters.filters_list_details_label": "Filtereinstellungen:", "filters.filters_list_drop": "Drop", - "filters.filters_list_hide": "Hide", + "filters.filters_list_hide": "Verstecken", "filters.filters_list_phrase_label": "Stichwort oder Wortfolge:", "filters.filters_list_whole-word": "Whole word", "filters.removed": "Filter gelöscht.", "follow_recommendation.subhead": "Let's get started!", "follow_recommendations.done": "Done", "follow_recommendations.heading": "Folge Nutzern, deren Beiträge du sehen möchtest. Hier sind einige Vorschläge:", - "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", + "follow_recommendations.lead": "Posts von Usern, denen du folgst, werden in deinem Home-Feed in chronologischer Reihenfolge angezeigt. Los geht's - du kannst anderen später jederzeit wieder entfolgen.", "follow_request.authorize": "Bestätigen", "follow_request.reject": "Ablehnen", "forms.copy": "Kopieren", @@ -528,7 +528,7 @@ "groups.join": "Gruppe beitreten", "groups.leave": "Gruppe verlassen", "groups.removed_accounts": "Entfernte Accounts", - "groups.sidebar-panel.item.no_recent_activity": "No recent activity", + "groups.sidebar-panel.item.no_recent_activity": "Keine kürzliche Aktivität", "groups.sidebar-panel.item.view": "Neue Beiträge", "groups.sidebar-panel.show_all": "Alle anzeigen", "groups.sidebar-panel.title": "Gruppenmitgliedschaften", @@ -543,7 +543,7 @@ "header.login.label": "Anmelden", "header.login.password.label": "Password", "header.login.username.placeholder": "Email oder Nutzername", - "header.register.label": "Anmelden", + "header.register.label": "Registrieren", "home.column_settings.show_direct": "Direktnachricht anzeigen", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", @@ -571,10 +571,10 @@ "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}", "introduction.federation.action": "Weiter", "introduction.federation.home.headline": "Home", - "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.home.text": "Posts von Konten, denen du folgst, werden in deinem Home-Feed erscheinen. Du kannst jedem auf deiner Instanz folgen!!", "introduction.interactions.action": "Finish tutorial!", - "introduction.interactions.favourite.headline": "Favorite", - "introduction.interactions.favourite.text": "You can save a post for later, and let the author know that you liked it, by favoriting it.", + "introduction.interactions.favourite.headline": "Favorisieren", + "introduction.interactions.favourite.text": "Du kannst einen Beitrag für später speichern und den Autor wissen lassen, dass er Ihnen gefallen hat, indem du ihm ein Like hinterlässt.", "introduction.interactions.reblog.headline": "Teilen", "introduction.interactions.reblog.text": "You can share other people's posts with your followers by reposting them.", "introduction.interactions.reply.headline": "Antworten", @@ -633,37 +633,37 @@ "login.fields.instance_label": "Instance", "login.fields.instance_placeholder": "example.com", "login.fields.otp_code_hint": "Enter the two-factor code generated by your phone app or use one of your recovery codes", - "login.fields.otp_code_label": "Two-factor code:", + "login.fields.otp_code_label": "Zwei-Faktoren-Code:", "login.fields.password_placeholder": "Passwort", - "login.fields.username_label": "Email or username", + "login.fields.username_label": "E-Mail oder Nutzername", "login.log_in": "Anmelden", "login.otp_log_in": "OTP Login", "login.reset_password_hint": "Probleme beim Anmelden?", "login.sign_in": "Sign in", "media_gallery.toggle_visible": "Sichtbarkeit umschalten", - "media_panel.empty_message": "No media found.", + "media_panel.empty_message": "Keine Medien gefunden.", "media_panel.title": "Media", - "mfa.confirm.success_message": "MFA confirmed", - "mfa.disable.success_message": "MFA disabled", - "mfa.mfa_disable_enter_password": "Enter your current password to disable two-factor auth:", - "mfa.mfa_setup.code_hint": "Enter the code from your two-factor app.", + "mfa.confirm.success_message": "MFA bestätigt", + "mfa.disable.success_message": "MFA abgeschaltet", + "mfa.mfa_disable_enter_password": "Aktuelles Passwort eingäben, um Zwei-Faktoren-Authentifizierung zu deaktivieren:", + "mfa.mfa_setup.code_hint": "Bitte den Code aus der 2FA-App eingeben.", "mfa.mfa_setup.code_placeholder": "Code", - "mfa.mfa_setup.password_hint": "Enter your current password to confirm your identity.", - "mfa.mfa_setup.password_placeholder": "Password", - "mfa.mfa_setup_scan_description": "Using your two-factor app, scan this QR code or enter text key:", + "mfa.mfa_setup.password_hint": "Aktuelles Passwort zur Bestätigung eingeben.", + "mfa.mfa_setup.password_placeholder": "Passwort", + "mfa.mfa_setup_scan_description": "Nutze eine 2FA-App, scanne den QR-Code oder gibt diesen Schlüsseltext ein:", "mfa.mfa_setup_scan_title": "Scan", - "mfa.mfa_setup_verify_title": "Verify", - "mfa.otp_enabled_description": "You have enabled two-factor authentication via OTP.", - "mfa.otp_enabled_title": "OTP Enabled", - "mfa.setup_recoverycodes": "Recovery codes", - "mfa.setup_warning": "Write these codes down or save them somewhere secure - otherwise you won't see them again. If you lose access to your 2FA app and recovery codes you'll be locked out of your account.", - "migration.fields.acct.label": "Handle of the new account", + "mfa.mfa_setup_verify_title": "Bestätigen", + "mfa.otp_enabled_description": "Du hast die Zwei-Faktoren-Authentifizierung per OTP aktiviert.", + "mfa.otp_enabled_title": "OTP eingeschaltet", + "mfa.setup_recoverycodes": "Sicherungs-Keys", + "mfa.setup_warning": "Notiere dir diese Codes an einem sicheren Platz - andernfalls wirst du sie nicht mehr auffinden und aus deinem Konto ausgesperrt.", + "migration.fields.acct.label": "Handle des neuen Kontos", "migration.fields.acct.placeholder": "username@domain", - "migration.fields.confirm_password.label": "Current password", - "migration.hint": "This will move your followers to the new account. No other data will be moved. To perform migration, you need to {link} on your new account first.", - "migration.hint.link": "create an account alias", - "migration.move_account.fail": "Account migration failed.", - "migration.move_account.success": "Account successfully moved.", + "migration.fields.confirm_password.label": "Aktuelles Passwort", + "migration.hint": "Damit werden deine Follower auf dein neues Konto übertragen - weitere Daten werden nicht migriert. Zur Bestätigung ist es nötig, {link} auf deinem neuen Konto zunächst zu bestätigen.", + "migration.hint.link": "Neues Alias erstellen", + "migration.move_account.fail": "Account-Übertragung fehlgeschlagen.", + "migration.move_account.success": "Account-Übertragung fehlgeschlagen.", "migration.submit": "Move followers", "missing_description_modal.cancel": "Abbrechen", "missing_description_modal.continue": "Senden", @@ -702,8 +702,8 @@ "navigation_bar.preferences": "Einstellungen", "navigation_bar.profile_directory": "Profilverzeichnis", "navigation_bar.security": "Sicherheit", - "navigation_bar.soapbox_config": "Soapbox config", - "notification.birthday": "{name} has a birthday today", + "navigation_bar.soapbox_config": "Soapbox Konfiguration", + "notification.birthday": "{name} hat Geburtstag!", "notification.birthday.more": "{count} more {count, plural, one {friend} other {friends}}", "notification.birthday_plural": "{name} and {more} have birthday today", "notification.pleroma:chat_mention": "{name} hat dir eine Nachricht gesendet", @@ -718,7 +718,7 @@ "notification.status": "{name} just posted", "notifications.clear": "Benachrichtigungen löschen", "notifications.clear_confirmation": "Bist du dir sicher, dass du alle Benachrichtigungen löschen möchtest?", - "notifications.clear_heading": "Clear notifications", + "notifications.clear_heading": "Benachrichtigungen löschen", "notifications.column_settings.alert": "Desktop-Benachrichtigungen", "notifications.column_settings.birthdays.category": "Geburtstage", "notifications.column_settings.birthdays.show": "Geburtstagserinnerungen anzeigen", @@ -786,12 +786,12 @@ "preferences.fields.auto_play_gif_label": "Animierte GIFs automatisch abspielen", "preferences.fields.autoload_more_label": "Automatically load more items when scrolled to the bottom of the page", "preferences.fields.autoload_timelines_label": "Automatically load new posts when scrolled to the top of the page", - "preferences.fields.boost_modal_label": "Show confirmation dialog before reposting", - "preferences.fields.delete_modal_label": "Show confirmation dialog before deleting a post", - "preferences.fields.display_media.default": "Hide media marked as sensitive", - "preferences.fields.display_media.hide_all": "Always hide media", - "preferences.fields.display_media.show_all": "Always show media", - "preferences.fields.expand_spoilers_label": "Always expand posts marked with content warnings", + "preferences.fields.boost_modal_label": "Bestätigungsdialog öffnen, bevor ein Beitrag geboostet wird", + "preferences.fields.delete_modal_label": "Bestätigungsdialog öffnen, bevor ein Beitrag gelöscht wird", + "preferences.fields.display_media.default": "Als verstörend gekennzeichnete Medien grundsätzlich anzeigen", + "preferences.fields.display_media.hide_all": "Medien grundsätzlich ausblenden", + "preferences.fields.display_media.show_all": "Medien grundsätzlich anzeigen", + "preferences.fields.expand_spoilers_label": "Als verstörend gekennzeichnete Posts grundsätzlich ausklappen", "preferences.fields.language_label": "Sprache", "preferences.fields.media_display_label": "Media display", "preferences.hints.feed": "In your home feed", @@ -804,29 +804,29 @@ "privacy.public.short": "Öffentlich", "privacy.unlisted.long": "Wird in öffentlichen Zeitleisten nicht gezeigt", "privacy.unlisted.short": "Nicht gelistet", - "profile_dropdown.add_account": "Add an existing account", - "profile_dropdown.logout": "Log out @{acct}", + "profile_dropdown.add_account": "Bestehendes Konto hinzufügen", + "profile_dropdown.logout": "Aus @{acct} abmelden", "profile_fields_panel.title": "Profile fields", - "public.column_settings.title": "Fediverse timeline settings", - "reactions.all": "All", + "public.column_settings.title": "Einstellungen der globalen Timeline", + "reactions.all": "Alle", "regeneration_indicator.label": "Laden…", "regeneration_indicator.sublabel": "Deine Startseite wird gerade vorbereitet!", - "register_invite.lead": "Complete the form below to create an account.", - "register_invite.title": "You've been invited to join {siteTitle}!", + "register_invite.lead": "Fülle folgendes Formular aus, bevor dein Konto erstellt wird.", + "register_invite.title": "Du wurdest zu {siteTitle} eingeladen!", "registration.agreement": "Ich akzeptiere die {tos}.", - "registration.captcha.hint": "Click the image to get a new captcha", - "registration.closed_message": "{instance} is not accepting new members", - "registration.closed_title": "Registrations Closed", - "registration.confirmation_modal.close": "Close", + "registration.captcha.hint": "Bild anklicken, um neues Captcha zu erhalten", + "registration.closed_message": "{instance} nimmt keine neuen Mitglieder auf", + "registration.closed_title": "Registrierungen geschlossen", + "registration.confirmation_modal.close": "Schließen", "registration.fields.confirm_placeholder": "Passwort (wiederholen)", "registration.fields.email_placeholder": "Emailadresse", "registration.fields.password_placeholder": "Passwort", "registration.fields.username_hint": "Only letters, numbers, and underscores are allowed.", - "registration.fields.username_placeholder": "Nutzername", + "registration.fields.username_placeholder": "Benutzername", "registration.newsletter": "Newsletter abonnieren.", "registration.password_mismatch": "Die eingegebenen Passwörter stimmen nicht überein", - "registration.reason": "Why do you want to join?", - "registration.reason_hint": "This will help us review your application", + "registration.reason": "Warum möchtest du ein Teil von uns werden?", + "registration.reason_hint": "Damit hilfst du uns, über deinen Antrag zu entscheiden", "registration.sign_up": "Registrieren", "registration.tos": "Nutzungsbedingungen", "registration.username_unavailable": "Der gewählte Nutzername ist bereits vorhanden.", @@ -846,15 +846,15 @@ "remote_interaction.divider": "or", "remote_interaction.favourite": "Proceed to like", "remote_interaction.favourite_title": "Like a post remotely", - "remote_interaction.follow": "Proceed to follow", + "remote_interaction.follow": "Fortsetzen, um zu folgen", "remote_interaction.follow_title": "Follow {user} remotely", "remote_interaction.poll_vote": "Proceed to vote", "remote_interaction.poll_vote_title": "Vote in a poll remotely", - "remote_interaction.reblog": "Proceed to repost", + "remote_interaction.reblog": "Boost bestätigen", "remote_interaction.reblog_title": "Reblog a post remotely", - "remote_interaction.reply": "Proceed to reply", + "remote_interaction.reply": "Antwort bestätigen", "remote_interaction.reply_title": "Reply to a post remotely", - "remote_interaction.user_not_found_error": "Couldn't find given user", + "remote_interaction.user_not_found_error": "Konto nicht gefunden", "remote_timeline.filter_message": "You are viewing the timeline of {instance}.", "reply_indicator.cancel": "Abbrechen", "reply_mentions.account.add": "Add to mentions", @@ -873,8 +873,8 @@ "reset_password.header": "Set New Password", "schedule.post_time": "Post Date/Time", "schedule.remove": "Remove schedule", - "schedule_button.add_schedule": "Schedule post for later", - "schedule_button.remove_schedule": "Post immediately", + "schedule_button.add_schedule": "Für späteres Absenden planen", + "schedule_button.remove_schedule": "Sofort posten", "scheduled_status.cancel": "Cancel", "search.action": "Search for “{query}”", "search.placeholder": "Suche", @@ -883,11 +883,11 @@ "search_results.statuses": "Beiträge", "search_results.top": "Top", "security.codes.fail": "Failed to fetch backup codes", - "security.confirm.fail": "Incorrect code or password. Try again.", + "security.confirm.fail": "Falscher Code oder falsches Passwort. Bitte erneut versuchen.", "security.delete_account.fail": "Account deletion failed.", "security.delete_account.success": "Das Konto wurde erfolgreich gelöscht.", - "security.disable.fail": "Incorrect password. Try again.", - "security.disable_mfa": "Disable", + "security.disable.fail": "Falsches Passwort. Versuche es erneut.", + "security.disable_mfa": "Abschalten", "security.fields.email.label": "Emailaddresse", "security.fields.new_password.label": "Neues Passwort", "security.fields.old_password.label": "Bisheriges Passwort", @@ -897,33 +897,33 @@ "security.headers.tokens": "Sessions", "security.headers.update_email": "Email ändern", "security.headers.update_password": "Passwort ändern", - "security.mfa": "Set up 2-Factor Auth", + "security.mfa": "Zwei-Faktoren-Authentifizierung einstellen", "security.mfa_enabled": "You have multi-factor authentication set up with OTP.", - "security.mfa_header": "Authorization Methods", - "security.mfa_setup_hint": "Configure multi-factor authentication with OTP", + "security.mfa_header": "Authentifizierungsmethoden", + "security.mfa_setup_hint": "OTP-Zwei-Faktoren-Authentifizierung konfigurieren", "security.qr.fail": "Failed to fetch setup key", "security.submit": "Änderungen speichern", "security.submit.delete": "Konto löschen", - "security.text.delete": "To delete your account, enter your password then click Delete Account. This is a permanent action that cannot be undone. Your account will be destroyed from this server, and a deletion request will be sent to other servers. It's not guaranteed that all servers will purge your account.", + "security.text.delete": "Gib dein Passwort ein, um dein Konto zu löschen. Diese Löschung ist dauerhaft und kann nicht rückgängig gemacht werden. Dein Konto wird von diesem Server aus gelöscht und eine Löschungsanfrage wird an andere Server gesendet. Es ist nicht garantiert, dass alle Instanzen dein Konto löschen..", "security.tokens.revoke": "Widerrufen", "security.update_email.fail": "Änderung der Emailadresse fehlgeschlagen.", "security.update_email.success": "Die neue Emailadresse wurde gespeichert.", "security.update_password.fail": "Änderung des Passwortes fehlgeschlagen.", "security.update_password.success": "Das Passwort wurde erfolgreich geändert.", - "settings.change_email": "Change Email", - "settings.change_password": "Change Password", - "settings.configure_mfa": "Configure MFA", - "settings.delete_account": "Delete Account", + "settings.change_email": "E-Mail ändern", + "settings.change_password": "Passwort ändern", + "settings.configure_mfa": "MFA konfigurieren", + "settings.delete_account": "Konto löschen", "settings.edit_profile": "Edit Profile", - "settings.preferences": "Preferences", - "settings.profile": "Profile", - "settings.save.success": "Your preferences have been saved!", - "settings.security": "Security", - "settings.settings": "Settings", + "settings.preferences": "Einstellungen", + "settings.profile": "Profil", + "settings.save.success": "Einstellungen wurden gespeichert!", + "settings.security": "Sicherheit", + "settings.settings": "Einstellungen", "signup_panel.subtitle": "Jetzt anmelden, um mitzureden.", "signup_panel.title": "Neu auf {site_title}?", - "snackbar.view": "View", - "soapbox_config.authenticated_profile_hint": "Users must be logged-in to view replies and media on user profiles.", + "snackbar.view": "Anzeigen", + "soapbox_config.authenticated_profile_hint": "Nur angemeldete Nutzer können Antworten und Medien auf Nutzerprofilen sehen.", "soapbox_config.authenticated_profile_label": "Profiles require authentication", "soapbox_config.copyright_footer.meta_fields.label_placeholder": "Copyright footer", "soapbox_config.crypto_address.meta_fields.address_placeholder": "Address", @@ -934,21 +934,21 @@ "soapbox_config.display_fqn_label": "Display domain (eg @user@domain) for local accounts.", "soapbox_config.fields.accent_color_label": "Accent color", "soapbox_config.fields.brand_color_label": "Brand color", - "soapbox_config.fields.crypto_address.add": "Add new crypto address", - "soapbox_config.fields.crypto_addresses_label": "Cryptocurrency addresses", + "soapbox_config.fields.crypto_address.add": "Cryptocoin-Adresse hinzufügen", + "soapbox_config.fields.crypto_addresses_label": "Cryptocoin-Adresse", "soapbox_config.fields.home_footer.add": "Add new Home Footer Item", "soapbox_config.fields.home_footer_fields_label": "Home footer items", "soapbox_config.fields.logo_label": "Logo", "soapbox_config.fields.promo_panel.add": "Add new Promo panel item", "soapbox_config.fields.promo_panel_fields_label": "Promo panel items", - "soapbox_config.fields.theme_label": "Default theme", + "soapbox_config.fields.theme_label": "Standard-Theme", "soapbox_config.greentext_label": "Enable greentext support", "soapbox_config.hints.crypto_addresses": "Add cryptocurrency addresses so users of your site can donate to you. Order matters, and you must use lowercase ticker values.", "soapbox_config.hints.home_footer_fields": "You can have custom defined links displayed on the footer of your static pages", - "soapbox_config.hints.logo": "SVG. At most 2 MB. Will be displayed to 50px height, maintaining aspect ratio", + "soapbox_config.hints.logo": "SVG. Maximal 2 MB. Die Darstellung erfolgt mit 50px Höhe, das Seitenverhältnis wird beibehalten", "soapbox_config.hints.promo_panel_fields": "You can have custom defined links displayed on the right panel of the timelines page.", "soapbox_config.hints.promo_panel_icons": "{ link }", - "soapbox_config.hints.promo_panel_icons.link": "Soapbox Icons List", + "soapbox_config.hints.promo_panel_icons.link": "Soapbox Icon-Liste", "soapbox_config.home_footer.meta_fields.label_placeholder": "Label", "soapbox_config.home_footer.meta_fields.url_placeholder": "URL", "soapbox_config.promo_panel.meta_fields.icon_placeholder": "Icon", @@ -957,13 +957,13 @@ "soapbox_config.raw_json_hint": "Edit the settings data directly. Changes made directly to the JSON file will override the form fields above. Click Save to apply your changes.", "soapbox_config.raw_json_label": "Advanced: Edit raw JSON data", "soapbox_config.save": "Speichern", - "soapbox_config.saved": "Soapbox config saved!", - "soapbox_config.single_user_mode_hint": "Front page will redirect to a given user profile.", + "soapbox_config.saved": "Soapbox-Konfiruation gespeichert!", + "soapbox_config.single_user_mode_hint": "Startseite leitet zum Nutzerprofil weiter.", "soapbox_config.single_user_mode_label": "Single user mode", "soapbox_config.single_user_mode_profile_hint": "@handle", "soapbox_config.single_user_mode_profile_label": "Main user handle", - "soapbox_config.verified_can_edit_name_label": "Allow verified users to edit their own display name.", - "status.actions.more": "More", + "soapbox_config.verified_can_edit_name_label": "Verifizierten Nutzern die Änderung des Anzeigenamens gestatten.", + "status.actions.more": "Weitere Einstellungen", "status.admin_account": "Öffne Moderationsoberfläche für @{name}", "status.admin_status": "Öffne Beitrag in der Moderationsoberfläche", "status.block": "@{name} blockieren", @@ -989,13 +989,13 @@ "status.pin": "Im Profil anheften", "status.pinned": "Angehefteter Beitrag", "status.quote": "Beitrag zitieren", - "status.reactions.cry": "Sad", + "status.reactions.cry": "Traurig", "status.reactions.empty": "No one has reacted to this post yet. When someone does, they will show up here.", - "status.reactions.heart": "Love", + "status.reactions.heart": "Liebe", "status.reactions.laughing": "Haha", "status.reactions.like": "Like", "status.reactions.open_mouth": "Wow", - "status.reactions.weary": "Weary", + "status.reactions.weary": "Überdrüssig", "status.reactions_expand": "Emoji auswählen", "status.read_more": "Mehr lesen", "status.reblog": "Teilen", From 4a4e0daa1a8d1a78d4d1cb823ce310882317c8cd Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Fri, 11 Nov 2022 09:57:39 -0500 Subject: [PATCH 02/65] Autoplay videos from Rumble --- app/soapbox/components/status-media.tsx | 3 +- .../features/status/components/card.tsx | 25 +--------------- app/soapbox/utils/__tests__/media.test.ts | 17 +++++++++++ app/soapbox/utils/media.ts | 30 ++++++++++++++++++- 4 files changed, 49 insertions(+), 26 deletions(-) create mode 100644 app/soapbox/utils/__tests__/media.test.ts diff --git a/app/soapbox/components/status-media.tsx b/app/soapbox/components/status-media.tsx index 4445e67b5..195e749f1 100644 --- a/app/soapbox/components/status-media.tsx +++ b/app/soapbox/components/status-media.tsx @@ -7,6 +7,7 @@ import Card from 'soapbox/features/status/components/card'; import Bundle from 'soapbox/features/ui/components/bundle'; import { MediaGallery, Video, Audio } from 'soapbox/features/ui/util/async-components'; import { useAppDispatch } from 'soapbox/hooks'; +import { addAutoPlay } from 'soapbox/utils/media'; import type { List as ImmutableList } from 'immutable'; import type { Status, Attachment } from 'soapbox/types/entities'; @@ -93,7 +94,7 @@ const StatusMedia: React.FC = ({ ref={setRef} className='status-card__image status-card-video' style={height ? { height } : undefined} - dangerouslySetInnerHTML={{ __html: status.card.html }} + dangerouslySetInnerHTML={{ __html: addAutoPlay(status.card.html) }} /> ); diff --git a/app/soapbox/features/status/components/card.tsx b/app/soapbox/features/status/components/card.tsx index 3d83020fe..7e976e5bb 100644 --- a/app/soapbox/features/status/components/card.tsx +++ b/app/soapbox/features/status/components/card.tsx @@ -6,6 +6,7 @@ import Blurhash from 'soapbox/components/blurhash'; import Icon from 'soapbox/components/icon'; import { HStack, Stack, Text } from 'soapbox/components/ui'; import { normalizeAttachment } from 'soapbox/normalizers'; +import { addAutoPlay } from 'soapbox/utils/media'; import type { Card as CardEntity, Attachment } from 'soapbox/types/entities'; @@ -19,30 +20,6 @@ const trim = (text: string, len: number): string => { return text.substring(0, cut) + (text.length > len ? '…' : ''); }; -const domParser = new DOMParser(); - -const addAutoPlay = (html: string): string => { - const document = domParser.parseFromString(html, 'text/html').documentElement; - const iframe = document.querySelector('iframe'); - - if (iframe) { - if (iframe.src.includes('?')) { - iframe.src += '&'; - } else { - iframe.src += '?'; - } - - iframe.src += 'autoplay=1&auto_play=1'; - iframe.allow = 'autoplay'; - - // DOM parser creates html/body elements around original HTML fragment, - // so we need to get innerHTML out of the body and not the entire document - return (document.querySelector('body') as HTMLBodyElement).innerHTML; - } - - return html; -}; - interface ICard { card: CardEntity, maxTitle?: number, diff --git a/app/soapbox/utils/__tests__/media.test.ts b/app/soapbox/utils/__tests__/media.test.ts new file mode 100644 index 000000000..815b12321 --- /dev/null +++ b/app/soapbox/utils/__tests__/media.test.ts @@ -0,0 +1,17 @@ +import { addAutoPlay } from '../media'; + +describe('addAutoPlay()', () => { + describe('when the provider is Rumble', () => { + it('adds the correct query parameters to the src', () => { + const html = ''; + expect(addAutoPlay(html)).toEqual(''); + }); + }); + + describe('when the provider is not Rumble', () => { + it('adds the correct query parameters to the src', () => { + const html = ''; + expect(addAutoPlay(html)).toEqual(''); + }); + }); +}); diff --git a/app/soapbox/utils/media.ts b/app/soapbox/utils/media.ts index 7947ef91f..27a1f6ba0 100644 --- a/app/soapbox/utils/media.ts +++ b/app/soapbox/utils/media.ts @@ -51,4 +51,32 @@ const getVideoDuration = (file: File): Promise => { return promise; }; -export { getVideoDuration, formatBytes, truncateFilename }; +const domParser = new DOMParser(); + +const addAutoPlay = (html: string): string => { + const document = domParser.parseFromString(html, 'text/html').documentElement; + const iframe = document.querySelector('iframe'); + + if (iframe) { + if (iframe.src.includes('?')) { + iframe.src += '&'; + } else { + iframe.src += '?'; + } + + if (new URL(iframe.src).host === 'rumble.com') { + iframe.src += 'pub=7a20&autoplay=2'; + } else { + iframe.src += 'autoplay=1&auto_play=1'; + iframe.allow = 'autoplay'; + } + + // DOM parser creates html/body elements around original HTML fragment, + // so we need to get innerHTML out of the body and not the entire document + return (document.querySelector('body') as HTMLBodyElement).innerHTML; + } + + return html; +}; + +export { getVideoDuration, formatBytes, truncateFilename, addAutoPlay }; From 5c6ae4d6da1af2ab671efe20d6b9072142c2eaec Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Fri, 11 Nov 2022 10:21:32 -0500 Subject: [PATCH 03/65] Make auto-play video optional config --- app/soapbox/__fixtures__/intlMessages.json | 1 + app/soapbox/components/status-media.tsx | 9 +++++++-- app/soapbox/features/preferences/index.tsx | 4 ++++ app/soapbox/features/status/components/card.tsx | 6 +++++- app/soapbox/locales/en.json | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/soapbox/__fixtures__/intlMessages.json b/app/soapbox/__fixtures__/intlMessages.json index 54c919e6a..eb2a35806 100644 --- a/app/soapbox/__fixtures__/intlMessages.json +++ b/app/soapbox/__fixtures__/intlMessages.json @@ -319,6 +319,7 @@ "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "preferences.fields.auto_play_gif_label": "Auto-play animated GIFs", + "preferences.fields.auto_play_video_label": "Auto-play videos", "preferences.fields.boost_modal_label": "Show confirmation dialog before reposting", "preferences.fields.delete_modal_label": "Show confirmation dialog before deleting a post", "preferences.fields.demetricator_label": "Use Demetricator", diff --git a/app/soapbox/components/status-media.tsx b/app/soapbox/components/status-media.tsx index 195e749f1..b159d4fe5 100644 --- a/app/soapbox/components/status-media.tsx +++ b/app/soapbox/components/status-media.tsx @@ -6,7 +6,7 @@ import PlaceholderCard from 'soapbox/features/placeholder/components/placeholder import Card from 'soapbox/features/status/components/card'; import Bundle from 'soapbox/features/ui/components/bundle'; import { MediaGallery, Video, Audio } from 'soapbox/features/ui/util/async-components'; -import { useAppDispatch } from 'soapbox/hooks'; +import { useAppDispatch, useSettings } from 'soapbox/hooks'; import { addAutoPlay } from 'soapbox/utils/media'; import type { List as ImmutableList } from 'immutable'; @@ -34,6 +34,9 @@ const StatusMedia: React.FC = ({ onToggleVisibility = () => { }, }) => { const dispatch = useAppDispatch(); + const settings = useSettings(); + const shouldAutoPlayVideo = settings.get('autoPlayVideo'); + const [mediaWrapperWidth, setMediaWrapperWidth] = useState(undefined); const size = status.media_attachments.size; @@ -94,7 +97,9 @@ const StatusMedia: React.FC = ({ ref={setRef} className='status-card__image status-card-video' style={height ? { height } : undefined} - dangerouslySetInnerHTML={{ __html: addAutoPlay(status.card.html) }} + dangerouslySetInnerHTML={{ + __html: shouldAutoPlayVideo ? addAutoPlay(status.card.html) : status.card.html, + }} /> ); diff --git a/app/soapbox/features/preferences/index.tsx b/app/soapbox/features/preferences/index.tsx index 3adb90861..98221a8fd 100644 --- a/app/soapbox/features/preferences/index.tsx +++ b/app/soapbox/features/preferences/index.tsx @@ -193,6 +193,10 @@ const Preferences = () => { + }> + + + {features.spoilers && }> } diff --git a/app/soapbox/features/status/components/card.tsx b/app/soapbox/features/status/components/card.tsx index 7e976e5bb..18dd427a5 100644 --- a/app/soapbox/features/status/components/card.tsx +++ b/app/soapbox/features/status/components/card.tsx @@ -5,6 +5,7 @@ import React, { useState, useEffect } from 'react'; import Blurhash from 'soapbox/components/blurhash'; import Icon from 'soapbox/components/icon'; import { HStack, Stack, Text } from 'soapbox/components/ui'; +import { useSettings } from 'soapbox/hooks'; import { normalizeAttachment } from 'soapbox/normalizers'; import { addAutoPlay } from 'soapbox/utils/media'; @@ -41,6 +42,9 @@ const Card: React.FC = ({ onOpenMedia, horizontal, }): JSX.Element => { + const settings = useSettings(); + const shouldAutoPlayVideo = settings.get('autoPlayVideo'); + const [width, setWidth] = useState(defaultWidth); const [embedded, setEmbedded] = useState(false); @@ -88,7 +92,7 @@ const Card: React.FC = ({ }; const renderVideo = () => { - const content = { __html: addAutoPlay(card.html) }; + const content = { __html: shouldAutoPlayVideo ? addAutoPlay(card.html) : card.html }; const ratio = getRatio(card); const height = width / ratio; diff --git a/app/soapbox/locales/en.json b/app/soapbox/locales/en.json index f2eaf32c8..b7c280137 100644 --- a/app/soapbox/locales/en.json +++ b/app/soapbox/locales/en.json @@ -790,6 +790,7 @@ "poll_button.remove_poll": "Remove poll", "pre_header.close": "Close", "preferences.fields.auto_play_gif_label": "Auto-play animated GIFs", + "preferences.fields.auto_play_video_label": "Auto-play videos", "preferences.fields.autoload_more_label": "Automatically load more items when scrolled to the bottom of the page", "preferences.fields.autoload_timelines_label": "Automatically load new posts when scrolled to the top of the page", "preferences.fields.boost_modal_label": "Show confirmation dialog before reposting", From a0b854da338d40e9c1bd27fca56d6cd5e06cc1a3 Mon Sep 17 00:00:00 2001 From: Yotam Nachum Date: Fri, 11 Nov 2022 15:34:50 +0000 Subject: [PATCH 04/65] Add Hebrew translations --- app/soapbox/locales/he.json | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/app/soapbox/locales/he.json b/app/soapbox/locales/he.json index 7b20f137a..63b242ee1 100644 --- a/app/soapbox/locales/he.json +++ b/app/soapbox/locales/he.json @@ -4,7 +4,7 @@ "accordion.expand": "הרחבה", "account.add_or_remove_from_list": "הוסף או הסר מהרשימות", "account.badges.bot": "בוט", - "account.birthday": "Born {date}", + "account.birthday": "נולד ב-{date}", "account.birthday_today": "Birthday is today!", "account.block": "חסימת @{name}", "account.block_domain": "להסתיר הכל מהקהילה {domain}", @@ -122,11 +122,11 @@ "admin_nav.dashboard": "לוח מחוונים", "admin_nav.reports": "דיווחים", "alert.unexpected.body": "We're sorry for the interruption. If the problem persists, please reach out to our support team. You may also try to {clearCookies} (this will log you out).", - "alert.unexpected.browser": "Browser", + "alert.unexpected.browser": "דפדפן", "alert.unexpected.clear_cookies": "נקה קובצי 'עוגיות' ונתוני דפדפן", "alert.unexpected.links.help": "Help Center", - "alert.unexpected.links.status": "Status", - "alert.unexpected.links.support": "Support", + "alert.unexpected.links.status": "סטטוס", + "alert.unexpected.links.support": "תמיכה", "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.", "alert.unexpected.return_home": "חזור הביתה", "alert.unexpected.title": "אופס!", @@ -154,8 +154,8 @@ "backups.empty_message": "לא נמצאו גיבויים. {action}", "backups.empty_message.action": "האם ליצור אחד עכשיו?", "backups.pending": "בהמתנה", - "beta.also_available": "Available in:", - "birthday_panel.title": "Birthdays", + "beta.also_available": "זמין ב:", + "birthday_panel.title": "ימי הולדת", "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה", "bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.", "bundle_column_error.retry": "לנסות שוב", @@ -257,7 +257,7 @@ "column_forbidden.body": "אין לך הרשאה לגשת לדף זה.", "column_forbidden.title": "אסור", "column_header.show_settings": "הצגת העדפות", - "common.cancel": "Cancel", + "common.cancel": "בטל", "community.column_settings.media_only": "רק מדיה", "community.column_settings.title": "הגדרות ציר זמן מקומי", "compose.character_counter.title": "השתמת ב{chars} מתוך {maxChars} תווים", @@ -345,21 +345,21 @@ "crypto_donate_panel.heading": "תרום מטבעות קריפטו", "crypto_donate_panel.intro.message": "{siteTitle} מקבל תרומות של מטבעות קריפטוגרפיים כדי לממן את השירות שלנו. תודה על תמיכתך!", "datepicker.hint": "מתוכנן לפרסם ב...", - "datepicker.next_month": "Next month", - "datepicker.next_year": "Next year", - "datepicker.previous_month": "Previous month", - "datepicker.previous_year": "Previous year", - "developers.challenge.answer_label": "Answer", - "developers.challenge.answer_placeholder": "Your answer", - "developers.challenge.fail": "Wrong answer", + "datepicker.next_month": "חודש הבא", + "datepicker.next_year": "שנה הבאה", + "datepicker.previous_month": "חודש קודם", + "datepicker.previous_year": "שנה קודמת", + "developers.challenge.answer_label": "תשובה", + "developers.challenge.answer_placeholder": "התשובה שלך", + "developers.challenge.fail": "תשובה שגויה", "developers.challenge.message": "What is the result of calling {function}?", "developers.challenge.submit": "Become a developer", - "developers.challenge.success": "You are now a developer", + "developers.challenge.success": "אתה עכשיו מפתח", "developers.leave": "You have left developers", "developers.navigation.app_create_label": "צור אפליקציה", "developers.navigation.intentional_error_label": "הפעלת שגיאה", "developers.navigation.leave_developers_label": "Leave developers", - "developers.navigation.network_error_label": "Network error", + "developers.navigation.network_error_label": "שגיאת רשת", "developers.navigation.settings_store_label": "Settings store", "developers.navigation.test_timeline_label": "Test timeline", "developers.settings_store.hint": "It is possible to directly edit your user settings here. BE CAREFUL! Editing this section can break your account, and you will only be able to recover through the API.", @@ -375,7 +375,7 @@ "edit_federation.save": "שמור", "edit_federation.success": "הפדרציה של {host} עודכנה", "edit_federation.unlisted": "לכפות פוסטים כלא רשומים", - "edit_password.header": "Change Password", + "edit_password.header": "שנה סיסמא", "edit_profile.error": "עדכון הפרופיל נכשל", "edit_profile.fields.accepts_email_list_label": "הירשם לעדכונים", "edit_profile.fields.avatar_label": "אווטאר", @@ -395,9 +395,9 @@ "edit_profile.fields.meta_fields.content_placeholder": "תוכן", "edit_profile.fields.meta_fields.label_placeholder": "תווית", "edit_profile.fields.stranger_notifications_label": "חסום התראות מזרים", - "edit_profile.fields.website_label": "Website", + "edit_profile.fields.website_label": "אתר", "edit_profile.fields.website_placeholder": "Display a Link", - "edit_profile.header": "Edit Profile", + "edit_profile.header": "ערוך פרופיל", "edit_profile.hints.accepts_email_list": "הצטרפו לעדכוני חדשות ועדכונים שיווקיים.", "edit_profile.hints.avatar": "PNG, GIF או JPG. יוקטן ל-{size}", "edit_profile.hints.bot": "חשבון זה מבצע בעיקר פעולות אוטומטיות וייתכן שלא יהיה פיקוח", @@ -409,13 +409,13 @@ "edit_profile.save": "שמירה", "edit_profile.success": "הפרופיל נשמר!", "email_passthru.confirmed.body": "Close this tab and continue the registration process on the {bold} from which you sent this email confirmation.", - "email_passthru.confirmed.heading": "Email Confirmed!", + "email_passthru.confirmed.heading": "אימייל אומת!", "email_passthru.generic_fail.body": "Please request a new email confirmation.", - "email_passthru.generic_fail.heading": "Something Went Wrong", + "email_passthru.generic_fail.heading": "משהו השתבש", "email_passthru.token_expired.body": "Your email token has expired. Please request a new email confirmation from the {bold} from which you sent this email confirmation.", - "email_passthru.token_expired.heading": "Token Expired", + "email_passthru.token_expired.heading": "טוקן פג תוקף", "email_passthru.token_not_found.body": "Your email token was not found. Please request a new email confirmation from the {bold} from which you sent this email confirmation.", - "email_passthru.token_not_found.heading": "Invalid Token", + "email_passthru.token_not_found.heading": "טוקן לא תקין", "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", "embed.preview": "דוגמא כיצד זה יראה:", "emoji_button.activity": "פעילות", @@ -564,8 +564,8 @@ "import_data.success.blocks": "חסימות יובאו בהצלחה", "import_data.success.followers": "מעקבים יובאו בהצלחה", "import_data.success.mutes": "השתקות יובאו בהצלחה", - "input.password.hide_password": "Hide password", - "input.password.show_password": "Show password", + "input.password.hide_password": "הסתר סיסמא", + "input.password.show_password": "הצג סיסמא", "intervals.full.days": "{number, plural, one {# יום} other {# ימים}}", "intervals.full.hours": "{number, plural, one {# שעה} other {# שעות}}", "intervals.full.minutes": "{number, plural, one {# דקה} other {# דקות}}", @@ -635,7 +635,7 @@ "login.fields.otp_code_hint": "הזן את קוד שני הגורמים שנוצר על ידי אפליקציות הטלפון שלך או השתמש באחד מקודי השחזור שלך", "login.fields.otp_code_label": "קוד דו גורמי:", "login.fields.password_placeholder": "סיסמא", - "login.fields.username_label": "Email or username", + "login.fields.username_label": "שם משתמש או אימייל", "login.log_in": "התחברות", "login.otp_log_in": "התחברות OTP", "login.reset_password_hint": "בעיה בהתחברות?", @@ -659,12 +659,12 @@ "mfa.setup_warning": "רשום את הקודים האלה או שמור אותם במקום מאובטח - אחרת לא תראה אותם שוב. אם תאבד את הגישה לאפליקציית 2FA ולקודי השחזור שלך תינעל מחוץ לחשבון שלך.", "migration.fields.acct.label": "Handle of the new account", "migration.fields.acct.placeholder": "username@domain", - "migration.fields.confirm_password.label": "Current password", + "migration.fields.confirm_password.label": "סיסמא נוכחית", "migration.hint": "This will move your followers to the new account. No other data will be moved. To perform migration, you need to {link} on your new account first.", "migration.hint.link": "create an account alias", - "migration.move_account.fail": "Account migration failed.", - "migration.move_account.success": "Account successfully moved.", - "migration.submit": "Move followers", + "migration.move_account.fail": "העברת חשבון נכשלה.", + "migration.move_account.success": "חשבון הועבר בהצלחה.", + "migration.submit": "העבר עוקבים", "missing_description_modal.cancel": "בטל", "missing_description_modal.continue": "שלח", "missing_description_modal.description": "המשך בכל זאת?", @@ -720,8 +720,8 @@ "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?", "notifications.clear_heading": "Clear notifications", "notifications.column_settings.alert": "התראות לשולחן העבודה", - "notifications.column_settings.birthdays.category": "Birthdays", - "notifications.column_settings.birthdays.show": "Show birthday reminders", + "notifications.column_settings.birthdays.category": "ימי הולדת", + "notifications.column_settings.birthdays.show": "הראה תזכורות לימי הולדת", "notifications.column_settings.emoji_react": "הגבות אימוג'י:", "notifications.column_settings.favourite": "מחובבים:", "notifications.column_settings.filter_bar.advanced": "הצג את כל הקטגוריות", @@ -891,7 +891,7 @@ "security.fields.email.label": "אימייל", "security.fields.new_password.label": "סיסמא חדשה", "security.fields.old_password.label": "סיסמא נוכחית", - "security.fields.password.label": "Password", + "security.fields.password.label": "סיסמא", "security.fields.password_confirmation.label": "סיסמא חדשה (שוב)", "security.headers.delete": "מחק חשבון", "security.headers.tokens": "הפעלות", @@ -910,16 +910,16 @@ "security.update_email.success": "האימייל עודכן בהצלחה.", "security.update_password.fail": "עדכון הסיסמא נכשל.", "security.update_password.success": "הסיסמה עודכנה בהצלחה.", - "settings.change_email": "Change Email", - "settings.change_password": "Change Password", + "settings.change_email": "שנה אימייל", + "settings.change_password": "שנה סיסמא", "settings.configure_mfa": "Configure MFA", - "settings.delete_account": "Delete Account", - "settings.edit_profile": "Edit Profile", + "settings.delete_account": "מחק חשבון", + "settings.edit_profile": "ערוך פרופיל", "settings.preferences": "Preferences", - "settings.profile": "Profile", + "settings.profile": "פרופיל", "settings.save.success": "Your preferences have been saved!", "settings.security": "Security", - "settings.settings": "Settings", + "settings.settings": "הגדרות", "signup_panel.subtitle": "הירשם כעת כדי לדון.", "signup_panel.title": "חדש ל{site_title}?", "snackbar.view": "View", @@ -1029,12 +1029,12 @@ "tabs_bar.dashboard": "לוח מחוונים", "tabs_bar.fediverse": "פדרציה", "tabs_bar.home": "בית", - "tabs_bar.more": "More", + "tabs_bar.more": "עוד", "tabs_bar.notifications": "התראות", "tabs_bar.post": "פוסט", - "tabs_bar.profile": "Profile", + "tabs_bar.profile": "פרופיל", "tabs_bar.search": "חיפוש", - "tabs_bar.settings": "Settings", + "tabs_bar.settings": "הגדרות", "tabs_bar.theme_toggle_dark": "עבור לערכת נושא כהה", "tabs_bar.theme_toggle_light": "עבור לערכת נושא בהירה", "time_remaining.days": "{number, plural, one {# יום} other {# ימים}} נותרו", From e75f1ea07441f7352576acac7ba69abef1eef8b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Fri, 11 Nov 2022 20:41:32 +0100 Subject: [PATCH 05/65] Update some dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/components/autosuggest_input.tsx | 2 +- .../components/autosuggest_textarea.tsx | 2 +- app/soapbox/components/ui/tooltip/tooltip.tsx | 2 +- package.json | 18 +- yarn.lock | 203 +++++++++--------- 5 files changed, 108 insertions(+), 119 deletions(-) diff --git a/app/soapbox/components/autosuggest_input.tsx b/app/soapbox/components/autosuggest_input.tsx index 155cd428a..eb51ae41f 100644 --- a/app/soapbox/components/autosuggest_input.tsx +++ b/app/soapbox/components/autosuggest_input.tsx @@ -1,4 +1,4 @@ -import Portal from '@reach/portal'; +import { Portal } from '@reach/portal'; import classNames from 'clsx'; import { List as ImmutableList } from 'immutable'; import React from 'react'; diff --git a/app/soapbox/components/autosuggest_textarea.tsx b/app/soapbox/components/autosuggest_textarea.tsx index c1c849b07..4f80d0b3b 100644 --- a/app/soapbox/components/autosuggest_textarea.tsx +++ b/app/soapbox/components/autosuggest_textarea.tsx @@ -1,4 +1,4 @@ -import Portal from '@reach/portal'; +import { Portal } from '@reach/portal'; import classNames from 'clsx'; import React from 'react'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/soapbox/components/ui/tooltip/tooltip.tsx b/app/soapbox/components/ui/tooltip/tooltip.tsx index e04221200..02a811bac 100644 --- a/app/soapbox/components/ui/tooltip/tooltip.tsx +++ b/app/soapbox/components/ui/tooltip/tooltip.tsx @@ -1,4 +1,4 @@ -import Portal from '@reach/portal'; +import { Portal } from '@reach/portal'; import { TooltipPopup, useTooltip } from '@reach/tooltip'; import React from 'react'; diff --git a/package.json b/package.json index 576eec262..afad054f8 100644 --- a/package.json +++ b/package.json @@ -56,17 +56,17 @@ "@lcdp/offline-plugin": "^5.1.0", "@metamask/providers": "^9.0.0", "@popperjs/core": "^2.11.5", - "@reach/menu-button": "^0.16.2", - "@reach/popover": "^0.16.2", - "@reach/portal": "^0.16.2", - "@reach/rect": "^0.16.0", - "@reach/tabs": "^0.16.4", - "@reach/tooltip": "^0.16.2", + "@reach/menu-button": "^0.18.0", + "@reach/popover": "^0.18.0", + "@reach/portal": "^0.18.0", + "@reach/rect": "^0.18.0", + "@reach/tabs": "^0.18.0", + "@reach/tooltip": "^0.18.0", "@reduxjs/toolkit": "^1.8.1", "@sentry/browser": "^7.11.1", "@sentry/react": "^7.11.1", "@sentry/tracing": "^7.11.1", - "@tabler/icons": "^1.109.0", + "@tabler/icons": "^1.111.0", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.7", "@tanstack/react-query": "^4.0.10", @@ -173,13 +173,13 @@ "react-redux": "^7.2.5", "react-router-dom": "^5.3.0", "react-router-scroll-4": "^1.0.0-beta.2", - "react-simple-pull-to-refresh": "^1.3.0", + "react-simple-pull-to-refresh": "^1.3.3", "react-sparklines": "^1.7.0", "react-sticky-box": "^1.0.2", "react-swipeable-views": "^0.14.0", "react-textarea-autosize": "^8.3.4", "react-toggle": "^4.1.2", - "react-virtuoso": "^2.16.2", + "react-virtuoso": "^3.1.3", "redux": "^4.1.1", "redux-immutable": "^4.0.0", "redux-thunk": "^2.2.0", diff --git a/yarn.lock b/yarn.lock index 9c2729f93..803003924 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2048,121 +2048,110 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.1.tgz#728ecd95ab207aab8a9a4e421f0422db329232be" integrity sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw== -"@reach/auto-id@0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.16.0.tgz#dfabc3227844e8c04f8e6e45203a8e14a8edbaed" - integrity sha512-5ssbeP5bCkM39uVsfQCwBBL+KT8YColdnMN5/Eto6Rj7929ql95R3HZUOkKIvj7mgPtEb60BLQxd1P3o6cjbmg== +"@reach/auto-id@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.18.0.tgz#4b97085cd1cf1360a9bedc6e9c78e97824014f0d" + integrity sha512-XwY1IwhM7mkHZFghhjiqjQ6dstbOdpbFLdggeke75u8/8icT8uEHLbovFUgzKjy9qPvYwZIB87rLiR8WdtOXCg== dependencies: - "@reach/utils" "0.16.0" - tslib "^2.3.0" + "@reach/utils" "0.18.0" -"@reach/descendants@0.16.1": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@reach/descendants/-/descendants-0.16.1.tgz#fa3d89c0503565369707f32985d87eef61985d9f" - integrity sha512-3WZgRnD9O4EORKE31rrduJDiPFNMOjUkATx0zl192ZxMq3qITe4tUj70pS5IbJl/+v9zk78JwyQLvA1pL7XAPA== +"@reach/descendants@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/descendants/-/descendants-0.18.0.tgz#16fe52a5154da262994b0b8768baff4f670922d1" + integrity sha512-GXUxnM6CfrX5URdnipPIl3Tlc6geuz4xb4n61y4tVWXQX1278Ra9Jz9DMRN8x4wheHAysvrYwnR/SzAlxQzwtA== dependencies: - "@reach/utils" "0.16.0" - tslib "^2.3.0" + "@reach/utils" "0.18.0" -"@reach/dropdown@0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/dropdown/-/dropdown-0.16.2.tgz#4aa7df0f716cb448d01bc020d54df595303d5fa6" - integrity sha512-l4nNiX6iUpMdHQNbZMhgW5APtw0AUwJuRnkqE93vkjvdtrYl/sNJy1Jr6cGG7TrZIABLSOsfwbXU3C+qwJ3ftQ== +"@reach/dropdown@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/dropdown/-/dropdown-0.18.0.tgz#c2e2e99df682f2136558851b80dc05b4f9dd92a5" + integrity sha512-LriXdVgxJoUhIQfS2r2DHYv3X6fHyplYxa9FmSwQIMXdESpE/P9Zsb1pVEObcNf3ZQBrl0L1bl/5rk7SpK7qfA== dependencies: - "@reach/auto-id" "0.16.0" - "@reach/descendants" "0.16.1" - "@reach/popover" "0.16.2" - "@reach/utils" "0.16.0" - tslib "^2.3.0" + "@reach/auto-id" "0.18.0" + "@reach/descendants" "0.18.0" + "@reach/polymorphic" "0.18.0" + "@reach/popover" "0.18.0" + "@reach/utils" "0.18.0" -"@reach/menu-button@^0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/menu-button/-/menu-button-0.16.2.tgz#664e33e70de431f88abf1f8537c48b1b6ce87e88" - integrity sha512-p4n6tFVaJZHJZEznHWy0YH2Xr3I+W7tsQWAT72PqKGT+uryGRdtgEQqi76f/8cRaw/00ueazBk5lwLG7UKGFaA== +"@reach/menu-button@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/menu-button/-/menu-button-0.18.0.tgz#ae40dc86e47e7f925599ca720e3ba65263cc56f3" + integrity sha512-v1lj5rYSpavOKI4ipXj8OfvQmvVNAYXCv+UcltRkjOcWEKWADUUKkGX55wiUhsCsTGCJ7lGYz5LqOZrn3LP6PQ== dependencies: - "@reach/dropdown" "0.16.2" - "@reach/popover" "0.16.2" - "@reach/utils" "0.16.0" - prop-types "^15.7.2" - tiny-warning "^1.0.3" - tslib "^2.3.0" + "@reach/dropdown" "0.18.0" + "@reach/polymorphic" "0.18.0" + "@reach/popover" "0.18.0" + "@reach/utils" "0.18.0" "@reach/observe-rect@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== -"@reach/popover@0.16.2", "@reach/popover@^0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/popover/-/popover-0.16.2.tgz#71d7af3002ca49d791476b22dee1840dd1719c19" - integrity sha512-IwkRrHM7Vt33BEkSXneovymJv7oIToOfTDwRKpuYEB/BWYMAuNfbsRL7KVe6MjkgchDeQzAk24cYY1ztQj5HQQ== +"@reach/polymorphic@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/polymorphic/-/polymorphic-0.18.0.tgz#2fe42007a774e06cdbc8e13e0d46f2dc30f2f1ed" + integrity sha512-N9iAjdMbE//6rryZZxAPLRorzDcGBnluf7YQij6XDLiMtfCj1noa7KyLpEc/5XCIB/EwhX3zCluFAwloBKdblA== + +"@reach/popover@0.18.0", "@reach/popover@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/popover/-/popover-0.18.0.tgz#1eba3e9ed826ac69dfdf3b01a1dab15ca889b5fc" + integrity sha512-mpnWWn4w74L2U7fcneVdA6Fz3yKWNdZIRMoK8s6H7F8U2dLM/qN7AjzjEBqi6LXKb3Uf1ge4KHSbMixW0BygJQ== dependencies: - "@reach/portal" "0.16.2" - "@reach/rect" "0.16.0" - "@reach/utils" "0.16.0" - tabbable "^4.0.0" - tslib "^2.3.0" + "@reach/polymorphic" "0.18.0" + "@reach/portal" "0.18.0" + "@reach/rect" "0.18.0" + "@reach/utils" "0.18.0" + tabbable "^5.3.3" -"@reach/portal@0.16.2", "@reach/portal@^0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.16.2.tgz#ca83696215ee03acc2bb25a5ae5d8793eaaf2f64" - integrity sha512-9ur/yxNkuVYTIjAcfi46LdKUvH0uYZPfEp4usWcpt6PIp+WDF57F/5deMe/uGi/B/nfDweQu8VVwuMVrCb97JQ== +"@reach/portal@0.18.0", "@reach/portal@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.18.0.tgz#dd466f5110689d14a0e7491b3aa8a449e8cefb40" + integrity sha512-TImozRapd576ofRk30Le2L3lRTFXF1p47B182wnp5eMTdZa74JX138BtNGEPJFOyrMaVmguVF8SSwZ6a0fon1Q== dependencies: - "@reach/utils" "0.16.0" - tiny-warning "^1.0.3" - tslib "^2.3.0" + "@reach/utils" "0.18.0" -"@reach/rect@0.16.0", "@reach/rect@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.16.0.tgz#78cf6acefe2e83d3957fa84f938f6e1fc5700f16" - integrity sha512-/qO9jQDzpOCdrSxVPR6l674mRHNTqfEjkaxZHluwJ/2qGUtYsA0GSZiF/+wX/yOWeBif1ycxJDa6HusAMJZC5Q== +"@reach/rect@0.18.0", "@reach/rect@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.18.0.tgz#d1dc45adc92f80cc54b64498e19de909ced40722" + integrity sha512-Xk8urN4NLn3F70da/DtByMow83qO6DF6vOxpLjuDBqud+kjKgxAU9vZMBSZJyH37+F8mZinRnHyXtlLn5njQOg== dependencies: "@reach/observe-rect" "1.2.0" - "@reach/utils" "0.16.0" - prop-types "^15.7.2" - tiny-warning "^1.0.3" - tslib "^2.3.0" + "@reach/utils" "0.18.0" -"@reach/tabs@^0.16.4": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@reach/tabs/-/tabs-0.16.4.tgz#7da85e46f64052bdd1c0f9582f900e379b098ac5" - integrity sha512-4EK+1U0OoLfg2tJ1BSZf6/tx0hF5vlXKxY7qB//bPWtlIh9Xfp/aSDIdspFf3xS8MjtKeb6IVmo5UAxDMq85ZA== +"@reach/tabs@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/tabs/-/tabs-0.18.0.tgz#f2e789d445d61a371eace9415841502729d099c9" + integrity sha512-gTRJzStWJJtgMhn9FDEmKogAJMcqNaGZx0i1SGoTdVM+D29DBhVeRdO8qEg+I2l2k32DkmuZxG/Mrh+GZTjczQ== dependencies: - "@reach/auto-id" "0.16.0" - "@reach/descendants" "0.16.1" - "@reach/utils" "0.16.0" - prop-types "^15.7.2" - tslib "^2.3.0" + "@reach/auto-id" "0.18.0" + "@reach/descendants" "0.18.0" + "@reach/polymorphic" "0.18.0" + "@reach/utils" "0.18.0" -"@reach/tooltip@^0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/tooltip/-/tooltip-0.16.2.tgz#8448cee341476e4f795fa7192f7a0864f06b8085" - integrity sha512-wtJPnbJ6l4pmudMpQHGU9v1NS4ncDgcwRNi9re9KsIdsM525zccZvHQLteBKYiaW4ib7k09t2dbwhyNU9oa0Iw== - dependencies: - "@reach/auto-id" "0.16.0" - "@reach/portal" "0.16.2" - "@reach/rect" "0.16.0" - "@reach/utils" "0.16.0" - "@reach/visually-hidden" "0.16.0" - prop-types "^15.7.2" - tiny-warning "^1.0.3" - tslib "^2.3.0" - -"@reach/utils@0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.16.0.tgz#5b0777cf16a7cab1ddd4728d5d02762df0ba84ce" - integrity sha512-PCggBet3qaQmwFNcmQ/GqHSefadAFyNCUekq9RrWoaU9hh/S4iaFgf2MBMdM47eQj5i/Bk0Mm07cP/XPFlkN+Q== +"@reach/tooltip@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/tooltip/-/tooltip-0.18.0.tgz#6d416e77a82543af9a57d122962f9c0294fc2a5f" + integrity sha512-yugoTmTjB3qoMk/nUvcnw99MqpyE2TQMOXE29qnQhSqHriRwQhfftjXlTAGTSzsUJmbyms3A/1gQW0X61kjFZw== dependencies: - tiny-warning "^1.0.3" - tslib "^2.3.0" + "@reach/auto-id" "0.18.0" + "@reach/polymorphic" "0.18.0" + "@reach/portal" "0.18.0" + "@reach/rect" "0.18.0" + "@reach/utils" "0.18.0" + "@reach/visually-hidden" "0.18.0" -"@reach/visually-hidden@0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@reach/visually-hidden/-/visually-hidden-0.16.0.tgz#2a5e834af9e93c554065ff8cbb0907fbeb26ad02" - integrity sha512-IIayZ3jzJtI5KfcfRVtOMFkw2ef/1dMT8D9BUuFcU2ORZAWLNvnzj1oXNoIfABKl5wtsLjY6SGmkYQ+tMPN8TA== +"@reach/utils@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.18.0.tgz#4f3cebe093dd436eeaff633809bf0f68f4f9d2ee" + integrity sha512-KdVMdpTgDyK8FzdKO9SCpiibuy/kbv3pwgfXshTI6tEcQT1OOwj7BAksnzGC0rPz0UholwC+AgkqEl3EJX3M1A== + +"@reach/visually-hidden@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@reach/visually-hidden/-/visually-hidden-0.18.0.tgz#17923c08acc5946624c2836b2b09d359b3aa8c27" + integrity sha512-NsJ3oeHJtPc6UOeV6MHMuzQ5sl1ouKhW85i3C0S7VM+klxVlYScBZ2J4UVnWB50A2c+evdVpCnld2YeuyYYwBw== dependencies: - prop-types "^15.7.2" - tslib "^2.3.0" + "@reach/polymorphic" "0.18.0" "@reduxjs/toolkit@^1.8.1": version "1.8.1" @@ -2271,10 +2260,10 @@ remark "^13.0.0" unist-util-find-all-after "^3.0.2" -"@tabler/icons@^1.109.0": - version "1.109.0" - resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-1.109.0.tgz#11626c3fc097f2f70c4c197e4b9909fb05380752" - integrity sha512-B0YetE4pB6HY2Wa57v/LJ3NgkJzKYPze4U0DurIqPoKSptatKv2ga76FZSkO6EUpkYfHMtGPM6QjpJljfuCmAQ== +"@tabler/icons@^1.111.0": + version "1.111.0" + resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-1.111.0.tgz#0538fdd8b5de7072ae60fc5d2f13a9a636d2d0e3" + integrity sha512-TZWYiMT5ccqfHxRE0Qtgvl+sGsMbNkrv7cJMt/tm8TN9l/CDXx/o7d8uAwUN+3PAlSFfF5e/rD1bi1WJs2xNIA== "@tailwindcss/forms@^0.5.3": version "0.5.3" @@ -10021,10 +10010,10 @@ react-side-effect@^2.1.0: resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== -react-simple-pull-to-refresh@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-simple-pull-to-refresh/-/react-simple-pull-to-refresh-1.3.0.tgz#5f7bcd475ea5c33ecd505d097b14f56c3e5e3ce8" - integrity sha512-QPFGFsbroh2WoTcLCh3f6peMRfSettYJKCXMS9FNbFav7GWKD2whqACiNLx+Mi+VkP/I+aerB7kEirk+DQx41A== +react-simple-pull-to-refresh@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/react-simple-pull-to-refresh/-/react-simple-pull-to-refresh-1.3.3.tgz#118afe0d8ba6cade87094786b3889fb2ffd5b9bc" + integrity sha512-6qXsa5RtNVmKJhLWvDLIX8UK51HFtCEGjdqQGf+M1Qjrcc4qH4fki97sgVpGEFBRwbY7DiVDA5N5p97kF16DTw== react-sparklines@^1.7.0: version "1.7.0" @@ -10097,10 +10086,10 @@ react-transition-group@^2.2.1: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-virtuoso@^2.16.2: - version "2.16.2" - resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-2.16.2.tgz#f0a290931ee358c40661d751df2d8b9f32496f0a" - integrity sha512-aH6XpizVYCpIkBm6td1q63Lqeu7KG1iAmpYVnzjThhm5tHEo9FJpeHAU73FJaMplFrfMKBrNfmO7a7jTOeM56g== +react-virtuoso@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-3.1.3.tgz#db811ff6fdd4749cfe9348f6d0b1333a348e65c4" + integrity sha512-sc4WICEZkyT+XdVc7gA/61UT43ZnMSX0ugh+xBG2cX+EDWs31wP1dSKQ2HSQ0YFLhZXRJ+Jqndqa8MTu4NE4CQ== dependencies: "@virtuoso.dev/react-urx" "^0.2.12" "@virtuoso.dev/urx" "^0.2.12" @@ -11329,10 +11318,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tabbable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-4.0.0.tgz#5bff1d1135df1482cf0f0206434f15eadbeb9261" - integrity sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ== +tabbable@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf" + integrity sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA== table@^6.0.9, table@^6.6.0: version "6.7.1" @@ -11608,7 +11597,7 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== From f2c5e138f3cc07ce6d05fb0d62441f93d4db213f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Sat, 12 Nov 2022 00:07:02 +0100 Subject: [PATCH 06/65] Do not define translatable messages inline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- .../notifications/components/notification.tsx | 12 +- .../ui/components/modals/verify-sms-modal.tsx | 107 ++++++++++-------- .../features/verification/email_passthru.tsx | 24 ++-- .../verification/steps/email-verification.tsx | 24 ++-- .../verification/steps/sms-verification.tsx | 35 +++--- 5 files changed, 108 insertions(+), 94 deletions(-) diff --git a/app/soapbox/features/notifications/components/notification.tsx b/app/soapbox/features/notifications/components/notification.tsx index 1871b3a89..f9ba8de33 100644 --- a/app/soapbox/features/notifications/components/notification.tsx +++ b/app/soapbox/features/notifications/components/notification.tsx @@ -1,6 +1,6 @@ import React, { useCallback } from 'react'; import { HotKeys } from 'react-hotkeys'; -import { defineMessages, useIntl, FormattedMessage, IntlShape, MessageDescriptor } from 'react-intl'; +import { defineMessages, useIntl, FormattedMessage, IntlShape, MessageDescriptor, defineMessage } from 'react-intl'; import { useHistory } from 'react-router-dom'; import { mentionCompose } from 'soapbox/actions/compose'; @@ -55,6 +55,11 @@ const icons: Record = { update: require('@tabler/icons/pencil.svg'), }; +const nameMessage = defineMessage({ + id: 'notification.name', + defaultMessage: '{link}{others}', +}); + const messages: Record = defineMessages({ follow: { id: 'notification.follow', @@ -115,10 +120,7 @@ const buildMessage = ( instanceTitle: string, ): React.ReactNode => { const link = buildLink(account); - const name = intl.formatMessage({ - id: 'notification.name', - defaultMessage: '{link}{others}', - }, { + const name = intl.formatMessage(nameMessage, { link, others: totalCount && totalCount > 0 ? ( void, } @@ -47,10 +78,7 @@ const VerifySmsModal: React.FC = ({ onClose }) => { setStatus(Statuses.IDLE); dispatch( snackbar.error( - intl.formatMessage({ - id: 'sms_verification.invalid', - defaultMessage: 'Please enter a valid phone number.', - }), + intl.formatMessage(messages.verificationInvalid), ), ); return; @@ -59,10 +87,7 @@ const VerifySmsModal: React.FC = ({ onClose }) => { dispatch(reRequestPhoneVerification(phone!)).then(() => { dispatch( snackbar.success( - intl.formatMessage({ - id: 'sms_verification.success', - defaultMessage: 'A verification code has been sent to your phone number.', - }), + intl.formatMessage(messages.verificationSuccess), ), ); }) @@ -70,10 +95,7 @@ const VerifySmsModal: React.FC = ({ onClose }) => { .catch(() => { dispatch( snackbar.error( - intl.formatMessage({ - id: 'sms_verification.fail', - defaultMessage: 'Failed to send SMS message to your phone number.', - }), + intl.formatMessage(messages.verificationFail), ), ); }); @@ -102,20 +124,11 @@ const VerifySmsModal: React.FC = ({ onClose }) => { const confirmationText = useMemo(() => { switch (status) { case Statuses.IDLE: - return intl.formatMessage({ - id: 'sms_verification.modal.verify_sms', - defaultMessage: 'Verify SMS', - }); + return intl.formatMessage(messages.verifySms); case Statuses.READY: - return intl.formatMessage({ - id: 'sms_verification.modal.verify_number', - defaultMessage: 'Verify phone number', - }); + return intl.formatMessage(messages.verifyNumber); case Statuses.REQUESTED: - return intl.formatMessage({ - id: 'sms_verification.modal.verify_code', - defaultMessage: 'Verify code', - }); + return intl.formatMessage(messages.verifyCode); default: return null; } @@ -126,12 +139,13 @@ const VerifySmsModal: React.FC = ({ onClose }) => { case Statuses.IDLE: return ( - {intl.formatMessage({ - id: 'sms_verification.modal.verify_help_text', - defaultMessage: 'Verify your phone number to start using {instance}.', - }, { - instance: title, - })} + ); case Statuses.READY: @@ -149,10 +163,10 @@ const VerifySmsModal: React.FC = ({ onClose }) => { return ( <> - {intl.formatMessage({ - id: 'sms_verification.modal.enter_code', - defaultMessage: 'We sent you a 6-digit code via SMS. Enter it below.', - })} + = ({ onClose }) => { }) .catch(() => dispatch( snackbar.error( - intl.formatMessage({ - id: 'sms_verification.invalid', - defaultMessage: 'Your SMS token has expired.', - }), + intl.formatMessage(messages.verificationExpired), ), )); }; @@ -201,10 +212,10 @@ const VerifySmsModal: React.FC = ({ onClose }) => { return ( } onClose={() => onClose('VERIFY_SMS')} cancelAction={status === Statuses.IDLE ? () => onClose('VERIFY_SMS') : undefined} @@ -212,10 +223,12 @@ const VerifySmsModal: React.FC = ({ onClose }) => { confirmationAction={onConfirmationClick} confirmationText={confirmationText} secondaryAction={status === Statuses.REQUESTED ? resendVerificationCode : undefined} - secondaryText={status === Statuses.REQUESTED ? intl.formatMessage({ - id: 'sms_verification.modal.resend_code', - defaultMessage: 'Resend verification code?', - }) : undefined} + secondaryText={status === Statuses.REQUESTED ? ( + + ) : undefined} secondaryDisabled={requestedAnother} > diff --git a/app/soapbox/features/verification/email_passthru.tsx b/app/soapbox/features/verification/email_passthru.tsx index 43432c586..e51f3220f 100644 --- a/app/soapbox/features/verification/email_passthru.tsx +++ b/app/soapbox/features/verification/email_passthru.tsx @@ -28,6 +28,11 @@ const messages = defineMessages({ tokenNotFoundBody: { id: 'email_passthru.token_not_found.body', defaultMessage: 'Your email token was not found. Please request a new email confirmation from the {bold} from which you sent this email confirmation.' }, tokenExpiredHeading: { id: 'email_passthru.token_expired.heading', defaultMessage: 'Token Expired' }, tokenExpiredBody: { id: 'email_passthru.token_expired.body', defaultMessage: 'Your email token has expired. Please request a new email confirmation from the {bold} from which you sent this email confirmation.' }, + emailConfirmed: { id: 'email_passthru.success', defaultMessage: 'Your email has been verified!' }, + genericFail: { id: 'email_passthru.fail.generic', defaultMessage: 'Unable to confirm your email' }, + tokenExpired: { id: 'email_passthru.fail.expired', defaultMessage: 'Your email token has expired' }, + tokenNotFound: { id: 'email_passthru.fail.not_found', defaultMessage: 'Your email token is invalid.' }, + invalidToken: { id: 'email_passthru.fail.invalid_token', defaultMessage: 'Your token is invalid' }, }); const Success = () => { @@ -116,30 +121,21 @@ const EmailPassThru = () => { dispatch(confirmEmailVerification(token)) .then(() => { setStatus(Statuses.SUCCESS); - dispatch(snackbar.success(intl.formatMessage({ id: 'email_passthru.success', defaultMessage: 'Your email has been verified!' }))); + dispatch(snackbar.success(intl.formatMessage(messages.emailConfirmed))); }) .catch((error: AxiosError) => { const errorKey = error?.response?.data?.error; - let message = intl.formatMessage({ - id: 'email_passthru.fail.generic', - defaultMessage: 'Unable to confirm your email', - }); + let message = intl.formatMessage(messages.genericFail); if (errorKey) { switch (errorKey) { case 'token_expired': - message = intl.formatMessage({ - id: 'email_passthru.fail.expired', - defaultMessage: 'Your email token has expired.', - }); + message = intl.formatMessage(messages.tokenExpired); setStatus(Statuses.TOKEN_EXPIRED); break; case 'token_not_found': - message = intl.formatMessage({ - id: 'email_passthru.fail.not_found', - defaultMessage: 'Your email token is invalid.', - }); - message = 'Your token is invalid'; + message = intl.formatMessage(messages.tokenNotFound); + message = intl.formatMessage(messages.invalidToken); setStatus(Statuses.TOKEN_NOT_FOUND); break; default: diff --git a/app/soapbox/features/verification/steps/email-verification.tsx b/app/soapbox/features/verification/steps/email-verification.tsx index bec6c2868..95b888aef 100644 --- a/app/soapbox/features/verification/steps/email-verification.tsx +++ b/app/soapbox/features/verification/steps/email-verification.tsx @@ -1,6 +1,6 @@ import { AxiosError } from 'axios'; import React from 'react'; -import { useIntl } from 'react-intl'; +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import snackbar from 'soapbox/actions/snackbar'; import { checkEmailVerification, postEmailVerification, requestEmailVerification } from 'soapbox/actions/verification'; @@ -8,6 +8,13 @@ import Icon from 'soapbox/components/icon'; import { Button, Form, FormGroup, Input, Text } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; +const messages = defineMessages({ + verificationSuccess: { id: 'email_verification.success', defaultMessage: 'Verification email sent successfully.' }, + verificationFail: { id: 'email_verification.fail', defaultMessage: 'Failed to request email verification.' }, + verificationFailTakenAlert: { id: 'emai_verifilcation.exists', defaultMessage: 'This email has already been taken.' }, + verificationFailTaken: { id: 'email_verification.taken', defaultMessage: 'is taken' }, +}); + const Statuses = { IDLE: 'IDLE', REQUESTED: 'REQUESTED', @@ -77,26 +84,23 @@ const EmailVerification = () => { dispatch( snackbar.success( - intl.formatMessage({ - id: 'email_verification.exists', - defaultMessage: 'Verification email sent successfully.', - }), + intl.formatMessage(messages.verificationSuccess), ), ); }) .catch((error: AxiosError) => { const errorMessage = (error.response?.data as any)?.error; const isEmailTaken = errorMessage === 'email_taken'; - let message = intl.formatMessage({ id: 'email_verification.fail', defaultMessage: 'Failed to request email verification.' }); + let message = intl.formatMessage(messages.verificationFail); if (isEmailTaken) { - message = intl.formatMessage({ id: 'email_verification.exists', defaultMessage: 'This email has already been taken.' }); + message = intl.formatMessage(messages.verificationFailTakenAlert); } else if (errorMessage) { message = errorMessage; } if (isEmailTaken) { - setErrors([intl.formatMessage({ id: 'email_verification.taken', defaultMessage: 'is taken' })]); + setErrors([intl.formatMessage(messages.verificationFailTaken)]); } dispatch(snackbar.error(message)); @@ -111,7 +115,9 @@ const EmailVerification = () => { return (
-

{intl.formatMessage({ id: 'email_verification.header', defaultMessage: 'Enter your email address' })}

+

+ +

diff --git a/app/soapbox/features/verification/steps/sms-verification.tsx b/app/soapbox/features/verification/steps/sms-verification.tsx index 8f545e1ad..7337c706d 100644 --- a/app/soapbox/features/verification/steps/sms-verification.tsx +++ b/app/soapbox/features/verification/steps/sms-verification.tsx @@ -1,6 +1,6 @@ import { AxiosError } from 'axios'; import React from 'react'; -import { useIntl } from 'react-intl'; +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import OtpInput from 'react-otp-input'; import snackbar from 'soapbox/actions/snackbar'; @@ -8,6 +8,13 @@ import { confirmPhoneVerification, requestPhoneVerification } from 'soapbox/acti import { Button, Form, FormGroup, PhoneInput, Text } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; +const messages = defineMessages({ + verificationInvalid: { id: 'sms_verification.invalid', defaultMessage: 'Please enter a valid phone number.' }, + verificationSuccess: { id: 'sms_verification.success', defaultMessage: 'A verification code has been sent to your phone number.' }, + verificationFail: { id: 'sms_verification.fail', defaultMessage: 'Failed to send SMS message to your phone number.' }, + verificationExpired: { id: 'sms_verification.expired', defaultMessage: 'Your SMS token has expired.' }, +}); + const Statuses = { IDLE: 'IDLE', REQUESTED: 'REQUESTED', @@ -38,10 +45,7 @@ const SmsVerification = () => { setStatus(Statuses.IDLE); dispatch( snackbar.error( - intl.formatMessage({ - id: 'sms_verification.invalid', - defaultMessage: 'Please enter a valid phone number.', - }), + intl.formatMessage(messages.verificationInvalid), ), ); return; @@ -50,18 +54,12 @@ const SmsVerification = () => { dispatch(requestPhoneVerification(phone!)).then(() => { dispatch( snackbar.success( - intl.formatMessage({ - id: 'sms_verification.success', - defaultMessage: 'A verification code has been sent to your phone number.', - }), + intl.formatMessage(messages.verificationSuccess), ), ); setStatus(Statuses.REQUESTED); }).catch((error: AxiosError) => { - const message = (error.response?.data as any)?.message || intl.formatMessage({ - id: 'sms_verification.fail', - defaultMessage: 'Failed to send SMS message to your phone number.', - }); + const message = (error.response?.data as any)?.message || intl.formatMessage(messages.verificationFail); dispatch(snackbar.error(message)); setStatus(Statuses.FAIL); @@ -78,10 +76,7 @@ const SmsVerification = () => { dispatch(confirmPhoneVerification(verificationCode)) .catch(() => dispatch( snackbar.error( - intl.formatMessage({ - id: 'sms_verification.invalid', - defaultMessage: 'Your SMS token has expired.', - }), + intl.formatMessage(messages.verificationExpired), ), )); }; @@ -97,7 +92,7 @@ const SmsVerification = () => {

- {intl.formatMessage({ id: 'sms_verification.sent.header', defaultMessage: 'Verification code' })} +

@@ -136,7 +131,9 @@ const SmsVerification = () => { return (
-

{intl.formatMessage({ id: 'sms_verification.header', defaultMessage: 'Enter your phone number' })}

+

+ +

From 6bf9040a34e98c2ee4acb2d210d7643539df7eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Sat, 12 Nov 2022 12:43:34 +0100 Subject: [PATCH 07/65] Replace Permalinks with Links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/components/hashtag.tsx | 6 +-- app/soapbox/components/permalink.tsx | 37 ------------------- app/soapbox/features/birthdays/account.tsx | 6 +-- .../directory/components/account_card.tsx | 6 +-- .../components/account_authorize.tsx | 6 +-- .../notifications/components/notification.tsx | 6 +-- 6 files changed, 14 insertions(+), 53 deletions(-) delete mode 100644 app/soapbox/components/permalink.tsx diff --git a/app/soapbox/components/hashtag.tsx b/app/soapbox/components/hashtag.tsx index 0b0cc5bae..41267d19c 100644 --- a/app/soapbox/components/hashtag.tsx +++ b/app/soapbox/components/hashtag.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; +import { Link } from 'react-router-dom'; import { Sparklines, SparklinesCurve } from 'react-sparklines'; import { shortNumberFormat } from '../utils/numbers'; -import Permalink from './permalink'; import { HStack, Stack, Text } from './ui'; import type { Tag } from 'soapbox/types/entities'; @@ -19,9 +19,9 @@ const Hashtag: React.FC = ({ hashtag }) => { return ( - + #{hashtag.name} - + {hashtag.history && ( diff --git a/app/soapbox/components/permalink.tsx b/app/soapbox/components/permalink.tsx deleted file mode 100644 index db68811e5..000000000 --- a/app/soapbox/components/permalink.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import * as React from 'react'; -import { useHistory } from 'react-router-dom'; - -interface IPermaLink extends Pick, 'dangerouslySetInnerHTML'> { - className?: string, - href: string, - title?: string, - to: string, -} - -const Permalink: React.FC = (props) => { - const history = useHistory(); - - const { className, href, title, to, children, ...filteredProps } = props; - - const handleClick = (event: React.MouseEvent) => { - if (event.button === 0 && !(event.ctrlKey || event.metaKey)) { - event.preventDefault(); - history.push(to); - } - }; - - return ( - - {children} - - ); -}; - -export default Permalink; diff --git a/app/soapbox/features/birthdays/account.tsx b/app/soapbox/features/birthdays/account.tsx index 745ca5268..805538fd5 100644 --- a/app/soapbox/features/birthdays/account.tsx +++ b/app/soapbox/features/birthdays/account.tsx @@ -1,10 +1,10 @@ import React, { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; +import { Link } from 'react-router-dom'; import Avatar from 'soapbox/components/avatar'; import DisplayName from 'soapbox/components/display-name'; import Icon from 'soapbox/components/icon'; -import Permalink from 'soapbox/components/permalink'; import { useAppSelector } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; @@ -38,13 +38,13 @@ const Account: React.FC = ({ accountId }) => { return (
- +
-
+
= ({ id }) => {
- + - +
diff --git a/app/soapbox/features/follow_requests/components/account_authorize.tsx b/app/soapbox/features/follow_requests/components/account_authorize.tsx index 0d0428d44..0c8e8a561 100644 --- a/app/soapbox/features/follow_requests/components/account_authorize.tsx +++ b/app/soapbox/features/follow_requests/components/account_authorize.tsx @@ -1,12 +1,12 @@ import React, { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useDispatch } from 'react-redux'; +import { Link } from 'react-router-dom'; import { authorizeFollowRequest, rejectFollowRequest } from 'soapbox/actions/accounts'; import Avatar from 'soapbox/components/avatar'; import DisplayName from 'soapbox/components/display-name'; import IconButton from 'soapbox/components/icon_button'; -import Permalink from 'soapbox/components/permalink'; import { Text } from 'soapbox/components/ui'; import { useAppSelector } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; @@ -43,10 +43,10 @@ const AccountAuthorize: React.FC = ({ id }) => { return (
- +
-
+
diff --git a/app/soapbox/features/notifications/components/notification.tsx b/app/soapbox/features/notifications/components/notification.tsx index f9ba8de33..bd4433e8d 100644 --- a/app/soapbox/features/notifications/components/notification.tsx +++ b/app/soapbox/features/notifications/components/notification.tsx @@ -1,7 +1,7 @@ import React, { useCallback } from 'react'; import { HotKeys } from 'react-hotkeys'; import { defineMessages, useIntl, FormattedMessage, IntlShape, MessageDescriptor, defineMessage } from 'react-intl'; -import { useHistory } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import { mentionCompose } from 'soapbox/actions/compose'; import { reblog, favourite, unreblog, unfavourite } from 'soapbox/actions/interactions'; @@ -9,7 +9,6 @@ import { openModal } from 'soapbox/actions/modals'; import { getSettings } from 'soapbox/actions/settings'; import { hideStatus, revealStatus } from 'soapbox/actions/statuses'; import Icon from 'soapbox/components/icon'; -import Permalink from 'soapbox/components/permalink'; import { HStack, Text, Emoji } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account_container'; import StatusContainer from 'soapbox/containers/status_container'; @@ -30,9 +29,8 @@ const notificationForScreenReader = (intl: IntlShape, message: string, timestamp const buildLink = (account: Account): JSX.Element => ( - Date: Sat, 12 Nov 2022 15:18:24 +0100 Subject: [PATCH 08/65] JS -> TS, FC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/actions/modals.ts | 6 +- app/soapbox/actions/notifications.ts | 17 ++-- .../components/extended_video_player.js | 70 -------------- .../components/extended_video_player.tsx | 64 +++++++++++++ app/soapbox/components/modal_root.tsx | 5 +- app/soapbox/components/sidebar-navigation.tsx | 2 +- .../__tests__/notification.test.tsx | 2 +- .../components/placeholder_media_gallery.js | 96 ------------------- .../components/placeholder_media_gallery.tsx | 93 ++++++++++++++++++ .../placeholder/{utils.js => utils.ts} | 4 +- app/soapbox/features/ui/components/bundle.tsx | 6 +- .../features/ui/components/media-modal.tsx | 3 +- .../{modal_root.js => modal_root.tsx} | 23 +++-- .../ui/containers/bundle_container.tsx | 3 +- ...{modal_container.js => modal_container.ts} | 14 +-- .../{notifications.js => notifications.ts} | 89 ++++++++++------- 16 files changed, 254 insertions(+), 243 deletions(-) delete mode 100644 app/soapbox/components/extended_video_player.js create mode 100644 app/soapbox/components/extended_video_player.tsx delete mode 100644 app/soapbox/features/placeholder/components/placeholder_media_gallery.js create mode 100644 app/soapbox/features/placeholder/components/placeholder_media_gallery.tsx rename app/soapbox/features/placeholder/{utils.js => utils.ts} (68%) rename app/soapbox/features/ui/components/{modal_root.js => modal_root.tsx} (83%) rename app/soapbox/features/ui/containers/{modal_container.js => modal_container.ts} (65%) rename app/soapbox/reducers/{notifications.js => notifications.ts} (64%) diff --git a/app/soapbox/actions/modals.ts b/app/soapbox/actions/modals.ts index 3e1a106cf..00d4fd01a 100644 --- a/app/soapbox/actions/modals.ts +++ b/app/soapbox/actions/modals.ts @@ -1,8 +1,10 @@ +import type { ModalType } from 'soapbox/features/ui/components/modal_root'; + export const MODAL_OPEN = 'MODAL_OPEN'; export const MODAL_CLOSE = 'MODAL_CLOSE'; /** Open a modal of the given type */ -export function openModal(type: string, props?: any) { +export function openModal(type: ModalType, props?: any) { return { type: MODAL_OPEN, modalType: type, @@ -11,7 +13,7 @@ export function openModal(type: string, props?: any) { } /** Close the modal */ -export function closeModal(type?: string) { +export function closeModal(type?: ModalType) { return { type: MODAL_CLOSE, modalType: type, diff --git a/app/soapbox/actions/notifications.ts b/app/soapbox/actions/notifications.ts index db8fd688f..8ef0e5715 100644 --- a/app/soapbox/actions/notifications.ts +++ b/app/soapbox/actions/notifications.ts @@ -1,6 +1,3 @@ -import { - Map as ImmutableMap, -} from 'immutable'; import IntlMessageFormat from 'intl-messageformat'; import 'intl-pluralrules'; import { defineMessages } from 'react-intl'; @@ -149,13 +146,13 @@ const updateNotificationsQueue = (notification: APIEntity, intlMessages: Record< const dequeueNotifications = () => (dispatch: AppDispatch, getState: () => RootState) => { - const queuedNotifications = getState().notifications.get('queuedNotifications'); - const totalQueuedNotificationsCount = getState().notifications.get('totalQueuedNotificationsCount'); + const queuedNotifications = getState().notifications.queuedNotifications; + const totalQueuedNotificationsCount = getState().notifications.totalQueuedNotificationsCount; if (totalQueuedNotificationsCount === 0) { return; } else if (totalQueuedNotificationsCount > 0 && totalQueuedNotificationsCount <= MAX_QUEUED_NOTIFICATIONS) { - queuedNotifications.forEach((block: APIEntity) => { + queuedNotifications.forEach((block) => { dispatch(updateNotifications(block.notification)); }); } else { @@ -184,7 +181,7 @@ const expandNotifications = ({ maxId }: Record = {}, done: () => an const notifications = state.notifications; const isLoadingMore = !!maxId; - if (notifications.get('isLoading')) { + if (notifications.isLoading) { done(); return dispatch(noOp); } @@ -207,7 +204,7 @@ const expandNotifications = ({ maxId }: Record = {}, done: () => an } } - if (!maxId && notifications.get('items').size > 0) { + if (!maxId && notifications.items.size > 0) { params.since_id = notifications.getIn(['items', 0, 'id']); } @@ -306,8 +303,8 @@ const markReadNotifications = () => if (!isLoggedIn(getState)) return; const state = getState(); - const topNotificationId: string | undefined = state.notifications.get('items').first(ImmutableMap()).get('id'); - const lastReadId: string | -1 = state.notifications.get('lastRead'); + const topNotificationId = state.notifications.items.first()?.id; + const lastReadId = state.notifications.lastRead; const v = parseVersion(state.instance.version); if (topNotificationId && (lastReadId === -1 || compareId(topNotificationId, lastReadId) > 0)) { diff --git a/app/soapbox/components/extended_video_player.js b/app/soapbox/components/extended_video_player.js deleted file mode 100644 index 59a6b938e..000000000 --- a/app/soapbox/components/extended_video_player.js +++ /dev/null @@ -1,70 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; - -import { isIOS } from 'soapbox/is_mobile'; - -export default class ExtendedVideoPlayer extends React.PureComponent { - - static propTypes = { - src: PropTypes.string.isRequired, - alt: PropTypes.string, - width: PropTypes.number, - height: PropTypes.number, - time: PropTypes.number, - controls: PropTypes.bool.isRequired, - muted: PropTypes.bool.isRequired, - onClick: PropTypes.func, - }; - - handleLoadedData = () => { - if (this.props.time) { - this.video.currentTime = this.props.time; - } - } - - componentDidMount() { - this.video.addEventListener('loadeddata', this.handleLoadedData); - } - - componentWillUnmount() { - this.video.removeEventListener('loadeddata', this.handleLoadedData); - } - - setRef = (c) => { - this.video = c; - } - - handleClick = e => { - e.stopPropagation(); - const handler = this.props.onClick; - if (handler) handler(); - } - - render() { - const { src, muted, controls, alt } = this.props; - const conditionalAttributes = {}; - if (isIOS()) { - conditionalAttributes.playsInline = '1'; - } - - return ( -
-
- ); - } - -} diff --git a/app/soapbox/components/extended_video_player.tsx b/app/soapbox/components/extended_video_player.tsx new file mode 100644 index 000000000..99a0af01c --- /dev/null +++ b/app/soapbox/components/extended_video_player.tsx @@ -0,0 +1,64 @@ +import React, { useEffect, useRef } from 'react'; + +import { isIOS } from 'soapbox/is_mobile'; + +interface IExtendedVideoPlayer { + src: string, + alt?: string, + width?: number, + height?: number, + time?: number, + controls?: boolean, + muted?: boolean, + onClick?: () => void, +} + +const ExtendedVideoPlayer: React.FC = ({ src, alt, time, controls, muted, onClick }) => { + const video = useRef(null); + + useEffect(() => { + const handleLoadedData = () => { + if (time) { + video.current!.currentTime = time; + } + }; + + video.current?.addEventListener('loadeddata', handleLoadedData); + + return () => { + video.current?.removeEventListener('loadeddata', handleLoadedData); + }; + }, [video.current]); + + const handleClick: React.MouseEventHandler = e => { + e.stopPropagation(); + const handler = onClick; + if (handler) handler(); + }; + + const conditionalAttributes: React.VideoHTMLAttributes = {}; + if (isIOS()) { + conditionalAttributes.playsInline = true; + } + + return ( +
+
+ ); +}; + +export default ExtendedVideoPlayer; diff --git a/app/soapbox/components/modal_root.tsx b/app/soapbox/components/modal_root.tsx index f34597d5b..d17be3efc 100644 --- a/app/soapbox/components/modal_root.tsx +++ b/app/soapbox/components/modal_root.tsx @@ -9,6 +9,7 @@ import { openModal, closeModal } from 'soapbox/actions/modals'; import { useAppDispatch, useAppSelector, usePrevious } from 'soapbox/hooks'; import type { UnregisterCallback } from 'history'; +import type { ModalType } from 'soapbox/features/ui/components/modal_root'; import type { ReducerCompose } from 'soapbox/reducers/compose'; const messages = defineMessages({ @@ -26,8 +27,8 @@ export const checkComposeContent = (compose?: ReturnType) interface IModalRoot { onCancel?: () => void, - onClose: (type?: string) => void, - type: string, + onClose: (type?: ModalType) => void, + type: ModalType, } const ModalRoot: React.FC = ({ children, onCancel, onClose, type }) => { diff --git a/app/soapbox/components/sidebar-navigation.tsx b/app/soapbox/components/sidebar-navigation.tsx index 583006070..22ad8dfc9 100644 --- a/app/soapbox/components/sidebar-navigation.tsx +++ b/app/soapbox/components/sidebar-navigation.tsx @@ -28,7 +28,7 @@ const SidebarNavigation = () => { const instance = useAppSelector((state) => state.instance); const settings = useAppSelector((state) => getSettings(state)); const account = useOwnAccount(); - const notificationCount = useAppSelector((state) => state.notifications.get('unread')); + const notificationCount = useAppSelector((state) => state.notifications.unread); const chatsCount = useAppSelector((state) => state.chats.items.reduce((acc, curr) => acc + Math.min(curr.unread || 0, 1), 0)); const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.count()); const dashboardCount = useAppSelector((state) => state.admin.openReports.count() + state.admin.awaitingApproval.count()); diff --git a/app/soapbox/features/notifications/components/__tests__/notification.test.tsx b/app/soapbox/features/notifications/components/__tests__/notification.test.tsx index 9c86474b7..b9c5df641 100644 --- a/app/soapbox/features/notifications/components/__tests__/notification.test.tsx +++ b/app/soapbox/features/notifications/components/__tests__/notification.test.tsx @@ -13,7 +13,7 @@ const normalize = (notification: any) => { return { // @ts-ignore - notification: state.notifications.items.get(notification.id), + notification: state.notifications.items.get(notification.id)!, state, }; }; diff --git a/app/soapbox/features/placeholder/components/placeholder_media_gallery.js b/app/soapbox/features/placeholder/components/placeholder_media_gallery.js deleted file mode 100644 index c1b2dd3b9..000000000 --- a/app/soapbox/features/placeholder/components/placeholder_media_gallery.js +++ /dev/null @@ -1,96 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; -import PropTypes from 'prop-types'; -import React from 'react'; -import ImmutablePropTypes from 'react-immutable-proptypes'; - -export default class PlaceholderMediaGallery extends React.Component { - - static propTypes = { - media: ImmutablePropTypes.map.isRequired, - defaultWidth: PropTypes.number, - } - - state = { - width: this.props.defaultWidth, - }; - - handleRef = (node) => { - if (node) { - this.setState({ - width: node.offsetWidth, - }); - } - } - - getSizeData = size => { - const { defaultWidth } = this.props; - const width = this.state.width || defaultWidth; - - const style = {}; - let itemsDimensions = []; - - if (size === 1) { - style.height = width * 9 / 16; - - itemsDimensions = [ - { w: '100%', h: '100%' }, - ]; - } else if (size === 2) { - style.height = width / 2; - - itemsDimensions = [ - { w: '50%', h: '100%', r: '2px' }, - { w: '50%', h: '100%', l: '2px' }, - ]; - } else if (size === 3) { - style.height = width; - - itemsDimensions = [ - { w: '50%', h: '50%', b: '2px', r: '2px' }, - { w: '50%', h: '50%', b: '2px', l: '2px' }, - { w: '100%', h: '50%', t: '2px' }, - ]; - } else if (size >= 4) { - style.height = width; - - itemsDimensions = [ - { w: '50%', h: '50%', b: '2px', r: '2px' }, - { w: '50%', h: '50%', b: '2px', l: '2px' }, - { w: '50%', h: '50%', t: '2px', r: '2px' }, - { w: '50%', h: '50%', t: '2px', l: '2px' }, - ]; - } - - return ImmutableMap({ - style, - itemsDimensions, - size, - width, - }); - } - - renderItem = (dimensions, i) => { - const width = dimensions.w; - const height = dimensions.h; - const top = dimensions.t || 'auto'; - const right = dimensions.r || 'auto'; - const bottom = dimensions.b || 'auto'; - const left = dimensions.l || 'auto'; - const float = dimensions.float || 'left'; - const position = dimensions.pos || 'relative'; - - return
; - } - - render() { - const { media } = this.props; - const sizeData = this.getSizeData(media.size); - - return ( -
- {media.take(4).map((_, i) => this.renderItem(sizeData.get('itemsDimensions')[i], i))} -
- ); - } - -} diff --git a/app/soapbox/features/placeholder/components/placeholder_media_gallery.tsx b/app/soapbox/features/placeholder/components/placeholder_media_gallery.tsx new file mode 100644 index 000000000..3eab10e4d --- /dev/null +++ b/app/soapbox/features/placeholder/components/placeholder_media_gallery.tsx @@ -0,0 +1,93 @@ +import { List as ImmutableList, Record as ImmutableRecord } from 'immutable'; +import React, { useState } from 'react'; + +import type { Attachment as AttachmentEntity } from 'soapbox/types/entities'; + +interface IPlaceholderMediaGallery { + media: ImmutableList; + defaultWidth?: number; +} + +const SizeData = ImmutableRecord({ + style: {} as React.CSSProperties, + itemsDimensions: [] as Record[], + size: 1 as number, + width: 0 as number, +}); + +const PlaceholderMediaGallery: React.FC = ({ media, defaultWidth }) => { + const [width, setWidth] = useState(defaultWidth); + + const handleRef = (node: HTMLDivElement) => { + if (node) { + setWidth(node.offsetWidth); + } + }; + + const getSizeData = (size: number) => { + const style: React.CSSProperties = {}; + let itemsDimensions: Record[] = []; + + if (size === 1) { + style.height = width! * 9 / 16; + + itemsDimensions = [ + { w: '100%', h: '100%' }, + ]; + } else if (size === 2) { + style.height = width! / 2; + + itemsDimensions = [ + { w: '50%', h: '100%', r: '2px' }, + { w: '50%', h: '100%', l: '2px' }, + ]; + } else if (size === 3) { + style.height = width; + + itemsDimensions = [ + { w: '50%', h: '50%', b: '2px', r: '2px' }, + { w: '50%', h: '50%', b: '2px', l: '2px' }, + { w: '100%', h: '50%', t: '2px' }, + ]; + } else if (size >= 4) { + style.height = width; + + itemsDimensions = [ + { w: '50%', h: '50%', b: '2px', r: '2px' }, + { w: '50%', h: '50%', b: '2px', l: '2px' }, + { w: '50%', h: '50%', t: '2px', r: '2px' }, + { w: '50%', h: '50%', t: '2px', l: '2px' }, + ]; + } + + return SizeData({ + style, + itemsDimensions, + size, + width, + }); + }; + + const renderItem = (dimensions: Record, i: number) => { + const width = dimensions.w; + const height = dimensions.h; + const top = dimensions.t || 'auto'; + const right = dimensions.r || 'auto'; + const bottom = dimensions.b || 'auto'; + const left = dimensions.l || 'auto'; + const float = dimensions.float as any || 'left'; + const position = dimensions.pos as any || 'relative'; + + return
; + }; + + const sizeData = getSizeData(media.size); + + return ( +
+ {media.take(4).map((_, i) => renderItem(sizeData.get('itemsDimensions')[i], i))} +
+ ); +}; + +export default PlaceholderMediaGallery; diff --git a/app/soapbox/features/placeholder/utils.js b/app/soapbox/features/placeholder/utils.ts similarity index 68% rename from app/soapbox/features/placeholder/utils.js rename to app/soapbox/features/placeholder/utils.ts index f2001a61d..15eb4e5e5 100644 --- a/app/soapbox/features/placeholder/utils.js +++ b/app/soapbox/features/placeholder/utils.ts @@ -1,6 +1,6 @@ export const PLACEHOLDER_CHAR = '█'; -export const generateText = length => { +export const generateText = (length: number) => { let text = ''; for (let i = 0; i < length; i++) { @@ -11,6 +11,6 @@ export const generateText = length => { }; // https://stackoverflow.com/a/7228322/8811886 -export const randomIntFromInterval = (min, max) => { +export const randomIntFromInterval = (min: number, max: number) => { return Math.floor(Math.random() * (max - min + 1) + min); }; diff --git a/app/soapbox/features/ui/components/bundle.tsx b/app/soapbox/features/ui/components/bundle.tsx index 55f6478bc..79851b978 100644 --- a/app/soapbox/features/ui/components/bundle.tsx +++ b/app/soapbox/features/ui/components/bundle.tsx @@ -3,10 +3,10 @@ import React from 'react'; const emptyComponent = () => null; const noop = () => { }; -interface BundleProps { +export interface BundleProps { fetchComponent: () => Promise, loading: React.ComponentType, - error: React.ComponentType<{ onRetry: (props: BundleProps) => void }>, + error: React.ComponentType<{ onRetry: (props?: BundleProps) => void }>, children: (mod: any) => React.ReactNode, renderDelay?: number, onFetch: () => void, @@ -57,7 +57,7 @@ class Bundle extends React.PureComponent { } } - load = (props: BundleProps) => { + load = (props?: BundleProps) => { const { fetchComponent, onFetch, onFetchSuccess, onFetchFail, renderDelay } = props || this.props; const cachedMod = Bundle.cache.get(fetchComponent); diff --git a/app/soapbox/features/ui/components/media-modal.tsx b/app/soapbox/features/ui/components/media-modal.tsx index 92b5ecad9..1a432de3b 100644 --- a/app/soapbox/features/ui/components/media-modal.tsx +++ b/app/soapbox/features/ui/components/media-modal.tsx @@ -225,7 +225,6 @@ const MediaModal: React.FC = (props) => { muted controls={false} width={width} - link={link} height={height} key={attachment.preview_url} alt={attachment.description} @@ -298,4 +297,4 @@ const MediaModal: React.FC = (props) => { ); }; -export default MediaModal; \ No newline at end of file +export default MediaModal; diff --git a/app/soapbox/features/ui/components/modal_root.js b/app/soapbox/features/ui/components/modal_root.tsx similarity index 83% rename from app/soapbox/features/ui/components/modal_root.js rename to app/soapbox/features/ui/components/modal_root.tsx index 32425cffd..f9900d569 100644 --- a/app/soapbox/features/ui/components/modal_root.js +++ b/app/soapbox/features/ui/components/modal_root.tsx @@ -35,6 +35,7 @@ import { } from 'soapbox/features/ui/util/async-components'; import BundleContainer from '../containers/bundle_container'; +import { BundleProps } from './bundle'; import BundleModalError from './bundle_modal_error'; import ModalLoading from './modal_loading'; @@ -71,19 +72,21 @@ const MODAL_COMPONENTS = { 'ACCOUNT_MODERATION': AccountModerationModal, }; -export default class ModalRoot extends React.PureComponent { +export type ModalType = keyof typeof MODAL_COMPONENTS | null; - static propTypes = { - type: PropTypes.string, - props: PropTypes.object, - onClose: PropTypes.func.isRequired, - }; +interface IModalRoot { + type: ModalType, + props?: Record | null, + onClose: (type?: ModalType) => void, +} + +export default class ModalRoot extends React.PureComponent { getSnapshotBeforeUpdate() { return { visible: !!this.props.type }; } - componentDidUpdate(prevProps, prevState, { visible }) { + componentDidUpdate(prevProps: IModalRoot, prevState: any, { visible }: any) { if (visible) { document.body.classList.add('with-modals'); } else { @@ -91,15 +94,15 @@ export default class ModalRoot extends React.PureComponent { } } - renderLoading = modalId => () => { + renderLoading = (modalId: string) => () => { return !['MEDIA', 'VIDEO', 'BOOST', 'CONFIRM', 'ACTIONS'].includes(modalId) ? : null; } - renderError = (props) => { + renderError: React.ComponentType<{ onRetry: (props?: BundleProps) => void }> = (props) => { return ; } - onClickClose = (_) => { + onClickClose = (_?: ModalType) => { const { onClose, type } = this.props; onClose(type); } diff --git a/app/soapbox/features/ui/containers/bundle_container.tsx b/app/soapbox/features/ui/containers/bundle_container.tsx index 12e4b3787..50a8b8629 100644 --- a/app/soapbox/features/ui/containers/bundle_container.tsx +++ b/app/soapbox/features/ui/containers/bundle_container.tsx @@ -1,6 +1,7 @@ import { connect } from 'react-redux'; -import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from '../../../actions/bundles'; +import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'soapbox/actions/bundles'; + import Bundle from '../components/bundle'; import type { AppDispatch } from 'soapbox/store'; diff --git a/app/soapbox/features/ui/containers/modal_container.js b/app/soapbox/features/ui/containers/modal_container.ts similarity index 65% rename from app/soapbox/features/ui/containers/modal_container.js rename to app/soapbox/features/ui/containers/modal_container.ts index 54f07a371..dc24254c3 100644 --- a/app/soapbox/features/ui/containers/modal_container.js +++ b/app/soapbox/features/ui/containers/modal_container.ts @@ -4,22 +4,24 @@ import { cancelReplyCompose } from 'soapbox/actions/compose'; import { closeModal } from 'soapbox/actions/modals'; import { cancelReport } from 'soapbox/actions/reports'; -import ModalRoot from '../components/modal_root'; +import ModalRoot, { ModalType } from '../components/modal_root'; -const mapStateToProps = state => { - const modal = state.get('modals').last({ +import type { AppDispatch, RootState } from 'soapbox/store'; + +const mapStateToProps = (state: RootState) => { + const modal = state.modals.last({ modalType: null, modalProps: {}, }); return { - type: modal.modalType, + type: modal.modalType as ModalType, props: modal.modalProps, }; }; -const mapDispatchToProps = (dispatch) => ({ - onClose(type) { +const mapDispatchToProps = (dispatch: AppDispatch) => ({ + onClose(type?: ModalType) { switch (type) { case 'COMPOSE': dispatch(cancelReplyCompose()); diff --git a/app/soapbox/reducers/notifications.js b/app/soapbox/reducers/notifications.ts similarity index 64% rename from app/soapbox/reducers/notifications.js rename to app/soapbox/reducers/notifications.ts index 4d5dd9921..d8c27292b 100644 --- a/app/soapbox/reducers/notifications.js +++ b/app/soapbox/reducers/notifications.ts @@ -1,4 +1,5 @@ import { + Map as ImmutableMap, Record as ImmutableRecord, OrderedMap as ImmutableOrderedMap, fromJS, @@ -33,40 +34,53 @@ import { } from '../actions/notifications'; import { TIMELINE_DELETE } from '../actions/timelines'; +import type { AnyAction } from 'redux'; +import type { APIEntity } from 'soapbox/types/entities'; + +const QueuedNotificationRecord = ImmutableRecord({ + notification: {} as APIEntity, + intlMessages: {} as Record, + intlLocale: '', +}); + const ReducerRecord = ImmutableRecord({ - items: ImmutableOrderedMap(), + items: ImmutableOrderedMap(), hasMore: true, top: false, unread: 0, isLoading: false, - queuedNotifications: ImmutableOrderedMap(), //max = MAX_QUEUED_NOTIFICATIONS + queuedNotifications: ImmutableOrderedMap(), //max = MAX_QUEUED_NOTIFICATIONS totalQueuedNotificationsCount: 0, //used for queuedItems overflow for MAX_QUEUED_NOTIFICATIONS+ - lastRead: -1, + lastRead: -1 as string | -1, }); -const parseId = id => parseInt(id, 10); +type State = ReturnType; +type NotificationRecord = ReturnType; +type QueuedNotification = ReturnType; + +const parseId = (id: string | number) => parseInt(id as string, 10); // For sorting the notifications -const comparator = (a, b) => { - const parse = m => parseId(m.get('id')); +const comparator = (a: NotificationRecord, b: NotificationRecord) => { + const parse = (m: NotificationRecord) => parseId(m.id); if (parse(a) < parse(b)) return 1; if (parse(a) > parse(b)) return -1; return 0; }; -const minifyNotification = notification => { +const minifyNotification = (notification: NotificationRecord) => { return notification.mergeWith((o, n) => n || o, { - account: notification.getIn(['account', 'id']), - target: notification.getIn(['target', 'id']), - status: notification.getIn(['status', 'id']), + account: notification.getIn(['account', 'id']) as string, + target: notification.getIn(['target', 'id']) as string, + status: notification.getIn(['status', 'id']) as string, }); }; -const fixNotification = notification => { +const fixNotification = (notification: APIEntity) => { return minifyNotification(normalizeNotification(notification)); }; -const isValid = notification => { +const isValid = (notification: APIEntity) => { try { // Ensure the notification is a known type if (!validType(notification.type)) { @@ -90,7 +104,7 @@ const isValid = notification => { }; // Count how many notifications appear after the given ID (for unread count) -const countFuture = (notifications, lastId) => { +const countFuture = (notifications: ImmutableOrderedMap, lastId: string | number) => { return notifications.reduce((acc, notification) => { if (parseId(notification.get('id')) > parseId(lastId)) { return acc + 1; @@ -100,8 +114,9 @@ const countFuture = (notifications, lastId) => { }, 0); }; -const importNotification = (state, notification) => { - const top = state.get('top'); + +const importNotification = (state: State, notification: APIEntity) => { + const top = state.top; if (!top) state = state.update('unread', unread => unread + 1); @@ -114,14 +129,14 @@ const importNotification = (state, notification) => { }); }; -const processRawNotifications = notifications => ( +export const processRawNotifications = (notifications: APIEntity[]) => ( ImmutableOrderedMap( notifications .filter(isValid) .map(n => [n.id, fixNotification(n)]), )); -const expandNormalizedNotifications = (state, notifications, next) => { +const expandNormalizedNotifications = (state: State, notifications: APIEntity[], next: string | null) => { const items = processRawNotifications(notifications); return state.withMutations(mutable => { @@ -132,28 +147,28 @@ const expandNormalizedNotifications = (state, notifications, next) => { }); }; -const filterNotifications = (state, relationship) => { - return state.update('items', map => map.filterNot(item => item !== null && item.get('account') === relationship.id)); +const filterNotifications = (state: State, relationship: APIEntity) => { + return state.update('items', map => map.filterNot(item => item !== null && item.account === relationship.id)); }; -const filterNotificationIds = (state, accountIds, type) => { - const helper = list => list.filterNot(item => item !== null && accountIds.includes(item.get('account')) && (type === undefined || type === item.get('type'))); +const filterNotificationIds = (state: State, accountIds: Array, type?: string) => { + const helper = (list: ImmutableOrderedMap) => list.filterNot(item => item !== null && accountIds.includes(item.account as string) && (type === undefined || type === item.type)); return state.update('items', helper); }; -const updateTop = (state, top) => { +const updateTop = (state: State, top: boolean) => { if (top) state = state.set('unread', 0); return state.set('top', top); }; -const deleteByStatus = (state, statusId) => { - return state.update('items', map => map.filterNot(item => item !== null && item.get('status') === statusId)); +const deleteByStatus = (state: State, statusId: string) => { + return state.update('items', map => map.filterNot(item => item !== null && item.status === statusId)); }; -const updateNotificationsQueue = (state, notification, intlMessages, intlLocale) => { - const queuedNotifications = state.getIn(['queuedNotifications'], ImmutableOrderedMap()); - const listedNotifications = state.getIn(['items'], ImmutableOrderedMap()); - const totalQueuedNotificationsCount = state.getIn(['totalQueuedNotificationsCount'], 0); +const updateNotificationsQueue = (state: State, notification: APIEntity, intlMessages: Record, intlLocale: string) => { + const queuedNotifications = state.queuedNotifications; + const listedNotifications = state.items; + const totalQueuedNotificationsCount = state.totalQueuedNotificationsCount; const alreadyExists = queuedNotifications.has(notification.id) || listedNotifications.has(notification.id); if (alreadyExists) return state; @@ -162,25 +177,25 @@ const updateNotificationsQueue = (state, notification, intlMessages, intlLocale) return state.withMutations(mutable => { if (totalQueuedNotificationsCount <= MAX_QUEUED_NOTIFICATIONS) { - mutable.set('queuedNotifications', newQueuedNotifications.set(notification.id, { + mutable.set('queuedNotifications', newQueuedNotifications.set(notification.id, QueuedNotificationRecord({ notification, intlMessages, intlLocale, - })); + }))); } mutable.set('totalQueuedNotificationsCount', totalQueuedNotificationsCount + 1); }); }; -const importMarker = (state, marker) => { - const lastReadId = marker.getIn(['notifications', 'last_read_id'], -1); +const importMarker = (state: State, marker: ImmutableMap) => { + const lastReadId = marker.getIn(['notifications', 'last_read_id'], -1) as string | -1; if (!lastReadId) { return state; } return state.withMutations(state => { - const notifications = state.get('items'); + const notifications = state.items; const unread = countFuture(notifications, lastReadId); state.set('unread', unread); @@ -188,14 +203,14 @@ const importMarker = (state, marker) => { }); }; -export default function notifications(state = ReducerRecord(), action) { +export default function notifications(state: State = ReducerRecord(), action: AnyAction) { switch (action.type) { case NOTIFICATIONS_EXPAND_REQUEST: return state.set('isLoading', true); case NOTIFICATIONS_EXPAND_FAIL: return state.set('isLoading', false); case NOTIFICATIONS_FILTER_SET: - return state.delete('items').set('hasMore', true); + return state.set('items', ImmutableOrderedMap()).set('hasMore', true); case NOTIFICATIONS_SCROLL_TOP: return updateTop(state, action.top); case NOTIFICATIONS_UPDATE: @@ -217,13 +232,13 @@ export default function notifications(state = ReducerRecord(), action) { case FOLLOW_REQUEST_REJECT_SUCCESS: return filterNotificationIds(state, [action.id], 'follow_request'); case NOTIFICATIONS_CLEAR: - return state.delete('items').set('hasMore', false); + return state.set('items', ImmutableOrderedMap()).set('hasMore', false); case NOTIFICATIONS_MARK_READ_REQUEST: return state.set('lastRead', action.lastRead); case MARKER_FETCH_SUCCESS: case MARKER_SAVE_REQUEST: case MARKER_SAVE_SUCCESS: - return importMarker(state, fromJS(action.marker)); + return importMarker(state, ImmutableMap(fromJS(action.marker))); case TIMELINE_DELETE: return deleteByStatus(state, action.id); default: From 3c1b9c6154914530e8d5a539cfc3d8e04eb262dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Sat, 12 Nov 2022 16:52:06 +0100 Subject: [PATCH 09/65] lint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/components/media_gallery.tsx | 1 - .../features/soapbox_config/components/icon-picker-menu.js | 1 - app/soapbox/features/ui/components/modal_root.tsx | 3 +-- app/soapbox/reducers/notifications.ts | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/soapbox/components/media_gallery.tsx b/app/soapbox/components/media_gallery.tsx index f899d7ba4..390a300ca 100644 --- a/app/soapbox/components/media_gallery.tsx +++ b/app/soapbox/components/media_gallery.tsx @@ -526,7 +526,6 @@ const MediaGallery: React.FC = (props) => { /> )); - useEffect(() => { if (node.current) { const { offsetWidth } = node.current; diff --git a/app/soapbox/features/soapbox_config/components/icon-picker-menu.js b/app/soapbox/features/soapbox_config/components/icon-picker-menu.js index c89b00488..a9b6be2f2 100644 --- a/app/soapbox/features/soapbox_config/components/icon-picker-menu.js +++ b/app/soapbox/features/soapbox_config/components/icon-picker-menu.js @@ -18,7 +18,6 @@ const listenerOptions = supportsPassiveEvents ? { passive: true } : false; const categoriesSort = ['custom']; - class IconPickerMenu extends React.PureComponent { static propTypes = { diff --git a/app/soapbox/features/ui/components/modal_root.tsx b/app/soapbox/features/ui/components/modal_root.tsx index f9900d569..4e7a82e04 100644 --- a/app/soapbox/features/ui/components/modal_root.tsx +++ b/app/soapbox/features/ui/components/modal_root.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import React from 'react'; import Base from 'soapbox/components/modal_root'; @@ -35,8 +34,8 @@ import { } from 'soapbox/features/ui/util/async-components'; import BundleContainer from '../containers/bundle_container'; -import { BundleProps } from './bundle'; +import { BundleProps } from './bundle'; import BundleModalError from './bundle_modal_error'; import ModalLoading from './modal_loading'; diff --git a/app/soapbox/reducers/notifications.ts b/app/soapbox/reducers/notifications.ts index d8c27292b..24185ee0a 100644 --- a/app/soapbox/reducers/notifications.ts +++ b/app/soapbox/reducers/notifications.ts @@ -114,7 +114,6 @@ const countFuture = (notifications: ImmutableOrderedMap { const top = state.top; From 0ae57236c7b49514db4abdf00bfcbb5d757864c5 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sun, 13 Nov 2022 12:43:36 -0600 Subject: [PATCH 10/65] Make quote posting work on Akkoma --- app/soapbox/normalizers/__tests__/instance.test.ts | 2 +- app/soapbox/normalizers/instance.ts | 2 +- app/soapbox/utils/features.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/soapbox/normalizers/__tests__/instance.test.ts b/app/soapbox/normalizers/__tests__/instance.test.ts index 0df95fcb3..87088b30d 100644 --- a/app/soapbox/normalizers/__tests__/instance.test.ts +++ b/app/soapbox/normalizers/__tests__/instance.test.ts @@ -197,7 +197,7 @@ describe('normalizeInstance()', () => { const instance = require('soapbox/__fixtures__/akkoma-instance.json'); const result = normalizeInstance(instance); - expect(result.version).toEqual('2.7.2 (compatible; Pleroma 2.4.5+akkoma)'); + expect(result.version).toEqual('2.7.2 (compatible; Pleroma 2.4.50+akkoma)'); }); }); diff --git a/app/soapbox/normalizers/instance.ts b/app/soapbox/normalizers/instance.ts index ff55ef4a5..7a33343f7 100644 --- a/app/soapbox/normalizers/instance.ts +++ b/app/soapbox/normalizers/instance.ts @@ -103,7 +103,7 @@ const fixAkkoma = (instance: ImmutableMap) => { const version: string = instance.get('version', ''); if (version.includes('Akkoma')) { - return instance.set('version', '2.7.2 (compatible; Pleroma 2.4.5+akkoma)'); + return instance.set('version', '2.7.2 (compatible; Pleroma 2.4.50+akkoma)'); } else { return instance; } diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index 3cb7e98dc..200cee5f1 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -504,7 +504,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/statuses */ quotePosts: any([ - v.software === PLEROMA && v.build === SOAPBOX && gte(v.version, '2.4.50'), + v.software === PLEROMA && [SOAPBOX, AKKOMA].includes(v.build!) && gte(v.version, '2.4.50'), instance.feature_quote === true, ]), From c421819202fb84813c87da019436e194a43891c1 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Mon, 14 Nov 2022 11:50:21 -0500 Subject: [PATCH 11/65] Refactor to use URL and URLSearchParams --- app/soapbox/utils/__tests__/media.test.ts | 14 ++++++++++++++ app/soapbox/utils/media.ts | 21 +++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/app/soapbox/utils/__tests__/media.test.ts b/app/soapbox/utils/__tests__/media.test.ts index 815b12321..56a02aebc 100644 --- a/app/soapbox/utils/__tests__/media.test.ts +++ b/app/soapbox/utils/__tests__/media.test.ts @@ -6,6 +6,13 @@ describe('addAutoPlay()', () => { const html = ''; expect(addAutoPlay(html)).toEqual(''); }); + + describe('when the iframe src already has params', () => { + it('adds the correct query parameters to the src', () => { + const html = ''; + expect(addAutoPlay(html)).toEqual(''); + }); + }); }); describe('when the provider is not Rumble', () => { @@ -13,5 +20,12 @@ describe('addAutoPlay()', () => { const html = ''; expect(addAutoPlay(html)).toEqual(''); }); + + describe('when the iframe src already has params', () => { + it('adds the correct query parameters to the src', () => { + const html = ''; + expect(addAutoPlay(html)).toEqual(''); + }); + }); }); }); diff --git a/app/soapbox/utils/media.ts b/app/soapbox/utils/media.ts index 27a1f6ba0..ff0bf502e 100644 --- a/app/soapbox/utils/media.ts +++ b/app/soapbox/utils/media.ts @@ -53,24 +53,29 @@ const getVideoDuration = (file: File): Promise => { const domParser = new DOMParser(); +enum VideoProviders { + RUMBLE = 'rumble.com' +} + const addAutoPlay = (html: string): string => { const document = domParser.parseFromString(html, 'text/html').documentElement; const iframe = document.querySelector('iframe'); if (iframe) { - if (iframe.src.includes('?')) { - iframe.src += '&'; - } else { - iframe.src += '?'; - } + const url = new URL(iframe.src); + const provider = new URL(iframe.src).host; - if (new URL(iframe.src).host === 'rumble.com') { - iframe.src += 'pub=7a20&autoplay=2'; + if (provider === VideoProviders.RUMBLE) { + url.searchParams.append('pub', '7a20'); + url.searchParams.append('autoplay', '2'); } else { - iframe.src += 'autoplay=1&auto_play=1'; + url.searchParams.append('autoplay', '1'); + url.searchParams.append('auto_play', '1'); iframe.allow = 'autoplay'; } + iframe.src = url.toString(); + // DOM parser creates html/body elements around original HTML fragment, // so we need to get innerHTML out of the body and not the entire document return (document.querySelector('body') as HTMLBodyElement).innerHTML; From cecbc7c277af0c23f6b0d6e3c664513b82e2fa35 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Nov 2022 16:34:30 -0600 Subject: [PATCH 12/65] Fix sensitive content z-order (when a sensitive status contains a sensitive quote) --- app/soapbox/components/quoted-status.tsx | 2 +- app/soapbox/components/status.tsx | 2 +- app/soapbox/features/status/components/detailed-status.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/soapbox/components/quoted-status.tsx b/app/soapbox/components/quoted-status.tsx index 863a5d3af..77adeffa6 100644 --- a/app/soapbox/components/quoted-status.tsx +++ b/app/soapbox/components/quoted-status.tsx @@ -103,7 +103,7 @@ const QuotedStatus: React.FC = ({ status, onCancel, compose }) => - diff --git a/app/soapbox/components/status.tsx b/app/soapbox/components/status.tsx index f01ded300..23fd5145b 100644 --- a/app/soapbox/components/status.tsx +++ b/app/soapbox/components/status.tsx @@ -359,7 +359,7 @@ const Status: React.FC = (props) => { = ({ Date: Mon, 14 Nov 2022 17:03:40 -0600 Subject: [PATCH 13/65] Hashtag timeline: stop flashing repeatedly Fixes https://gitlab.com/soapbox-pub/soapbox/-/issues/1166 --- app/soapbox/features/hashtag-timeline/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/soapbox/features/hashtag-timeline/index.tsx b/app/soapbox/features/hashtag-timeline/index.tsx index 7ead1a9f5..e10b74aee 100644 --- a/app/soapbox/features/hashtag-timeline/index.tsx +++ b/app/soapbox/features/hashtag-timeline/index.tsx @@ -95,7 +95,7 @@ export const HashtagTimeline: React.FC = ({ params }) => { subscribe(); dispatch(clearTimeline(`hashtag:${id}`)); dispatch(expandHashtagTimeline(id, { tags })); - }, [id, tags]); + }, [id]); return ( From dad7c226033266ae5b08aa8df7a74e5ae9bfe4b7 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Tue, 15 Nov 2022 08:23:16 -0500 Subject: [PATCH 14/65] Remove Halloween theme --- app/images/halloween/clouds.png | Bin 226398 -> 0 bytes app/images/halloween/halloween-emblem.svg | 311 ------------------ app/images/halloween/spider.svg | 69 ---- app/images/halloween/spiderweb.svg | 78 ----- app/images/halloween/starfield.png | Bin 12137 -> 0 bytes app/images/halloween/twinkle.svg | 34 -- .../features/developers/settings-store.tsx | 7 - app/styles/application.scss | 3 - app/styles/holiday/halloween.scss | 144 -------- 9 files changed, 646 deletions(-) delete mode 100644 app/images/halloween/clouds.png delete mode 100644 app/images/halloween/halloween-emblem.svg delete mode 100644 app/images/halloween/spider.svg delete mode 100644 app/images/halloween/spiderweb.svg delete mode 100644 app/images/halloween/starfield.png delete mode 100644 app/images/halloween/twinkle.svg delete mode 100644 app/styles/holiday/halloween.scss diff --git a/app/images/halloween/clouds.png b/app/images/halloween/clouds.png deleted file mode 100644 index 29962c1048bd08e7416f765b821ea13fd0a9cf7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226398 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
9lMN#JuMHwPtar0haXJ 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 diff --git a/app/images/halloween/halloween-emblem.svg b/app/images/halloween/halloween-emblem.svg deleted file mode 100644 index ad23be14c..000000000 --- a/app/images/halloween/halloween-emblem.svg +++ /dev/null @@ -1,311 +0,0 @@ - - - - Flying Witch during Full Moon - - - - - image/svg+xml - - Flying Witch during Full Moon - 2017-10-10 - - - Urs Roesch - - - - - - OpenClipart - - - - - remix+287475 - remix+288242 - remix+170669 - yellow - moon - yellow moon - full moon - moon - witch - cat - silhouette - bat - bats - flying bat - flying witch - black - dark - night - halloween - walpurgis night - walpurgis - - - Flying witch with cat flying during full moon. - - - gnokii - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/images/halloween/spider.svg b/app/images/halloween/spider.svg deleted file mode 100644 index 077b60d65..000000000 --- a/app/images/halloween/spider.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/app/images/halloween/spiderweb.svg b/app/images/halloween/spiderweb.svg deleted file mode 100644 index 16ae81984..000000000 --- a/app/images/halloween/spiderweb.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Realistic spider web - - - - - - - image/svg+xml - - - - - Openclipart - - - Realistic spider web - - - - - - - - - diff --git a/app/images/halloween/starfield.png b/app/images/halloween/starfield.png deleted file mode 100644 index 1e799589553544a3b69f7f35cb061f03bb986437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12137 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%0AQh?W`C{0!R!Y`oAVW4hi+59hWRdCl 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 - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/app/soapbox/features/developers/settings-store.tsx b/app/soapbox/features/developers/settings-store.tsx index bd619a93f..c2fbf0cc9 100644 --- a/app/soapbox/features/developers/settings-store.tsx +++ b/app/soapbox/features/developers/settings-store.tsx @@ -132,13 +132,6 @@ const SettingsStore: React.FC = () => {
- {/* } - hint={} - > - - */} - } hint={} diff --git a/app/styles/application.scss b/app/styles/application.scss index 1b70c6982..e7974c887 100644 --- a/app/styles/application.scss +++ b/app/styles/application.scss @@ -72,9 +72,6 @@ @import 'components/radio-button'; @import 'components/directory'; -// Holiday -@import 'holiday/halloween'; - // Truth custom styles @import 'truth'; diff --git a/app/styles/holiday/halloween.scss b/app/styles/holiday/halloween.scss deleted file mode 100644 index 9fcf96ae5..000000000 --- a/app/styles/holiday/halloween.scss +++ /dev/null @@ -1,144 +0,0 @@ -.halloween, -.site-preview.halloween { - // Set brand color to orange - --brand-color_h: 29.727272727272727; - --brand-color_s: 100%; - --brand-color_l: 43.13725490196079%; - - // Stars BG - background-color: #904700; // Color matches twinkle.svg - background-image: url('../images/halloween/starfield.png'); - background-size: cover; - background-attachment: fixed; - background-position: center; - - // Full-screen pseudo-elements to hold BG graphics - &::before, - &::after, - > .app-holder::before, - > .app-holder::after { - content: ''; - display: block; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-size: cover; - background-position: center; - width: 100%; - height: 100%; - z-index: -100; - } - - // Spiderweb BG - &::before { - background-image: url('../images/halloween/spiderweb.svg'); - } - - // Twinkle effect by masking with semi-transparent animated circles - &::after { - z-index: -101; - background: transparent url("../images/halloween/twinkle.svg") repeat top center; - animation: halloween-twinkle 200s linear infinite; - } - - > .app-holder { - // Vignette - &::before { - background-image: radial-gradient( - circle, - transparent 0%, - transparent 60%, - var(--vignette-color) 100% - ); - } - - // Floating clouds BG - &::after { - background: transparent url("../images/halloween/clouds.png") repeat top center; - animation: halloween-clouds 200s linear infinite; - } - - // Dangling spider - .ui .page__top::after, - .ui .page__columns::after { - content: ''; - display: block; - width: 100px; - height: 100px; - right: 20px; - background-image: url('../images/halloween/spider.svg'); - background-size: contain; - background-repeat: no-repeat; - background-position: top right; - z-index: -1; - pointer-events: none; - } - - .ui .page__columns::after { - position: fixed; - top: 50px; - } - - .ui .page__top::after { - position: absolute; - bottom: -100px; - } - - .ui .page__top + .page__columns::after { - display: none; - } - - .profile-info-panel { - color: #fff; - - &-content__name h1 { - span:first-of-type { - color: hsla(0, 0%, 100%, 0.6); - } - - small { - color: #fff; - } - } - - &-content__bio { - color: #fff; - } - - &-content__bio a, - &-content__fields a { - color: hsl( - var(--brand-color_h), - var(--brand-color_s), - calc(var(--brand-color_l) + 8%) - ); - } - } - } - - .column-header > button.grouped, - .column-header > .btn.grouped { - color: #fff; - - &:hover { - color: #fff; - } - - &::before { - background-color: var(--brand-color); - } - } -} - -// Animations -@keyframes halloween-twinkle { - from { background-position: 0 0; } - to { background-position: -10000px 5000px; } -} - -@keyframes halloween-clouds { - from { background-position: 0 0; } - to { background-position: 10000px 0; } -} From 8b22ca5f27a200dfc6aa0d9aaf004ed0ccc19cc1 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Tue, 15 Nov 2022 08:23:36 -0500 Subject: [PATCH 15/65] Organize fonts,images,icon,sounds into 'assets' folder --- app/application.ts | 2 +- app/{ => assets}/fonts/OpenDyslexic/LICENSE | 0 .../OpenDyslexic-Bold-Italic.woff2 | Bin .../OpenDyslexic/OpenDyslexic-Bold.woff2 | Bin .../OpenDyslexic/OpenDyslexic-Italic.woff2 | Bin .../OpenDyslexic/OpenDyslexic-Regular.woff2 | Bin app/{ => assets}/fonts/soapbox/soapbox.eot | Bin app/{ => assets}/fonts/soapbox/soapbox.svg | 0 app/{ => assets}/fonts/soapbox/soapbox.ttf | Bin app/{ => assets}/fonts/soapbox/soapbox.woff | Bin app/{ => assets}/icons/COPYING.md | 0 app/{ => assets}/icons/fediverse.svg | 0 app/{ => assets}/icons/verified.svg | 0 app/{ => assets}/images/audio-placeholder.png | Bin app/{ => assets}/images/avatar-missing.png | Bin app/{ => assets}/images/avatar-missing.svg | 0 app/{ => assets}/images/header-missing.png | Bin .../images/soapbox-logo-white.svg | 0 app/{ => assets}/images/soapbox-logo.svg | 0 app/{ => assets}/images/video-placeholder.png | Bin app/{ => assets}/images/void.png | Bin .../images/web-push/web-push-icon_expand.png | Bin .../web-push/web-push-icon_favourite.png | Bin .../images/web-push/web-push-icon_reblog.png | Bin app/{ => assets}/sounds/boop.mp3 | Bin app/{ => assets}/sounds/boop.ogg | Bin app/{ => assets}/sounds/chat.mp3 | Bin app/{ => assets}/sounds/chat.oga | Bin app/images/sprite-post-functions.png | Bin 10420 -> 0 bytes app/soapbox/components/sidebar-navigation.tsx | 2 +- app/soapbox/components/sidebar_menu.tsx | 2 +- app/soapbox/components/site-logo.tsx | 4 ++-- app/soapbox/components/verification_badge.tsx | 2 +- app/soapbox/middleware/sounds.ts | 8 ++++---- .../normalizers/__tests__/account.test.ts | 4 ++-- app/soapbox/normalizers/account.ts | 4 ++-- .../service_worker/web_push_notifications.ts | 6 +++--- app/styles/components/compose-form.scss | 4 ++-- app/styles/fonts.scss | 18 +++++++++--------- app/styles/ui.scss | 2 +- webpack/rules/assets.ts | 8 ++++---- 41 files changed, 33 insertions(+), 33 deletions(-) rename app/{ => assets}/fonts/OpenDyslexic/LICENSE (100%) rename app/{ => assets}/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2 (100%) rename app/{ => assets}/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2 (100%) rename app/{ => assets}/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2 (100%) rename app/{ => assets}/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2 (100%) rename app/{ => assets}/fonts/soapbox/soapbox.eot (100%) rename app/{ => assets}/fonts/soapbox/soapbox.svg (100%) rename app/{ => assets}/fonts/soapbox/soapbox.ttf (100%) rename app/{ => assets}/fonts/soapbox/soapbox.woff (100%) rename app/{ => assets}/icons/COPYING.md (100%) rename app/{ => assets}/icons/fediverse.svg (100%) rename app/{ => assets}/icons/verified.svg (100%) rename app/{ => assets}/images/audio-placeholder.png (100%) rename app/{ => assets}/images/avatar-missing.png (100%) rename app/{ => assets}/images/avatar-missing.svg (100%) rename app/{ => assets}/images/header-missing.png (100%) rename app/{ => assets}/images/soapbox-logo-white.svg (100%) rename app/{ => assets}/images/soapbox-logo.svg (100%) rename app/{ => assets}/images/video-placeholder.png (100%) rename app/{ => assets}/images/void.png (100%) rename app/{ => assets}/images/web-push/web-push-icon_expand.png (100%) rename app/{ => assets}/images/web-push/web-push-icon_favourite.png (100%) rename app/{ => assets}/images/web-push/web-push-icon_reblog.png (100%) rename app/{ => assets}/sounds/boop.mp3 (100%) rename app/{ => assets}/sounds/boop.ogg (100%) rename app/{ => assets}/sounds/chat.mp3 (100%) rename app/{ => assets}/sounds/chat.oga (100%) delete mode 100644 app/images/sprite-post-functions.png diff --git a/app/application.ts b/app/application.ts index 38dc08993..111923abd 100644 --- a/app/application.ts +++ b/app/application.ts @@ -4,7 +4,7 @@ import loadPolyfills from './soapbox/load_polyfills'; require('./soapbox/iframe'); // @ts-ignore -require.context('./images/', true); +require.context('./assets/images/', true); // Load stylesheet require('react-datepicker/dist/react-datepicker.css'); diff --git a/app/fonts/OpenDyslexic/LICENSE b/app/assets/fonts/OpenDyslexic/LICENSE similarity index 100% rename from app/fonts/OpenDyslexic/LICENSE rename to app/assets/fonts/OpenDyslexic/LICENSE diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2 b/app/assets/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2 similarity index 100% rename from app/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2 rename to app/assets/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2 diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2 b/app/assets/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2 similarity index 100% rename from app/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2 rename to app/assets/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2 diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2 b/app/assets/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2 similarity index 100% rename from app/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2 rename to app/assets/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2 diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2 b/app/assets/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2 similarity index 100% rename from app/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2 rename to app/assets/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2 diff --git a/app/fonts/soapbox/soapbox.eot b/app/assets/fonts/soapbox/soapbox.eot similarity index 100% rename from app/fonts/soapbox/soapbox.eot rename to app/assets/fonts/soapbox/soapbox.eot diff --git a/app/fonts/soapbox/soapbox.svg b/app/assets/fonts/soapbox/soapbox.svg similarity index 100% rename from app/fonts/soapbox/soapbox.svg rename to app/assets/fonts/soapbox/soapbox.svg diff --git a/app/fonts/soapbox/soapbox.ttf b/app/assets/fonts/soapbox/soapbox.ttf similarity index 100% rename from app/fonts/soapbox/soapbox.ttf rename to app/assets/fonts/soapbox/soapbox.ttf diff --git a/app/fonts/soapbox/soapbox.woff b/app/assets/fonts/soapbox/soapbox.woff similarity index 100% rename from app/fonts/soapbox/soapbox.woff rename to app/assets/fonts/soapbox/soapbox.woff diff --git a/app/icons/COPYING.md b/app/assets/icons/COPYING.md similarity index 100% rename from app/icons/COPYING.md rename to app/assets/icons/COPYING.md diff --git a/app/icons/fediverse.svg b/app/assets/icons/fediverse.svg similarity index 100% rename from app/icons/fediverse.svg rename to app/assets/icons/fediverse.svg diff --git a/app/icons/verified.svg b/app/assets/icons/verified.svg similarity index 100% rename from app/icons/verified.svg rename to app/assets/icons/verified.svg diff --git a/app/images/audio-placeholder.png b/app/assets/images/audio-placeholder.png similarity index 100% rename from app/images/audio-placeholder.png rename to app/assets/images/audio-placeholder.png diff --git a/app/images/avatar-missing.png b/app/assets/images/avatar-missing.png similarity index 100% rename from app/images/avatar-missing.png rename to app/assets/images/avatar-missing.png diff --git a/app/images/avatar-missing.svg b/app/assets/images/avatar-missing.svg similarity index 100% rename from app/images/avatar-missing.svg rename to app/assets/images/avatar-missing.svg diff --git a/app/images/header-missing.png b/app/assets/images/header-missing.png similarity index 100% rename from app/images/header-missing.png rename to app/assets/images/header-missing.png diff --git a/app/images/soapbox-logo-white.svg b/app/assets/images/soapbox-logo-white.svg similarity index 100% rename from app/images/soapbox-logo-white.svg rename to app/assets/images/soapbox-logo-white.svg diff --git a/app/images/soapbox-logo.svg b/app/assets/images/soapbox-logo.svg similarity index 100% rename from app/images/soapbox-logo.svg rename to app/assets/images/soapbox-logo.svg diff --git a/app/images/video-placeholder.png b/app/assets/images/video-placeholder.png similarity index 100% rename from app/images/video-placeholder.png rename to app/assets/images/video-placeholder.png diff --git a/app/images/void.png b/app/assets/images/void.png similarity index 100% rename from app/images/void.png rename to app/assets/images/void.png diff --git a/app/images/web-push/web-push-icon_expand.png b/app/assets/images/web-push/web-push-icon_expand.png similarity index 100% rename from app/images/web-push/web-push-icon_expand.png rename to app/assets/images/web-push/web-push-icon_expand.png diff --git a/app/images/web-push/web-push-icon_favourite.png b/app/assets/images/web-push/web-push-icon_favourite.png similarity index 100% rename from app/images/web-push/web-push-icon_favourite.png rename to app/assets/images/web-push/web-push-icon_favourite.png diff --git a/app/images/web-push/web-push-icon_reblog.png b/app/assets/images/web-push/web-push-icon_reblog.png similarity index 100% rename from app/images/web-push/web-push-icon_reblog.png rename to app/assets/images/web-push/web-push-icon_reblog.png diff --git a/app/sounds/boop.mp3 b/app/assets/sounds/boop.mp3 similarity index 100% rename from app/sounds/boop.mp3 rename to app/assets/sounds/boop.mp3 diff --git a/app/sounds/boop.ogg b/app/assets/sounds/boop.ogg similarity index 100% rename from app/sounds/boop.ogg rename to app/assets/sounds/boop.ogg diff --git a/app/sounds/chat.mp3 b/app/assets/sounds/chat.mp3 similarity index 100% rename from app/sounds/chat.mp3 rename to app/assets/sounds/chat.mp3 diff --git a/app/sounds/chat.oga b/app/assets/sounds/chat.oga similarity index 100% rename from app/sounds/chat.oga rename to app/assets/sounds/chat.oga diff --git a/app/images/sprite-post-functions.png b/app/images/sprite-post-functions.png deleted file mode 100644 index aea7f57ba90bdaa245663f41f237cb950b8414ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10420 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 E03@b(p#T5? diff --git a/app/soapbox/components/sidebar-navigation.tsx b/app/soapbox/components/sidebar-navigation.tsx index 22ad8dfc9..4dd47efff 100644 --- a/app/soapbox/components/sidebar-navigation.tsx +++ b/app/soapbox/components/sidebar-navigation.tsx @@ -97,7 +97,7 @@ const SidebarNavigation = () => { if (features.publicTimeline && features.federating) { menu.push({ to: '/timeline/fediverse', - icon: require('icons/fediverse.svg'), + icon: require('assets/icons/fediverse.svg'), text: intl.formatMessage(messages.fediverse), }); } diff --git a/app/soapbox/components/sidebar_menu.tsx b/app/soapbox/components/sidebar_menu.tsx index 817e1f0d2..2c695e5a1 100644 --- a/app/soapbox/components/sidebar_menu.tsx +++ b/app/soapbox/components/sidebar_menu.tsx @@ -228,7 +228,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { {features.federating && ( } onClick={onClose} /> diff --git a/app/soapbox/components/site-logo.tsx b/app/soapbox/components/site-logo.tsx index 56add1c19..90552d0bd 100644 --- a/app/soapbox/components/site-logo.tsx +++ b/app/soapbox/components/site-logo.tsx @@ -18,8 +18,8 @@ const SiteLogo: React.FC = ({ className, theme, ...rest }) => { /** Soapbox logo. */ const soapboxLogo = darkMode - ? require('images/soapbox-logo-white.svg') - : require('images/soapbox-logo.svg'); + ? require('assets/images/soapbox-logo-white.svg') + : require('assets/images/soapbox-logo.svg'); // Use the right logo if provided, then use fallbacks. const getSrc = () => { diff --git a/app/soapbox/components/verification_badge.tsx b/app/soapbox/components/verification_badge.tsx index ce1d3792a..766decb88 100644 --- a/app/soapbox/components/verification_badge.tsx +++ b/app/soapbox/components/verification_badge.tsx @@ -18,7 +18,7 @@ const VerificationBadge: React.FC = ({ className }) => { const soapboxConfig = useSoapboxConfig(); // Prefer a custom icon if found - const icon = soapboxConfig.verifiedIcon || require('icons/verified.svg'); + const icon = soapboxConfig.verifiedIcon || require('assets/icons/verified.svg'); // Render component based on file extension const Element = icon.endsWith('.svg') ? Icon : 'img'; diff --git a/app/soapbox/middleware/sounds.ts b/app/soapbox/middleware/sounds.ts index 94ba15313..1d600306f 100644 --- a/app/soapbox/middleware/sounds.ts +++ b/app/soapbox/middleware/sounds.ts @@ -39,21 +39,21 @@ export default function soundsMiddleware(): ThunkMiddleware { const soundCache: Record = { boop: createAudio([ { - src: require('../../sounds/boop.ogg'), + src: require('../../assets/sounds/boop.ogg'), type: 'audio/ogg', }, { - src: require('../../sounds/boop.mp3'), + src: require('../../assets/sounds/boop.mp3'), type: 'audio/mpeg', }, ]), chat: createAudio([ { - src: require('../../sounds/chat.oga'), + src: require('../../assets/sounds/chat.oga'), type: 'audio/ogg', }, { - src: require('../../sounds/chat.mp3'), + src: require('../../assets/sounds/chat.mp3'), type: 'audio/mpeg', }, ]), diff --git a/app/soapbox/normalizers/__tests__/account.test.ts b/app/soapbox/normalizers/__tests__/account.test.ts index b5f4f5a75..a0589da2c 100644 --- a/app/soapbox/normalizers/__tests__/account.test.ts +++ b/app/soapbox/normalizers/__tests__/account.test.ts @@ -2,8 +2,8 @@ import { Record as ImmutableRecord, fromJS } from 'immutable'; import { normalizeAccount } from '../account'; -const AVATAR_MISSING = require('images/avatar-missing.png'); -const HEADER_MISSING = require('images/header-missing.png'); +const AVATAR_MISSING = require('assets/images/avatar-missing.png'); +const HEADER_MISSING = require('assets/images/header-missing.png'); describe('normalizeAccount()', () => { it('adds base fields', () => { diff --git a/app/soapbox/normalizers/account.ts b/app/soapbox/normalizers/account.ts index 97c640886..07d3ec1e6 100644 --- a/app/soapbox/normalizers/account.ts +++ b/app/soapbox/normalizers/account.ts @@ -98,7 +98,7 @@ const normalizePleromaLegacyFields = (account: ImmutableMap) => { const normalizeAvatar = (account: ImmutableMap) => { const avatar = account.get('avatar'); const avatarStatic = account.get('avatar_static'); - const missing = require('images/avatar-missing.png'); + const missing = require('assets/images/avatar-missing.png'); return account.withMutations(account => { account.set('avatar', avatar || avatarStatic || missing); @@ -110,7 +110,7 @@ const normalizeAvatar = (account: ImmutableMap) => { const normalizeHeader = (account: ImmutableMap) => { const header = account.get('header'); const headerStatic = account.get('header_static'); - const missing = require('images/header-missing.png'); + const missing = require('assets/images/header-missing.png'); return account.withMutations(account => { account.set('header', header || headerStatic || missing); diff --git a/app/soapbox/service_worker/web_push_notifications.ts b/app/soapbox/service_worker/web_push_notifications.ts index fe3d8e652..787e60941 100644 --- a/app/soapbox/service_worker/web_push_notifications.ts +++ b/app/soapbox/service_worker/web_push_notifications.ts @@ -180,21 +180,21 @@ const handlePush = (event: PushEvent) => { /** Native action to open a status on the device. */ const actionExpand = (preferred_locale: string) => ({ action: 'expand', - icon: `/${require('../../images/web-push/web-push-icon_expand.png')}`, + icon: `/${require('../../assets/images/web-push/web-push-icon_expand.png')}`, title: formatMessage('status.show_more', preferred_locale), }); /** Native action to repost status. */ const actionReblog = (preferred_locale: string) => ({ action: 'reblog', - icon: `/${require('../../images/web-push/web-push-icon_reblog.png')}`, + icon: `/${require('../../assets/images/web-push/web-push-icon_reblog.png')}`, title: formatMessage('status.reblog', preferred_locale), }); /** Native action to like status. */ const actionFavourite = (preferred_locale: string) => ({ action: 'favourite', - icon: `/${require('../../images/web-push/web-push-icon_favourite.png')}`, + icon: `/${require('../../assets/images/web-push/web-push-icon_favourite.png')}`, title: formatMessage('status.favourite', preferred_locale), }); diff --git a/app/styles/components/compose-form.scss b/app/styles/components/compose-form.scss index 0d76263d3..50ffbc2fe 100644 --- a/app/styles/components/compose-form.scss +++ b/app/styles/components/compose-form.scss @@ -135,12 +135,12 @@ position: relative; &.video { - background-image: url('../images/video-placeholder.png'); + background-image: url('../assets/images/video-placeholder.png'); background-size: cover; } &.audio { - background-image: url('../images/audio-placeholder.png'); + background-image: url('../assets/images/audio-placeholder.png'); background-size: cover; } } diff --git a/app/styles/fonts.scss b/app/styles/fonts.scss index bd8f1bec5..fbb21c381 100644 --- a/app/styles/fonts.scss +++ b/app/styles/fonts.scss @@ -3,26 +3,26 @@ // OpenDyslexic @font-face { font-family: 'OpenDyslexic'; - src: url('../fonts/OpenDyslexic/OpenDyslexic-Regular.woff2') format('woff2'); + src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Regular.woff2') format('woff2'); } @font-face { font-family: 'OpenDyslexic'; font-weight: bold; - src: url('../fonts/OpenDyslexic/OpenDyslexic-Bold.woff2') format('woff2'); + src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Bold.woff2') format('woff2'); } @font-face { font-family: 'OpenDyslexic'; font-weight: bold; font-style: italic; - src: url('../fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2') format('woff2'); + src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Bold-Italic.woff2') format('woff2'); } @font-face { font-family: 'OpenDyslexic'; font-style: italic; - src: url('../fonts/OpenDyslexic/OpenDyslexic-Italic.woff2') format('woff2'); + src: url('../assets/fonts/OpenDyslexic/OpenDyslexic-Italic.woff2') format('woff2'); } // TYPEOGRAPHY MIXINS @@ -62,11 +62,11 @@ // Soapbox icon font @font-face { font-family: 'soapbox'; - src: url('../fonts/soapbox/soapbox.eot?pryg6i'); - src: url('../fonts/soapbox/soapbox.eot?pryg6i#iefix') format('embedded-opentype'), - url('../fonts/soapbox/soapbox.ttf?pryg6i') format('truetype'), - url('../fonts/soapbox/soapbox.woff?pryg6i') format('woff'), - url('../fonts/soapbox/soapbox.svg?pryg6i#soapbox') format('svg'); + src: url('../assets/fonts/soapbox/soapbox.eot?pryg6i'); + src: url('../assets/fonts/soapbox/soapbox.eot?pryg6i#iefix') format('embedded-opentype'), + url('../assets/fonts/soapbox/soapbox.ttf?pryg6i') format('truetype'), + url('../assets/fonts/soapbox/soapbox.woff?pryg6i') format('woff'), + url('../assets/fonts/soapbox/soapbox.svg?pryg6i#soapbox') format('svg'); font-weight: normal; font-style: normal; } diff --git a/app/styles/ui.scss b/app/styles/ui.scss index e11041089..b822b77f1 100644 --- a/app/styles/ui.scss +++ b/app/styles/ui.scss @@ -232,7 +232,7 @@ article:last-child > .domain { .image-loader__preview-canvas { max-width: $media-modal-media-max-width; max-height: $media-modal-media-max-height; - background: url('../images/void.png') repeat; + background: url('../assets/images/void.png') repeat; object-fit: contain; } diff --git a/webpack/rules/assets.ts b/webpack/rules/assets.ts index d8c8e3e18..e9dd0202a 100644 --- a/webpack/rules/assets.ts +++ b/webpack/rules/assets.ts @@ -11,7 +11,7 @@ const rules: RuleSetRule[] = [{ test: /\.(png|svg)/, type: 'asset/resource', include: [ - resolve('app', 'images'), + resolve('app', 'assets', 'images'), resolve('node_modules', 'emoji-datasource'), ], generator: { @@ -21,7 +21,7 @@ const rules: RuleSetRule[] = [{ test: /\.(ttf|eot|svg|woff|woff2)/, type: 'asset/resource', include: [ - resolve('app', 'fonts'), + resolve('app', 'assets', 'fonts'), resolve('node_modules', 'fork-awesome'), resolve('node_modules', 'line-awesome'), resolve('node_modules', '@fontsource'), @@ -32,7 +32,7 @@ const rules: RuleSetRule[] = [{ }, { test: /\.(ogg|oga|mp3)/, type: 'asset/resource', - include: resolve('app', 'sounds'), + include: resolve('app', 'assets', 'sounds'), generator: { filename: 'packs/sounds/[name]-[contenthash:8][ext]', }, @@ -46,7 +46,7 @@ const rules: RuleSetRule[] = [{ }, { test: /\.svg$/, type: 'asset/resource', - include: resolve('app', 'icons'), + include: resolve('app', 'assets', 'icons'), generator: { filename: 'packs/icons/[name]-[contenthash:8][ext]', }, From a202fe68d1ffa9cc2f34ceaae89811535936688f Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Tue, 15 Nov 2022 08:43:26 -0500 Subject: [PATCH 16/65] Move api into a folder --- .../api.ts => api/__mocks__/index.ts} | 2 +- app/soapbox/{api.ts => api/index.ts} | 40 +++++++++---------- app/soapbox/jest/test-setup.ts | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) rename app/soapbox/{__mocks__/api.ts => api/__mocks__/index.ts} (92%) rename app/soapbox/{api.ts => api/index.ts} (77%) diff --git a/app/soapbox/__mocks__/api.ts b/app/soapbox/api/__mocks__/index.ts similarity index 92% rename from app/soapbox/__mocks__/api.ts rename to app/soapbox/api/__mocks__/index.ts index 060846c94..dd2f1ec93 100644 --- a/app/soapbox/__mocks__/api.ts +++ b/app/soapbox/api/__mocks__/index.ts @@ -4,7 +4,7 @@ import LinkHeader from 'http-link-header'; import type { AxiosInstance, AxiosResponse } from 'axios'; -const api = jest.requireActual('../api') as Record; +const api = jest.requireActual('../index') as Record; let mocks: Array = []; export const __stub = (func: (mock: MockAdapter) => void) => mocks.push(func); diff --git a/app/soapbox/api.ts b/app/soapbox/api/index.ts similarity index 77% rename from app/soapbox/api.ts rename to app/soapbox/api/index.ts index bdcaf53d8..fde4a1a24 100644 --- a/app/soapbox/api.ts +++ b/app/soapbox/api/index.ts @@ -16,11 +16,11 @@ import { getAccessToken, getAppToken, isURL, parseBaseURL } from 'soapbox/utils/ import type MockAdapter from 'axios-mock-adapter'; /** - Parse Link headers, mostly for pagination. - @see {@link https://www.npmjs.com/package/http-link-header} - @param {object} response - Axios response object - @returns {object} Link object - */ + Parse Link headers, mostly for pagination. + @see {@link https://www.npmjs.com/package/http-link-header} + @param {object} response - Axios response object + @returns {object} Link object + */ export const getLinks = (response: AxiosResponse): LinkHeader => { return new LinkHeader(response.headers?.link); }; @@ -50,11 +50,11 @@ const getAuthBaseURL = createSelector([ }); /** - * Base client for HTTP requests. - * @param {string} accessToken - * @param {string} baseURL - * @returns {object} Axios instance - */ + * Base client for HTTP requests. + * @param {string} accessToken + * @param {string} baseURL + * @returns {object} Axios instance + */ export const baseClient = (accessToken?: string | null, baseURL: string = ''): AxiosInstance => { return axios.create({ // When BACKEND_URL is set, always use it. @@ -68,22 +68,22 @@ export const baseClient = (accessToken?: string | null, baseURL: string = ''): A }; /** - * Dumb client for grabbing static files. - * It uses FE_SUBDIRECTORY and parses JSON if possible. - * No authorization is needed. - */ + * Dumb client for grabbing static files. + * It uses FE_SUBDIRECTORY and parses JSON if possible. + * No authorization is needed. + */ export const staticClient = axios.create({ baseURL: BuildConfig.FE_SUBDIRECTORY, transformResponse: [maybeParseJSON], }); /** - * Stateful API client. - * Uses credentials from the Redux store if available. - * @param {function} getState - Must return the Redux state - * @param {string} authType - Either 'user' or 'app' - * @returns {object} Axios instance - */ + * Stateful API client. + * Uses credentials from the Redux store if available. + * @param {function} getState - Must return the Redux state + * @param {string} authType - Either 'user' or 'app' + * @returns {object} Axios instance + */ export default (getState: () => RootState, authType: string = 'user'): AxiosInstance => { const state = getState(); const accessToken = getToken(state, authType); diff --git a/app/soapbox/jest/test-setup.ts b/app/soapbox/jest/test-setup.ts index 0052388b0..c2a226a48 100644 --- a/app/soapbox/jest/test-setup.ts +++ b/app/soapbox/jest/test-setup.ts @@ -1,6 +1,6 @@ 'use strict'; -import { __clear as clearApiMocks } from '../__mocks__/api'; +import { __clear as clearApiMocks } from '../api/__mocks__'; // API mocking jest.mock('soapbox/api'); From db5d0d64004fb67146f4485f97fe5261c5466ea9 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Tue, 15 Nov 2022 08:58:55 -0500 Subject: [PATCH 17/65] Move 'compareId' to comparators utils --- app/soapbox/__tests__/compare_id.test.ts | 2 +- app/soapbox/actions/notifications.ts | 2 +- .../features/admin/components/latest_accounts_panel.tsx | 2 +- app/soapbox/reducers/conversations.ts | 2 +- app/soapbox/{compare_id.ts => utils/comparators.ts} | 4 +++- 5 files changed, 7 insertions(+), 5 deletions(-) rename app/soapbox/{compare_id.ts => utils/comparators.ts} (86%) diff --git a/app/soapbox/__tests__/compare_id.test.ts b/app/soapbox/__tests__/compare_id.test.ts index 583b4a1eb..1afbe0da3 100644 --- a/app/soapbox/__tests__/compare_id.test.ts +++ b/app/soapbox/__tests__/compare_id.test.ts @@ -1,4 +1,4 @@ -import compareId from '../compare_id'; +import { compareId } from '../utils/comparators'; test('compareId', () => { expect(compareId('3', '3')).toBe(0); diff --git a/app/soapbox/actions/notifications.ts b/app/soapbox/actions/notifications.ts index 8ef0e5715..068e65dc4 100644 --- a/app/soapbox/actions/notifications.ts +++ b/app/soapbox/actions/notifications.ts @@ -3,9 +3,9 @@ import 'intl-pluralrules'; import { defineMessages } from 'react-intl'; import api, { getLinks } from 'soapbox/api'; -import compareId from 'soapbox/compare_id'; import { getFilters, regexFromFilters } from 'soapbox/selectors'; import { isLoggedIn } from 'soapbox/utils/auth'; +import { compareId } from 'soapbox/utils/comparators'; import { getFeatures, parseVersion, PLEROMA } from 'soapbox/utils/features'; import { unescapeHTML } from 'soapbox/utils/html'; import { EXCLUDE_TYPES, NOTIFICATION_TYPES } from 'soapbox/utils/notification'; diff --git a/app/soapbox/features/admin/components/latest_accounts_panel.tsx b/app/soapbox/features/admin/components/latest_accounts_panel.tsx index 07b3c3f9d..f8a9fc04f 100644 --- a/app/soapbox/features/admin/components/latest_accounts_panel.tsx +++ b/app/soapbox/features/admin/components/latest_accounts_panel.tsx @@ -4,10 +4,10 @@ import { defineMessages, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; import { fetchUsers } from 'soapbox/actions/admin'; -import compareId from 'soapbox/compare_id'; import { Widget } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account_container'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; +import { compareId } from 'soapbox/utils/comparators'; const messages = defineMessages({ title: { id: 'admin.latest_accounts_panel.title', defaultMessage: 'Latest Accounts' }, diff --git a/app/soapbox/reducers/conversations.ts b/app/soapbox/reducers/conversations.ts index 622d11a23..57c907448 100644 --- a/app/soapbox/reducers/conversations.ts +++ b/app/soapbox/reducers/conversations.ts @@ -9,7 +9,7 @@ import { CONVERSATIONS_UPDATE, CONVERSATIONS_READ, } from '../actions/conversations'; -import compareId from '../compare_id'; +import { compareId } from '../utils/comparators'; import type { AnyAction } from 'redux'; import type { APIEntity } from 'soapbox/types/entities'; diff --git a/app/soapbox/compare_id.ts b/app/soapbox/utils/comparators.ts similarity index 86% rename from app/soapbox/compare_id.ts rename to app/soapbox/utils/comparators.ts index b92a44cf1..14c3ba4df 100644 --- a/app/soapbox/compare_id.ts +++ b/app/soapbox/utils/comparators.ts @@ -9,7 +9,7 @@ * - `1`: id1 > id2 * - `-1`: id1 < id2 */ -export default function compareId(id1: string, id2: string) { +function compareId(id1: string, id2: string) { if (id1 === id2) { return 0; } @@ -19,3 +19,5 @@ export default function compareId(id1: string, id2: string) { return id1.length > id2.length ? 1 : -1; } } + +export { compareId }; \ No newline at end of file From e78242806f4e8e5ec8f7717372e9482698bb1949 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Tue, 15 Nov 2022 09:10:14 -0500 Subject: [PATCH 18/65] Rename files (0): _ -> - --- app/soapbox/actions/dropdown_menu.ts | 2 +- .../__tests__/avatar_overlay.test.tsx | 2 +- .../__tests__/emoji_selector.test.tsx | 2 +- ...{account_search.tsx => account-search.tsx} | 2 +- app/soapbox/components/attachment_list.tsx | 54 ------------------- ...nput.tsx => autosuggest-account-input.tsx} | 4 +- app/soapbox/components/autosuggest_input.tsx | 2 +- ...{avatar_overlay.tsx => avatar-overlay.tsx} | 0 ...{birthday_input.tsx => birthday-input.tsx} | 0 .../{column_header.js => column-header.js} | 0 .../{dropdown_menu.tsx => dropdown-menu.tsx} | 0 ...{emoji_selector.tsx => emoji-selector.tsx} | 0 ...{error_boundary.tsx => error-boundary.tsx} | 0 ...o_player.tsx => extended-video-player.tsx} | 0 ...awesome_icon.tsx => fork-awesome-icon.tsx} | 0 app/soapbox/components/icon.tsx | 2 +- app/soapbox/components/sidebar-navigation.tsx | 2 +- app/soapbox/components/status-action-bar.tsx | 2 +- .../containers/dropdown_menu_container.ts | 4 +- app/soapbox/containers/soapbox.tsx | 2 +- .../features/account/components/header.tsx | 2 +- .../components/moved_note.tsx | 2 +- .../components/registration_form.tsx | 2 +- .../chats/components/chat-message-list.tsx | 2 +- .../features/chats/components/chat-panes.tsx | 2 +- app/soapbox/features/chats/index.tsx | 2 +- .../features/compose/components/search.tsx | 2 +- app/soapbox/features/conversations/index.tsx | 2 +- .../features/direct_timeline/index.tsx | 4 +- app/soapbox/features/edit_profile/index.tsx | 2 +- .../features/ui/components/accordion.tsx | 2 +- .../features/ui/components/actions_modal.tsx | 2 +- .../features/ui/components/media-modal.tsx | 2 +- app/soapbox/reducers/dropdown_menu.ts | 2 +- 34 files changed, 28 insertions(+), 82 deletions(-) rename app/soapbox/components/{account_search.tsx => account-search.tsx} (99%) delete mode 100644 app/soapbox/components/attachment_list.tsx rename app/soapbox/components/{autosuggest_account_input.tsx => autosuggest-account-input.tsx} (96%) rename app/soapbox/components/{avatar_overlay.tsx => avatar-overlay.tsx} (100%) rename app/soapbox/components/{birthday_input.tsx => birthday-input.tsx} (100%) rename app/soapbox/components/{column_header.js => column-header.js} (100%) rename app/soapbox/components/{dropdown_menu.tsx => dropdown-menu.tsx} (100%) rename app/soapbox/components/{emoji_selector.tsx => emoji-selector.tsx} (100%) rename app/soapbox/components/{error_boundary.tsx => error-boundary.tsx} (100%) rename app/soapbox/components/{extended_video_player.tsx => extended-video-player.tsx} (100%) rename app/soapbox/components/{fork_awesome_icon.tsx => fork-awesome-icon.tsx} (100%) diff --git a/app/soapbox/actions/dropdown_menu.ts b/app/soapbox/actions/dropdown_menu.ts index 2c19735a1..0c6fc8536 100644 --- a/app/soapbox/actions/dropdown_menu.ts +++ b/app/soapbox/actions/dropdown_menu.ts @@ -1,4 +1,4 @@ -import type { DropdownPlacement } from 'soapbox/components/dropdown_menu'; +import type { DropdownPlacement } from 'soapbox/components/dropdown-menu'; const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN'; const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE'; diff --git a/app/soapbox/components/__tests__/avatar_overlay.test.tsx b/app/soapbox/components/__tests__/avatar_overlay.test.tsx index 105828556..4e83dd071 100644 --- a/app/soapbox/components/__tests__/avatar_overlay.test.tsx +++ b/app/soapbox/components/__tests__/avatar_overlay.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { normalizeAccount } from 'soapbox/normalizers'; import { render, screen } from '../../jest/test-helpers'; -import AvatarOverlay from '../avatar_overlay'; +import AvatarOverlay from '../avatar-overlay'; import type { ReducerAccount } from 'soapbox/reducers/accounts'; diff --git a/app/soapbox/components/__tests__/emoji_selector.test.tsx b/app/soapbox/components/__tests__/emoji_selector.test.tsx index c680d156e..b382a4b94 100644 --- a/app/soapbox/components/__tests__/emoji_selector.test.tsx +++ b/app/soapbox/components/__tests__/emoji_selector.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen } from '../../jest/test-helpers'; -import EmojiSelector from '../emoji_selector'; +import EmojiSelector from '../emoji-selector'; describe('', () => { it('renders correctly', () => { diff --git a/app/soapbox/components/account_search.tsx b/app/soapbox/components/account-search.tsx similarity index 99% rename from app/soapbox/components/account_search.tsx rename to app/soapbox/components/account-search.tsx index bf9652b66..883278bcf 100644 --- a/app/soapbox/components/account_search.tsx +++ b/app/soapbox/components/account-search.tsx @@ -2,7 +2,7 @@ import classNames from 'clsx'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import AutosuggestAccountInput from 'soapbox/components/autosuggest_account_input'; +import AutosuggestAccountInput from 'soapbox/components/autosuggest-account-input'; import Icon from 'soapbox/components/icon'; const messages = defineMessages({ diff --git a/app/soapbox/components/attachment_list.tsx b/app/soapbox/components/attachment_list.tsx deleted file mode 100644 index 94c496819..000000000 --- a/app/soapbox/components/attachment_list.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react'; - -import Icon from 'soapbox/components/icon'; - -import type { Attachment as AttachmentEntity } from 'soapbox/types/entities'; - -const filename = (url: string) => url.split('/').pop()!.split('#')[0].split('?')[0]; - -interface IAttachmentList { - media: AttachmentEntity[], - compact?: boolean, -} - -const AttachmentList: React.FC = ({ media, compact }) => { - if (compact) { - return ( - - ); - } - - return ( -
-
- -
- -
    - {media.map(attachment => { - const displayUrl = attachment.get('remote_url') || attachment.get('url'); - - return ( -
  • - {filename(displayUrl)} -
  • - ); - })} -
-
- ); -}; - -export default AttachmentList; diff --git a/app/soapbox/components/autosuggest_account_input.tsx b/app/soapbox/components/autosuggest-account-input.tsx similarity index 96% rename from app/soapbox/components/autosuggest_account_input.tsx rename to app/soapbox/components/autosuggest-account-input.tsx index e8cd63830..17c5f41cb 100644 --- a/app/soapbox/components/autosuggest_account_input.tsx +++ b/app/soapbox/components/autosuggest-account-input.tsx @@ -6,10 +6,10 @@ import { accountSearch } from 'soapbox/actions/accounts'; import AutosuggestInput, { AutoSuggestion } from 'soapbox/components/autosuggest_input'; import { useAppDispatch } from 'soapbox/hooks'; -import type { Menu } from 'soapbox/components/dropdown_menu'; +import type { Menu } from 'soapbox/components/dropdown-menu'; import type { InputThemes } from 'soapbox/components/ui/input/input'; -const noOp = () => {}; +const noOp = () => { }; interface IAutosuggestAccountInput { onChange: React.ChangeEventHandler, diff --git a/app/soapbox/components/autosuggest_input.tsx b/app/soapbox/components/autosuggest_input.tsx index eb51ae41f..9313e092f 100644 --- a/app/soapbox/components/autosuggest_input.tsx +++ b/app/soapbox/components/autosuggest_input.tsx @@ -10,7 +10,7 @@ import { Input } from 'soapbox/components/ui'; import AutosuggestAccount from 'soapbox/features/compose/components/autosuggest_account'; import { isRtl } from 'soapbox/rtl'; -import type { Menu, MenuItem } from 'soapbox/components/dropdown_menu'; +import type { Menu, MenuItem } from 'soapbox/components/dropdown-menu'; import type { InputThemes } from 'soapbox/components/ui/input/input'; type CursorMatch = [ diff --git a/app/soapbox/components/avatar_overlay.tsx b/app/soapbox/components/avatar-overlay.tsx similarity index 100% rename from app/soapbox/components/avatar_overlay.tsx rename to app/soapbox/components/avatar-overlay.tsx diff --git a/app/soapbox/components/birthday_input.tsx b/app/soapbox/components/birthday-input.tsx similarity index 100% rename from app/soapbox/components/birthday_input.tsx rename to app/soapbox/components/birthday-input.tsx diff --git a/app/soapbox/components/column_header.js b/app/soapbox/components/column-header.js similarity index 100% rename from app/soapbox/components/column_header.js rename to app/soapbox/components/column-header.js diff --git a/app/soapbox/components/dropdown_menu.tsx b/app/soapbox/components/dropdown-menu.tsx similarity index 100% rename from app/soapbox/components/dropdown_menu.tsx rename to app/soapbox/components/dropdown-menu.tsx diff --git a/app/soapbox/components/emoji_selector.tsx b/app/soapbox/components/emoji-selector.tsx similarity index 100% rename from app/soapbox/components/emoji_selector.tsx rename to app/soapbox/components/emoji-selector.tsx diff --git a/app/soapbox/components/error_boundary.tsx b/app/soapbox/components/error-boundary.tsx similarity index 100% rename from app/soapbox/components/error_boundary.tsx rename to app/soapbox/components/error-boundary.tsx diff --git a/app/soapbox/components/extended_video_player.tsx b/app/soapbox/components/extended-video-player.tsx similarity index 100% rename from app/soapbox/components/extended_video_player.tsx rename to app/soapbox/components/extended-video-player.tsx diff --git a/app/soapbox/components/fork_awesome_icon.tsx b/app/soapbox/components/fork-awesome-icon.tsx similarity index 100% rename from app/soapbox/components/fork_awesome_icon.tsx rename to app/soapbox/components/fork-awesome-icon.tsx diff --git a/app/soapbox/components/icon.tsx b/app/soapbox/components/icon.tsx index cba7b5805..93985d55a 100644 --- a/app/soapbox/components/icon.tsx +++ b/app/soapbox/components/icon.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import ForkAwesomeIcon, { IForkAwesomeIcon } from './fork_awesome_icon'; +import ForkAwesomeIcon, { IForkAwesomeIcon } from './fork-awesome-icon'; import SvgIcon, { ISvgIcon } from './svg_icon'; export type IIcon = IForkAwesomeIcon | ISvgIcon; diff --git a/app/soapbox/components/sidebar-navigation.tsx b/app/soapbox/components/sidebar-navigation.tsx index 4dd47efff..9ff0ad0f8 100644 --- a/app/soapbox/components/sidebar-navigation.tsx +++ b/app/soapbox/components/sidebar-navigation.tsx @@ -9,7 +9,7 @@ import { getFeatures } from 'soapbox/utils/features'; import SidebarNavigationLink from './sidebar-navigation-link'; -import type { Menu } from 'soapbox/components/dropdown_menu'; +import type { Menu } from 'soapbox/components/dropdown-menu'; const messages = defineMessages({ follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, diff --git a/app/soapbox/components/status-action-bar.tsx b/app/soapbox/components/status-action-bar.tsx index 9153cb256..6429050d9 100644 --- a/app/soapbox/components/status-action-bar.tsx +++ b/app/soapbox/components/status-action-bar.tsx @@ -21,7 +21,7 @@ import { useAppDispatch, useAppSelector, useFeatures, useOwnAccount, useSettings import { isLocal } from 'soapbox/utils/accounts'; import { getReactForStatus, reduceEmoji } from 'soapbox/utils/emoji_reacts'; -import type { Menu } from 'soapbox/components/dropdown_menu'; +import type { Menu } from 'soapbox/components/dropdown-menu'; import type { Account, Status } from 'soapbox/types/entities'; const messages = defineMessages({ diff --git a/app/soapbox/containers/dropdown_menu_container.ts b/app/soapbox/containers/dropdown_menu_container.ts index b047edfff..c5e0dc8cb 100644 --- a/app/soapbox/containers/dropdown_menu_container.ts +++ b/app/soapbox/containers/dropdown_menu_container.ts @@ -2,11 +2,11 @@ import { connect } from 'react-redux'; import { openDropdownMenu, closeDropdownMenu } from '../actions/dropdown_menu'; import { openModal, closeModal } from '../actions/modals'; -import DropdownMenu from '../components/dropdown_menu'; +import DropdownMenu from '../components/dropdown-menu'; import { isUserTouching } from '../is_mobile'; import type { Dispatch } from 'redux'; -import type { DropdownPlacement, IDropdown } from 'soapbox/components/dropdown_menu'; +import type { DropdownPlacement, IDropdown } from 'soapbox/components/dropdown-menu'; import type { RootState } from 'soapbox/store'; const mapStateToProps = (state: RootState) => ({ diff --git a/app/soapbox/containers/soapbox.tsx b/app/soapbox/containers/soapbox.tsx index 2841ec3ca..6249fe44a 100644 --- a/app/soapbox/containers/soapbox.tsx +++ b/app/soapbox/containers/soapbox.tsx @@ -45,7 +45,7 @@ import { generateThemeCss } from 'soapbox/utils/theme'; import { checkOnboardingStatus } from '../actions/onboarding'; import { preload } from '../actions/preload'; -import ErrorBoundary from '../components/error_boundary'; +import ErrorBoundary from '../components/error-boundary'; import UI from '../features/ui'; import { store } from '../store'; diff --git a/app/soapbox/features/account/components/header.tsx b/app/soapbox/features/account/components/header.tsx index 21e44f33b..fdb12611f 100644 --- a/app/soapbox/features/account/components/header.tsx +++ b/app/soapbox/features/account/components/header.tsx @@ -27,7 +27,7 @@ import { normalizeAttachment } from 'soapbox/normalizers'; import { Account } from 'soapbox/types/entities'; import { isRemote } from 'soapbox/utils/accounts'; -import type { Menu as MenuType } from 'soapbox/components/dropdown_menu'; +import type { Menu as MenuType } from 'soapbox/components/dropdown-menu'; const messages = defineMessages({ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, diff --git a/app/soapbox/features/account_timeline/components/moved_note.tsx b/app/soapbox/features/account_timeline/components/moved_note.tsx index 0ba6d8da5..19a9249f1 100644 --- a/app/soapbox/features/account_timeline/components/moved_note.tsx +++ b/app/soapbox/features/account_timeline/components/moved_note.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import { NavLink } from 'react-router-dom'; -import AvatarOverlay from 'soapbox/components/avatar_overlay'; +import AvatarOverlay from 'soapbox/components/avatar-overlay'; import DisplayName from 'soapbox/components/display-name'; import Icon from 'soapbox/components/icon'; diff --git a/app/soapbox/features/auth_login/components/registration_form.tsx b/app/soapbox/features/auth_login/components/registration_form.tsx index bdf4bc05d..fa5ad524c 100644 --- a/app/soapbox/features/auth_login/components/registration_form.tsx +++ b/app/soapbox/features/auth_login/components/registration_form.tsx @@ -9,7 +9,7 @@ import { v4 as uuidv4 } from 'uuid'; import { accountLookup } from 'soapbox/actions/accounts'; import { register, verifyCredentials } from 'soapbox/actions/auth'; import { openModal } from 'soapbox/actions/modals'; -import BirthdayInput from 'soapbox/components/birthday_input'; +import BirthdayInput from 'soapbox/components/birthday-input'; import { Checkbox, Form, FormGroup, FormActions, Button, Input, Textarea } from 'soapbox/components/ui'; import CaptchaField from 'soapbox/features/auth_login/components/captcha'; import { useAppSelector, useAppDispatch, useSettings, useFeatures } from 'soapbox/hooks'; diff --git a/app/soapbox/features/chats/components/chat-message-list.tsx b/app/soapbox/features/chats/components/chat-message-list.tsx index 9303f2b33..c1d6362ed 100644 --- a/app/soapbox/features/chats/components/chat-message-list.tsx +++ b/app/soapbox/features/chats/components/chat-message-list.tsx @@ -21,7 +21,7 @@ import { MediaGallery } from 'soapbox/features/ui/util/async-components'; import { useAppSelector, useAppDispatch, useRefEventHandler } from 'soapbox/hooks'; import { onlyEmoji } from 'soapbox/utils/rich_content'; -import type { Menu } from 'soapbox/components/dropdown_menu'; +import type { Menu } from 'soapbox/components/dropdown-menu'; import type { ChatMessage as ChatMessageEntity } from 'soapbox/types/entities'; const BIG_EMOJI_LIMIT = 1; diff --git a/app/soapbox/features/chats/components/chat-panes.tsx b/app/soapbox/features/chats/components/chat-panes.tsx index 6ed873139..0aab9734f 100644 --- a/app/soapbox/features/chats/components/chat-panes.tsx +++ b/app/soapbox/features/chats/components/chat-panes.tsx @@ -6,7 +6,7 @@ import { createSelector } from 'reselect'; import { openChat, launchChat, toggleMainWindow } from 'soapbox/actions/chats'; import { getSettings } from 'soapbox/actions/settings'; -import AccountSearch from 'soapbox/components/account_search'; +import AccountSearch from 'soapbox/components/account-search'; import { Counter } from 'soapbox/components/ui'; import AudioToggle from 'soapbox/features/chats/components/audio-toggle'; import { useAppDispatch, useAppSelector, useSettings } from 'soapbox/hooks'; diff --git a/app/soapbox/features/chats/index.tsx b/app/soapbox/features/chats/index.tsx index 5635cbdc8..b3d0a2cff 100644 --- a/app/soapbox/features/chats/index.tsx +++ b/app/soapbox/features/chats/index.tsx @@ -4,7 +4,7 @@ import { useDispatch } from 'react-redux'; import { useHistory } from 'react-router-dom'; import { launchChat } from 'soapbox/actions/chats'; -import AccountSearch from 'soapbox/components/account_search'; +import AccountSearch from 'soapbox/components/account-search'; import AudioToggle from 'soapbox/features/chats/components/audio-toggle'; import { Column } from '../../components/ui'; diff --git a/app/soapbox/features/compose/components/search.tsx b/app/soapbox/features/compose/components/search.tsx index 818080f2f..a5f310655 100644 --- a/app/soapbox/features/compose/components/search.tsx +++ b/app/soapbox/features/compose/components/search.tsx @@ -14,7 +14,7 @@ import { showSearch, submitSearch, } from 'soapbox/actions/search'; -import AutosuggestAccountInput from 'soapbox/components/autosuggest_account_input'; +import AutosuggestAccountInput from 'soapbox/components/autosuggest-account-input'; import { Input } from 'soapbox/components/ui'; import SvgIcon from 'soapbox/components/ui/icon/svg-icon'; import { useAppSelector } from 'soapbox/hooks'; diff --git a/app/soapbox/features/conversations/index.tsx b/app/soapbox/features/conversations/index.tsx index 8e81ac1c5..0faf2237f 100644 --- a/app/soapbox/features/conversations/index.tsx +++ b/app/soapbox/features/conversations/index.tsx @@ -4,7 +4,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { directComposeById } from 'soapbox/actions/compose'; import { mountConversations, unmountConversations, expandConversations } from 'soapbox/actions/conversations'; import { connectDirectStream } from 'soapbox/actions/streaming'; -import AccountSearch from 'soapbox/components/account_search'; +import AccountSearch from 'soapbox/components/account-search'; import { Column } from 'soapbox/components/ui'; import { useAppDispatch } from 'soapbox/hooks'; diff --git a/app/soapbox/features/direct_timeline/index.tsx b/app/soapbox/features/direct_timeline/index.tsx index 9da60dd9f..885c617db 100644 --- a/app/soapbox/features/direct_timeline/index.tsx +++ b/app/soapbox/features/direct_timeline/index.tsx @@ -4,8 +4,8 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { directComposeById } from 'soapbox/actions/compose'; import { connectDirectStream } from 'soapbox/actions/streaming'; import { expandDirectTimeline } from 'soapbox/actions/timelines'; -import AccountSearch from 'soapbox/components/account_search'; -import ColumnHeader from 'soapbox/components/column_header'; +import AccountSearch from 'soapbox/components/account-search'; +import ColumnHeader from 'soapbox/components/column-header'; import { Column } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; diff --git a/app/soapbox/features/edit_profile/index.tsx b/app/soapbox/features/edit_profile/index.tsx index c60298a7b..de7d6ee2d 100644 --- a/app/soapbox/features/edit_profile/index.tsx +++ b/app/soapbox/features/edit_profile/index.tsx @@ -4,7 +4,7 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import { updateNotificationSettings } from 'soapbox/actions/accounts'; import { patchMe } from 'soapbox/actions/me'; import snackbar from 'soapbox/actions/snackbar'; -import BirthdayInput from 'soapbox/components/birthday_input'; +import BirthdayInput from 'soapbox/components/birthday-input'; import List, { ListItem } from 'soapbox/components/list'; import { Button, diff --git a/app/soapbox/features/ui/components/accordion.tsx b/app/soapbox/features/ui/components/accordion.tsx index f425e5321..6c07aa25b 100644 --- a/app/soapbox/features/ui/components/accordion.tsx +++ b/app/soapbox/features/ui/components/accordion.tsx @@ -5,7 +5,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { Text } from 'soapbox/components/ui'; import DropdownMenu from 'soapbox/containers/dropdown_menu_container'; -import type { Menu } from 'soapbox/components/dropdown_menu'; +import type { Menu } from 'soapbox/components/dropdown-menu'; const messages = defineMessages({ collapse: { id: 'accordion.collapse', defaultMessage: 'Collapse' }, diff --git a/app/soapbox/features/ui/components/actions_modal.tsx b/app/soapbox/features/ui/components/actions_modal.tsx index cc00126f6..67e29933f 100644 --- a/app/soapbox/features/ui/components/actions_modal.tsx +++ b/app/soapbox/features/ui/components/actions_modal.tsx @@ -10,7 +10,7 @@ import AccountContainer from 'soapbox/containers/account_container'; import Motion from '../util/optional_motion'; -import type { Menu, MenuItem } from 'soapbox/components/dropdown_menu'; +import type { Menu, MenuItem } from 'soapbox/components/dropdown-menu'; import type { Status as StatusEntity } from 'soapbox/types/entities'; interface IActionsModal { diff --git a/app/soapbox/features/ui/components/media-modal.tsx b/app/soapbox/features/ui/components/media-modal.tsx index 1a432de3b..c5530ec47 100644 --- a/app/soapbox/features/ui/components/media-modal.tsx +++ b/app/soapbox/features/ui/components/media-modal.tsx @@ -4,7 +4,7 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import { useHistory } from 'react-router-dom'; import ReactSwipeableViews from 'react-swipeable-views'; -import ExtendedVideoPlayer from 'soapbox/components/extended_video_player'; +import ExtendedVideoPlayer from 'soapbox/components/extended-video-player'; import Icon from 'soapbox/components/icon'; import IconButton from 'soapbox/components/icon_button'; import Audio from 'soapbox/features/audio'; diff --git a/app/soapbox/reducers/dropdown_menu.ts b/app/soapbox/reducers/dropdown_menu.ts index 2b5c50252..64bc316b9 100644 --- a/app/soapbox/reducers/dropdown_menu.ts +++ b/app/soapbox/reducers/dropdown_menu.ts @@ -6,7 +6,7 @@ import { } from '../actions/dropdown_menu'; import type { AnyAction } from 'redux'; -import type { DropdownPlacement } from 'soapbox/components/dropdown_menu'; +import type { DropdownPlacement } from 'soapbox/components/dropdown-menu'; const ReducerRecord = ImmutableRecord({ openId: null as number | null, From c95423c7e7dd2305bc0e25dbe733f0a26242a1af Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Tue, 15 Nov 2022 09:11:30 -0500 Subject: [PATCH 19/65] Rename files (1): _ -> - --- app/soapbox/components/birthday-input.tsx | 2 +- app/soapbox/components/domain.tsx | 2 +- app/soapbox/components/{icon_button.js => icon-button.js} | 0 app/soapbox/features/admin/components/unapproved_account.tsx | 2 +- app/soapbox/features/aliases/components/account.tsx | 2 +- app/soapbox/features/chats/components/chat-box.tsx | 2 +- app/soapbox/features/chats/components/chat-window.tsx | 2 +- app/soapbox/features/compose/components/schedule_form.tsx | 2 +- app/soapbox/features/compose/components/search_results.tsx | 2 +- app/soapbox/features/compose/components/upload.tsx | 2 +- .../features/follow_requests/components/account_authorize.tsx | 2 +- app/soapbox/features/list_adder/components/list.tsx | 2 +- app/soapbox/features/list_editor/components/account.tsx | 2 +- app/soapbox/features/remote_timeline/index.tsx | 2 +- app/soapbox/features/reply_mentions/account.tsx | 2 +- .../components/scheduled_status_action_bar.tsx | 2 +- app/soapbox/features/ui/components/bundle_modal_error.tsx | 2 +- app/soapbox/features/ui/components/media-modal.tsx | 2 +- 18 files changed, 17 insertions(+), 17 deletions(-) rename app/soapbox/components/{icon_button.js => icon-button.js} (100%) diff --git a/app/soapbox/components/birthday-input.tsx b/app/soapbox/components/birthday-input.tsx index fc9521ca0..bd38666cf 100644 --- a/app/soapbox/components/birthday-input.tsx +++ b/app/soapbox/components/birthday-input.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container'; import { DatePicker } from 'soapbox/features/ui/util/async-components'; import { useAppSelector, useFeatures } from 'soapbox/hooks'; diff --git a/app/soapbox/components/domain.tsx b/app/soapbox/components/domain.tsx index 22c8272de..646c37205 100644 --- a/app/soapbox/components/domain.tsx +++ b/app/soapbox/components/domain.tsx @@ -4,7 +4,7 @@ import { useDispatch } from 'react-redux'; import { unblockDomain } from 'soapbox/actions/domain_blocks'; -import IconButton from './icon_button'; +import IconButton from './icon-button'; const messages = defineMessages({ blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' }, diff --git a/app/soapbox/components/icon_button.js b/app/soapbox/components/icon-button.js similarity index 100% rename from app/soapbox/components/icon_button.js rename to app/soapbox/components/icon-button.js diff --git a/app/soapbox/features/admin/components/unapproved_account.tsx b/app/soapbox/features/admin/components/unapproved_account.tsx index a01421643..c1dae46fb 100644 --- a/app/soapbox/features/admin/components/unapproved_account.tsx +++ b/app/soapbox/features/admin/components/unapproved_account.tsx @@ -4,7 +4,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { approveUsers } from 'soapbox/actions/admin'; import { rejectUserModal } from 'soapbox/actions/moderation'; import snackbar from 'soapbox/actions/snackbar'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { useAppSelector, useAppDispatch } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; diff --git a/app/soapbox/features/aliases/components/account.tsx b/app/soapbox/features/aliases/components/account.tsx index 802d3e0f6..f76431ba8 100644 --- a/app/soapbox/features/aliases/components/account.tsx +++ b/app/soapbox/features/aliases/components/account.tsx @@ -4,7 +4,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { addToAliases } from 'soapbox/actions/aliases'; import Avatar from 'soapbox/components/avatar'; import DisplayName from 'soapbox/components/display-name'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; import { getFeatures } from 'soapbox/utils/features'; diff --git a/app/soapbox/features/chats/components/chat-box.tsx b/app/soapbox/features/chats/components/chat-box.tsx index 66371bc8d..9a96a0d00 100644 --- a/app/soapbox/features/chats/components/chat-box.tsx +++ b/app/soapbox/features/chats/components/chat-box.tsx @@ -7,7 +7,7 @@ import { markChatRead, } from 'soapbox/actions/chats'; import { uploadMedia } from 'soapbox/actions/media'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import UploadProgress from 'soapbox/components/upload-progress'; import UploadButton from 'soapbox/features/compose/components/upload_button'; import { useAppSelector, useAppDispatch } from 'soapbox/hooks'; diff --git a/app/soapbox/features/chats/components/chat-window.tsx b/app/soapbox/features/chats/components/chat-window.tsx index 8b30d3ba8..13ba3ed39 100644 --- a/app/soapbox/features/chats/components/chat-window.tsx +++ b/app/soapbox/features/chats/components/chat-window.tsx @@ -7,7 +7,7 @@ import { } from 'soapbox/actions/chats'; import Avatar from 'soapbox/components/avatar'; import HoverRefWrapper from 'soapbox/components/hover_ref_wrapper'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { HStack, Counter } from 'soapbox/components/ui'; import { useAppSelector, useAppDispatch } from 'soapbox/hooks'; import { makeGetChat } from 'soapbox/selectors'; diff --git a/app/soapbox/features/compose/components/schedule_form.tsx b/app/soapbox/features/compose/components/schedule_form.tsx index b619188e6..d08e3d252 100644 --- a/app/soapbox/features/compose/components/schedule_form.tsx +++ b/app/soapbox/features/compose/components/schedule_form.tsx @@ -5,7 +5,7 @@ import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { setSchedule, removeSchedule } from 'soapbox/actions/compose'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { HStack, Stack, Text } from 'soapbox/components/ui'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container'; import { DatePicker } from 'soapbox/features/ui/util/async-components'; diff --git a/app/soapbox/features/compose/components/search_results.tsx b/app/soapbox/features/compose/components/search_results.tsx index 8f8fa5938..de8b3807b 100644 --- a/app/soapbox/features/compose/components/search_results.tsx +++ b/app/soapbox/features/compose/components/search_results.tsx @@ -5,7 +5,7 @@ import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { expandSearch, setFilter, setSearchAccount } from 'soapbox/actions/search'; import { fetchTrendingStatuses } from 'soapbox/actions/trending_statuses'; import Hashtag from 'soapbox/components/hashtag'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import ScrollableList from 'soapbox/components/scrollable_list'; import { HStack, Tabs, Text } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account_container'; diff --git a/app/soapbox/features/compose/components/upload.tsx b/app/soapbox/features/compose/components/upload.tsx index fdef1f899..f2f199d6e 100644 --- a/app/soapbox/features/compose/components/upload.tsx +++ b/app/soapbox/features/compose/components/upload.tsx @@ -9,7 +9,7 @@ import { undoUploadCompose, changeUploadCompose, submitCompose } from 'soapbox/a import { openModal } from 'soapbox/actions/modals'; import Blurhash from 'soapbox/components/blurhash'; import Icon from 'soapbox/components/icon'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { useAppDispatch, useAppSelector, useCompose } from 'soapbox/hooks'; import Motion from '../../ui/util/optional_motion'; diff --git a/app/soapbox/features/follow_requests/components/account_authorize.tsx b/app/soapbox/features/follow_requests/components/account_authorize.tsx index 0c8e8a561..430a0d49f 100644 --- a/app/soapbox/features/follow_requests/components/account_authorize.tsx +++ b/app/soapbox/features/follow_requests/components/account_authorize.tsx @@ -6,7 +6,7 @@ import { Link } from 'react-router-dom'; import { authorizeFollowRequest, rejectFollowRequest } from 'soapbox/actions/accounts'; import Avatar from 'soapbox/components/avatar'; import DisplayName from 'soapbox/components/display-name'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { Text } from 'soapbox/components/ui'; import { useAppSelector } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; diff --git a/app/soapbox/features/list_adder/components/list.tsx b/app/soapbox/features/list_adder/components/list.tsx index c9358c98e..f1fb3ee40 100644 --- a/app/soapbox/features/list_adder/components/list.tsx +++ b/app/soapbox/features/list_adder/components/list.tsx @@ -3,7 +3,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { removeFromListAdder, addToListAdder } from 'soapbox/actions/lists'; import Icon from 'soapbox/components/icon'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ diff --git a/app/soapbox/features/list_editor/components/account.tsx b/app/soapbox/features/list_editor/components/account.tsx index ef1b2e246..b6c04a9e6 100644 --- a/app/soapbox/features/list_editor/components/account.tsx +++ b/app/soapbox/features/list_editor/components/account.tsx @@ -3,7 +3,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { removeFromListEditor, addToListEditor } from 'soapbox/actions/lists'; import DisplayName from 'soapbox/components/display-name'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { Avatar } from 'soapbox/components/ui'; import { useAppSelector, useAppDispatch } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; diff --git a/app/soapbox/features/remote_timeline/index.tsx b/app/soapbox/features/remote_timeline/index.tsx index 00e2effe2..a3f8d2c68 100644 --- a/app/soapbox/features/remote_timeline/index.tsx +++ b/app/soapbox/features/remote_timeline/index.tsx @@ -4,7 +4,7 @@ import { useHistory } from 'react-router-dom'; import { connectRemoteStream } from 'soapbox/actions/streaming'; import { expandRemoteTimeline } from 'soapbox/actions/timelines'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { HStack, Text } from 'soapbox/components/ui'; import Column from 'soapbox/features/ui/components/column'; import { useAppDispatch, useSettings } from 'soapbox/hooks'; diff --git a/app/soapbox/features/reply_mentions/account.tsx b/app/soapbox/features/reply_mentions/account.tsx index 87ba71278..53dc4e02c 100644 --- a/app/soapbox/features/reply_mentions/account.tsx +++ b/app/soapbox/features/reply_mentions/account.tsx @@ -5,7 +5,7 @@ import { fetchAccount } from 'soapbox/actions/accounts'; import { addToMentions, removeFromMentions } from 'soapbox/actions/compose'; import Avatar from 'soapbox/components/avatar'; import DisplayName from 'soapbox/components/display-name'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { useAppDispatch, useAppSelector, useCompose } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; diff --git a/app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx b/app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx index dd73b8945..d22a90bf3 100644 --- a/app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx +++ b/app/soapbox/features/scheduled_statuses/components/scheduled_status_action_bar.tsx @@ -4,7 +4,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { openModal } from 'soapbox/actions/modals'; import { cancelScheduledStatus } from 'soapbox/actions/scheduled_statuses'; import { getSettings } from 'soapbox/actions/settings'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import { HStack } from 'soapbox/components/ui'; import { useAppDispatch } from 'soapbox/hooks'; diff --git a/app/soapbox/features/ui/components/bundle_modal_error.tsx b/app/soapbox/features/ui/components/bundle_modal_error.tsx index 2945c442b..21e140d5b 100644 --- a/app/soapbox/features/ui/components/bundle_modal_error.tsx +++ b/app/soapbox/features/ui/components/bundle_modal_error.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; const messages = defineMessages({ error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this page.' }, diff --git a/app/soapbox/features/ui/components/media-modal.tsx b/app/soapbox/features/ui/components/media-modal.tsx index c5530ec47..be80a27e4 100644 --- a/app/soapbox/features/ui/components/media-modal.tsx +++ b/app/soapbox/features/ui/components/media-modal.tsx @@ -6,7 +6,7 @@ import ReactSwipeableViews from 'react-swipeable-views'; import ExtendedVideoPlayer from 'soapbox/components/extended-video-player'; import Icon from 'soapbox/components/icon'; -import IconButton from 'soapbox/components/icon_button'; +import IconButton from 'soapbox/components/icon-button'; import Audio from 'soapbox/features/audio'; import Video from 'soapbox/features/video'; From 770794dcd705523df557d67b2f289c450ebb323f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 15 Nov 2022 09:38:23 -0600 Subject: [PATCH 20/65] Patch emoji parsing from upstream https://github.com/mastodon/mastodon/pull/20640 https://github.com/mastodon/mastodon/pull/20677 --- .../features/emoji/__tests__/emoji.test.ts | 46 ++++---- app/soapbox/features/emoji/emoji.js | 102 +++++++++++------- 2 files changed, 89 insertions(+), 59 deletions(-) diff --git a/app/soapbox/features/emoji/__tests__/emoji.test.ts b/app/soapbox/features/emoji/__tests__/emoji.test.ts index f1374e8c1..83b6ef14d 100644 --- a/app/soapbox/features/emoji/__tests__/emoji.test.ts +++ b/app/soapbox/features/emoji/__tests__/emoji.test.ts @@ -11,8 +11,8 @@ describe('emoji', () => { }); it('works with unclosed tags', () => { - expect(emojify('hello>')).toEqual('hello>'); - expect(emojify('')).toEqual('hello>'); + expect(emojify(' { @@ -22,23 +22,23 @@ describe('emoji', () => { it('does unicode', () => { expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual( - '👩‍👩‍👦‍👦'); + '👩‍👩‍👦‍👦'); expect(emojify('👨‍👩‍👧‍👧')).toEqual( - '👨‍👩‍👧‍👧'); - expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); + '👨‍👩‍👧‍👧'); + expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); expect(emojify('\u2757')).toEqual( - '❗'); + '❗'); }); it('does multiple unicode', () => { expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual( - '❗ #️⃣'); + '❗ #️⃣'); expect(emojify('\u2757#\uFE0F\u20E3')).toEqual( - '❗#️⃣'); + '❗#️⃣'); expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual( - '❗ #️⃣ ❗'); + '❗ #️⃣ ❗'); expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual( - 'foo ❗ #️⃣ bar'); + 'foo ❗ #️⃣ bar'); }); it('ignores unicode inside of tags', () => { @@ -46,16 +46,16 @@ describe('emoji', () => { }); it('does multiple emoji properly (issue 5188)', () => { - expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); - expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); + expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); + expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); }); it('does an emoji that has no shortcode', () => { - expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); + expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); }); it('does an emoji whose filename is irregular', () => { - expect(emojify('↙️')).toEqual('↙️'); + expect(emojify('↙️')).toEqual('↙️'); }); it('avoid emojifying on invisible text', () => { @@ -67,16 +67,26 @@ describe('emoji', () => { it('avoid emojifying on invisible text with nested tags', () => { expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); expect(emojify('😇')) - .toEqual('😇'); + .toEqual('😇'); }); it('skips the textual presentation VS15 character', () => { expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15 - .toEqual('✴'); + .toEqual('✴'); + }); + + it('does an simple emoji properly', () => { + expect(emojify('♀♂')) + .toEqual('♀♂'); + }); + + it('does an emoji containing ZWJ properly', () => { + expect(emojify('💂‍♀️💂‍♂️')) + .toEqual('💂\u200D♀️💂\u200D♂️'); }); }); }); diff --git a/app/soapbox/features/emoji/emoji.js b/app/soapbox/features/emoji/emoji.js index 0ce74c4de..81d9b9f60 100644 --- a/app/soapbox/features/emoji/emoji.js +++ b/app/soapbox/features/emoji/emoji.js @@ -6,60 +6,44 @@ import unicodeMapping from './emoji_unicode_mapping_light'; const trie = new Trie(Object.keys(unicodeMapping)); -const emojify = (str, customEmojis = {}, autoplay = false) => { - const tagCharsWithoutEmojis = '<&'; - const tagCharsWithEmojis = Object.keys(customEmojis).length ? '<&:' : '<&'; - let rtn = '', tagChars = tagCharsWithEmojis, invisible = 0; +const domParser = new DOMParser(); + +const emojifyTextNode = (node, customEmojis, autoPlayGif = false) => { + let str = node.textContent; + + const fragment = new DocumentFragment(); + for (;;) { - let match, i = 0, tag; - while (i < str.length && (tag = tagChars.indexOf(str[i])) === -1 && (invisible || !(match = trie.search(str.slice(i))))) { - i += str.codePointAt(i) < 65536 ? 1 : 2; + let match, i = 0; + + if (customEmojis === null) { + while (i < str.length && !(match = trie.search(str.slice(i)))) { + i += str.codePointAt(i) < 65536 ? 1 : 2; + } + } else { + while (i < str.length && str[i] !== ':' && !(match = trie.search(str.slice(i)))) { + i += str.codePointAt(i) < 65536 ? 1 : 2; + } } + let rend, replacement = ''; if (i === str.length) { break; } else if (str[i] === ':') { - // FIXME: This is insane. - /* eslint-disable no-loop-func */ + // eslint-disable-next-line no-loop-func if (!(() => { rend = str.indexOf(':', i + 1) + 1; if (!rend) return false; // no pair of ':' - const lt = str.indexOf('<', i + 1); - if (!(lt === -1 || lt >= rend)) return false; // tag appeared before closing ':' const shortname = str.slice(i, rend); // now got a replacee as ':shortname:' // if you want additional emoji handler, add statements below which set replacement and return true. if (shortname in customEmojis) { - const filename = autoplay ? customEmojis[shortname].url : customEmojis[shortname].static_url; - replacement = `${shortname}`; + const filename = autoPlayGif ? customEmojis[shortname].url : customEmojis[shortname].static_url; + replacement = `${shortname}`; return true; } return false; })()) rend = ++i; - /* eslint-enable no-loop-func */ - } else if (tag >= 0) { // <, & - rend = str.indexOf('>;'[tag], i + 1) + 1; - if (!rend) { - break; - } - if (tag === 0) { - if (invisible) { - if (str[i + 1] === '/') { // closing tag - if (!--invisible) { - tagChars = tagCharsWithEmojis; - } - } else if (str[rend - 2] !== '/') { // opening tag - invisible++; - } - } else { - if (str.startsWith('