From b15a1f09515b78cd95fc7ff9e526c282dc0ba47a Mon Sep 17 00:00:00 2001 From: Dank Gabs Date: Tue, 9 Jul 2019 14:25:11 -0400 Subject: [PATCH 01/31] Removing the username from the mention button. Gab has some very long usernames which will break the button. --- .../gabsocial/features/account/components/header.js | 4 ++-- app/javascript/gabsocial/locales/ar.json | 2 +- app/javascript/gabsocial/locales/ast.json | 2 +- app/javascript/gabsocial/locales/bn.json | 2 +- app/javascript/gabsocial/locales/ca.json | 2 +- app/javascript/gabsocial/locales/co.json | 2 +- app/javascript/gabsocial/locales/cs.json | 2 +- app/javascript/gabsocial/locales/cy.json | 2 +- app/javascript/gabsocial/locales/da.json | 2 +- app/javascript/gabsocial/locales/de.json | 2 +- app/javascript/gabsocial/locales/el.json | 2 +- app/javascript/gabsocial/locales/en.json | 2 +- app/javascript/gabsocial/locales/eo.json | 2 +- app/javascript/gabsocial/locales/es.json | 2 +- app/javascript/gabsocial/locales/eu.json | 2 +- app/javascript/gabsocial/locales/fa.json | 2 +- app/javascript/gabsocial/locales/fi.json | 2 +- app/javascript/gabsocial/locales/fr.json | 2 +- app/javascript/gabsocial/locales/gl.json | 2 +- app/javascript/gabsocial/locales/he.json | 2 +- app/javascript/gabsocial/locales/hi.json | 2 +- app/javascript/gabsocial/locales/hr.json | 2 +- app/javascript/gabsocial/locales/hu.json | 2 +- app/javascript/gabsocial/locales/hy.json | 2 +- app/javascript/gabsocial/locales/id.json | 2 +- app/javascript/gabsocial/locales/io.json | 2 +- app/javascript/gabsocial/locales/it.json | 2 +- app/javascript/gabsocial/locales/ja.json | 2 +- app/javascript/gabsocial/locales/ka.json | 2 +- app/javascript/gabsocial/locales/kk.json | 2 +- app/javascript/gabsocial/locales/ko.json | 2 +- app/javascript/gabsocial/locales/lv.json | 2 +- app/javascript/gabsocial/locales/ms.json | 2 +- app/javascript/gabsocial/locales/nl.json | 2 +- app/javascript/gabsocial/locales/oc.json | 2 +- app/javascript/gabsocial/locales/pl.json | 2 +- app/javascript/gabsocial/locales/te.json | 2 +- app/javascript/gabsocial/locales/th.json | 2 +- app/javascript/gabsocial/locales/tr.json | 2 +- app/javascript/gabsocial/locales/uk.json | 2 +- app/javascript/gabsocial/locales/zh-CN.json | 2 +- app/javascript/gabsocial/locales/zh-HK.json | 2 +- app/javascript/gabsocial/locales/zh-TW.json | 2 +- 43 files changed, 44 insertions(+), 44 deletions(-) diff --git a/app/javascript/gabsocial/features/account/components/header.js b/app/javascript/gabsocial/features/account/components/header.js index 9affdb9f..4bc88f2a 100644 --- a/app/javascript/gabsocial/features/account/components/header.js +++ b/app/javascript/gabsocial/features/account/components/header.js @@ -24,7 +24,7 @@ const messages = defineMessages({ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' }, account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' }, - mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, + mention: { id: 'account.mention', defaultMessage: 'Mention' }, unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, block: { id: 'account.block', defaultMessage: 'Block @{name}' }, mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, @@ -311,7 +311,7 @@ class Header extends ImmutablePureComponent { {actionBtn} {account.get('id') !== me && diff --git a/app/javascript/gabsocial/locales/ar.json b/app/javascript/gabsocial/locales/ar.json index 738bb3ec..76b6126a 100644 --- a/app/javascript/gabsocial/locales/ar.json +++ b/app/javascript/gabsocial/locales/ar.json @@ -18,7 +18,7 @@ "account.link_verified_on": "تم التحقق مِن مِلْكية هذا الرابط بتاريخ {date}", "account.locked_info": "تم تأمين خصوصية هذا الحساب عبر قفل. صاحب الحساب يُراجِع يدويا طلبات المتابَعة و الاشتراك بحسابه.", "account.media": "وسائط", - "account.mention": "أُذكُر/ي @{name}", + "account.mention": "أُذكُر/ي", "account.moved_to": "{name} إنتقل إلى :", "account.mute": "كتم @{name}", "account.mute_notifications": "كتم الإخطارات من @{name}", diff --git a/app/javascript/gabsocial/locales/ast.json b/app/javascript/gabsocial/locales/ast.json index 44b664cf..cf9d67b9 100644 --- a/app/javascript/gabsocial/locales/ast.json +++ b/app/javascript/gabsocial/locales/ast.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mentar a @{name}", + "account.mention": "Mentar", "account.moved_to": "{name} has moved to:", "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/bn.json b/app/javascript/gabsocial/locales/bn.json index a72e4e59..9436093e 100644 --- a/app/javascript/gabsocial/locales/bn.json +++ b/app/javascript/gabsocial/locales/bn.json @@ -18,7 +18,7 @@ "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিকে", "account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।", "account.media": "ছবি বা ভিডিও", - "account.mention": "@{name} কে উল্লেখ করুন", + "account.mention": "কে উল্লেখ করুন", "account.moved_to": "{name} চলে গেছে এখানে:", "account.mute": "@{name}র কার্যক্রম সরিয়ে ফেলুন", "account.mute_notifications": "@{name}র প্রজ্ঞাপন আপনার কাছ থেকে সরিয়ে ফেলুন", diff --git a/app/javascript/gabsocial/locales/ca.json b/app/javascript/gabsocial/locales/ca.json index 66fbd4ee..74a37559 100644 --- a/app/javascript/gabsocial/locales/ca.json +++ b/app/javascript/gabsocial/locales/ca.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}", "account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.", "account.media": "Mèdia", - "account.mention": "Esmentar @{name}", + "account.mention": "Esmentar", "account.moved_to": "{name} s'ha mogut a:", "account.mute": "Silencia @{name}", "account.mute_notifications": "Notificacions desactivades de @{name}", diff --git a/app/javascript/gabsocial/locales/co.json b/app/javascript/gabsocial/locales/co.json index e7a42884..f64f92a8 100644 --- a/app/javascript/gabsocial/locales/co.json +++ b/app/javascript/gabsocial/locales/co.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A prupietà di stu ligame hè stata verificata u {date}", "account.locked_info": "U statutu di vita privata di u contu hè chjosu. U pruprietariu esamina manualmente e dumande d'abbunamentu.", "account.media": "Media", - "account.mention": "Mintuvà @{name}", + "account.mention": "Mintuvà", "account.moved_to": "{name} hè partutu nant'à:", "account.mute": "Piattà @{name}", "account.mute_notifications": "Piattà nutificazione da @{name}", diff --git a/app/javascript/gabsocial/locales/cs.json b/app/javascript/gabsocial/locales/cs.json index b4ee8a14..5a95cc5a 100644 --- a/app/javascript/gabsocial/locales/cs.json +++ b/app/javascript/gabsocial/locales/cs.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Vlastnictví tohoto odkazu bylo zkontrolováno {date}", "account.locked_info": "Stav soukromí tohoto účtu je nastaven na zamčeno. Jeho vlastník ručně posuzuje, kdo ho může sledovat.", "account.media": "Média", - "account.mention": "Zmínit uživatele @{name}", + "account.mention": "Zmínit uživatele", "account.moved_to": "{name} se přesunul/a na:", "account.mute": "Skrýt uživatele @{name}", "account.mute_notifications": "Skrýt oznámení od uživatele @{name}", diff --git a/app/javascript/gabsocial/locales/cy.json b/app/javascript/gabsocial/locales/cy.json index 815e1b4a..73773b78 100644 --- a/app/javascript/gabsocial/locales/cy.json +++ b/app/javascript/gabsocial/locales/cy.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}", "account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.", "account.media": "Cyfryngau", - "account.mention": "Crybwyll @{name}", + "account.mention": "Crybwyll", "account.moved_to": "Mae @{name} wedi symud i:", "account.mute": "Tawelu @{name}", "account.mute_notifications": "Cuddio hysbysiadau o @{name}", diff --git a/app/javascript/gabsocial/locales/da.json b/app/javascript/gabsocial/locales/da.json index 540efba8..679b1e8b 100644 --- a/app/javascript/gabsocial/locales/da.json +++ b/app/javascript/gabsocial/locales/da.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ejerskabet af dette link blev tjekket den %{date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Medie", - "account.mention": "Nævn @{name}", + "account.mention": "Nævn", "account.moved_to": "{name} er flyttet til:", "account.mute": "Dæmp @{name}", "account.mute_notifications": "Dæmp notifikationer fra @{name}", diff --git a/app/javascript/gabsocial/locales/de.json b/app/javascript/gabsocial/locales/de.json index a64d19f6..ad422781 100644 --- a/app/javascript/gabsocial/locales/de.json +++ b/app/javascript/gabsocial/locales/de.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}", "account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf gesperrt gesetzt. Die Person bestimmt manuell wer ihm/ihr folgen darf.", "account.media": "Medien", - "account.mention": "@{name} erwähnen", + "account.mention": "erwähnen", "account.moved_to": "{name} ist umgezogen auf:", "account.mute": "@{name} stummschalten", "account.mute_notifications": "Benachrichtigungen von @{name} verbergen", diff --git a/app/javascript/gabsocial/locales/el.json b/app/javascript/gabsocial/locales/el.json index 4937d6c8..3d007ad2 100644 --- a/app/javascript/gabsocial/locales/el.json +++ b/app/javascript/gabsocial/locales/el.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου εκλέχθηκε την {date}", "account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού είναι κλειδωμένη. Ο ιδιοκτήτης επιβεβαιώνει χειροκίνητα ποιος μπορεί να τον ακολουθήσει.", "account.media": "Πολυμέσα", - "account.mention": "Ανάφερε @{name}", + "account.mention": "Ανάφερε", "account.moved_to": "{name} μεταφέρθηκε στο:", "account.mute": "Σώπασε τον/την @{name}", "account.mute_notifications": "Σώπασε τις ειδοποιήσεις από τον/την @{name}", diff --git a/app/javascript/gabsocial/locales/en.json b/app/javascript/gabsocial/locales/en.json index 9f9a3d4a..e707172d 100644 --- a/app/javascript/gabsocial/locales/en.json +++ b/app/javascript/gabsocial/locales/en.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/eo.json b/app/javascript/gabsocial/locales/eo.json index 4c952673..739e0f49 100644 --- a/app/javascript/gabsocial/locales/eo.json +++ b/app/javascript/gabsocial/locales/eo.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}", "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.", "account.media": "Aŭdovidaĵoj", - "account.mention": "Mencii @{name}", + "account.mention": "Mencii", "account.moved_to": "{name} moviĝis al:", "account.mute": "Silentigi @{name}", "account.mute_notifications": "Silentigi sciigojn el @{name}", diff --git a/app/javascript/gabsocial/locales/es.json b/app/javascript/gabsocial/locales/es.json index 92ec4889..c2325ce3 100644 --- a/app/javascript/gabsocial/locales/es.json +++ b/app/javascript/gabsocial/locales/es.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mencionar a @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} se ha mudado a:", "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Silenciar notificaciones de @{name}", diff --git a/app/javascript/gabsocial/locales/eu.json b/app/javascript/gabsocial/locales/eu.json index d553d76c..0e55c7b1 100644 --- a/app/javascript/gabsocial/locales/eu.json +++ b/app/javascript/gabsocial/locales/eu.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Esteka honen jabetzaren egiaztaketa data: {date}", "account.locked_info": "Kontu honen pribatutasun egoera blokeatuta gisa ezarri da. Jabeak eskuz erabakitzen du nork jarraitu diezaioken.", "account.media": "Media", - "account.mention": "Aipatu @{name}", + "account.mention": "Aipatu", "account.moved_to": "{name} hona lekualdatu da:", "account.mute": "Mututu @{name}", "account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak", diff --git a/app/javascript/gabsocial/locales/fa.json b/app/javascript/gabsocial/locales/fa.json index bbbbf599..7bc637cb 100644 --- a/app/javascript/gabsocial/locales/fa.json +++ b/app/javascript/gabsocial/locales/fa.json @@ -18,7 +18,7 @@ "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد", "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.", "account.media": "عکس و ویدیو", - "account.mention": "نام‌بردن از @{name}", + "account.mention": "نام‌بردن از", "account.moved_to": "{name} منتقل شده است به:", "account.mute": "بی‌صدا کردن @{name}", "account.mute_notifications": "بی‌صداکردن اعلان‌ها از طرف @{name}", diff --git a/app/javascript/gabsocial/locales/fi.json b/app/javascript/gabsocial/locales/fi.json index 28dc7e81..44b8ca1b 100644 --- a/app/javascript/gabsocial/locales/fi.json +++ b/app/javascript/gabsocial/locales/fi.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Tämän linkin omistaja tarkistettiin {date}", "account.locked_info": "Tämän tili on yksityinen. Käyttäjä vahvistaa itse kuka voi seurata häntä.", "account.media": "Media", - "account.mention": "Mainitse @{name}", + "account.mention": "Mainitse", "account.moved_to": "{name} on muuttanut instanssiin:", "account.mute": "Mykistä @{name}", "account.mute_notifications": "Mykistä ilmoitukset käyttäjältä @{name}", diff --git a/app/javascript/gabsocial/locales/fr.json b/app/javascript/gabsocial/locales/fr.json index 1cf66198..52916ab4 100644 --- a/app/javascript/gabsocial/locales/fr.json +++ b/app/javascript/gabsocial/locales/fr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.locked_info": "Ce compte est verrouillé. Son propriétaire approuve manuellement qui peut le ou la suivre.", "account.media": "Média", - "account.mention": "Mentionner @{name}", + "account.mention": "Mentionner", "account.moved_to": "{name} a déménagé vers :", "account.mute": "Masquer @{name}", "account.mute_notifications": "Ignorer les notifications de @{name}", diff --git a/app/javascript/gabsocial/locales/gl.json b/app/javascript/gabsocial/locales/gl.json index ce1a22e5..6f78f6aa 100644 --- a/app/javascript/gabsocial/locales/gl.json +++ b/app/javascript/gabsocial/locales/gl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A propiedade de esta ligazón foi comprobada en {date}", "account.locked_info": "O estado da intimidade de esta conta estableceuse en pechado. A persoa dona da conta revisa quen pode seguila.", "account.media": "Medios", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} marchou a:", "account.mute": "Acalar @{name}", "account.mute_notifications": "Acalar as notificacións de @{name}", diff --git a/app/javascript/gabsocial/locales/he.json b/app/javascript/gabsocial/locales/he.json index 1465b090..888b3760 100644 --- a/app/javascript/gabsocial/locales/he.json +++ b/app/javascript/gabsocial/locales/he.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "מדיה", - "account.mention": "אזכור של @{name}", + "account.mention": "אזכור של", "account.moved_to": "החשבון {name} הועבר אל:", "account.mute": "להשתיק את @{name}", "account.mute_notifications": "להסתיר התראות מאת @{name}", diff --git a/app/javascript/gabsocial/locales/hi.json b/app/javascript/gabsocial/locales/hi.json index 42ceed33..3c53a68b 100644 --- a/app/javascript/gabsocial/locales/hi.json +++ b/app/javascript/gabsocial/locales/hi.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/hr.json b/app/javascript/gabsocial/locales/hr.json index 5f00a7f1..677e6d29 100644 --- a/app/javascript/gabsocial/locales/hr.json +++ b/app/javascript/gabsocial/locales/hr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Spomeni @{name}", + "account.mention": "Spomeni", "account.moved_to": "{name} has moved to:", "account.mute": "Utišaj @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/hu.json b/app/javascript/gabsocial/locales/hu.json index a3a95223..1fc83213 100644 --- a/app/javascript/gabsocial/locales/hu.json +++ b/app/javascript/gabsocial/locales/hu.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Média", - "account.mention": "@{name} említése", + "account.mention": "említése", "account.moved_to": "{name} átköltözött:", "account.mute": "@{name} némítása", "account.mute_notifications": "@{name} értesítések némítása", diff --git a/app/javascript/gabsocial/locales/hy.json b/app/javascript/gabsocial/locales/hy.json index 35b0dedf..3187ad41 100644 --- a/app/javascript/gabsocial/locales/hy.json +++ b/app/javascript/gabsocial/locales/hy.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Մեդիա", - "account.mention": "Նշել @{name}֊ին", + "account.mention": "Նշել", "account.moved_to": "{name}֊ը տեղափոխվել է՝", "account.mute": "Լռեցնել @{name}֊ին", "account.mute_notifications": "Անջատել ծանուցումները @{name}֊ից", diff --git a/app/javascript/gabsocial/locales/id.json b/app/javascript/gabsocial/locales/id.json index e0006a2b..e9c99f53 100644 --- a/app/javascript/gabsocial/locales/id.json +++ b/app/javascript/gabsocial/locales/id.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Balasan @{name}", + "account.mention": "Balasan", "account.moved_to": "{name} telah pindah ke:", "account.mute": "Bisukan @{name}", "account.mute_notifications": "Sembunyikan notifikasi dari @{name}", diff --git a/app/javascript/gabsocial/locales/io.json b/app/javascript/gabsocial/locales/io.json index 04bc4587..ca9d7091 100644 --- a/app/javascript/gabsocial/locales/io.json +++ b/app/javascript/gabsocial/locales/io.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} has moved to:", "account.mute": "Celar @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/it.json b/app/javascript/gabsocial/locales/it.json index f7668c6e..92d19efa 100644 --- a/app/javascript/gabsocial/locales/it.json +++ b/app/javascript/gabsocial/locales/it.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}", "account.locked_info": "Il livello di privacy di questo account è impostato a \"bloccato\". Il proprietario esamina manualmente le richieste di seguirlo.", "account.media": "Media", - "account.mention": "Menziona @{name}", + "account.mention": "Menziona", "account.moved_to": "{name} si è trasferito su:", "account.mute": "Silenzia @{name}", "account.mute_notifications": "Silenzia notifiche da @{name}", diff --git a/app/javascript/gabsocial/locales/ja.json b/app/javascript/gabsocial/locales/ja.json index a7e9b1ef..7885c94e 100644 --- a/app/javascript/gabsocial/locales/ja.json +++ b/app/javascript/gabsocial/locales/ja.json @@ -18,7 +18,7 @@ "account.link_verified_on": "このリンクの所有権は{date}に確認されました", "account.locked_info": "このアカウントは承認制アカウントです。相手が承認するまでフォローは完了しません。", "account.media": "メディア", - "account.mention": "@{name}さんにトゥート", + "account.mention": "さんにトゥート", "account.moved_to": "{name}さんは引っ越しました:", "account.mute": "@{name}さんをミュート", "account.mute_notifications": "@{name}さんからの通知を受け取らない", diff --git a/app/javascript/gabsocial/locales/ka.json b/app/javascript/gabsocial/locales/ka.json index 36557efd..d53ab849 100644 --- a/app/javascript/gabsocial/locales/ka.json +++ b/app/javascript/gabsocial/locales/ka.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "მედია", - "account.mention": "ასახელეთ @{name}", + "account.mention": "ასახელეთ", "account.moved_to": "{name} გადავიდა:", "account.mute": "გააჩუმე @{name}", "account.mute_notifications": "გააჩუმე შეტყობინებები @{name}-სგან", diff --git a/app/javascript/gabsocial/locales/kk.json b/app/javascript/gabsocial/locales/kk.json index adbe9d5e..11260e2d 100644 --- a/app/javascript/gabsocial/locales/kk.json +++ b/app/javascript/gabsocial/locales/kk.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Сілтеме меншігі расталған күн {date}", "account.locked_info": "Бұл қолданушы өзі туралы мәліметтерді жасырған. Тек жазылғандар ғана көре алады.", "account.media": "Медиа", - "account.mention": "Аталым @{name}", + "account.mention": "Аталым", "account.moved_to": "{name} көшіп кетті:", "account.mute": "Үнсіз қылу @{name}", "account.mute_notifications": "@{name} туралы ескертпелерді жасыру", diff --git a/app/javascript/gabsocial/locales/ko.json b/app/javascript/gabsocial/locales/ko.json index 7f56eb77..157fee01 100644 --- a/app/javascript/gabsocial/locales/ko.json +++ b/app/javascript/gabsocial/locales/ko.json @@ -18,7 +18,7 @@ "account.link_verified_on": "{date}에 이 링크의 소유권이 확인 됨", "account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로어를 승인합니다.", "account.media": "미디어", - "account.mention": "@{name}에게 글쓰기", + "account.mention": "에게 글쓰기", "account.moved_to": "{name}는 계정을 이동했습니다:", "account.mute": "@{name} 뮤트", "account.mute_notifications": "@{name}의 알림을 뮤트", diff --git a/app/javascript/gabsocial/locales/lv.json b/app/javascript/gabsocial/locales/lv.json index 832acc6d..55ec186c 100644 --- a/app/javascript/gabsocial/locales/lv.json +++ b/app/javascript/gabsocial/locales/lv.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}", "account.locked_info": "Šī konta privātuma status ir iestatīts slēgts. Īpašnieks izskatīs un izvēlēsies kas viņam drīkst sekot.", "account.media": "Mēdiji", - "account.mention": "Piemin @{name}", + "account.mention": "Piemin", "account.moved_to": "{name} ir pārvācies uz:", "account.mute": "Apklusināt @{name}", "account.mute_notifications": "Nerādīt paziņojumus no @{name}", diff --git a/app/javascript/gabsocial/locales/ms.json b/app/javascript/gabsocial/locales/ms.json index 5884c9a5..4b0adf09 100644 --- a/app/javascript/gabsocial/locales/ms.json +++ b/app/javascript/gabsocial/locales/ms.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/nl.json b/app/javascript/gabsocial/locales/nl.json index 2f4b41dd..0b091125 100644 --- a/app/javascript/gabsocial/locales/nl.json +++ b/app/javascript/gabsocial/locales/nl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.", "account.media": "Media", - "account.mention": "Vermeld @{name}", + "account.mention": "Vermeld", "account.moved_to": "{name} is verhuisd naar:", "account.mute": "Negeer @{name}", "account.mute_notifications": "Negeer meldingen van @{name}", diff --git a/app/javascript/gabsocial/locales/oc.json b/app/javascript/gabsocial/locales/oc.json index 59d9b2d1..2101bfc8 100644 --- a/app/javascript/gabsocial/locales/oc.json +++ b/app/javascript/gabsocial/locales/oc.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}", "account.locked_info": "L’estatut de privacitat del compte es configurat sus clavat. Lo proprietari causís qual pòt sègre son compte.", "account.media": "Mèdias", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} a mudat los catons a :", "account.mute": "Rescondre @{name}", "account.mute_notifications": "Rescondre las notificacions de @{name}", diff --git a/app/javascript/gabsocial/locales/pl.json b/app/javascript/gabsocial/locales/pl.json index 9f620bcf..156c43bf 100644 --- a/app/javascript/gabsocial/locales/pl.json +++ b/app/javascript/gabsocial/locales/pl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}", "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go śledzić.", "account.media": "Zawartość multimedialna", - "account.mention": "Wspomnij o @{name}", + "account.mention": "Wspomnij", "account.moved_to": "{name} przeniósł(-osła) się do:", "account.mute": "Wycisz @{name}", "account.mute_notifications": "Wycisz powiadomienia o @{name}", diff --git a/app/javascript/gabsocial/locales/te.json b/app/javascript/gabsocial/locales/te.json index 629fa620..841ada12 100644 --- a/app/javascript/gabsocial/locales/te.json +++ b/app/javascript/gabsocial/locales/te.json @@ -18,7 +18,7 @@ "account.link_verified_on": "ఈ లంకె యొక్క యాజమాన్యం {date}న పరీక్షించబడింది", "account.locked_info": "ఈ ఖాతా యొక్క గోప్యత స్థితి లాక్ చేయబడి వుంది. ఈ ఖాతాను ఎవరు అనుసరించవచ్చో యజమానే నిర్ణయం తీసుకుంటారు.", "account.media": "మీడియా", - "account.mention": "@{name}ను ప్రస్తావించు", + "account.mention": "ప్రస్తావించు", "account.moved_to": "{name} ఇక్కడికి మారారు:", "account.mute": "@{name}ను మ్యూట్ చెయ్యి", "account.mute_notifications": "@{name}నుంచి ప్రకటనలను మ్యూట్ చెయ్యి", diff --git a/app/javascript/gabsocial/locales/th.json b/app/javascript/gabsocial/locales/th.json index db22d646..268d0a7a 100644 --- a/app/javascript/gabsocial/locales/th.json +++ b/app/javascript/gabsocial/locales/th.json @@ -18,7 +18,7 @@ "account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "สื่อ", - "account.mention": "กล่าวถึง @{name}", + "account.mention": "กล่าวถึง", "account.moved_to": "{name} ได้ย้ายไปยัง:", "account.mute": "ปิดเสียง @{name}", "account.mute_notifications": "ปิดเสียงการแจ้งเตือนจาก @{name}", diff --git a/app/javascript/gabsocial/locales/tr.json b/app/javascript/gabsocial/locales/tr.json index 0c6d735f..e6585083 100644 --- a/app/javascript/gabsocial/locales/tr.json +++ b/app/javascript/gabsocial/locales/tr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Bu bağlantının mülkiyeti {date} tarihinde kontrol edildi", "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceler.", "account.media": "Medya", - "account.mention": "@{name} kullanıcısından bahset", + "account.mention": "kullanıcısından bahset", "account.moved_to": "{name} şuraya taşındı:", "account.mute": "@{name} kullanıcısını sessize al", "account.mute_notifications": "@{name} kullanıcısının bildirimlerini kapat", diff --git a/app/javascript/gabsocial/locales/uk.json b/app/javascript/gabsocial/locales/uk.json index 416b2535..d4d61042 100644 --- a/app/javascript/gabsocial/locales/uk.json +++ b/app/javascript/gabsocial/locales/uk.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Медіа", - "account.mention": "Згадати @{name}", + "account.mention": "Згадати", "account.moved_to": "{name} переїхав на:", "account.mute": "Заглушити @{name}", "account.mute_notifications": "Не показувати сповіщення від @{name}", diff --git a/app/javascript/gabsocial/locales/zh-CN.json b/app/javascript/gabsocial/locales/zh-CN.json index bd53d86b..766161ff 100644 --- a/app/javascript/gabsocial/locales/zh-CN.json +++ b/app/javascript/gabsocial/locales/zh-CN.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "媒体", - "account.mention": "提及 @{name}", + "account.mention": "提及", "account.moved_to": "{name} 已经迁移到:", "account.mute": "隐藏 @{name}", "account.mute_notifications": "隐藏来自 @{name} 的通知", diff --git a/app/javascript/gabsocial/locales/zh-HK.json b/app/javascript/gabsocial/locales/zh-HK.json index e51f197c..f3fb9db2 100644 --- a/app/javascript/gabsocial/locales/zh-HK.json +++ b/app/javascript/gabsocial/locales/zh-HK.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "媒體", - "account.mention": "提及 @{name}", + "account.mention": "提及", "account.moved_to": "{name} 已經遷移到:", "account.mute": "將 @{name} 靜音", "account.mute_notifications": "將來自 @{name} 的通知靜音", diff --git a/app/javascript/gabsocial/locales/zh-TW.json b/app/javascript/gabsocial/locales/zh-TW.json index fa27485f..1e9161da 100644 --- a/app/javascript/gabsocial/locales/zh-TW.json +++ b/app/javascript/gabsocial/locales/zh-TW.json @@ -18,7 +18,7 @@ "account.link_verified_on": "此連結的所有權已在 {date} 檢查", "account.locked_info": "此帳號的隱私狀態被設為鎖定,擁有者將手動審核可關注此帳號的人。", "account.media": "媒體", - "account.mention": "提及 @{name}", + "account.mention": "提及", "account.moved_to": "{name} 已遷移至:", "account.mute": "靜音 @{name}", "account.mute_notifications": "靜音來自 @{name} 的通知", From e1a00a26b106a6a8e525dc32ef9549a426ca563f Mon Sep 17 00:00:00 2001 From: Dank Gabs Date: Tue, 9 Jul 2019 14:40:28 -0400 Subject: [PATCH 02/31] Removed username from property files used on mention button within the app. --- app/javascript/gabsocial/locales/no.json | 2 +- app/javascript/gabsocial/locales/pt-BR.json | 2 +- app/javascript/gabsocial/locales/pt.json | 2 +- app/javascript/gabsocial/locales/ro.json | 2 +- app/javascript/gabsocial/locales/sk.json | 2 +- app/javascript/gabsocial/locales/sl.json | 2 +- app/javascript/gabsocial/locales/sq.json | 2 +- app/javascript/gabsocial/locales/sr.json | 2 +- app/javascript/gabsocial/locales/sv.json | 2 +- app/javascript/gabsocial/locales/ta.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/javascript/gabsocial/locales/no.json b/app/javascript/gabsocial/locales/no.json index 4967e486..bbd72bbe 100644 --- a/app/javascript/gabsocial/locales/no.json +++ b/app/javascript/gabsocial/locales/no.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Nevn @{name}", + "account.mention": "Nevn", "account.moved_to": "{name} har flyttet til:", "account.mute": "Demp @{name}", "account.mute_notifications": "Ignorer varsler fra @{name}", diff --git a/app/javascript/gabsocial/locales/pt-BR.json b/app/javascript/gabsocial/locales/pt-BR.json index c06f6da4..a118b1d9 100644 --- a/app/javascript/gabsocial/locales/pt-BR.json +++ b/app/javascript/gabsocial/locales/pt-BR.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A posse desse link foi verificada em {date}", "account.locked_info": "Essa conta está trancada. Se você a seguir sua solicitação será revisada manualmente.", "account.media": "Mídia", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} se mudou para:", "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", diff --git a/app/javascript/gabsocial/locales/pt.json b/app/javascript/gabsocial/locales/pt.json index 70c31ad8..9576b79a 100644 --- a/app/javascript/gabsocial/locales/pt.json +++ b/app/javascript/gabsocial/locales/pt.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A posse deste link foi verificada em {date}", "account.locked_info": "O estatuto de privacidade desta conta é fechado. O dono revê manualmente que a pode seguir.", "account.media": "Media", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} mudou a sua conta para:", "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", diff --git a/app/javascript/gabsocial/locales/ro.json b/app/javascript/gabsocial/locales/ro.json index 6c1d4e27..ee783117 100644 --- a/app/javascript/gabsocial/locales/ro.json +++ b/app/javascript/gabsocial/locales/ro.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Deținerea acestui link a fost verificată la {date}", "account.locked_info": "Acest profil este privat. Această persoană gestioneaz manual cine o urmărește.", "account.media": "Media", - "account.mention": "Menționează @{name}", + "account.mention": "Menționează", "account.moved_to": "{name} a fost mutat la:", "account.mute": "Oprește @{name}", "account.mute_notifications": "Oprește notificările de la @{name}", diff --git a/app/javascript/gabsocial/locales/sk.json b/app/javascript/gabsocial/locales/sk.json index 568443e3..5a5fa21f 100644 --- a/app/javascript/gabsocial/locales/sk.json +++ b/app/javascript/gabsocial/locales/sk.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Vlastníctvo tohto odkazu bolo skontrolované {date}", "account.locked_info": "Stav súkromia pre tento účet je nastavený na zamknutý. Jeho vlastník sám prehodnocuje, kto ho môže sledovať.", "account.media": "Médiá", - "account.mention": "Spomeň @{name}", + "account.mention": "Spomeň", "account.moved_to": "{name} sa presunul/a na:", "account.mute": "Ignorovať @{name}", "account.mute_notifications": "Stĺm oboznámenia od @{name}", diff --git a/app/javascript/gabsocial/locales/sl.json b/app/javascript/gabsocial/locales/sl.json index 0587aa0d..dcd88c14 100644 --- a/app/javascript/gabsocial/locales/sl.json +++ b/app/javascript/gabsocial/locales/sl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Mediji", - "account.mention": "Omeni @{name}", + "account.mention": "Omeni", "account.moved_to": "{name} se je premaknil na:", "account.mute": "Utišaj @{name}", "account.mute_notifications": "Utišaj obvestila od @{name}", diff --git a/app/javascript/gabsocial/locales/sq.json b/app/javascript/gabsocial/locales/sq.json index b77597a9..bbedaa6e 100644 --- a/app/javascript/gabsocial/locales/sq.json +++ b/app/javascript/gabsocial/locales/sq.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}", "account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.", "account.media": "Media", - "account.mention": "Përmendni @{name}", + "account.mention": "Përmendni", "account.moved_to": "{name} ka kaluar te:", "account.mute": "Heshtoni @{name}", "account.mute_notifications": "Heshtoji njoftimet prej @{name}", diff --git a/app/javascript/gabsocial/locales/sr.json b/app/javascript/gabsocial/locales/sr.json index 4f94b914..81f671a9 100644 --- a/app/javascript/gabsocial/locales/sr.json +++ b/app/javascript/gabsocial/locales/sr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Медији", - "account.mention": "Помени корисника @{name}", + "account.mention": "Помени корисника", "account.moved_to": "{name} се померио на:", "account.mute": "Ућуткај корисника @{name}", "account.mute_notifications": "Искључи обавештења од корисника @{name}", diff --git a/app/javascript/gabsocial/locales/sv.json b/app/javascript/gabsocial/locales/sv.json index 8960fe25..1ae7c06a 100644 --- a/app/javascript/gabsocial/locales/sv.json +++ b/app/javascript/gabsocial/locales/sv.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Nämna @{name}", + "account.mention": "Nämna", "account.moved_to": "{name} har flyttat till:", "account.mute": "Tysta @{name}", "account.mute_notifications": "Stäng av notifieringar från @{name}", diff --git a/app/javascript/gabsocial/locales/ta.json b/app/javascript/gabsocial/locales/ta.json index ef04e94e..bf26aaf7 100644 --- a/app/javascript/gabsocial/locales/ta.json +++ b/app/javascript/gabsocial/locales/ta.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", From d9d8721655116dc9439fa96d8a1665b3d3b337ae Mon Sep 17 00:00:00 2001 From: Dank Gabs Date: Tue, 9 Jul 2019 16:33:07 -0400 Subject: [PATCH 03/31] Patch Fix for scrollbar colors. Complaints about not being able to see scrollbars on the light theme. This adjusts both themes to become visible. Adjustments may follow, along with incorporating into all supported browsers. --- .../styles/gabsocial/scrollbars.scss | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/app/javascript/styles/gabsocial/scrollbars.scss b/app/javascript/styles/gabsocial/scrollbars.scss index 203068e6..88216f89 100644 --- a/app/javascript/styles/gabsocial/scrollbars.scss +++ b/app/javascript/styles/gabsocial/scrollbars.scss @@ -2,41 +2,35 @@ // Content containers are meant to behave much differently than the mastodon default UI // For now linking default gab colors to replace the base UI colors and formulas -html { - scrollbar-color: lighten($gab-background-container, 4%) $gab-background-container; -} - +html {scrollbar-color: lighten($gab-background-container, 4%) $gab-background-container;} ::-webkit-scrollbar { - width: 12px; - height: 12px; + width: 12px; + height: 12px; } - ::-webkit-scrollbar-thumb { - background: lighten($gab-background-container, 4%); - border: none; + border: none; + background: rgba($gab-placeholder-accent, .5); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-container-light, .3);} } - ::-webkit-scrollbar-thumb:hover { - background: lighten($gab-background-container, 6%); + background: rgba($gab-placeholder-accent, .75); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-container-light, .4);} } - ::-webkit-scrollbar-thumb:active { - background: lighten($gab-background-container, 4%); + background: $gab-placeholder-accent; + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-container-light, .5);} } - ::-webkit-scrollbar-track { - border: none; - background: $gab-background-container; + border: none; + background: rgba($gab-background-container, .5); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-base, .3);} } - ::-webkit-scrollbar-track:hover { - background: lighten($gab-background-container, 4%); + background: rgba($gab-background-container, .75); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-base, .4);} } - ::-webkit-scrollbar-track:active { - background: $gab-background-container; + background: $gab-background-container; + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-base, .5);} } - -::-webkit-scrollbar-corner { - background: transparent; -} \ No newline at end of file +::-webkit-scrollbar-corner {background: transparent;} \ No newline at end of file From a385210c096c15638e6ce3aaa3c53a0e20a92518 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Wed, 10 Jul 2019 14:17:07 -0400 Subject: [PATCH 04/31] Removed unused import in scrollable_list --- app/javascript/gabsocial/components/scrollable_list.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/gabsocial/components/scrollable_list.js b/app/javascript/gabsocial/components/scrollable_list.js index 2a94fa04..33662df8 100644 --- a/app/javascript/gabsocial/components/scrollable_list.js +++ b/app/javascript/gabsocial/components/scrollable_list.js @@ -1,5 +1,4 @@ import React, { PureComponent } from 'react'; -import { ScrollContainer } from 'react-router-scroll-4'; import PropTypes from 'prop-types'; import IntersectionObserverArticleContainer from '../containers/intersection_observer_article_container'; import LoadMore from './load_more'; From 038e7db5b9d05af9e26e8f447d8bf44ee61ac8d1 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Wed, 10 Jul 2019 14:20:31 -0400 Subject: [PATCH 05/31] Removed unused columnId throughout app --- .../components/column_settings.js | 1 - .../containers/column_settings_container.js | 21 +++++-------------- .../features/community_timeline/index.js | 19 ++++++----------- .../features/direct_timeline/index.js | 5 ++--- .../features/favourited_statuses/index.js | 5 ++--- .../features/groups/timeline/index.js | 5 ++--- .../features/hashtag_timeline/index.js | 10 +++------ .../gabsocial/features/home_timeline/index.js | 5 ++--- .../gabsocial/features/list_timeline/index.js | 14 ++++--------- .../gabsocial/features/notifications/index.js | 3 +-- .../containers/column_settings_container.js | 21 +++++-------------- .../features/public_timeline/index.js | 11 ++++------ 12 files changed, 36 insertions(+), 84 deletions(-) diff --git a/app/javascript/gabsocial/features/community_timeline/components/column_settings.js b/app/javascript/gabsocial/features/community_timeline/components/column_settings.js index 8250190a..7adeb674 100644 --- a/app/javascript/gabsocial/features/community_timeline/components/column_settings.js +++ b/app/javascript/gabsocial/features/community_timeline/components/column_settings.js @@ -11,7 +11,6 @@ class ColumnSettings extends React.PureComponent { settings: ImmutablePropTypes.map.isRequired, onChange: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, - columnId: PropTypes.string, }; render () { diff --git a/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js b/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js index 405064c3..0a756197 100644 --- a/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js +++ b/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js @@ -1,26 +1,15 @@ import { connect } from 'react-redux'; import ColumnSettings from '../components/column_settings'; import { changeSetting } from '../../../actions/settings'; -import { changeColumnParams } from '../../../actions/columns'; -const mapStateToProps = (state, { columnId }) => { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); +const mapStateToProps = state => ({ + settings: state.getIn(['settings', 'community']), +}); - return { - settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'community']), - }; -}; - -const mapDispatchToProps = (dispatch, { columnId }) => { +const mapDispatchToProps = (dispatch) => { return { onChange (key, checked) { - if (columnId) { - dispatch(changeColumnParams(columnId, key, checked)); - } else { - dispatch(changeSetting(['community', ...key], checked)); - } + dispatch(changeSetting(['community', ...key], checked)); }, }; }; diff --git a/app/javascript/gabsocial/features/community_timeline/index.js b/app/javascript/gabsocial/features/community_timeline/index.js index cb8ae3d3..d987d55c 100644 --- a/app/javascript/gabsocial/features/community_timeline/index.js +++ b/app/javascript/gabsocial/features/community_timeline/index.js @@ -13,16 +13,10 @@ const messages = defineMessages({ title: { id: 'column.community', defaultMessage: 'Local timeline' }, }); -const mapStateToProps = (state, { onlyMedia, columnId }) => { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); - - return { - hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0, - onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']), - }; -}; +const mapStateToProps = (state, { onlyMedia }) => ({ + hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0, + onlyMedia: state.getIn(['settings', 'community', 'other', 'onlyMedia']), +}); export default @connect(mapStateToProps) @injectIntl @@ -38,7 +32,6 @@ class CommunityTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - columnId: PropTypes.string, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, onlyMedia: PropTypes.bool, @@ -75,7 +68,7 @@ class CommunityTimeline extends React.PureComponent { } render () { - const { intl, hasUnread, columnId, onlyMedia } = this.props; + const { intl, hasUnread, onlyMedia } = this.props; return ( @@ -86,7 +79,7 @@ class CommunityTimeline extends React.PureComponent { } diff --git a/app/javascript/gabsocial/features/direct_timeline/index.js b/app/javascript/gabsocial/features/direct_timeline/index.js index 9eab561e..1b82ae30 100644 --- a/app/javascript/gabsocial/features/direct_timeline/index.js +++ b/app/javascript/gabsocial/features/direct_timeline/index.js @@ -18,7 +18,6 @@ class DirectTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - columnId: PropTypes.string, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, }; @@ -45,14 +44,14 @@ class DirectTimeline extends React.PureComponent { } render () { - const { intl, hasUnread, columnId } = this.props; + const { intl, hasUnread } = this.props; return ( } diff --git a/app/javascript/gabsocial/features/favourited_statuses/index.js b/app/javascript/gabsocial/features/favourited_statuses/index.js index 81505629..439898aa 100644 --- a/app/javascript/gabsocial/features/favourited_statuses/index.js +++ b/app/javascript/gabsocial/features/favourited_statuses/index.js @@ -29,7 +29,6 @@ class Favourites extends ImmutablePureComponent { dispatch: PropTypes.func.isRequired, statusIds: ImmutablePropTypes.list.isRequired, intl: PropTypes.object.isRequired, - columnId: PropTypes.string, hasMore: PropTypes.bool, isLoading: PropTypes.bool, isMyAccount: PropTypes.bool.isRequired, @@ -44,7 +43,7 @@ class Favourites extends ImmutablePureComponent { }, 300, { leading: true }) render () { - const { intl, statusIds, columnId, hasMore, isLoading, isMyAccount } = this.props; + const { intl, statusIds, hasMore, isLoading, isMyAccount } = this.props; if (!isMyAccount) { return ( @@ -60,7 +59,7 @@ class Favourites extends ImmutablePureComponent { } alwaysPrepend - scrollKey={`group_timeline-${columnId}`} + scrollKey='group_timeline' timelineId={`group:${id}`} onLoadMore={this.handleLoadMore} emptyMessage={} diff --git a/app/javascript/gabsocial/features/hashtag_timeline/index.js b/app/javascript/gabsocial/features/hashtag_timeline/index.js index 5948af79..a89d8413 100644 --- a/app/javascript/gabsocial/features/hashtag_timeline/index.js +++ b/app/javascript/gabsocial/features/hashtag_timeline/index.js @@ -21,7 +21,6 @@ class HashtagTimeline extends React.PureComponent { static propTypes = { params: PropTypes.object.isRequired, - columnId: PropTypes.string, dispatch: PropTypes.func.isRequired, hasUnread: PropTypes.bool, }; @@ -104,17 +103,14 @@ class HashtagTimeline extends React.PureComponent { } render () { - const { hasUnread, columnId } = this.props; + const { hasUnread } = this.props; const { id } = this.props.params; return ( - - {columnId && } - - + } diff --git a/app/javascript/gabsocial/features/home_timeline/index.js b/app/javascript/gabsocial/features/home_timeline/index.js index b4a375b8..1448d44f 100644 --- a/app/javascript/gabsocial/features/home_timeline/index.js +++ b/app/javascript/gabsocial/features/home_timeline/index.js @@ -26,7 +26,6 @@ class HomeTimeline extends React.PureComponent { intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, isPartial: PropTypes.bool, - columnId: PropTypes.string, }; handleLoadMore = maxId => { @@ -67,7 +66,7 @@ class HomeTimeline extends React.PureComponent { } render () { - const { intl, hasUnread, columnId } = this.props; + const { intl, hasUnread } = this.props; return ( @@ -78,7 +77,7 @@ class HomeTimeline extends React.PureComponent { } diff --git a/app/javascript/gabsocial/features/list_timeline/index.js b/app/javascript/gabsocial/features/list_timeline/index.js index bd873b21..0dcb7662 100644 --- a/app/javascript/gabsocial/features/list_timeline/index.js +++ b/app/javascript/gabsocial/features/list_timeline/index.js @@ -36,7 +36,6 @@ class ListTimeline extends React.PureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - columnId: PropTypes.string, hasUnread: PropTypes.bool, list: PropTypes.oneOfType([ImmutablePropTypes.map, PropTypes.bool]), intl: PropTypes.object.isRequired, @@ -69,7 +68,7 @@ class ListTimeline extends React.PureComponent { } handleDeleteClick = () => { - const { dispatch, columnId, intl } = this.props; + const { dispatch, intl } = this.props; const { id } = this.props.params; dispatch(openModal('CONFIRM', { @@ -77,18 +76,13 @@ class ListTimeline extends React.PureComponent { confirm: intl.formatMessage(messages.deleteConfirm), onConfirm: () => { dispatch(deleteList(id)); - - if (!!columnId) { - // - } else { - this.context.router.history.push('/lists'); - } + this.context.router.history.push('/lists'); }, })); } render () { - const { hasUnread, columnId, list } = this.props; + const { hasUnread, list } = this.props; const { id } = this.props.params; const title = list ? list.get('title') : id; @@ -126,7 +120,7 @@ class ListTimeline extends React.PureComponent { } diff --git a/app/javascript/gabsocial/features/notifications/index.js b/app/javascript/gabsocial/features/notifications/index.js index 011c6ecb..9c075c08 100644 --- a/app/javascript/gabsocial/features/notifications/index.js +++ b/app/javascript/gabsocial/features/notifications/index.js @@ -47,7 +47,6 @@ export default @connect(mapStateToProps) class Notifications extends React.PureComponent { static propTypes = { - columnId: PropTypes.string, notifications: ImmutablePropTypes.list.isRequired, showFilterBar: PropTypes.bool.isRequired, dispatch: PropTypes.func.isRequired, @@ -150,7 +149,7 @@ class Notifications extends React.PureComponent { const scrollContainer = ( { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); +const mapStateToProps = state => ({ + settings: state.getIn(['settings', 'public']), +}); - return { - settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'public']), - }; -}; - -const mapDispatchToProps = (dispatch, { columnId }) => { +const mapDispatchToProps = dispatch => { return { onChange (key, checked) { - if (columnId) { - dispatch(changeColumnParams(columnId, key, checked)); - } else { - dispatch(changeSetting(['public', ...key], checked)); - } + dispatch(changeSetting(['public', ...key], checked)); }, }; }; diff --git a/app/javascript/gabsocial/features/public_timeline/index.js b/app/javascript/gabsocial/features/public_timeline/index.js index 99949244..da40ca81 100644 --- a/app/javascript/gabsocial/features/public_timeline/index.js +++ b/app/javascript/gabsocial/features/public_timeline/index.js @@ -13,14 +13,12 @@ const messages = defineMessages({ title: { id: 'column.public', defaultMessage: 'Federated timeline' }, }); -const mapStateToProps = (state, { onlyMedia, columnId }) => { - const uuid = columnId; +const mapStateToProps = (state, { onlyMedia }) => { const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); return { hasUnread: state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`, 'unread']) > 0, - onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']), + onlyMedia: state.getIn(['settings', 'public', 'other', 'onlyMedia']), }; }; @@ -39,7 +37,6 @@ class PublicTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, - columnId: PropTypes.string, hasUnread: PropTypes.bool, onlyMedia: PropTypes.bool, }; @@ -80,13 +77,13 @@ class PublicTimeline extends React.PureComponent { return ( - + } /> From 6b5b0dc16206c7e053e62a7d6bf81b428b41fea0 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Wed, 10 Jul 2019 14:21:24 -0400 Subject: [PATCH 06/31] Removed unused hashtag timeilne column settings non visible functionality to change visiblility of filtering hashtags on hashtag timeline --- .../components/column_settings.js | 113 ------------------ .../containers/column_settings_container.js | 31 ----- .../features/hashtag_timeline/index.js | 1 - 3 files changed, 145 deletions(-) delete mode 100644 app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js delete mode 100644 app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js diff --git a/app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js b/app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js deleted file mode 100644 index cdc138c8..00000000 --- a/app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js +++ /dev/null @@ -1,113 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import Toggle from 'react-toggle'; -import AsyncSelect from 'react-select/lib/Async'; - -const messages = defineMessages({ - placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' }, - noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' }, -}); - -export default @injectIntl -class ColumnSettings extends React.PureComponent { - - static propTypes = { - settings: ImmutablePropTypes.map.isRequired, - onChange: PropTypes.func.isRequired, - onLoad: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - }; - - state = { - open: this.hasTags(), - }; - - hasTags () { - return ['all', 'any', 'none'].map(mode => this.tags(mode).length > 0).includes(true); - } - - tags (mode) { - let tags = this.props.settings.getIn(['tags', mode]) || []; - - if (tags.toJSON) { - return tags.toJSON(); - } else { - return tags; - } - }; - - onSelect = mode => value => this.props.onChange(['tags', mode], value); - - onToggle = () => { - if (this.state.open && this.hasTags()) { - this.props.onChange('tags', {}); - } - - this.setState({ open: !this.state.open }); - }; - - noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions); - - modeSelect (mode) { - return ( -
- - {this.modeLabel(mode)} - - - -
- ); - } - - modeLabel (mode) { - switch(mode) { - case 'any': - return ; - case 'all': - return ; - case 'none': - return ; - default: - return ''; - } - }; - - render () { - return ( -
-
-
- - - - - -
-
- - {this.state.open && ( -
- {this.modeSelect('any')} - {this.modeSelect('all')} - {this.modeSelect('none')} -
- )} -
- ); - } - -} diff --git a/app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js b/app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js deleted file mode 100644 index c5098052..00000000 --- a/app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js +++ /dev/null @@ -1,31 +0,0 @@ -import { connect } from 'react-redux'; -import ColumnSettings from '../components/column_settings'; -import { changeColumnParams } from '../../../actions/columns'; -import api from '../../../api'; - -const mapStateToProps = (state, { columnId }) => { - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === columnId); - - if (!(columnId && index >= 0)) { - return {}; - } - - return { settings: columns.get(index).get('params') }; -}; - -const mapDispatchToProps = (dispatch, { columnId }) => ({ - onChange (key, value) { - dispatch(changeColumnParams(columnId, key, value)); - }, - - onLoad (value) { - return api().get('/api/v2/search', { params: { q: value } }).then(response => { - return (response.data.hashtags || []).map((tag) => { - return { value: tag.name, label: `#${tag.name}` }; - }); - }); - }, -}); - -export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings); diff --git a/app/javascript/gabsocial/features/hashtag_timeline/index.js b/app/javascript/gabsocial/features/hashtag_timeline/index.js index a89d8413..edca2c1d 100644 --- a/app/javascript/gabsocial/features/hashtag_timeline/index.js +++ b/app/javascript/gabsocial/features/hashtag_timeline/index.js @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import StatusListContainer from '../ui/containers/status_list_container'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import ColumnSettingsContainer from './containers/column_settings_container'; import { expandHashtagTimeline, clearTimeline } from '../../actions/timelines'; import { FormattedMessage } from 'react-intl'; import { connectHashtagStream } from '../../actions/streaming'; From f10878ceaa550ef3bf985eaf899accb2886a2854 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Wed, 10 Jul 2019 14:22:18 -0400 Subject: [PATCH 07/31] Removed unused column param actions --- app/javascript/gabsocial/actions/columns.js | 16 ---------------- app/javascript/gabsocial/reducers/settings.js | 14 -------------- 2 files changed, 30 deletions(-) delete mode 100644 app/javascript/gabsocial/actions/columns.js diff --git a/app/javascript/gabsocial/actions/columns.js b/app/javascript/gabsocial/actions/columns.js deleted file mode 100644 index 36be749d..00000000 --- a/app/javascript/gabsocial/actions/columns.js +++ /dev/null @@ -1,16 +0,0 @@ -import { saveSettings } from './settings'; - -export const COLUMN_PARAMS_CHANGE = 'COLUMN_PARAMS_CHANGE'; - -export function changeColumnParams(uuid, path, value) { - return dispatch => { - dispatch({ - type: COLUMN_PARAMS_CHANGE, - uuid, - path, - value, - }); - - dispatch(saveSettings()); - }; -} diff --git a/app/javascript/gabsocial/reducers/settings.js b/app/javascript/gabsocial/reducers/settings.js index 558180f8..99f0c718 100644 --- a/app/javascript/gabsocial/reducers/settings.js +++ b/app/javascript/gabsocial/reducers/settings.js @@ -1,6 +1,5 @@ import { SETTING_CHANGE, SETTING_SAVE } from '../actions/settings'; import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications'; -import { COLUMN_PARAMS_CHANGE } from '../actions/columns'; import { STORE_HYDRATE } from '../actions/store'; import { EMOJI_USE } from '../actions/emojis'; import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists'; @@ -88,17 +87,6 @@ const defaultColumns = fromJS([ const hydrate = (state, settings) => state.mergeDeep(settings).update('columns', (val = defaultColumns) => val); -const changeColumnParams = (state, uuid, path, value) => { - const columns = state.get('columns'); - const index = columns.findIndex(item => item.get('uuid') === uuid); - - const newColumns = columns.update(index, column => column.updateIn(['params', ...path], () => value)); - - return state - .set('columns', newColumns) - .set('saved', false); -}; - const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false); const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId)); @@ -112,8 +100,6 @@ export default function settings(state = initialState, action) { return state .setIn(action.path, action.value) .set('saved', false); - case COLUMN_PARAMS_CHANGE: - return changeColumnParams(state, action.uuid, action.path, action.value); case EMOJI_USE: return updateFrequentEmojis(state, action.emoji); case SETTING_SAVE: From b7da0b3d3886e80138174e076c32dda934d8095f Mon Sep 17 00:00:00 2001 From: Dank Gabs Date: Wed, 10 Jul 2019 17:19:06 -0400 Subject: [PATCH 08/31] Patch Fix for bar background colors for polls. Polls need a tighter design overall, especially when one bar shows 0%. --- app/javascript/styles/gabsocial/polls.scss | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/javascript/styles/gabsocial/polls.scss b/app/javascript/styles/gabsocial/polls.scss index 0d55afda..b1cc6017 100644 --- a/app/javascript/styles/gabsocial/polls.scss +++ b/app/javascript/styles/gabsocial/polls.scss @@ -15,11 +15,8 @@ height: 100%; display: inline-block; border-radius: 4px; - background: darken($ui-primary-color, 14%); - - &.leading { - background: $ui-highlight-color; - } + background: rgba($gab-placeholder-accent, .3); + &.leading {background: rgba($gab-placeholder-accent, .6);} } &__text { @@ -31,7 +28,7 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - + color: #fff; input[type=radio], input[type=checkbox] { display: none; From 9e926a34b0800f3f7069d7ddb78028ac9ebacfa5 Mon Sep 17 00:00:00 2001 From: Dank Gabs Date: Wed, 10 Jul 2019 17:56:51 -0400 Subject: [PATCH 09/31] Patch Fix for blocked navigation items on mobile due to compose button position. Added 100px to bottom padding overall. This will be fine tuned with the design evolution. --- app/javascript/styles/gabsocial/components.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/gabsocial/components.scss b/app/javascript/styles/gabsocial/components.scss index 2dce18e5..bc52cba8 100644 --- a/app/javascript/styles/gabsocial/components.scss +++ b/app/javascript/styles/gabsocial/components.scss @@ -1380,6 +1380,7 @@ a.account__display-name { .ui { display: block; width: 100%; + padding: 0 0 100px 0; .page { display: flex; From 6ad747a6092fbf89b1e10087293276ffc5cf82ff Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Wed, 10 Jul 2019 23:54:19 -0400 Subject: [PATCH 10/31] Added TimelineQueueButtonHeader component, styles button at top of feeds to show "click to load more" --- .../timeline_queue_button_header.js | 38 +++++++++++++++++++ .../styles/gabsocial/components.scss | 22 +++++++++++ 2 files changed, 60 insertions(+) create mode 100644 app/javascript/gabsocial/components/timeline_queue_button_header.js diff --git a/app/javascript/gabsocial/components/timeline_queue_button_header.js b/app/javascript/gabsocial/components/timeline_queue_button_header.js new file mode 100644 index 00000000..e1bfe6d0 --- /dev/null +++ b/app/javascript/gabsocial/components/timeline_queue_button_header.js @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { FormattedMessage } from 'react-intl'; +import { shortNumberFormat } from '../utils/numbers'; + +export default class TimelineQueueButtonHeader extends React.PureComponent { + static propTypes = { + onClick: PropTypes.func.isRequired, + count: PropTypes.number, + itemType: PropTypes.string, + }; + + static defaultProps = { + count: 0, + itemType: 'item', + }; + + render () { + const { count, itemType, onClick } = this.props; + + if (count <= 0) return null; + + return ( +
+ + + +
+ ); + } +} diff --git a/app/javascript/styles/gabsocial/components.scss b/app/javascript/styles/gabsocial/components.scss index 2dce18e5..bbadaabb 100644 --- a/app/javascript/styles/gabsocial/components.scss +++ b/app/javascript/styles/gabsocial/components.scss @@ -5103,3 +5103,25 @@ noscript { } } } + +.timeline-queue-header { + display: block; + width: 100%; + height: 52px; + position: relative; + background-color: darken($ui-base-color, 8%); + border-bottom: 1px solid; + border-top: 1px solid; + border-color: darken($ui-base-color, 4%); + + &__btn { + display: block; + width: 100%; + height: 100%; + text-align: center; + line-height: 52px; + font-size: 14px; + cursor: pointer; + color: $secondary-text-color; + } +} From c8e8618f641b7c9d360c27ce5326e3d954fcae76 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 00:02:18 -0400 Subject: [PATCH 11/31] Added notification queueing functionality updated streaming functionality to load notifications into a queue (if currently on notitications page) and to display TimelineQueueButtonHeader with outstanding notification count. (if not on notifications page, it behaves as normal, adding/updating notification state). Max 40 are saved to queuedNotifications state and all are tallied into the totalQueuedNotificationsCount state. On click of TimelineQueueButtonHeader it dequeues the queuedNotifications and loads on page if <= max, otherwise it refreshes the page and shows latest 20 (default count) and clears/resets the state for queuedNotifications and totalQueuedNotificationsCount. --- .../gabsocial/actions/notifications.js | 88 ++++++++++++++----- app/javascript/gabsocial/actions/streaming.js | 4 +- .../gabsocial/features/notifications/index.js | 18 +++- .../gabsocial/reducers/notifications.js | 38 ++++++++ 4 files changed, 123 insertions(+), 25 deletions(-) diff --git a/app/javascript/gabsocial/actions/notifications.js b/app/javascript/gabsocial/actions/notifications.js index 8266ac55..21b1cf3f 100644 --- a/app/javascript/gabsocial/actions/notifications.js +++ b/app/javascript/gabsocial/actions/notifications.js @@ -16,6 +16,8 @@ import { me } from 'gabsocial/initial_state'; export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP'; +export const NOTIFICATIONS_UPDATE_QUEUE = 'NOTIFICATIONS_UPDATE_QUEUE'; +export const NOTIFICATIONS_DEQUEUE = 'NOTIFICATIONS_DEQUEUE'; export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST'; export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS'; @@ -26,6 +28,8 @@ export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET'; export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; +export const MAX_QUEUED_NOTIFICATIONS = 40; + defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, group: { id: 'notifications.group', defaultMessage: '{count} notifications' }, @@ -42,18 +46,6 @@ const fetchRelatedRelationships = (dispatch, notifications) => { export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true); - const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); - const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); - const filters = getFilters(getState(), { contextType: 'notifications' }); - - let filtered = false; - - if (notification.type === 'mention') { - const regex = regexFromFilters(filters); - const searchIndex = notification.status.spoiler_text + '\n' + unescapeHTML(notification.status.content); - - filtered = regex && regex.test(searchIndex); - } if (showInColumn) { dispatch(importFetchedAccount(notification.account)); @@ -65,21 +57,33 @@ export function updateNotifications(notification, intlMessages, intlLocale) { dispatch({ type: NOTIFICATIONS_UPDATE, notification, - meta: (playSound && !filtered) ? { sound: 'ribbit' } : undefined, }); fetchRelatedRelationships(dispatch, [notification]); - } else if (playSound && !filtered) { - dispatch({ - type: NOTIFICATIONS_UPDATE_NOOP, - meta: { sound: 'ribbit' }, - }); + } + }; +}; + +export function updateNotificationsQueue(notification, intlMessages, intlLocale, curPath) { + return (dispatch, getState) => { + const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); + const filters = getFilters(getState(), { contextType: 'notifications' }); + const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); + + let filtered = false; + + const isOnNotificationsPage = curPath === '/notifications'; + + if (notification.type === 'mention') { + const regex = regexFromFilters(filters); + const searchIndex = notification.status.spoiler_text + '\n' + unescapeHTML(notification.status.content); + filtered = regex && regex.test(searchIndex); } // Desktop notifications if (typeof window.Notification !== 'undefined' && showAlert && !filtered) { const title = new IntlMessageFormat(intlMessages[`notification.${notification.type}`], intlLocale).format({ name: notification.account.display_name.length > 0 ? notification.account.display_name : notification.account.username }); - const body = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : unescapeHTML(notification.status ? notification.status.content : ''); + const body = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : unescapeHTML(notification.status ? notification.status.content : ''); const notify = new Notification(title, { body, icon: notification.account.avatar, tag: notification.id }); @@ -88,7 +92,49 @@ export function updateNotifications(notification, intlMessages, intlLocale) { notify.close(); }); } - }; + + if (playSound && !filtered) { + dispatch({ + type: NOTIFICATIONS_UPDATE_NOOP, + meta: { sound: 'ribbit' }, + }); + } + + if (isOnNotificationsPage) { + dispatch({ + type: NOTIFICATIONS_UPDATE_QUEUE, + notification, + intlMessages, + intlLocale, + }); + } + else { + dispatch(updateNotifications(notification, intlMessages, intlLocale)); + } + } +}; + +export function dequeueNotifications() { + return (dispatch, getState) => { + const queuedNotifications = getState().getIn(['notifications', 'queuedNotifications'], ImmutableList()); + const totalQueuedNotificationsCount = getState().getIn(['notifications', 'totalQueuedNotificationsCount'], 0); + + if (totalQueuedNotificationsCount == 0) { + return; + } + else if (totalQueuedNotificationsCount > 0 && totalQueuedNotificationsCount <= MAX_QUEUED_NOTIFICATIONS) { + queuedNotifications.forEach(block => { + dispatch(updateNotifications(block.notification, block.intlMessages, block.intlLocale)); + }); + } + else { + dispatch(expandNotifications()); + } + + dispatch({ + type: NOTIFICATIONS_DEQUEUE, + }); + } }; const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS(); @@ -169,7 +215,7 @@ export function expandNotificationsFail(error, isLoadingMore) { export function clearNotifications() { return (dispatch, getState) => { if (!me) return; - + dispatch({ type: NOTIFICATIONS_CLEAR, }); diff --git a/app/javascript/gabsocial/actions/streaming.js b/app/javascript/gabsocial/actions/streaming.js index 3876a4f5..5e2d355a 100644 --- a/app/javascript/gabsocial/actions/streaming.js +++ b/app/javascript/gabsocial/actions/streaming.js @@ -6,7 +6,7 @@ import { connectTimeline, disconnectTimeline, } from './timelines'; -import { updateNotifications, expandNotifications } from './notifications'; +import { updateNotificationsQueue, expandNotifications } from './notifications'; import { updateConversations } from './conversations'; import { fetchFilters } from './filters'; import { getLocale } from '../locales'; @@ -36,7 +36,7 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null, dispatch(deleteFromTimelines(data.payload)); break; case 'notification': - dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); + dispatch(updateNotificationsQueue(JSON.parse(data.payload), messages, locale, window.location.pathname)); break; case 'conversation': dispatch(updateConversations(JSON.parse(data.payload))); diff --git a/app/javascript/gabsocial/features/notifications/index.js b/app/javascript/gabsocial/features/notifications/index.js index 9c075c08..9f4a7c35 100644 --- a/app/javascript/gabsocial/features/notifications/index.js +++ b/app/javascript/gabsocial/features/notifications/index.js @@ -4,7 +4,11 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import { expandNotifications, scrollTopNotifications } from '../../actions/notifications'; +import { + expandNotifications, + scrollTopNotifications, + dequeueNotifications, +} from '../../actions/notifications'; import NotificationContainer from './containers/notification_container'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; @@ -14,6 +18,7 @@ import { List as ImmutableList } from 'immutable'; import { debounce } from 'lodash'; import ScrollableList from '../../components/scrollable_list'; import LoadGap from '../../components/load_gap'; +import TimelineQueueButtonHeader from '../../components/timeline_queue_button_header'; const messages = defineMessages({ title: { id: 'column.notifications', defaultMessage: 'Notifications' }, @@ -40,6 +45,7 @@ const mapStateToProps = state => ({ isLoading: state.getIn(['notifications', 'isLoading'], true), isUnread: state.getIn(['notifications', 'unread']) > 0, hasMore: state.getIn(['notifications', 'hasMore']), + totalQueuedNotificationsCount: state.getIn(['notifications', 'totalQueuedNotificationsCount'], 0), }); export default @connect(mapStateToProps) @@ -54,6 +60,8 @@ class Notifications extends React.PureComponent { isLoading: PropTypes.bool, isUnread: PropTypes.bool, hasMore: PropTypes.bool, + dequeueNotifications: PropTypes.func, + totalQueuedNotificationsCount: PropTypes.number, }; componentWillUnmount () { @@ -61,6 +69,7 @@ class Notifications extends React.PureComponent { this.handleScrollToTop.cancel(); this.handleScroll.cancel(); this.props.dispatch(scrollTopNotifications(false)); + this.handleDequeueNotifications(); } componentDidMount() { @@ -112,8 +121,12 @@ class Notifications extends React.PureComponent { } } + handleDequeueNotifications = () => { + this.props.dispatch(dequeueNotifications()); + }; + render () { - const { intl, notifications, isLoading, isUnread, columnId, hasMore, showFilterBar } = this.props; + const { intl, notifications, isLoading, isUnread, hasMore, showFilterBar, totalQueuedNotificationsCount } = this.props; const emptyMessage = ; let scrollableContent = null; @@ -168,6 +181,7 @@ class Notifications extends React.PureComponent {
{filterBarContainer} + {scrollContainer}
); diff --git a/app/javascript/gabsocial/reducers/notifications.js b/app/javascript/gabsocial/reducers/notifications.js index 4d9604de..7531165f 100644 --- a/app/javascript/gabsocial/reducers/notifications.js +++ b/app/javascript/gabsocial/reducers/notifications.js @@ -6,6 +6,9 @@ import { NOTIFICATIONS_FILTER_SET, NOTIFICATIONS_CLEAR, NOTIFICATIONS_SCROLL_TOP, + NOTIFICATIONS_UPDATE_QUEUE, + NOTIFICATIONS_DEQUEUE, + MAX_QUEUED_NOTIFICATIONS, } from '../actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, @@ -21,6 +24,8 @@ const initialState = ImmutableMap({ top: false, unread: 0, isLoading: false, + queuedNotifications: ImmutableList(), //max = MAX_QUEUED_NOTIFICATIONS + totalQueuedNotificationsCount: 0, //used for queuedItems overflow for MAX_QUEUED_NOTIFICATIONS+ }); const notificationToMap = notification => ImmutableMap({ @@ -93,6 +98,32 @@ const deleteByStatus = (state, statusId) => { return state.update('items', list => list.filterNot(item => item !== null && item.get('status') === statusId)); }; +const updateNotificationsQueue = (state, notification, intlMessages, intlLocale) => { + const queuedNotifications = state.getIn(['queuedNotifications'], ImmutableList()); + const listedNotifications = state.getIn(['items'], ImmutableList()); + const totalQueuedNotificationsCount = state.getIn(['totalQueuedNotificationsCount'], 0); + + let alreadyExists = queuedNotifications.find(existingQueuedNotification => existingQueuedNotification.id === notification.id); + if (!alreadyExists) alreadyExists = listedNotifications.find(existingListedNotification => existingListedNotification.get('id') === notification.id); + + if (alreadyExists) { + return state; + } + + let newQueuedNotifications = queuedNotifications; + + return state.withMutations(mutable => { + if (totalQueuedNotificationsCount <= MAX_QUEUED_NOTIFICATIONS) { + mutable.set('queuedNotifications', newQueuedNotifications.push({ + notification, + intlMessages, + intlLocale, + })); + } + mutable.set('totalQueuedNotificationsCount', totalQueuedNotificationsCount + 1); + }); +}; + export default function notifications(state = initialState, action) { switch(action.type) { case NOTIFICATIONS_EXPAND_REQUEST: @@ -105,6 +136,13 @@ export default function notifications(state = initialState, action) { return updateTop(state, action.top); case NOTIFICATIONS_UPDATE: return normalizeNotification(state, action.notification); + case NOTIFICATIONS_UPDATE_QUEUE: + return updateNotificationsQueue(state, action.notification, action.intlMessages, action.intlLocale); + case NOTIFICATIONS_DEQUEUE: + return state.withMutations(mutable => { + mutable.set('queuedNotifications', ImmutableList()) + mutable.set('totalQueuedNotificationsCount', 0) + }); case NOTIFICATIONS_EXPAND_SUCCESS: return expandNormalizedNotifications(state, action.notifications, action.next); case ACCOUNT_BLOCK_SUCCESS: From 0356e2174782e0d2f8b5d9a92789bad25d93fbdb Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 12:09:41 -0400 Subject: [PATCH 12/31] Added redux functionality for queueing/dequeueing timelines using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount". the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state. if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.) --- app/javascript/gabsocial/actions/streaming.js | 4 +- app/javascript/gabsocial/actions/timelines.js | 64 ++++++++++++++++++- .../gabsocial/reducers/timelines.js | 34 ++++++++++ 3 files changed, 99 insertions(+), 3 deletions(-) diff --git a/app/javascript/gabsocial/actions/streaming.js b/app/javascript/gabsocial/actions/streaming.js index 5e2d355a..e599805e 100644 --- a/app/javascript/gabsocial/actions/streaming.js +++ b/app/javascript/gabsocial/actions/streaming.js @@ -1,10 +1,10 @@ import { connectStream } from '../stream'; import { - updateTimeline, deleteFromTimelines, expandHomeTimeline, connectTimeline, disconnectTimeline, + updateTimelineQueue, } from './timelines'; import { updateNotificationsQueue, expandNotifications } from './notifications'; import { updateConversations } from './conversations'; @@ -30,7 +30,7 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null, onReceive (data) { switch(data.event) { case 'update': - dispatch(updateTimeline(timelineId, JSON.parse(data.payload), accept)); + dispatch(updateTimelineQueue(timelineId, JSON.parse(data.payload), accept)); break; case 'delete': dispatch(deleteFromTimelines(data.payload)); diff --git a/app/javascript/gabsocial/actions/timelines.js b/app/javascript/gabsocial/actions/timelines.js index ee57145e..4214cbde 100644 --- a/app/javascript/gabsocial/actions/timelines.js +++ b/app/javascript/gabsocial/actions/timelines.js @@ -1,10 +1,12 @@ import { importFetchedStatus, importFetchedStatuses } from './importer'; import api, { getLinks } from '../api'; -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +import { Map as ImmutableMap, List as ImmutableList, toJS } from 'immutable'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; export const TIMELINE_DELETE = 'TIMELINE_DELETE'; export const TIMELINE_CLEAR = 'TIMELINE_CLEAR'; +export const TIMELINE_UPDATE_QUEUE = 'TIMELINE_UPDATE_QUEUE'; +export const TIMELINE_DEQUEUE = 'TIMELINE_DEQUEUE'; export const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST'; export const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS'; @@ -13,6 +15,8 @@ export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL'; export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'; export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'; +export const MAX_QUEUED_ITEMS = 40; + export function updateTimeline(timeline, status, accept) { return dispatch => { if (typeof accept === 'function' && !accept(status)) { @@ -29,6 +33,64 @@ export function updateTimeline(timeline, status, accept) { }; }; +export function updateTimelineQueue(timeline, status, accept) { + return dispatch => { + if (typeof accept === 'function' && !accept(status)) { + return; + } + + dispatch({ + type: TIMELINE_UPDATE_QUEUE, + timeline, + status, + }); + } +}; + +export function dequeueTimeline(timeline, expandFunc, optionalExpandArgs) { + return (dispatch, getState) => { + const queuedItems = getState().getIn(['timelines', timeline, 'queuedItems'], ImmutableList()); + const totalQueuedItemsCount = getState().getIn(['timelines', timeline, 'totalQueuedItemsCount'], 0); + + let shouldDispatchDequeue = true; + + if (totalQueuedItemsCount == 0) { + return; + } + else if (totalQueuedItemsCount > 0 && totalQueuedItemsCount <= MAX_QUEUED_ITEMS) { + queuedItems.forEach(status => { + dispatch(updateTimeline(timeline, status.toJS(), null)); + }); + } + else { + if (typeof expandFunc === 'function') { + dispatch(clearTimeline(timeline)); + expandFunc(); + } + else { + if (timeline === 'home') { + dispatch(clearTimeline(timeline)); + dispatch(expandHomeTimeline(optionalExpandArgs)); + } + else if (timeline === 'community') { + dispatch(clearTimeline(timeline)); + dispatch(expandCommunityTimeline(optionalExpandArgs)); + } + else { + shouldDispatchDequeue = false; + } + } + } + + if (!shouldDispatchDequeue) return; + + dispatch({ + type: TIMELINE_DEQUEUE, + timeline, + }); + } +}; + export function deleteFromTimelines(id) { return (dispatch, getState) => { const accountId = getState().getIn(['statuses', id, 'account']); diff --git a/app/javascript/gabsocial/reducers/timelines.js b/app/javascript/gabsocial/reducers/timelines.js index 8e20bdf3..b0c1babf 100644 --- a/app/javascript/gabsocial/reducers/timelines.js +++ b/app/javascript/gabsocial/reducers/timelines.js @@ -7,6 +7,9 @@ import { TIMELINE_EXPAND_FAIL, TIMELINE_CONNECT, TIMELINE_DISCONNECT, + TIMELINE_UPDATE_QUEUE, + TIMELINE_DEQUEUE, + MAX_QUEUED_ITEMS, } from '../actions/timelines'; import { ACCOUNT_BLOCK_SUCCESS, @@ -25,6 +28,8 @@ const initialTimeline = ImmutableMap({ isLoading: false, hasMore: true, items: ImmutableList(), + queuedItems: ImmutableList(), //max= MAX_QUEUED_ITEMS + totalQueuedItemsCount: 0, //used for queuedItems overflow for MAX_QUEUED_ITEMS+ }); const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, isLoadingRecent) => { @@ -77,6 +82,28 @@ const updateTimeline = (state, timeline, status) => { })); }; +const updateTimelineQueue = (state, timeline, status) => { + const queuedStatuses = state.getIn([timeline, 'queuedItems'], ImmutableList()); + const listedStatuses = state.getIn([timeline, 'items'], ImmutableList()); + const totalQueuedItemsCount = state.getIn([timeline, 'totalQueuedItemsCount'], 0); + + let alreadyExists = queuedStatuses.find(existingQueuedStatus => existingQueuedStatus.get('id') === status.get('id')); + if (!alreadyExists) alreadyExists = listedStatuses.find(existingListedStatusId => existingListedStatusId === status.get('id')); + + if (alreadyExists) { + return state; + } + + let newQueuedStatuses = queuedStatuses; + + return state.update(timeline, initialTimeline, map => map.withMutations(mMap => { + if (totalQueuedItemsCount <= MAX_QUEUED_ITEMS) { + mMap.set('queuedItems', newQueuedStatuses.push(status)); + } + mMap.set('totalQueuedItemsCount', totalQueuedItemsCount + 1); + })); +}; + const deleteStatus = (state, id, accountId, references, exclude_account = null) => { state.keySeq().forEach(timeline => { if (exclude_account === null || (timeline !== `account:${exclude_account}` && !timeline.startsWith(`account:${exclude_account}:`))) @@ -126,6 +153,13 @@ export default function timelines(state = initialState, action) { return expandNormalizedTimeline(state, action.timeline, fromJS(action.statuses), action.next, action.partial, action.isLoadingRecent); case TIMELINE_UPDATE: return updateTimeline(state, action.timeline, fromJS(action.status)); + case TIMELINE_UPDATE_QUEUE: + return updateTimelineQueue(state, action.timeline, fromJS(action.status)); + case TIMELINE_DEQUEUE: + return state.update(action.timeline, initialTimeline, map => map.withMutations(mMap => { + mMap.set('queuedItems', ImmutableList()) + mMap.set('totalQueuedItemsCount', 0) + })); case TIMELINE_DELETE: return deleteStatus(state, action.id, action.accountId, action.references, action.reblogOf); case TIMELINE_CLEAR: From ebc44ed7436c6b111ee8d44c9e686da02991c0fd Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 12:10:46 -0400 Subject: [PATCH 13/31] Added timeline dequeue functionality to onSubmitCompose action when a status is composed and there's queued statuses, it attempts to dequeue those statuses with optional dequeueArgs --- app/javascript/gabsocial/actions/compose.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/javascript/gabsocial/actions/compose.js b/app/javascript/gabsocial/actions/compose.js index 34fd54f6..ec098608 100644 --- a/app/javascript/gabsocial/actions/compose.js +++ b/app/javascript/gabsocial/actions/compose.js @@ -6,7 +6,7 @@ import { tagHistory } from '../settings'; import { useEmoji } from './emojis'; import resizeImage from '../utils/resize_image'; import { importFetchedAccounts } from './importer'; -import { updateTimeline } from './timelines'; +import { updateTimeline, dequeueTimeline } from './timelines'; import { showAlertForError } from './alerts'; import { showAlert } from './alerts'; import { defineMessages } from 'react-intl'; @@ -168,6 +168,10 @@ export function submitCompose(routerHistory) { const timeline = getState().getIn(['timelines', timelineId]); if (timeline && timeline.get('items').size > 0 && timeline.getIn(['items', 0]) !== null && timeline.get('online')) { + let dequeueArgs = {}; + if (timelineId === 'community') dequeueArgs.onlyMedia = getState().getIn(['settings', 'community', 'other', 'onlyMedia']), + + dispatch(dequeueTimeline(timelineId, null, dequeueArgs)); dispatch(updateTimeline(timelineId, { ...response.data })); } }; From 49e533244c01d17a299844df1f6bf5866981fdf2 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 12:11:57 -0400 Subject: [PATCH 14/31] Updated all Redis.current.publish, PushUpdateWorker.perform_async to work again added back now that we will have timeline/notification queueing functionality --- app/lib/feed_manager.rb | 4 ++-- app/services/fan_out_on_write_service.rb | 10 +++++----- app/workers/push_conversation_worker.rb | 2 +- app/workers/push_update_worker.rb | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 02e9cb64..c903f9d1 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -30,7 +30,7 @@ class FeedManager def push_to_home(account, status) return false unless add_to_feed(:home, account.id, status, account.user&.aggregates_reblogs?) trim(:home, account.id) - #PushUpdateWorker.perform_async(account.id, status.id, "timeline:#{account.id}") if push_update_required?("timeline:#{account.id}") + PushUpdateWorker.perform_async(account.id, status.id, "timeline:#{account.id}") if push_update_required?("timeline:#{account.id}") true end @@ -48,7 +48,7 @@ class FeedManager end return false unless add_to_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) trim(:list, list.id) - #PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") + PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") true end diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index ea5e4788..f62fa66d 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -61,7 +61,7 @@ class FanOutOnWriteService < BaseService Rails.logger.debug "Delivering status #{status.id} to group" - # Redis.current.publish("timeline:group:#{status.group_id}", @payload) + Redis.current.publish("timeline:group:#{status.group_id}", @payload) end def deliver_to_mentioned_followers(status) @@ -89,15 +89,15 @@ class FanOutOnWriteService < BaseService def deliver_to_public(status) Rails.logger.debug "Delivering status #{status.id} to public timeline" - # Redis.current.publish('timeline:public', @payload) - # Redis.current.publish('timeline:public:local', @payload) if status.local? + Redis.current.publish('timeline:public', @payload) + Redis.current.publish('timeline:public:local', @payload) if status.local? end def deliver_to_media(status) Rails.logger.debug "Delivering status #{status.id} to media timeline" - # Redis.current.publish('timeline:public:media', @payload) - # Redis.current.publish('timeline:public:local:media', @payload) if status.local? + Redis.current.publish('timeline:public:media', @payload) + Redis.current.publish('timeline:public:local:media', @payload) if status.local? end def deliver_to_own_conversation(status) diff --git a/app/workers/push_conversation_worker.rb b/app/workers/push_conversation_worker.rb index f7a1c7a1..77f5895c 100644 --- a/app/workers/push_conversation_worker.rb +++ b/app/workers/push_conversation_worker.rb @@ -7,7 +7,7 @@ class PushConversationWorker conversation = AccountConversation.find(conversation_account_id) message = InlineRenderer.render(conversation, conversation.account, :conversation) timeline_id = "timeline:direct:#{conversation.account_id}" - # Redis.current.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) + Redis.current.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) true rescue ActiveRecord::RecordNotFound true diff --git a/app/workers/push_update_worker.rb b/app/workers/push_update_worker.rb index 6ed4906b..a491848e 100644 --- a/app/workers/push_update_worker.rb +++ b/app/workers/push_update_worker.rb @@ -9,7 +9,7 @@ class PushUpdateWorker message = InlineRenderer.render(status, account, :status) timeline_id = "timeline:#{account.id}" if timeline_id.nil? - # Redis.current.publish(timeline_id, Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) + Redis.current.publish(timeline_id, Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) true rescue ActiveRecord::RecordNotFound true From a41e6f28766349cd9376e3f2be99257550337f3d Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 12:13:32 -0400 Subject: [PATCH 15/31] Added queue functionality status_list_container for status timelines added totalQueuedItemsCount to props per timeline added dequeueTimeline action with timeline onLoadMore for expanding/dequeueing --- .../ui/containers/status_list_container.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/javascript/gabsocial/features/ui/containers/status_list_container.js b/app/javascript/gabsocial/features/ui/containers/status_list_container.js index baa0f901..ee58b9ed 100644 --- a/app/javascript/gabsocial/features/ui/containers/status_list_container.js +++ b/app/javascript/gabsocial/features/ui/containers/status_list_container.js @@ -4,6 +4,7 @@ import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { createSelector } from 'reselect'; import { debounce } from 'lodash'; import { me } from '../../../initial_state'; +import { dequeueTimeline } from 'gabsocial/actions/timelines'; const makeGetStatusIds = () => createSelector([ (state, { type }) => state.getIn(['settings', type], ImmutableMap()), @@ -28,17 +29,22 @@ const makeGetStatusIds = () => createSelector([ }); }); -const makeMapStateToProps = () => { +const mapStateToProps = (state, {timelineId}) => { const getStatusIds = makeGetStatusIds(); - const mapStateToProps = (state, { timelineId }) => ({ + return { statusIds: getStatusIds(state, { type: timelineId }), isLoading: state.getIn(['timelines', timelineId, 'isLoading'], true), isPartial: state.getIn(['timelines', timelineId, 'isPartial'], false), hasMore: state.getIn(['timelines', timelineId, 'hasMore']), - }); - - return mapStateToProps; + totalQueuedItemsCount: state.getIn(['timelines', timelineId, 'totalQueuedItemsCount']), + }; }; -export default connect(makeMapStateToProps)(StatusList); +const mapDispatchToProps = (dispatch, ownProps) => ({ + onDequeueTimeline(timelineId) { + dispatch(dequeueTimeline(timelineId, ownProps.onLoadMore)); + }, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(StatusList); From a7f2837a377d7639b6163b76a157bcd917d97da0 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 12:14:27 -0400 Subject: [PATCH 16/31] Added TimelineQueueButtonHeader to status_list updated render return to add timeline queue button header before scrollable list added handleDequeueTimeline action with totalQueuedItemsCount props --- .../gabsocial/components/status_list.js | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/javascript/gabsocial/components/status_list.js b/app/javascript/gabsocial/components/status_list.js index 7bbe01cc..262f9635 100644 --- a/app/javascript/gabsocial/components/status_list.js +++ b/app/javascript/gabsocial/components/status_list.js @@ -7,6 +7,7 @@ import StatusContainer from '../containers/status_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; import LoadGap from './load_gap'; import ScrollableList from './scrollable_list'; +import TimelineQueueButtonHeader from './timeline_queue_button_header'; export default class StatusList extends ImmutablePureComponent { @@ -22,6 +23,12 @@ export default class StatusList extends ImmutablePureComponent { emptyMessage: PropTypes.node, alwaysPrepend: PropTypes.bool, timelineId: PropTypes.string, + queuedItemSize: PropTypes.number, + onDequeueTimeline: PropTypes.func, + }; + + componentWillUnmount() { + this.handleDequeueTimeline(); }; getFeaturedStatusCount = () => { @@ -64,13 +71,17 @@ export default class StatusList extends ImmutablePureComponent { } } + handleDequeueTimeline = () => { + const { onDequeueTimeline, timelineId } = this.props; + onDequeueTimeline(timelineId); + } + setRef = c => { this.node = c; } render () { - const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other } = this.props; - const { isLoading, isPartial } = other; + const { statusIds, featuredStatusIds, onLoadMore, timelineId, totalQueuedItemsCount, isLoading, isPartial, ...other } = this.props; if (isPartial) { return ( @@ -119,11 +130,12 @@ export default class StatusList extends ImmutablePureComponent { )).concat(scrollableContent); } - return ( - + return [ + , + {scrollableContent} - ); + ]; } } From 45dcd5a1abaf0c792dac2084d53a69eefdf85914 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 11 Jul 2019 17:31:04 -0400 Subject: [PATCH 17/31] Updated timeline/notification dequeue to be in componentDidMount --- app/javascript/gabsocial/components/status_list.js | 3 ++- app/javascript/gabsocial/features/notifications/index.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/javascript/gabsocial/components/status_list.js b/app/javascript/gabsocial/components/status_list.js index 262f9635..91bbc511 100644 --- a/app/javascript/gabsocial/components/status_list.js +++ b/app/javascript/gabsocial/components/status_list.js @@ -27,7 +27,7 @@ export default class StatusList extends ImmutablePureComponent { onDequeueTimeline: PropTypes.func, }; - componentWillUnmount() { + componentDidMount() { this.handleDequeueTimeline(); }; @@ -73,6 +73,7 @@ export default class StatusList extends ImmutablePureComponent { handleDequeueTimeline = () => { const { onDequeueTimeline, timelineId } = this.props; + if (!onDequeueTimeline || !timelineId) return; onDequeueTimeline(timelineId); } diff --git a/app/javascript/gabsocial/features/notifications/index.js b/app/javascript/gabsocial/features/notifications/index.js index 9f4a7c35..0f932627 100644 --- a/app/javascript/gabsocial/features/notifications/index.js +++ b/app/javascript/gabsocial/features/notifications/index.js @@ -69,10 +69,10 @@ class Notifications extends React.PureComponent { this.handleScrollToTop.cancel(); this.handleScroll.cancel(); this.props.dispatch(scrollTopNotifications(false)); - this.handleDequeueNotifications(); } componentDidMount() { + this.handleDequeueNotifications(); this.props.dispatch(scrollTopNotifications(true)); } From 092bc3898c6c9281432c08418d96d5bf7c02affe Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 00:07:11 -0400 Subject: [PATCH 18/31] Added empty message to account_gallery media page --- app/javascript/gabsocial/features/account_gallery/index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/javascript/gabsocial/features/account_gallery/index.js b/app/javascript/gabsocial/features/account_gallery/index.js index 08151214..8d77b27c 100644 --- a/app/javascript/gabsocial/features/account_gallery/index.js +++ b/app/javascript/gabsocial/features/account_gallery/index.js @@ -212,6 +212,13 @@ class AccountGallery extends ImmutablePureComponent { ))} + { + attachments.size == 0 && +
+ +
+ } + {loadOlder} From 9795c1139c2de38381471b98d18811dfee9a2b1f Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 00:08:26 -0400 Subject: [PATCH 19/31] Updated nextProps withReplies for account timeline fixes #12 --- app/javascript/gabsocial/features/account_timeline/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/gabsocial/features/account_timeline/index.js b/app/javascript/gabsocial/features/account_timeline/index.js index ed133f49..6a2aad89 100644 --- a/app/javascript/gabsocial/features/account_timeline/index.js +++ b/app/javascript/gabsocial/features/account_timeline/index.js @@ -93,7 +93,7 @@ class AccountTimeline extends ImmutablePureComponent { this.props.dispatch(expandAccountFeaturedTimeline(nextProps.accountId)); } - this.props.dispatch(expandAccountTimeline(nextProps.accountId, { withReplies: nextProps.params.withReplies })); + this.props.dispatch(expandAccountTimeline(nextProps.accountId, { withReplies: nextProps.withReplies })); } } From 1e68c5d4fe96f0356daefe4f2aa3fa62765feaed Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 00:08:50 -0400 Subject: [PATCH 20/31] Added empty message to pinned statuses page --- app/javascript/gabsocial/features/pinned_statuses/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/gabsocial/features/pinned_statuses/index.js b/app/javascript/gabsocial/features/pinned_statuses/index.js index e8180191..85a0e5d2 100644 --- a/app/javascript/gabsocial/features/pinned_statuses/index.js +++ b/app/javascript/gabsocial/features/pinned_statuses/index.js @@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { fetchPinnedStatuses } from '../../actions/pin_statuses'; import Column from '../ui/components/column'; import StatusList from '../../components/status_list'; -import { injectIntl } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { meUsername } from 'gabsocial/initial_state'; import MissingIndicator from 'gabsocial/components/missing_indicator'; @@ -51,6 +51,7 @@ class PinnedStatuses extends ImmutablePureComponent { statusIds={statusIds} scrollKey='pinned_statuses' hasMore={hasMore} + emptyMessage={} />
); From 4e9b22640cace676941bb71ed7b862da194a9c09 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 12:22:05 -0400 Subject: [PATCH 21/31] Updated compose_form to account for if compose modal open fixes #9 since there are multiple compose_form on the page (on top of timeline = shouldCondense) and within the modal when replying. if isModalOpen and is the compose form that's on top of timeline then dont set the ref so we can set the cursor on the textarea of the compose modal after the existing reply content. --- .../gabsocial/features/compose/components/compose_form.js | 7 +++++-- .../features/compose/containers/compose_form_container.js | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/javascript/gabsocial/features/compose/components/compose_form.js b/app/javascript/gabsocial/features/compose/components/compose_form.js index 6d8625e5..8f595904 100644 --- a/app/javascript/gabsocial/features/compose/components/compose_form.js +++ b/app/javascript/gabsocial/features/compose/components/compose_form.js @@ -68,6 +68,7 @@ class ComposeForm extends ImmutablePureComponent { anyMedia: PropTypes.bool, shouldCondense: PropTypes.bool, autoFocus: PropTypes.bool, + isModalOpen: PropTypes.bool, }; static defaultProps = { @@ -150,6 +151,8 @@ class ComposeForm extends ImmutablePureComponent { } componentDidUpdate (prevProps) { + if (!this.autosuggestTextarea) return; + // This statement does several things: // - If we're beginning a reply, and, // - Replying to zero or one users, places the cursor at the end of the textbox. @@ -203,7 +206,7 @@ class ComposeForm extends ImmutablePureComponent { } render () { - const { intl, onPaste, showSearch, anyMedia, shouldCondense, autoFocus } = this.props; + const { intl, onPaste, showSearch, anyMedia, shouldCondense, autoFocus, isModalOpen } = this.props; const condensed = shouldCondense && !this.props.text && !this.state.composeFocused; const disabled = this.props.isSubmitting; const text = [this.props.spoilerText, countableText(this.props.text)].join(''); @@ -252,7 +255,7 @@ class ComposeForm extends ImmutablePureComponent { ({ isUploading: state.getIn(['compose', 'is_uploading']), showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']), anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, + isModalOpen: state.get('modal').modalType === 'COMPOSE', }); const mapDispatchToProps = (dispatch) => ({ From ca1984e499ca8d5531e1a0b62f5e2b03ca3ff8b4 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 15:30:08 -0400 Subject: [PATCH 22/31] Updated registration legal links removed server rules, updated all localizations for "checkbox_agreement_html" --- app/views/about/_registration.html.haml | 2 +- app/views/auth/registrations/new.html.haml | 2 +- config/locales/ca.yml | 2 +- config/locales/co.yml | 2 +- config/locales/cs.yml | 2 +- config/locales/de.yml | 2 +- config/locales/el.yml | 2 +- config/locales/en.yml | 2 +- config/locales/en_GB.yml | 2 +- config/locales/eo.yml | 2 +- config/locales/fa.yml | 2 +- config/locales/gl.yml | 2 +- config/locales/ja.yml | 2 +- config/locales/ko.yml | 2 +- config/locales/nl.yml | 2 +- config/locales/oc.yml | 2 +- config/locales/pl.yml | 2 +- config/locales/pt-BR.yml | 2 +- config/locales/ru.yml | 2 +- config/locales/sk.yml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index 0f7bd4d0..8f63f91a 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -16,7 +16,7 @@ = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false .fields-group - = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: homepage_path, about_tos_path: about_tos_path), disabled: closed_registrations? + = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', about_tos_path: about_tos_path), disabled: closed_registrations? .actions = f.button :button, sign_up_message, type: :submit, class: 'button button-primary', disabled: closed_registrations? diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index f3d27cee..40d57b67 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -33,7 +33,7 @@ = f.input :invite_code, as: :hidden .fields-group - = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: about_privacy_path, about_tos_path: about_tos_path) + = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', about_tos_path: about_tos_path) .actions = f.button :button, @invite.present? ? t('auth.register') : sign_up_message, type: :submit diff --git a/config/locales/ca.yml b/config/locales/ca.yml index bfa7f176..0f6d5c0d 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -515,7 +515,7 @@ ca: auth: apply_for_account: Demana una invitació change_password: Contrasenya - checkbox_agreement_html: Estic d'acord amb les normes del servidor i els termes del servei + checkbox_agreement_html: Estic d’acord amb els termes del servei. confirm_email: Confirmar correu electrònic delete_account: Suprimeix el compte delete_account_html: Si vols suprimir el compte pots fer-ho aquí. Se't demanarà confirmació. diff --git a/config/locales/co.yml b/config/locales/co.yml index e6caa923..e60bf696 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -515,7 +515,7 @@ co: auth: apply_for_account: Dumandà un'invitazione change_password: Chjave d’accessu - checkbox_agreement_html: Sò d'accunsentu cù e regule di u servore è i termini di u serviziu + checkbox_agreement_html: Sò in conformità à a termina di u serviziu confirm_email: Cunfirmà l’e-mail delete_account: Sguassà u contu delete_account_html: S’è voi vulete toglie u vostru contu ghjè quì. Duverete cunfirmà a vostra scelta. diff --git a/config/locales/cs.yml b/config/locales/cs.yml index ecde64a1..04df996c 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -521,7 +521,7 @@ cs: auth: apply_for_account: Vyžádat si pozvánku change_password: Heslo - checkbox_agreement_html: Souhlasím s pravidly serveru a podmínkami používání + checkbox_agreement_html: Souhlasím s Smluvními podmínkami confirm_email: Potvrdit e-mail delete_account: Odstranit účet delete_account_html: Chcete-li odstranit svůj účet, pokračujte zde. Budete požádán/a o potvrzení. diff --git a/config/locales/de.yml b/config/locales/de.yml index d2b64a3b..d5c77be3 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -515,7 +515,7 @@ de: auth: apply_for_account: Eine Einladung anfragen change_password: Passwort - checkbox_agreement_html: Ich akzeptiere die Server-Regeln und die Nutzungsbedingungen + checkbox_agreement_html: Ich akzeptiere die Nutzungsbedingungen confirm_email: E-Mail bestätigen delete_account: Konto löschen delete_account_html: Falls du dein Konto löschen willst, kannst du hier damit fortfahren. Du wirst um Bestätigung gebeten werden. diff --git a/config/locales/el.yml b/config/locales/el.yml index af6a88e4..56fdc013 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -508,7 +508,7 @@ el: auth: apply_for_account: Αίτηση πρόσκλησης change_password: Συνθηματικό - checkbox_agreement_html: Συμφωνώ με τους κανονισμούς του κόμβου και τους όρους χρήσης + checkbox_agreement_html: Συμφωνώ με τους όρους χρήσης confirm_email: Επιβεβαίωση email delete_account: Διαγραφή email delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς να συνεχίσεις εδώ. Θα σου ζητηθεί επιβεβαίωση. diff --git a/config/locales/en.yml b/config/locales/en.yml index ae3484c0..56a785c8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -523,7 +523,7 @@ en: auth: apply_for_account: Request an invite change_password: Password - checkbox_agreement_html: I agree to the server rules and terms of service + checkbox_agreement_html: I agree to the Terms of Service. confirm_email: Confirm email delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml index 0c2625bb..ccc2017f 100644 --- a/config/locales/en_GB.yml +++ b/config/locales/en_GB.yml @@ -508,7 +508,7 @@ en_GB: auth: apply_for_account: Request an invite change_password: Password - checkbox_agreement_html: I agree to the Terms of Service + checkbox_agreement_html: I agree to the Terms of Service. confirm_email: Confirm email delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. diff --git a/config/locales/eo.yml b/config/locales/eo.yml index ac4a8f9f..be2779b1 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -509,7 +509,7 @@ eo: auth: apply_for_account: Peti inviton change_password: Pasvorto - checkbox_agreement_html: Mi samopinii al la Servo reguloj kaj kondiĉo al servadon + checkbox_agreement_html: Mi konsentas kun la kondiĉoj de servo confirm_email: Konfirmi retadreson delete_account: Forigi konton delete_account_html: Se vi deziras forigi vian konton, vi povas fari tion ĉi tie. Vi bezonos konfirmi vian peton. diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 8fda7d98..8b6115e2 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -508,7 +508,7 @@ fa: auth: apply_for_account: درخواست دعوت‌نامه change_password: رمز - checkbox_agreement_html: من قانون‌های این سرور و شرایط کاربری را می‌پذیرم + checkbox_agreement_html: من شرایط استفاده را قبول میکنم. confirm_email: تأیید ایمیل delete_account: پاک‌کردن حساب delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از این‌جا پیش بروید. از شما درخواست تأیید خواهد شد. diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 5ff3b976..3b29db9e 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -508,7 +508,7 @@ gl: auth: apply_for_account: Solicite un convite change_password: Contrasinal - checkbox_agreement_html: Acepto as regras do servidor e os termos do servizo + checkbox_agreement_html: Acepto as termos do servizo confirm_email: Confirmar correo-e delete_account: Eliminar conta delete_account_html: Se desexa eliminar a súa conta, pode facelo aquí. Pediráselle confirmación. diff --git a/config/locales/ja.yml b/config/locales/ja.yml index c5fa19f4..1943f0c5 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -515,7 +515,7 @@ ja: auth: apply_for_account: 登録を申請する change_password: パスワード - checkbox_agreement_html: サーバーのルールプライバシーポリシー に同意します + checkbox_agreement_html: 利用規約に同意します confirm_email: メールアドレスの確認 delete_account: アカウントの削除 delete_account_html: アカウントを削除したい場合、こちら から手続きが行えます。削除する前に、確認画面があります。 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 4f81ddb3..ec21c538 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -517,7 +517,7 @@ ko: auth: apply_for_account: 가입 요청하기 change_password: 패스워드 - checkbox_agreement_html: 서버 규칙이용약관에 동의합니다 + checkbox_agreement_html: 이용 약관 에 동의합니다. confirm_email: 확인 메일 승인 delete_account: 계정 삭제 delete_account_html: 계정을 삭제하고 싶은 경우, 여기서 삭제할 수 있습니다. 삭제 전 확인 화면이 표시됩니다. diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 257b88b8..d8b990d5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -515,7 +515,7 @@ nl: auth: apply_for_account: Een uitnodiging aanvragen change_password: Wachtwoord - checkbox_agreement_html: Ik ga akkoord met de regels van deze server en de gebruiksvoorwaarden + checkbox_agreement_html: Ik ga akkoord met de Servicevoorwaarden confirm_email: E-mail bevestigen delete_account: Account verwijderen delete_account_html: Wanneer je jouw account graag wilt verwijderen, kun je dat hier doen. We vragen jou daar om een bevestiging. diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 64bfb485..17a988ec 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -500,7 +500,7 @@ oc: auth: apply_for_account: Demandar una invitacion change_password: Senhal - checkbox_agreement_html: Accepti las règlas del servidor e los tèrmes del servici + checkbox_agreement_html: Accepti la los tèrmes del servici confirm_email: Confirmar lo corrièl delete_account: Suprimir lo compte delete_account_html: Se volètz suprimir vòstre compte, podètz o far aquí. Vos demandarem que confirmetz. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index cd77ee85..332a84e8 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -521,7 +521,7 @@ pl: auth: apply_for_account: Poproś o zaproszenie change_password: Hasło - checkbox_agreement_html: Zgadzam się z regułami serwera i zasadami korzystania z usługi + checkbox_agreement_html: Zgadzam się z Warunkami korzystania z usługi confirm_email: Potwierdź adres e-mail delete_account: Usunięcie konta delete_account_html: Jeżeli chcesz usunąć konto, przejdź tutaj. Otrzymasz prośbę o potwierdzenie. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9abbd016..08d06f89 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -515,7 +515,7 @@ pt-BR: auth: apply_for_account: Pedir um convite change_password: Senha - checkbox_agreement_html: Eu concordo com as regras do servidor e com os termos de serviço + checkbox_agreement_html: Concordo com os Termos de Serviço confirm_email: Confirmar e-mail delete_account: Excluir conta delete_account_html: Se você deseja excluir a sua conta, você pode prosseguir para cá. Uma confirmação será requisitada. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index a1eeb5f4..8bbebd2f 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -527,7 +527,7 @@ ru: auth: apply_for_account: Запросить приглашение change_password: Пароль - checkbox_agreement_html: Я соглашаюсь с правилами сервера и Условиями использования + checkbox_agreement_html: Я согласен с Условиями использования confirm_email: Подтвердите email delete_account: Удалить аккаунт delete_account_html: Если Вы хотите удалить свой аккаунт, вы можете перейти сюда. У Вас будет запрошено подтверждение. diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 1dc8910e..1d725b3b 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -517,7 +517,7 @@ sk: auth: apply_for_account: Vyžiadaj si pozvánku change_password: Heslo - checkbox_agreement_html: Súhlasím s pravidlami servera, aj s prevoznými podmienkami + checkbox_agreement_html: Súhlasím s Zmluvnými podmienkami confirm_email: Potvrď email delete_account: Vymaž účet delete_account_html: Pokiaľ chceš svoj účet odtiaľto vymazať, môžeš tak urobiť tu. Budeš požiadaný/á o potvrdenie tohto kroku. From ee433f57fba12123a5d0c7d5d592bec84387a85e Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 16:10:24 -0400 Subject: [PATCH 23/31] Removed unused import in unauthorized_modal --- .../gabsocial/features/ui/components/unauthorized_modal.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js b/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js index 91cd49c9..adedd595 100644 --- a/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js +++ b/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js @@ -6,7 +6,6 @@ import { me } from '../../../initial_state'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Avatar from '../../../components/avatar'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import ComposeFormContainer from '../../compose/containers/compose_form_container'; import IconButton from 'gabsocial/components/icon_button'; const messages = defineMessages({ From dfb8d53785e20dc438a1d0ba71581180c0280021 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 16:26:06 -0400 Subject: [PATCH 24/31] Updated CommunityTimeline to add option for "all federated" content added a toggle for showing only gab (off) or all fediverse content (on) --- .../components/column_settings.js | 1 + .../features/community_timeline/index.js | 81 +++++++++++++------ 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/app/javascript/gabsocial/features/community_timeline/components/column_settings.js b/app/javascript/gabsocial/features/community_timeline/components/column_settings.js index 7adeb674..66e9269f 100644 --- a/app/javascript/gabsocial/features/community_timeline/components/column_settings.js +++ b/app/javascript/gabsocial/features/community_timeline/components/column_settings.js @@ -20,6 +20,7 @@ class ColumnSettings extends React.PureComponent {
} /> + } />
); diff --git a/app/javascript/gabsocial/features/community_timeline/index.js b/app/javascript/gabsocial/features/community_timeline/index.js index d987d55c..6b59339c 100644 --- a/app/javascript/gabsocial/features/community_timeline/index.js +++ b/app/javascript/gabsocial/features/community_timeline/index.js @@ -4,19 +4,34 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import PropTypes from 'prop-types'; import StatusListContainer from '../ui/containers/status_list_container'; import Column from '../../components/column'; -import { expandCommunityTimeline } from '../../actions/timelines'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectCommunityStream } from '../../actions/streaming'; import HomeColumnHeader from '../../components/home_column_header'; +import { + expandCommunityTimeline, + expandPublicTimeline, +} from '../../actions/timelines'; +import { + connectCommunityStream, + connectPublicStream, +} from '../../actions/streaming'; const messages = defineMessages({ - title: { id: 'column.community', defaultMessage: 'Local timeline' }, + title: { id: 'column.community', defaultMessage: 'Community timeline' }, }); -const mapStateToProps = (state, { onlyMedia }) => ({ - hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0, - onlyMedia: state.getIn(['settings', 'community', 'other', 'onlyMedia']), -}); +const mapStateToProps = state => { + const allFediverse = state.getIn(['settings', 'community', 'other', 'allFediverse']); + const onlyMedia = state.getIn(['settings', 'community', 'other', 'onlyMedia']); + + const timelineId = allFediverse ? 'public' : 'community'; + + return { + timelineId, + allFediverse, + onlyMedia, + hasUnread: state.getIn(['timelines', `${timelineId}${onlyMedia ? ':media' : ''}`, 'unread']) > 0, + }; +}; export default @connect(mapStateToProps) @injectIntl @@ -28,6 +43,7 @@ class CommunityTimeline extends React.PureComponent { static defaultProps = { onlyMedia: false, + allFediverse: false, }; static propTypes = { @@ -35,22 +51,37 @@ class CommunityTimeline extends React.PureComponent { intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, onlyMedia: PropTypes.bool, + allFediverse: PropTypes.bool, + timelineId: PropTypes.string, }; componentDidMount () { - const { dispatch, onlyMedia } = this.props; + const { dispatch, onlyMedia, allFediverse } = this.props; - dispatch(expandCommunityTimeline({ onlyMedia })); - this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + if (allFediverse) { + dispatch(expandPublicTimeline({ onlyMedia })); + this.disconnect = dispatch(connectPublicStream({ onlyMedia })); + } + else { + dispatch(expandCommunityTimeline({ onlyMedia })); + this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + } } componentDidUpdate (prevProps) { - if (prevProps.onlyMedia !== this.props.onlyMedia) { - const { dispatch, onlyMedia } = this.props; + if (prevProps.onlyMedia !== this.props.onlyMedia || prevProps.allFediverse !== this.props.allFediverse) { + const { dispatch, onlyMedia, allFediverse } = this.props; this.disconnect(); - dispatch(expandCommunityTimeline({ onlyMedia })); - this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + + if (allFediverse) { + dispatch(expandPublicTimeline({ onlyMedia })); + this.disconnect = dispatch(connectPublicStream({ onlyMedia })); + } + else { + dispatch(expandCommunityTimeline({ onlyMedia })); + this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + } } } @@ -62,27 +93,29 @@ class CommunityTimeline extends React.PureComponent { } handleLoadMore = maxId => { - const { dispatch, onlyMedia } = this.props; + const { dispatch, onlyMedia, allFediverse } = this.props; - dispatch(expandCommunityTimeline({ maxId, onlyMedia })); + if (allFediverse) { + dispatch(expandPublicTimeline({ maxId, onlyMedia })); + } + else { + dispatch(expandCommunityTimeline({ maxId, onlyMedia })); + } } render () { - const { intl, hasUnread, onlyMedia } = this.props; + const { intl, hasUnread, onlyMedia, timelineId, allFediverse } = this.props; return ( - + } + emptyMessage={} /> ); From 8f13fe05158e7dc585db0b33f0451fd429ccb94a Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 16:27:59 -0400 Subject: [PATCH 25/31] Removed unused PublicTimeline component now that this functionality is within the CommunityTimeline component from: dfb8d53 --- .../containers/column_settings_container.js | 17 ---- .../features/public_timeline/index.js | 93 ------------------- .../features/ui/util/async-components.js | 4 - 3 files changed, 114 deletions(-) delete mode 100644 app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js delete mode 100644 app/javascript/gabsocial/features/public_timeline/index.js diff --git a/app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js b/app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js deleted file mode 100644 index b8abeb27..00000000 --- a/app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js +++ /dev/null @@ -1,17 +0,0 @@ -import { connect } from 'react-redux'; -import ColumnSettings from '../../community_timeline/components/column_settings'; -import { changeSetting } from '../../../actions/settings'; - -const mapStateToProps = state => ({ - settings: state.getIn(['settings', 'public']), -}); - -const mapDispatchToProps = dispatch => { - return { - onChange (key, checked) { - dispatch(changeSetting(['public', ...key], checked)); - }, - }; -}; - -export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings); diff --git a/app/javascript/gabsocial/features/public_timeline/index.js b/app/javascript/gabsocial/features/public_timeline/index.js deleted file mode 100644 index da40ca81..00000000 --- a/app/javascript/gabsocial/features/public_timeline/index.js +++ /dev/null @@ -1,93 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import PropTypes from 'prop-types'; -import StatusListContainer from '../ui/containers/status_list_container'; -import Column from '../../components/column'; -import ColumnHeader from '../../components/column_header'; -import { expandPublicTimeline } from '../../actions/timelines'; -import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectPublicStream } from '../../actions/streaming'; - -const messages = defineMessages({ - title: { id: 'column.public', defaultMessage: 'Federated timeline' }, -}); - -const mapStateToProps = (state, { onlyMedia }) => { - const columns = state.getIn(['settings', 'columns']); - - return { - hasUnread: state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`, 'unread']) > 0, - onlyMedia: state.getIn(['settings', 'public', 'other', 'onlyMedia']), - }; -}; - -export default @connect(mapStateToProps) -@injectIntl -class PublicTimeline extends React.PureComponent { - - static contextTypes = { - router: PropTypes.object, - }; - - static defaultProps = { - onlyMedia: false, - }; - - static propTypes = { - dispatch: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - hasUnread: PropTypes.bool, - onlyMedia: PropTypes.bool, - }; - - componentDidMount () { - const { dispatch, onlyMedia } = this.props; - - dispatch(expandPublicTimeline({ onlyMedia })); - this.disconnect = dispatch(connectPublicStream({ onlyMedia })); - } - - componentDidUpdate (prevProps) { - if (prevProps.onlyMedia !== this.props.onlyMedia) { - const { dispatch, onlyMedia } = this.props; - - this.disconnect(); - dispatch(expandPublicTimeline({ onlyMedia })); - this.disconnect = dispatch(connectPublicStream({ onlyMedia })); - } - } - - componentWillUnmount () { - if (this.disconnect) { - this.disconnect(); - this.disconnect = null; - } - } - - handleLoadMore = maxId => { - const { dispatch, onlyMedia } = this.props; - - dispatch(expandPublicTimeline({ maxId, onlyMedia })); - } - - render () { - const { intl, hasUnread, onlyMedia } = this.props; - - return ( - - - - - - } - /> - - ); - } - -} diff --git a/app/javascript/gabsocial/features/ui/util/async-components.js b/app/javascript/gabsocial/features/ui/util/async-components.js index 4705a9b7..996a8492 100644 --- a/app/javascript/gabsocial/features/ui/util/async-components.js +++ b/app/javascript/gabsocial/features/ui/util/async-components.js @@ -14,10 +14,6 @@ export function HomeTimeline () { return import(/* webpackChunkName: "features/home_timeline" */'../../home_timeline'); } -export function PublicTimeline () { - return import(/* webpackChunkName: "features/public_timeline" */'../../public_timeline'); -} - export function CommunityTimeline () { return import(/* webpackChunkName: "features/community_timeline" */'../../community_timeline'); } From 1c8273e9e61156be6e453e3de9d42215a03010a4 Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Fri, 12 Jul 2019 16:29:17 -0400 Subject: [PATCH 26/31] Removed unused imports --- app/javascript/gabsocial/features/ui/components/columns_area.js | 2 +- app/javascript/gabsocial/features/ui/index.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/javascript/gabsocial/features/ui/components/columns_area.js b/app/javascript/gabsocial/features/ui/components/columns_area.js index 318d3392..361291ef 100644 --- a/app/javascript/gabsocial/features/ui/components/columns_area.js +++ b/app/javascript/gabsocial/features/ui/components/columns_area.js @@ -12,7 +12,7 @@ import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; import BundleColumnError from './bundle_column_error'; -import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; +import { Compose, Notifications, HomeTimeline, CommunityTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; import Icon from 'gabsocial/components/icon'; const messages = defineMessages({ diff --git a/app/javascript/gabsocial/features/ui/index.js b/app/javascript/gabsocial/features/ui/index.js index 9c46d2ba..1b341552 100644 --- a/app/javascript/gabsocial/features/ui/index.js +++ b/app/javascript/gabsocial/features/ui/index.js @@ -29,7 +29,6 @@ import SearchPage from 'gabsocial/pages/search_page'; import HomePage from 'gabsocial/pages/home_page'; import { - Compose, Status, GettingStarted, CommunityTimeline, From 0a95b2df66c38267f0df47460d9831b63044495e Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Sun, 14 Jul 2019 03:03:29 -0400 Subject: [PATCH 27/31] two more federation fixes --- app/lib/ostatus/activity/creation.rb | 2 +- app/lib/ostatus/atom_serializer.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb index cede5750..2b258afe 100644 --- a/app/lib/ostatus/activity/creation.rb +++ b/app/lib/ostatus/activity/creation.rb @@ -90,7 +90,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base end def visibility_scope - @xml.at_xpath('./gabsocial:scope', gabsocial: OStatus::TagManager::MTDN_XMLNS)&.content&.to_sym || :public + @xml.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content&.to_sym || :public end def published diff --git a/app/lib/ostatus/atom_serializer.rb b/app/lib/ostatus/atom_serializer.rb index 1967dcb1..17115444 100644 --- a/app/lib/ostatus/atom_serializer.rb +++ b/app/lib/ostatus/atom_serializer.rb @@ -32,7 +32,7 @@ class OStatus::AtomSerializer append_element(author, 'poco:preferredUsername', account.username) append_element(author, 'poco:displayName', account.display_name) if account.display_name? append_element(author, 'poco:note', account.local? ? account.note : strip_tags(account.note)) if account.note? - append_element(author, 'gabsocial:scope', account.locked? ? :private : :public) + append_element(author, 'mastodon:scope', account.locked? ? :private : :public) author end @@ -345,7 +345,7 @@ class OStatus::AtomSerializer parent['xmlns:poco'] = OStatus::TagManager::POCO_XMLNS parent['xmlns:media'] = OStatus::TagManager::MEDIA_XMLNS parent['xmlns:ostatus'] = OStatus::TagManager::OS_XMLNS - parent['xmlns:gabsocial'] = OStatus::TagManager::MTDN_XMLNS + parent['xmlns:mastodon'] = OStatus::TagManager::MTDN_XMLNS end def serialize_status_attributes(entry, status) @@ -369,7 +369,7 @@ class OStatus::AtomSerializer end append_element(entry, 'category', nil, term: 'nsfw') if status.sensitive? && status.media_attachments.any? - append_element(entry, 'gabsocial:scope', status.visibility) + append_element(entry, 'mastodon:scope', status.visibility) status.emojis.each do |emoji| append_element(entry, 'link', nil, rel: :emoji, href: full_asset_url(emoji.image.url), name: emoji.shortcode) From c804d6d43832eeb82c3065f274f65ed5f775e17a Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Sun, 14 Jul 2019 03:22:03 -0400 Subject: [PATCH 28/31] federation fix --- app/models/remote_profile.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/remote_profile.rb b/app/models/remote_profile.rb index d79b8eb8..742d2b56 100644 --- a/app/models/remote_profile.rb +++ b/app/models/remote_profile.rb @@ -30,7 +30,7 @@ class RemoteProfile end def scope - @scope ||= author.at_xpath('./gabsocial:scope', gabsocial: OStatus::TagManager::MTDN_XMLNS)&.content + @scope ||= author.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content end def avatar From 6226cc1dfd96c94a360afe5d92076db7c76e3937 Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Sun, 14 Jul 2019 03:22:15 -0400 Subject: [PATCH 29/31] intents fix --- app/controllers/intents_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/intents_controller.rb b/app/controllers/intents_controller.rb index 41f13486..9f41cf48 100644 --- a/app/controllers/intents_controller.rb +++ b/app/controllers/intents_controller.rb @@ -5,7 +5,7 @@ class IntentsController < ApplicationController rescue_from Addressable::URI::InvalidURIError, with: :handle_invalid_uri def show - if uri.scheme == 'web+gabsocial' + if uri.scheme == 'web+mastodon' case uri.host when 'follow' return redirect_to authorize_interaction_path(uri: uri.query_values['uri'].gsub(/\Aacct:/, '')) From eed65d2d045b65aebb8ac59f350afffc54f9ec3c Mon Sep 17 00:00:00 2001 From: Dank Gabs Date: Tue, 16 Jul 2019 00:07:51 -0400 Subject: [PATCH 30/31] Changed the method of adding main navigation icons. Created a png sprite sized @2x based on largest usage (for retina). This will fix some rendering issues caused by using svg images. It will allow adding depth and more color / shading if we choose later. --- .../features/ui/components/tabs_bar.js | 6 +- .../images/gab-icons/icon-explore-00d177.svg | 1 - .../images/gab-icons/icon-explore-d8d8d8.svg | 1 - .../images/gab-icons/icon-explore-sprite.svg | 1 - .../images/gab-icons/icon-home-00d177.svg | 1 - .../images/gab-icons/icon-home-d8d8d8.svg | 1 - .../images/gab-icons/icon-home-sprite.svg | 1 - .../images/gab-icons/icon-messages-00d177.svg | 1 - .../images/gab-icons/icon-messages-d8d8d8.svg | 1 - .../images/gab-icons/icon-messages-sprite.svg | 1 - .../images/gab-icons/icon-new-gab.svg | 1 - .../gab-icons/icon-notifications-00d177.svg | 1 - .../gab-icons/icon-notifications-d8d8d8.svg | 1 - .../gab-icons/icon-notifications-sprite.svg | 1 - .../images/gab-icons/icon-search-sprite.svg | 1 - .../images/sprite-main-navigation-links.png | Bin 0 -> 31526 bytes .../styles/gabsocial/components/tabs-bar.scss | 129 +++++++++++------- 17 files changed, 83 insertions(+), 66 deletions(-) delete mode 100644 app/javascript/images/gab-icons/icon-explore-00d177.svg delete mode 100644 app/javascript/images/gab-icons/icon-explore-d8d8d8.svg delete mode 100644 app/javascript/images/gab-icons/icon-explore-sprite.svg delete mode 100644 app/javascript/images/gab-icons/icon-home-00d177.svg delete mode 100644 app/javascript/images/gab-icons/icon-home-d8d8d8.svg delete mode 100644 app/javascript/images/gab-icons/icon-home-sprite.svg delete mode 100644 app/javascript/images/gab-icons/icon-messages-00d177.svg delete mode 100644 app/javascript/images/gab-icons/icon-messages-d8d8d8.svg delete mode 100644 app/javascript/images/gab-icons/icon-messages-sprite.svg delete mode 100644 app/javascript/images/gab-icons/icon-new-gab.svg delete mode 100644 app/javascript/images/gab-icons/icon-notifications-00d177.svg delete mode 100644 app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg delete mode 100644 app/javascript/images/gab-icons/icon-notifications-sprite.svg delete mode 100644 app/javascript/images/gab-icons/icon-search-sprite.svg create mode 100644 app/javascript/images/sprite-main-navigation-links.png diff --git a/app/javascript/gabsocial/features/ui/components/tabs_bar.js b/app/javascript/gabsocial/features/ui/components/tabs_bar.js index 81c4cffe..41ca1fb9 100644 --- a/app/javascript/gabsocial/features/ui/components/tabs_bar.js +++ b/app/javascript/gabsocial/features/ui/components/tabs_bar.js @@ -24,9 +24,9 @@ export const privateLinks = [ , - // - // - // , + + + , , diff --git a/app/javascript/images/gab-icons/icon-explore-00d177.svg b/app/javascript/images/gab-icons/icon-explore-00d177.svg deleted file mode 100644 index 4d38ecfb..00000000 --- a/app/javascript/images/gab-icons/icon-explore-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -icon-explore-00d177 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-explore-d8d8d8.svg b/app/javascript/images/gab-icons/icon-explore-d8d8d8.svg deleted file mode 100644 index 8b168c5b..00000000 --- a/app/javascript/images/gab-icons/icon-explore-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -icon-explore-d8d8d8 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-explore-sprite.svg b/app/javascript/images/gab-icons/icon-explore-sprite.svg deleted file mode 100644 index e078899b..00000000 --- a/app/javascript/images/gab-icons/icon-explore-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-explore-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-home-00d177.svg b/app/javascript/images/gab-icons/icon-home-00d177.svg deleted file mode 100644 index a6472761..00000000 --- a/app/javascript/images/gab-icons/icon-home-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -navigation-icon-master \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-home-d8d8d8.svg b/app/javascript/images/gab-icons/icon-home-d8d8d8.svg deleted file mode 100644 index 0f9f8556..00000000 --- a/app/javascript/images/gab-icons/icon-home-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -navigation-icon-master \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-home-sprite.svg b/app/javascript/images/gab-icons/icon-home-sprite.svg deleted file mode 100644 index a4dfeb04..00000000 --- a/app/javascript/images/gab-icons/icon-home-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-home-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-messages-00d177.svg b/app/javascript/images/gab-icons/icon-messages-00d177.svg deleted file mode 100644 index a14e271e..00000000 --- a/app/javascript/images/gab-icons/icon-messages-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -icon-messages-00d177 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-messages-d8d8d8.svg b/app/javascript/images/gab-icons/icon-messages-d8d8d8.svg deleted file mode 100644 index 6adca67c..00000000 --- a/app/javascript/images/gab-icons/icon-messages-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -icon-messages-d8d8d8 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-messages-sprite.svg b/app/javascript/images/gab-icons/icon-messages-sprite.svg deleted file mode 100644 index 29a12ed0..00000000 --- a/app/javascript/images/gab-icons/icon-messages-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-messages-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-new-gab.svg b/app/javascript/images/gab-icons/icon-new-gab.svg deleted file mode 100644 index 1eb8be5a..00000000 --- a/app/javascript/images/gab-icons/icon-new-gab.svg +++ /dev/null @@ -1 +0,0 @@ -icon-new-gab \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-notifications-00d177.svg b/app/javascript/images/gab-icons/icon-notifications-00d177.svg deleted file mode 100644 index df635d7d..00000000 --- a/app/javascript/images/gab-icons/icon-notifications-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -icon-notifications-00d177 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg b/app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg deleted file mode 100644 index 0f4ee958..00000000 --- a/app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -icon-notifications-d8d8d8 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-notifications-sprite.svg b/app/javascript/images/gab-icons/icon-notifications-sprite.svg deleted file mode 100644 index c2fd0061..00000000 --- a/app/javascript/images/gab-icons/icon-notifications-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-notifications-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-search-sprite.svg b/app/javascript/images/gab-icons/icon-search-sprite.svg deleted file mode 100644 index e18d4c18..00000000 --- a/app/javascript/images/gab-icons/icon-search-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-search-sprite \ No newline at end of file diff --git a/app/javascript/images/sprite-main-navigation-links.png b/app/javascript/images/sprite-main-navigation-links.png new file mode 100644 index 0000000000000000000000000000000000000000..9e871b70737320f94ba64a3fc9a9d972e4106f0b GIT binary patch literal 31526 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 Date: Tue, 16 Jul 2019 00:10:14 -0400 Subject: [PATCH 31/31] Comment out the "groups" button until ready to reveal. --- app/javascript/gabsocial/features/ui/components/tabs_bar.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/gabsocial/features/ui/components/tabs_bar.js b/app/javascript/gabsocial/features/ui/components/tabs_bar.js index 41ca1fb9..09fe1b0b 100644 --- a/app/javascript/gabsocial/features/ui/components/tabs_bar.js +++ b/app/javascript/gabsocial/features/ui/components/tabs_bar.js @@ -24,9 +24,9 @@ export const privateLinks = [ , - - - , + // + // + // , ,