Merge pull request #521 from plebbit/master

Development
This commit is contained in:
Tom (plebeius.eth)
2024-09-05 21:21:05 +02:00
committed by GitHub
44 changed files with 485 additions and 83 deletions
+56
View File
@@ -1,3 +1,58 @@
## [0.2.5](https://github.com/plebbit/plebchan/compare/v0.2.4...v0.2.5) (2024-09-04)
### Bug Fixes
* **board buttons:** buttons would wrap incorrectly on small window width ([385acb0](https://github.com/plebbit/plebchan/commit/385acb08fd24eff3dac4d1f029817ceb28597f4e))
* **catalog post preview:** special characters were able to overflow ([48b55ed](https://github.com/plebbit/plebchan/commit/48b55ed972e8d20d108086175b7838f43d2983a6))
* **edit menu:** checkbox would appear dark in floating post from quote ([c354d72](https://github.com/plebbit/plebchan/commit/c354d72e0ac561291a44822ad9f84e7d8c02059b))
* **edit menu:** couldn't edit post content if post was just published ([9543f16](https://github.com/plebbit/plebchan/commit/9543f16f683d2d90041edab895a571d30a30baae))
* **edit menu:** modal position would bug out when resizing textarea to edit post content ([4858cea](https://github.com/plebbit/plebchan/commit/4858ceadc98ee367c1d81a59dce67a4c78b3df10))
* **edit menu:** remove autofocus, it caused auto scroll ([e9c7e86](https://github.com/plebbit/plebchan/commit/e9c7e868f245ec803823ca372d848debf96d9376))
* **edit menu:** textarea to edit content was too small ([d52c29f](https://github.com/plebbit/plebchan/commit/d52c29f78148fa2641c5abadd3856a10e4ae492d))
* **home:** "use catalog" button didn't work for some addresses ([5c846fc](https://github.com/plebbit/plebchan/commit/5c846fcdc8a23ead278868c92bc6c9443ea231c8))
* **home:** options modal flickered when clicked twice ([30b9152](https://github.com/plebbit/plebchan/commit/30b91521b9a3e4daef86f696b18addb7149bcff8))
* **markdown:** don't allow horizontal lines, they look confusing inside of post content ([1eb64ed](https://github.com/plebbit/plebchan/commit/1eb64ede3dfba50b9e77d47c9c4dd7f8d3db4c5d))
* **markdown:** single returns would be rendered as spaces ([495e9e2](https://github.com/plebbit/plebchan/commit/495e9e25b5f5cdb19661318f552d1b2908fba987))
* **markdown:** users couldn't include empty lines in the post content ([38790a2](https://github.com/plebbit/plebchan/commit/38790a25966aea4217550d76ef1766bd2c5abefd))
* **pending post page:** opening settings would change theme ([5095e0e](https://github.com/plebbit/plebchan/commit/5095e0e3b9cc27b0a998a4bd646a613e69f6a0e5))
* **pending post:** "[Reply]" button and post menu shouldn't be clickable ([0cb386c](https://github.com/plebbit/plebchan/commit/0cb386cf662a570c3dd5772ec50bdbba56243618))
* **popular threads box:** in each post content, one return would appear as two returns (empty lines) ([cfe8686](https://github.com/plebbit/plebchan/commit/cfe8686d94c6ad0df05fe6a240ef25b1840429be))
* **post form:** opening settings would close post form ([17f57a1](https://github.com/plebbit/plebchan/commit/17f57a1d7d0fa47aa6f5fa97c803063734615173))
* **post form:** user could post empty comment using spaces ([3d2d510](https://github.com/plebbit/plebchan/commit/3d2d510259b0e7ac4bcfecdff872d928a550709c))
* **post menu:** 'hide post' button wasn't appearing in thread page on desktop ([f7bab7c](https://github.com/plebbit/plebchan/commit/f7bab7c83e92b24220c8244f4e1f7d0754ebb1a7))
* **post menu:** 'view on (client)' link was broken on multisubs ([25722d7](https://github.com/plebbit/plebchan/commit/25722d74a3e048c03d69d924a644886fdb70310f))
* **post mobile:** tooltip for title wasn't centered ([ca0020f](https://github.com/plebbit/plebchan/commit/ca0020f2c5d360d1e77a4bfcc716bf162a1c9174))
* **post:** 'comment too long' link was broken for description and rules ([2ab7197](https://github.com/plebbit/plebchan/commit/2ab71978a7329fd0d58e0ce028332cd25b65c931))
* **post:** "c/" was clickable while post is pending ([74ddae0](https://github.com/plebbit/plebchan/commit/74ddae0ed7a9fc9b1724355d076dbdb13107c861))
* **post:** "c/Pending" could appear on first render ([2590a9c](https://github.com/plebbit/plebchan/commit/2590a9c096657ce53d016f3570189a2bc7085930))
* **post:** clicking the quotelink or backlink to a reply wouldn't scroll to the reply more than once in a row ([e1422d0](https://github.com/plebbit/plebchan/commit/e1422d005419f21ddf039c76021156679146dc91))
* **post:** deleted or removed comments still showed display name, avatar, role and ID ([b7e443d](https://github.com/plebbit/plebchan/commit/b7e443d7d3d1e7c9e79b5996e34ae856057253fc))
* **post:** don't show link if comment is removed or deleted ([068c30a](https://github.com/plebbit/plebchan/commit/068c30a3222877c816b22601920c0d03a18b7c18))
* **post:** edited timestamp showed html on mobile ([ba49060](https://github.com/plebbit/plebchan/commit/ba4906058db17c474308c501ea756ee504140f6d))
* **post:** reply backlink didn't appear in post info immediately after replying to it ([0f6b922](https://github.com/plebbit/plebchan/commit/0f6b9225165983986771a712787c30f5a5215c8d))
* **post:** some gifs would appear animated before expanded ([5a56016](https://github.com/plebbit/plebchan/commit/5a56016c85bf5f7ac78af8ce3783e71c1eb8181b))
* **replymodal:** replying didn't work from multiboard feeds (p/all, p/subscriptions) ([f6548cc](https://github.com/plebbit/plebchan/commit/f6548cc2b826ba4b80d9d7511df17891408e016a))
* **theme:** changing theme in sfw sub wouldn't change it for p/all and p/subscriptions. it should because sfw is the default ([f06c50e](https://github.com/plebbit/plebchan/commit/f06c50ef33a3b5fc82c8532c144fd87e7be291d4))
* **theme:** theme changed incorrectly in pending post page ([4e390a9](https://github.com/plebbit/plebchan/commit/4e390a9fc573610ae76249b9126a42d85b442a87))
* **use-replies:** a reply to a newly-published reply wouldn't render until propagated ([a698b22](https://github.com/plebbit/plebchan/commit/a698b222f8a22bf3a4e5850cd5328b81cebbbdfa))
### Features
* **board stats:** remember hide/show choice per subplebbit ([d482d32](https://github.com/plebbit/plebchan/commit/d482d3246744b0d7701888fa0ce18433d7798381))
* **feed:** show account comments instantly in the feed once published, instead of waiting for the feed to update ([8598d10](https://github.com/plebbit/plebchan/commit/8598d1056ee9b08cb146b129356c28c14a8ec79a))
* **markdown:** when the user is publishing a comment, automatically format it to follow markdown rules ([c521ccb](https://github.com/plebbit/plebchan/commit/c521ccbc2ebf2d4d67889a28733d07eab4b8fa7b))
* **pending post:** show board navigation, stats and post form ([cdee29e](https://github.com/plebbit/plebchan/commit/cdee29e94ffa7cb616aacd34719114d384e60278))
* **post form:** add link media info for static or animated gifs ([4103fab](https://github.com/plebbit/plebchan/commit/4103fabb12c2b7f57c6c07808af4b7c213408852))
* **post:** add button to show full comment when it's too long ([99a2197](https://github.com/plebbit/plebchan/commit/99a219733c65138616976fd3f3f71a6b90199909))
* **post:** add user ID with color specific to user address ([8dfe209](https://github.com/plebbit/plebchan/commit/8dfe2098ce14e77898805093b5ce28c610f1b098))
* **post:** show embed of link in post content even if it doesn't have a thumbnail ([09a1441](https://github.com/plebbit/plebchan/commit/09a14416c8bcbd722ebeb3bbc0b158bf12c1190b))
* **settings:** add anon mode - automatically use a different user ID in each thread ([db67a94](https://github.com/plebbit/plebchan/commit/db67a9452c048c5abc954cbae345269495ab6c65))
* **settings:** add option to hide avatars ([5b7acbc](https://github.com/plebbit/plebchan/commit/5b7acbc5689d9cebee10d0ba8661227c9996b3cf))
## [0.2.4](https://github.com/plebbit/plebchan/compare/v0.2.3...v0.2.4) (2024-07-23)
@@ -7,6 +62,7 @@
* **board title:** offline icon would appear in p/all and p/subscriptions ([38e60fd](https://github.com/plebbit/plebchan/commit/38e60fd797812756480c84d46fb81a4223efec9a))
* **catalog post:** it was not possible to scroll past the floating post preview ([9960e40](https://github.com/plebbit/plebchan/commit/9960e400e822214377842cf43789a20c5324caf8))
* **edit menu:** reason field would reset at menu close ([15462f1](https://github.com/plebbit/plebchan/commit/15462f14ede7b0b3920ae62305b2bc3b112476da))
* **electron:** download url redirect status code changed ([c63b950](https://github.com/plebbit/plebchan/commit/c63b9507dec80626d22dbeb7d5663ea647b0358f))
* **iframe:** background was white in tomorrow theme ([8d766cc](https://github.com/plebbit/plebchan/commit/8d766cc9e3b1bf668b02fcaa651678b4cb125b38))
* **markdown:** bullet point lists were bugged ([9552938](https://github.com/plebbit/plebchan/commit/9552938b6de5fd3d860cca8c9335ce6f1487adbb))
* **post menu:** block button was visible for description and rules ([4ffd750](https://github.com/plebbit/plebchan/commit/4ffd75010d53dbf068fd6e4040954a6902163d10))
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "plebchan",
"version": "0.2.4",
"version": "0.2.5",
"description": "A GUI for plebbit similar to 4chan",
"type": "module",
"author": "plebeius.eth",
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "وضع مجهول",
"anon_mode_description": "يتم استخدام معرف مستخدم مختلف تلقائيًا في كل موضوع",
"pending": "قيد الانتظار",
"failed": "فشل"
"failed": "فشل",
"add": "أضف",
"pattern": "نمط",
"enable": "تفعيل",
"order": "ترتيب"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "অজ্ঞাত মোড",
"anon_mode_description": "প্রতিটি থ্রেডে স্বয়ংক্রিয়ভাবে একটি ভিন্ন ব্যবহারকারীর আইডি ব্যবহার করুন",
"pending": "অপেক্ষমাণ",
"failed": "ব্যর্থ"
"failed": "ব্যর্থ",
"add": "যোগ করুন",
"pattern": "প্যাটার্ন",
"enable": "সক্রিয় করুন",
"order": "অর্ডার"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonymní režim",
"anon_mode_description": "Automaticky používejte jiný uživatelský ID v každém vlákně",
"pending": "Čeká na schválení",
"failed": "Nepodařilo se"
"failed": "Nepodařilo se",
"add": "Přidat",
"pattern": "Vzor",
"enable": "Povolit",
"order": "Pořadí"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonim tilstand",
"anon_mode_description": "Brug automatisk en anden bruger-ID i hver tråd",
"pending": "Afventer",
"failed": "Mislykkedes"
"failed": "Mislykkedes",
"add": "Tilføj",
"pattern": "Mønster",
"enable": "Aktiver",
"order": "Rækkefølge"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonymer Modus",
"anon_mode_description": "Verwenden Sie automatisch eine andere Benutzer-ID in jedem Thread",
"pending": "Ausstehend",
"failed": "Fehlgeschlagen"
"failed": "Fehlgeschlagen",
"add": "Hinzufügen",
"pattern": "Muster",
"enable": "Aktivieren",
"order": "Reihenfolge"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Λειτουργία ανωνυμίας",
"anon_mode_description": "Χρησιμοποιήστε αυτόματα διαφορετικό αναγνωριστικό χρήστη σε κάθε νήμα",
"pending": "Σε εκκρεμότητα",
"failed": "Απέτυχε"
"failed": "Απέτυχε",
"add": "Προσθήκη",
"pattern": "Μοτίβο",
"enable": "Ενεργοποιήστε",
"order": "Σειρά"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anon mode",
"anon_mode_description": "Automatically use a different user ID in each thread",
"pending": "Pending",
"failed": "Failed"
"failed": "Failed",
"add": "Add",
"pattern": "Pattern",
"enable": "Enable",
"order": "Order"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Modo anónimo",
"anon_mode_description": "Utiliza automáticamente un ID de usuario diferente en cada hilo",
"pending": "Pendiente",
"failed": "Fallido"
"failed": "Fallido",
"add": "Añadir",
"pattern": "Patrón",
"enable": "Habilitar",
"order": "Orden"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "حالت ناشناس",
"anon_mode_description": "به طور خودکار از یک شناسه کاربری متفاوت در هر موضوع استفاده کنید",
"pending": "در انتظار",
"failed": "ناموفق"
"failed": "ناموفق",
"add": "اضافه کردن",
"pattern": "الگو",
"enable": "فعال کردن",
"order": "ترتیب"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonyymi tila",
"anon_mode_description": "Käytä automaattisesti eri käyttäjä-ID:tä jokaisessa keskustelussa",
"pending": "Odottaa",
"failed": "Epäonnistui"
"failed": "Epäonnistui",
"add": "Lisää",
"pattern": "Malli",
"enable": "Ota käyttöön",
"order": "Järjestys"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anong mode",
"anon_mode_description": "Awtomatikong gamitin ang ibang user ID sa bawat thread",
"pending": "Naghihintay",
"failed": "Nabigo"
"failed": "Nabigo",
"add": "Idagdag",
"pattern": "Pattern",
"enable": "I-enable",
"order": "Kaayusan"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mode anonyme",
"anon_mode_description": "Utilisez automatiquement un identifiant utilisateur différent dans chaque fil",
"pending": "En attente",
"failed": "Échoué"
"failed": "Échoué",
"add": "Ajouter",
"pattern": "Modèle",
"enable": "Activer",
"order": "Ordre"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "מצב אנונימי",
"anon_mode_description": "השתמש אוטומטית במזהה משתמש שונה בכל שרשור",
"pending": "ממתין",
"failed": "נכשל"
"failed": "נכשל",
"add": "הוסף",
"pattern": "תבנית",
"enable": "הפעל",
"order": "סדר"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "अनाम मोड",
"anon_mode_description": "प्रत्येक थ्रेड में स्वचालित रूप से एक अलग उपयोगकर्ता आईडी का उपयोग करें",
"pending": "लंबित",
"failed": "असफल"
"failed": "असफल",
"add": "जोड़ें",
"pattern": "पैटर्न",
"enable": "सक्षम करें",
"order": "क्रम"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonim mód",
"anon_mode_description": "Automatikusan használjon más felhasználói azonosítót minden szálban",
"pending": "Függőben",
"failed": "Sikertelen"
"failed": "Sikertelen",
"add": "Hozzáad",
"pattern": "Minta",
"enable": "Engedélyez",
"order": "Rendelés"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mode anonim",
"anon_mode_description": "Secara otomatis gunakan ID pengguna yang berbeda di setiap utas",
"pending": "Tertunda",
"failed": "Gagal"
"failed": "Gagal",
"add": "Tambahkan",
"pattern": "Pola",
"enable": "Aktifkan",
"order": "Urutan"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Modalità anonima",
"anon_mode_description": "Usa automaticamente un ID utente diverso in ogni thread",
"pending": "In attesa",
"failed": "Fallito"
"failed": "Fallito",
"add": "Aggiungi",
"pattern": "Modello",
"enable": "Abilita",
"order": "Ordine"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "匿名モード",
"anon_mode_description": "各スレッドで自動的に異なるユーザーIDを使用します",
"pending": "保留中",
"failed": "失敗"
"failed": "失敗",
"add": "追加",
"pattern": "パターン",
"enable": "有効にする",
"order": "順序"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "익명 모드",
"anon_mode_description": "각 스레드에서 자동으로 다른 사용자 ID를 사용합니다",
"pending": "대기 중",
"failed": "실패"
"failed": "실패",
"add": "추가",
"pattern": "패턴",
"enable": "사용",
"order": "순서"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "अनाम मोड",
"anon_mode_description": "प्रत्येक थ्रेडमध्ये स्वयंचलितपणे वेगळा वापरकर्ता ID वापरा",
"pending": "प्रलंबित",
"failed": "असफल"
"failed": "असफल",
"add": "अॅड करा",
"pattern": "पॅटर्न",
"enable": "सक्षम करा",
"order": "आदेश"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anoniem modus",
"anon_mode_description": "Gebruik automatisch een ander gebruikers-ID in elk thread",
"pending": "In afwachting",
"failed": "Mislukt"
"failed": "Mislukt",
"add": "Toevoegen",
"pattern": "Patroon",
"enable": "Inschakelen",
"order": "Volgorde"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonim modus",
"anon_mode_description": "Bruk automatisk en annen bruker-ID i hver tråd",
"pending": "Venter",
"failed": "Feilet"
"failed": "Feilet",
"add": "Legg til",
"pattern": "Mønster",
"enable": "Aktiver",
"order": "Rekkefølge"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Tryb anonimowy",
"anon_mode_description": "Automatycznie używaj innego identyfikatora użytkownika w każdym wątku",
"pending": "Oczekujące",
"failed": "Nieudane"
"failed": "Nieudane",
"add": "Dodaj",
"pattern": "Wzór",
"enable": "Włącz",
"order": "Kolejność"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Modo anônimo",
"anon_mode_description": "Use automaticamente um ID de usuário diferente em cada thread",
"pending": "Pendente",
"failed": "Falhou"
"failed": "Falhou",
"add": "Adicionar",
"pattern": "Padrão",
"enable": "Ativar",
"order": "Ordem"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mod anonim",
"anon_mode_description": "Utilizați automat un ID de utilizator diferit în fiecare fir",
"pending": "În așteptare",
"failed": "Eșuat"
"failed": "Eșuat",
"add": "Adaugă",
"pattern": "Model",
"enable": "Activare",
"order": "Ordine"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Анонимный режим",
"anon_mode_description": "Автоматически используйте другой идентификатор пользователя в каждом потоке",
"pending": "В ожидании",
"failed": "Не удалось"
"failed": "Не удалось",
"add": "Добавить",
"pattern": "Шаблон",
"enable": "Включить",
"order": "Порядок"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mënyra anonime",
"anon_mode_description": "Përdorni automatikisht një ID përdoruesi të ndryshëm në çdo temë",
"pending": "Në pritje",
"failed": "Dështuar"
"failed": "Dështuar",
"add": "Shto",
"pattern": "Model",
"enable": "Aktivizo",
"order": "Rendit"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonymt läge",
"anon_mode_description": "Använd automatiskt ett annat användar-ID i varje tråd",
"pending": "Väntande",
"failed": "Misslyckades"
"failed": "Misslyckades",
"add": "Lägg till",
"pattern": "Mönster",
"enable": "Aktivera",
"order": "Ordning"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "అనానిమస్ మోడ్",
"anon_mode_description": "ప్రతి థ్రెడ్లో ఆటోమేటిక్‌గా ఒక వేరు వినియోగదారుడి ID ఉపయోగించండి",
"pending": "అనుమతించబడాలి",
"failed": "విజయవంతం కాలేదు"
"failed": "విజయవంతం కాలేదు",
"add": "చేర్చండి",
"pattern": "ప్యాటర్న్",
"enable": "చేర్చు",
"order": "ఆర్డర్"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "โหมดนิรนาม",
"anon_mode_description": "ใช้ ID ผู้ใช้ที่แตกต่างกันโดยอัตโนมัติในแต่ละเธรด",
"pending": "รอดำเนินการ",
"failed": "ล้มเหลว"
"failed": "ล้มเหลว",
"add": "เพิ่ม",
"pattern": "รูปแบบ",
"enable": "เปิดใช้งาน",
"order": "ลำดับ"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Gizli mod",
"anon_mode_description": "Her iplikte otomatik olarak farklı bir kullanıcı ID'si kullanın",
"pending": "Beklemede",
"failed": "Başarısız"
"failed": "Başarısız",
"add": "Ekle",
"pattern": "Desen",
"enable": "Etkinleştir",
"order": "Sıra"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Режим анонімності",
"anon_mode_description": "Автоматично використовуйте інший ідентифікатор користувача в кожній гілці",
"pending": "Очікує",
"failed": "Не вдалося"
"failed": "Не вдалося",
"add": "Додати",
"pattern": "Шаблон",
"enable": "Увімкнути",
"order": "Порядок"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "خفیہ موڈ",
"anon_mode_description": "ہر تھریڈ میں خود بخود مختلف صارف آئی ڈی کا استعمال کریں",
"pending": "منتظر",
"failed": "ناکام"
"failed": "ناکام",
"add": "شامل کریں",
"pattern": "نمونہ",
"enable": "فعال کریں",
"order": "ترتیب"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Chế độ ẩn danh",
"anon_mode_description": "Tự động sử dụng ID người dùng khác nhau trong mỗi chủ đề",
"pending": "Đang chờ",
"failed": "Thất bại"
"failed": "Thất bại",
"add": "Thêm",
"pattern": "Mẫu",
"enable": "Kích hoạt",
"order": "Thứ tự"
}
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "匿名模式",
"anon_mode_description": "在每个线程中自动使用不同的用户 ID",
"pending": "待处理",
"failed": "失败"
"failed": "失败",
"add": "添加",
"pattern": "模式",
"enable": "启用",
"order": "顺序"
}
@@ -18,12 +18,16 @@
.settingsModal input[type='text'] {
outline: none;
border: 1px solid #aaa;
border: var(--reply-modal-field-input-border, revert);
padding: 2px 4px 3px;
}
.settingsModal textarea {
border: var(--reply-modal-field-input-border, revert) !important;
}
.settingsModal input[type="text"]:focus, .settingsModal textarea:focus {
border: var(--reply-modal-field-input-border-focus, revert);
border: var(--reply-modal-field-input-border-focus, revert) !important;
}
.settingsModal {
+1 -1
View File
@@ -63,7 +63,7 @@ const useCatalogFeedRows = (columnCount: number, feed: any, isFeedLoaded: boolea
}
// add subplebbit description and rules as fake posts at the top of the feed
if ((description && description.length > 0 && (showTextOnlyThreads || (!showTextOnlyThreads && suggested?.avatarUrl))) || isInAllView) {
if ((description && description.length > 0 && (showTextOnlyThreads || (!showTextOnlyThreads && suggested?.avatarUrl))) || (isInAllView && showTextOnlyThreads)) {
_feed.unshift({
isDescription: true,
subplebbitAddress: address,
+37 -17
View File
@@ -1,4 +1,10 @@
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
interface FilterItem {
text: string;
enabled: boolean;
}
interface CatalogFiltersStore {
showAdultBoards: boolean;
@@ -7,24 +13,38 @@ interface CatalogFiltersStore {
setShowGoreBoards: (value: boolean) => void;
showTextOnlyThreads: boolean;
setShowTextOnlyThreads: (value: boolean) => void;
filterText: string;
setFilterText: (value: string) => void;
filterItems: FilterItem[];
setFilterItems: (items: FilterItem[]) => void; // New method to set all filter items at once
saveAndApplyFilters: (items: FilterItem[]) => void; // Updated to accept items
}
const useCatalogFiltersStore = create<CatalogFiltersStore>((set) => ({
showTextOnlyThreads: localStorage.getItem('showTextOnlyThreads') === 'true' ? true : false,
setShowTextOnlyThreads: (value: boolean) => {
set({ showTextOnlyThreads: value });
localStorage.setItem('showTextOnlyThreads', value.toString());
},
showAdultBoards: localStorage.getItem('showAdultBoards') === 'true' ? true : false,
setShowAdultBoards: (value: boolean) => {
set({ showAdultBoards: value });
localStorage.setItem('showAdultBoards', value.toString());
},
showGoreBoards: localStorage.getItem('showGoreBoards') === 'true' ? true : false,
setShowGoreBoards: (value: boolean) => {
set({ showGoreBoards: value });
localStorage.setItem('showGoreBoards', value.toString());
},
}));
const useCatalogFiltersStore = create(
persist<CatalogFiltersStore>(
(set) => ({
showTextOnlyThreads: false,
setShowTextOnlyThreads: (value: boolean) => set({ showTextOnlyThreads: value }),
showAdultBoards: false,
setShowAdultBoards: (value: boolean) => set({ showAdultBoards: value }),
showGoreBoards: false,
setShowGoreBoards: (value: boolean) => set({ showGoreBoards: value }),
filterText: '',
setFilterText: (value: string) => set({ filterText: value }),
filterItems: [],
setFilterItems: (items: FilterItem[]) => {
const nonEmptyItems = items.filter((item) => item.text.trim() !== '');
set({ filterItems: nonEmptyItems });
},
saveAndApplyFilters: (items: FilterItem[]) => {
const nonEmptyItems = items.filter((item) => item.text.trim() !== '');
set({ filterItems: nonEmptyItems });
},
}),
{
name: 'catalog-filters-storage',
},
),
);
export default useCatalogFiltersStore;
@@ -84,7 +84,7 @@
}
.filters label {
display: block;
display: inline-block;
margin-bottom: 7px;
}
@@ -100,4 +100,67 @@
.paddingBottom {
padding-bottom: 5px;
}
}
.saveButton {
margin-left: 5px;
}
.filtersTable {
width: 100%;
border-spacing: 1px;
margin-left: auto;
margin-right: auto;
padding: 10px 2px 2px 2px;
}
.filtersTable th {
text-align: center;
font-weight: 700;
font-size: 11px;
min-width: 20px;
}
.filtersTable tbody td {
padding: 8px 0 0;
}
.filtersTable td {
text-align: center;
margin: 0;
font-size: 10pt;
}
.filtersTable input[type='checkbox'] {
display: inline-block;
margin: auto;
}
.filtersTable input[type='text'] {
margin: 0 2px;
padding: 1px;
outline: none;
border: var(--reply-modal-field-input-border, revert);
font-size: 11px;
width: 200px;
}
.filtersTable input[type='text']:focus {
border: var(--reply-modal-field-input-border-focus, revert);
}
.filtersTable span {
cursor: pointer;
}
.filtersTable tfoot td {
padding-top: 20px;
}
.addButton {
float: left;
}
.saveButton {
float: right;
}
@@ -1,10 +1,102 @@
import { useState } from 'react';
import { useState, useCallback } from 'react';
import { useLocation, useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { isAllView, isCatalogView } from '../../../lib/utils/view-utils';
import useCatalogFiltersStore from '../../../stores/use-catalog-filters-store';
import styles from './catalog-filters.module.css';
const FiltersTable = () => {
const { t } = useTranslation();
const { filterItems, saveAndApplyFilters } = useCatalogFiltersStore();
const [localFilterItems, setLocalFilterItems] = useState(filterItems);
const handleAddFilter = useCallback(() => {
setLocalFilterItems((prev) => [...prev, { text: '', enabled: true }]);
}, []);
const handleSave = useCallback(() => {
const nonEmptyFilters = localFilterItems.filter((item) => item.text.trim() !== '');
saveAndApplyFilters(nonEmptyFilters);
}, [saveAndApplyFilters, localFilterItems]);
const updateLocalFilterItem = useCallback((index: number, item: any) => {
setLocalFilterItems((prev) => prev.map((f, i) => (i === index ? item : f)));
}, []);
const removeLocalFilterItem = useCallback((index: number) => {
setLocalFilterItems((prev) => prev.filter((_, i) => i !== index));
}, []);
const moveLocalFilterItemUp = useCallback((index: number) => {
if (index === 0) return;
setLocalFilterItems((prev) => {
const newItems = [...prev];
[newItems[index - 1], newItems[index]] = [newItems[index], newItems[index - 1]];
return newItems;
});
}, []);
return (
<table className={styles.filtersTable}>
<thead>
<tr>
<th>{t('order')}</th>
<th>{t('enable')}</th>
<th>{t('pattern')}</th>
<th>{t('delete')}</th>
</tr>
</thead>
<tbody>
{localFilterItems.map((item, index) => (
<tr key={index}>
<td>
<span className={styles.orderButton} onClick={() => moveLocalFilterItemUp(index)}>
</span>
</td>
<td>
<input
type='checkbox'
className={styles.onCheckbox}
checked={item.enabled}
onChange={(e) => updateLocalFilterItem(index, { ...item, enabled: e.target.checked })}
/>
</td>
<td>
<input
type='text'
autoCorrect='off'
autoComplete='off'
spellCheck='false'
value={item.text}
onChange={(e) => updateLocalFilterItem(index, { ...item, text: e.target.value })}
/>
</td>
<td>
<span className={styles.deleteButton} onClick={() => removeLocalFilterItem(index)}>
×
</span>
</td>
</tr>
))}
</tbody>
<tfoot>
<tr>
<td colSpan={4}>
<button className={styles.addButton} onClick={handleAddFilter}>
{t('add')}
</button>
<button className={styles.saveButton} onClick={handleSave}>
{t('save')}
</button>
</td>
</tr>
</tfoot>
</table>
);
};
const FiltersModal = ({ closeModal }: { closeModal: () => void }) => {
const { t } = useTranslation();
const { showAdultBoards, setShowAdultBoards, showGoreBoards, setShowGoreBoards, showTextOnlyThreads, setShowTextOnlyThreads } = useCatalogFiltersStore();
@@ -23,25 +115,31 @@ const FiltersModal = ({ closeModal }: { closeModal: () => void }) => {
</div>
<div className={styles.filters}>
{isInCatalogView && (
<label className={`${styles.paddingBottom} capitalize`}>
<input type='checkbox' checked={!showTextOnlyThreads} onChange={(e) => setShowTextOnlyThreads(!e.target.checked)} />
{t('hide_threads_without_images')}
</label>
)}
{isInAllView && (
<div className={styles.nsfwLabels}>
<div className={styles.categoryTitle}>{t('nsfw_boards')}</div>
<label>
<input type='checkbox' checked={!showGoreBoards} onChange={(e) => setShowGoreBoards(!e.target.checked)} />
{t('hide_gore_boards')}
</label>
<label>
<input type='checkbox' checked={!showAdultBoards} onChange={(e) => setShowAdultBoards(!e.target.checked)} />
{t('hide_adult_boards')}
<div>
<label className='capitalize'>
<input type='checkbox' checked={!showTextOnlyThreads} onChange={(e) => setShowTextOnlyThreads(!e.target.checked)} />
{t('hide_threads_without_images')}
</label>
</div>
)}
{isInAllView && (
<div className={styles.nsfwLabels}>
<div>
<label>
<input type='checkbox' checked={!showGoreBoards} onChange={(e) => setShowGoreBoards(!e.target.checked)} />
hide gore content
</label>
</div>
<div>
<label>
<input type='checkbox' checked={!showAdultBoards} onChange={(e) => setShowAdultBoards(!e.target.checked)} />
hide adult content
</label>
</div>
</div>
)}
</div>
{isInCatalogView && <FiltersTable />}
</div>
</>
);
+29 -9
View File
@@ -21,12 +21,25 @@ import styles from './catalog.module.css';
const lastVirtuosoStates: { [key: string]: StateSnapshot } = {};
const catalogFilter = (comment: Comment) => {
const threadsWithImagesFilter = (comment: Comment) => {
const commentMediaInfo = getCommentMediaInfo(comment);
const hasThumbnail = getHasThumbnail(commentMediaInfo, comment?.link);
return hasThumbnail;
};
const textFilter = (comment: Comment, filterItems: any[]) => {
if (!filterItems) return true;
if (filterItems.length === 0) return true;
const titleLower = comment?.title?.toLowerCase() || '';
const contentLower = comment?.content?.toLowerCase() || '';
return filterItems.every((item) => {
if (!item.enabled) return true;
const pattern = item.text.toLowerCase();
return !(titleLower.includes(pattern) || contentLower.includes(pattern));
});
};
const Catalog = () => {
const { t } = useTranslation();
const location = useLocation();
@@ -34,7 +47,7 @@ const Catalog = () => {
const isInAllView = isAllView(location.pathname, useParams());
const defaultSubplebbits = useDefaultSubplebbits();
const { showAdultBoards, showGoreBoards } = useCatalogFiltersStore();
const { showAdultBoards, showGoreBoards, showTextOnlyThreads, filterItems } = useCatalogFiltersStore();
const account = useAccount();
const subscriptions = account?.subscriptions;
@@ -72,15 +85,22 @@ const Catalog = () => {
const postsPerPage = useMemo(() => (columnCount <= 2 ? 10 : columnCount === 3 ? 15 : columnCount === 4 ? 20 : 25), []);
const { timeFilterSeconds } = useTimeFilter();
const { showTextOnlyThreads } = useCatalogFiltersStore();
const { sortType } = useSortingStore();
const feedOptions: any = {
subplebbitAddresses,
sortType,
postsPerPage: isInAllView || isInSubscriptionsView ? 10 : postsPerPage,
filter: !showTextOnlyThreads && catalogFilter,
};
const feedOptions: any = useMemo(
() => ({
subplebbitAddresses,
sortType,
postsPerPage: isInAllView || isInSubscriptionsView ? 10 : postsPerPage,
filter: (comment: Comment) => {
if (!showTextOnlyThreads && !threadsWithImagesFilter(comment)) {
return false;
}
return textFilter(comment, filterItems);
},
}),
[subplebbitAddresses, sortType, isInAllView, isInSubscriptionsView, postsPerPage, showTextOnlyThreads, filterItems],
);
if (isInAllView || isInSubscriptionsView) {
feedOptions.newerThan = timeFilterSeconds;
+1
View File
@@ -328,6 +328,7 @@
.postMobile .postMessage {
padding: 10px;
font-size: var(--post-mobile-content-font-size);
word-break: break-word;
}
.postMobile .postLink {