mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
@@ -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
@@ -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",
|
||||
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "وضع مجهول",
|
||||
"anon_mode_description": "يتم استخدام معرف مستخدم مختلف تلقائيًا في كل موضوع",
|
||||
"pending": "قيد الانتظار",
|
||||
"failed": "فشل"
|
||||
"failed": "فشل",
|
||||
"add": "أضف",
|
||||
"pattern": "نمط",
|
||||
"enable": "تفعيل",
|
||||
"order": "ترتيب"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "অজ্ঞাত মোড",
|
||||
"anon_mode_description": "প্রতিটি থ্রেডে স্বয়ংক্রিয়ভাবে একটি ভিন্ন ব্যবহারকারীর আইডি ব্যবহার করুন",
|
||||
"pending": "অপেক্ষমাণ",
|
||||
"failed": "ব্যর্থ"
|
||||
"failed": "ব্যর্থ",
|
||||
"add": "যোগ করুন",
|
||||
"pattern": "প্যাটার্ন",
|
||||
"enable": "সক্রিয় করুন",
|
||||
"order": "অর্ডার"
|
||||
}
|
||||
@@ -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í"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "Λειτουργία ανωνυμίας",
|
||||
"anon_mode_description": "Χρησιμοποιήστε αυτόματα διαφορετικό αναγνωριστικό χρήστη σε κάθε νήμα",
|
||||
"pending": "Σε εκκρεμότητα",
|
||||
"failed": "Απέτυχε"
|
||||
"failed": "Απέτυχε",
|
||||
"add": "Προσθήκη",
|
||||
"pattern": "Μοτίβο",
|
||||
"enable": "Ενεργοποιήστε",
|
||||
"order": "Σειρά"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "حالت ناشناس",
|
||||
"anon_mode_description": "به طور خودکار از یک شناسه کاربری متفاوت در هر موضوع استفاده کنید",
|
||||
"pending": "در انتظار",
|
||||
"failed": "ناموفق"
|
||||
"failed": "ناموفق",
|
||||
"add": "اضافه کردن",
|
||||
"pattern": "الگو",
|
||||
"enable": "فعال کردن",
|
||||
"order": "ترتیب"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "מצב אנונימי",
|
||||
"anon_mode_description": "השתמש אוטומטית במזהה משתמש שונה בכל שרשור",
|
||||
"pending": "ממתין",
|
||||
"failed": "נכשל"
|
||||
"failed": "נכשל",
|
||||
"add": "הוסף",
|
||||
"pattern": "תבנית",
|
||||
"enable": "הפעל",
|
||||
"order": "סדר"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "अनाम मोड",
|
||||
"anon_mode_description": "प्रत्येक थ्रेड में स्वचालित रूप से एक अलग उपयोगकर्ता आईडी का उपयोग करें",
|
||||
"pending": "लंबित",
|
||||
"failed": "असफल"
|
||||
"failed": "असफल",
|
||||
"add": "जोड़ें",
|
||||
"pattern": "पैटर्न",
|
||||
"enable": "सक्षम करें",
|
||||
"order": "क्रम"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "匿名モード",
|
||||
"anon_mode_description": "各スレッドで自動的に異なるユーザーIDを使用します",
|
||||
"pending": "保留中",
|
||||
"failed": "失敗"
|
||||
"failed": "失敗",
|
||||
"add": "追加",
|
||||
"pattern": "パターン",
|
||||
"enable": "有効にする",
|
||||
"order": "順序"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "익명 모드",
|
||||
"anon_mode_description": "각 스레드에서 자동으로 다른 사용자 ID를 사용합니다",
|
||||
"pending": "대기 중",
|
||||
"failed": "실패"
|
||||
"failed": "실패",
|
||||
"add": "추가",
|
||||
"pattern": "패턴",
|
||||
"enable": "사용",
|
||||
"order": "순서"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "अनाम मोड",
|
||||
"anon_mode_description": "प्रत्येक थ्रेडमध्ये स्वयंचलितपणे वेगळा वापरकर्ता ID वापरा",
|
||||
"pending": "प्रलंबित",
|
||||
"failed": "असफल"
|
||||
"failed": "असफल",
|
||||
"add": "अॅड करा",
|
||||
"pattern": "पॅटर्न",
|
||||
"enable": "सक्षम करा",
|
||||
"order": "आदेश"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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ść"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "Анонимный режим",
|
||||
"anon_mode_description": "Автоматически используйте другой идентификатор пользователя в каждом потоке",
|
||||
"pending": "В ожидании",
|
||||
"failed": "Не удалось"
|
||||
"failed": "Не удалось",
|
||||
"add": "Добавить",
|
||||
"pattern": "Шаблон",
|
||||
"enable": "Включить",
|
||||
"order": "Порядок"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "అనానిమస్ మోడ్",
|
||||
"anon_mode_description": "ప్రతి థ్రెడ్లో ఆటోమేటిక్గా ఒక వేరు వినియోగదారుడి ID ఉపయోగించండి",
|
||||
"pending": "అనుమతించబడాలి",
|
||||
"failed": "విజయవంతం కాలేదు"
|
||||
"failed": "విజయవంతం కాలేదు",
|
||||
"add": "చేర్చండి",
|
||||
"pattern": "ప్యాటర్న్",
|
||||
"enable": "చేర్చు",
|
||||
"order": "ఆర్డర్"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "โหมดนิรนาม",
|
||||
"anon_mode_description": "ใช้ ID ผู้ใช้ที่แตกต่างกันโดยอัตโนมัติในแต่ละเธรด",
|
||||
"pending": "รอดำเนินการ",
|
||||
"failed": "ล้มเหลว"
|
||||
"failed": "ล้มเหลว",
|
||||
"add": "เพิ่ม",
|
||||
"pattern": "รูปแบบ",
|
||||
"enable": "เปิดใช้งาน",
|
||||
"order": "ลำดับ"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "Режим анонімності",
|
||||
"anon_mode_description": "Автоматично використовуйте інший ідентифікатор користувача в кожній гілці",
|
||||
"pending": "Очікує",
|
||||
"failed": "Не вдалося"
|
||||
"failed": "Не вдалося",
|
||||
"add": "Додати",
|
||||
"pattern": "Шаблон",
|
||||
"enable": "Увімкнути",
|
||||
"order": "Порядок"
|
||||
}
|
||||
@@ -226,5 +226,9 @@
|
||||
"anon_mode": "خفیہ موڈ",
|
||||
"anon_mode_description": "ہر تھریڈ میں خود بخود مختلف صارف آئی ڈی کا استعمال کریں",
|
||||
"pending": "منتظر",
|
||||
"failed": "ناکام"
|
||||
"failed": "ناکام",
|
||||
"add": "شامل کریں",
|
||||
"pattern": "نمونہ",
|
||||
"enable": "فعال کریں",
|
||||
"order": "ترتیب"
|
||||
}
|
||||
@@ -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ự"
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -328,6 +328,7 @@
|
||||
.postMobile .postMessage {
|
||||
padding: 10px;
|
||||
font-size: var(--post-mobile-content-font-size);
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.postMobile .postLink {
|
||||
|
||||
Reference in New Issue
Block a user