Merge pull request #360 from plebbit/development

Development
This commit is contained in:
Tom (plebeius.eth)
2024-05-13 09:09:27 +02:00
committed by GitHub
61 changed files with 1381 additions and 386 deletions
+2 -2
View File
@@ -28,10 +28,10 @@
### Features
* add 'view on seedit' links ([83c93c5](https://github.com/plebbit/plebchan/commit/83c93c5861cf96edfa9f0912eafa82f7c4d5ee80))
* add 'view on plebchan' links ([83c93c5](https://github.com/plebbit/plebchan/commit/83c93c5861cf96edfa9f0912eafa82f7c4d5ee80))
* **electron:** add plebbit rpc ([03b9b82](https://github.com/plebbit/plebchan/commit/03b9b82a6fbecba4658cc68d43523b9e862da298))
* **SettingsModal:** add export/import full account data ([07daa4e](https://github.com/plebbit/plebchan/commit/07daa4eeb315d13f756e4196253fe02d8a989284))
* **share:** add seedit to share button ([a13fe45](https://github.com/plebbit/plebchan/commit/a13fe45c6446527f52dac9dd25e32c4e23c364e3))
* **share:** add plebchan to share button ([a13fe45](https://github.com/plebbit/plebchan/commit/a13fe45c6446527f52dac9dd25e32c4e23c364e3))

Before

Width:  |  Height:  |  Size: 104 B

After

Width:  |  Height:  |  Size: 104 B

Before

Width:  |  Height:  |  Size: 94 B

After

Width:  |  Height:  |  Size: 94 B

Before

Width:  |  Height:  |  Size: 102 B

After

Width:  |  Height:  |  Size: 102 B

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 123 B

Before

Width:  |  Height:  |  Size: 111 B

After

Width:  |  Height:  |  Size: 111 B

Before

Width:  |  Height:  |  Size: 100 B

After

Width:  |  Height:  |  Size: 100 B

Before

Width:  |  Height:  |  Size: 109 B

After

Width:  |  Height:  |  Size: 109 B

Before

Width:  |  Height:  |  Size: 132 B

After

Width:  |  Height:  |  Size: 132 B

+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "مشاريع",
"challenge_counter": "{{index}} من {{total}}",
"embed": "تضمين",
"remove": "إزالة"
"remove": "إزالة",
"download_latest_desktop": "حمل أحدث إصدار سطح المكتب هنا: {{link}}",
"new_stable_version": "إصدار مستقر جديد متاح، plebchan v{{newVersion}}. أنت تستخدم plebchan v{{oldVersion}}.",
"refresh_to_update": "قم بتحديث الصفحة للتحديث",
"new_development_version": "إصدار تطوير جديد متاح، كوميت {{newCommit}}. أنت تستخدم كوميت {{oldCommit}}.",
"check_for_updates": "<1>تحقق</1> من التحديثات",
"latest_development_version": "أنت على أحدث إصدار تطوير، النسخة {{commit}}. لاستخدام النسخة الثابتة، انتقل إلى {{link}}.",
"latest_stable_version": "أنت على أحدث نسخة ثابتة، plebchan v{{version}}.",
"check": "تحقق",
"update": "تحديث",
"style": "الأسلوب",
"interface_language": "لغة الواجهة",
"delete_confirm": "هل أنت متأكد أنك تريد حذف {{value}}؟",
"double_confirm": "هل أنت متأكد حقًا؟ هذا الإجراء لا يمكن التراجع عنه."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "প্রকল্পসমূহ",
"challenge_counter": "{{index}} থেকে {{total}}",
"embed": "এম্বেড",
"remove": "অপসারণ"
"remove": "অপসারণ",
"download_latest_desktop": "সর্বশেষ ডেস্কটপ সংস্করণ এখানে ডাউনলোড করুন: {{link}}",
"new_stable_version": "নতুন স্থিতিশীল সংস্করণ উপলব্ধ, plebchan v{{newVersion}}। আপনি plebchan v{{oldVersion}} ব্যবহার করছেন।",
"refresh_to_update": "আপডেট করতে পৃষ্ঠাটি রিফ্রেশ করুন",
"new_development_version": "নতুন ডেভেলপমেন্ট সংস্করণ উপলব্ধ, কমিট {{newCommit}}। আপনি কমিট {{oldCommit}} ব্যবহার করছেন।",
"check_for_updates": "<1>যাচাই</1> করুন আপডেট",
"latest_development_version": "আপনি সর্বশেষ ডেভেলপমেন্ট সংস্করণে আছেন, কমিট {{commit}}। স্থিতিশীল সংস্করণ ব্যবহার করতে, {{link}} যান।",
"latest_stable_version": "আপনি সর্বশেষ স্থিতিশীল সংস্করণে আছেন, plebchan v{{version}}।",
"check": "পরীক্ষা করুন",
"update": "আপডেট",
"style": "স্টাইল",
"interface_language": "ইন্টারফেস ভাষা",
"delete_confirm": "আপনি কি নিশ্চিত যে আপনি {{value}} মুছতে চান?",
"double_confirm": "আপনি কি সত্যিই নিশ্চিত? এই অ্যাকশন বিপর্যস্ত করা যাবে না।"
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projekty",
"challenge_counter": "{{index}} z {{total}}",
"embed": "vložit",
"remove": "odstranit"
"remove": "odstranit",
"download_latest_desktop": "Stáhněte si nejnovější verzi pro stolní počítače zde: {{link}}",
"new_stable_version": "Nová stabilní verze k dispozici, plebchan v{{newVersion}}. Používáte plebchan v{{oldVersion}}.",
"refresh_to_update": "Obnovte stránku pro aktualizaci",
"new_development_version": "Nová vývojová verze k dispozici, commit {{newCommit}}. Používáte commit {{oldCommit}}.",
"check_for_updates": "<1>Zkontrolujte</1> aktualizace",
"latest_development_version": "Jste na nejnovější vývojové verzi, commit {{commit}}. Chcete-li použít stabilní verzi, přejděte na {{link}}.",
"latest_stable_version": "Jste na nejnovější stabilní verzi, plebchan v{{version}}.",
"check": "zkontroluj",
"update": "Aktualizovat",
"style": "Styl",
"interface_language": "jazyk rozhraní",
"delete_confirm": "Opravdu chcete smazat {{value}}?",
"double_confirm": "Opravdu jste si jisti? Tato akce je nevratná."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projekter",
"challenge_counter": "{{index}} af {{total}}",
"embed": "integrer",
"remove": "fjern"
"remove": "fjern",
"download_latest_desktop": "Download den seneste version til skrivebordet her: {{link}}",
"new_stable_version": "Ny stabil version tilgængelig, plebchan v{{newVersion}}. Du bruger plebchan v{{oldVersion}}.",
"refresh_to_update": "Opdater siden for at opdatere",
"new_development_version": "Ny udviklingsversion tilgængelig, commit {{newCommit}}. Du bruger commit {{oldCommit}}.",
"check_for_updates": "<1>Tjek</1> for opdateringer",
"latest_development_version": "Du er på den nyeste udviklingsversion, commit {{commit}}. For at bruge den stabile version, gå til {{link}}.",
"latest_stable_version": "Du er på den seneste stabile version, plebchan v{{version}}.",
"check": "tjek",
"update": "Opdater",
"style": "Stil",
"interface_language": "grænsefladesprog",
"delete_confirm": "Er du sikker på, at du vil slette {{value}}?",
"double_confirm": "Er du virkelig sikker? Denne handling er uigenkaldelig."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "Projekte",
"challenge_counter": "{{index}} von {{total}}",
"embed": "einbetten",
"remove": "entfernen"
"remove": "entfernen",
"download_latest_desktop": "Laden Sie hier die neueste Desktop-Version herunter: {{link}}",
"new_stable_version": "Neue stabile Version verfügbar, plebchan v{{newVersion}}. Du verwendest plebchan v{{oldVersion}}.",
"refresh_to_update": "Aktualisieren Sie die Seite, um zu aktualisieren",
"new_development_version": "Neue Entwicklungsversion verfügbar, Commit {{newCommit}}. Du verwendest Commit {{oldCommit}}.",
"check_for_updates": "<1>Überprüfen</1> Sie auf Updates",
"latest_development_version": "Du befindest dich auf der neuesten Entwicklungsversion, Commit {{commit}}. Um die stabile Version zu verwenden, gehe zu {{link}}.",
"latest_stable_version": "Du befindest dich auf der neuesten stabilen Version, plebchan v{{version}}.",
"check": "überprüfen",
"update": "Aktualisieren",
"style": "Stil",
"interface_language": "Sprache der Benutzeroberfläche",
"delete_confirm": "Möchten Sie {{value}} wirklich löschen?",
"double_confirm": "Sind Sie wirklich sicher? Diese Aktion ist nicht rückgängig zu machen."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "έργα",
"challenge_counter": "{{index}} από {{total}}",
"embed": "ενσωμάτωση",
"remove": "αφαίρεση"
"remove": "αφαίρεση",
"download_latest_desktop": "Κατεβάστε την πιο πρόσφατη έκδοση για επιτραπέζιο υπολογιστή εδώ: {{link}}",
"new_stable_version": "Νέα σταθερή έκδοση διαθέσιμη, plebchan v{{newVersion}}. Χρησιμοποιείτε plebchan v{{oldVersion}}.",
"refresh_to_update": "Ανανεώστε τη σελίδα για να ενημερωθεί",
"new_development_version": "Νέα έκδοση ανάπτυξης διαθέσιμη, commit {{newCommit}}. Χρησιμοποιείτε commit {{oldCommit}}.",
"check_for_updates": "<1>Ελέγξτε</1> για ενημερώσεις",
"latest_development_version": "Βρίσκεστε στην πιο πρόσφατη έκδοση ανάπτυξης, commit {{commit}}. Για να χρησιμοποιήσετε την σταθερή έκδοση, πηγαίνετε στη διεύθυνση {{link}}.",
"latest_stable_version": "Βρίσκεστε στην πιο πρόσφατη σταθερή έκδοση, plebchan v{{version}}.",
"check": "έλεγχος",
"update": "Ενημέρωση",
"style": "Στυλ",
"interface_language": "γλώσσα διεπαφής",
"delete_confirm": "Είστε σίγουροι ότι θέλετε να διαγράψετε το {{value}};",
"double_confirm": "Είστε σίγουροι; Αυτή η ενέργεια είναι αναίρεση."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projects",
"challenge_counter": "{{index}} of {{total}}",
"embed": "embed",
"remove": "remove"
"remove": "remove",
"download_latest_desktop": "Download the latest desktop version here: {{link}}",
"new_stable_version": "New stable version available, plebchan v{{newVersion}}. You are using plebchan v{{oldVersion}}.",
"refresh_to_update": "Refresh the page to update",
"new_development_version": "New development version available, commit {{newCommit}}. You are using commit {{oldCommit}}.",
"check_for_updates": "<1>Check</1> for updates",
"latest_development_version": "You're on the latest development version, commit {{commit}}. To use the stable version, go to {{link}}.",
"latest_stable_version": "You are on the latest stable version, plebchan v{{version}}.",
"check": "check",
"update": "Update",
"style": "Style",
"interface_language": "interface language",
"delete_confirm": "Are you sure you want to delete {{value}}?",
"double_confirm": "Are you really sure? This action is irreversible."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "proyectos",
"challenge_counter": "{{index}} de {{total}}",
"embed": "incrustar",
"remove": "eliminar"
"remove": "eliminar",
"download_latest_desktop": "Descarga la última versión de escritorio aquí: {{link}}",
"new_stable_version": "Nueva versión estable disponible, plebchan v{{newVersion}}. Estás usando plebchan v{{oldVersion}}.",
"refresh_to_update": "Actualiza la página para actualizar",
"new_development_version": "Nueva versión de desarrollo disponible, commit {{newCommit}}. Estás usando commit {{oldCommit}}.",
"check_for_updates": "<1>Verifique</1> las actualizaciones",
"latest_development_version": "Estás en la última versión de desarrollo, commit {{commit}}. Para usar la versión estable, ve a {{link}}.",
"latest_stable_version": "Estás en la última versión estable, plebchan v{{version}}.",
"check": "verificar",
"update": "Actualizar",
"style": "Estilo",
"interface_language": "idioma de la interfaz",
"delete_confirm": "¿Estás seguro de que quieres eliminar {{value}}?",
"double_confirm": "¿Estás realmente seguro? Esta acción es irreversible."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "پروژه‌ها",
"challenge_counter": "{{index}} از {{total}}",
"embed": "جاسازی",
"remove": "حذف"
"remove": "حذف",
"download_latest_desktop": "نسخه‌ی جدید سطح میز کامپیوتر را از اینجا دانلود کنید: {{link}}",
"new_stable_version": "نسخه پایدار جدید موجود است، plebchan v{{newVersion}}. شما plebchan v{{oldVersion}} را استفاده می‌کنید.",
"refresh_to_update": "برای به‌روزرسانی صفحه را رفرش کنید",
"new_development_version": "نسخه توسعه جدید موجود است، کامیت {{newCommit}}. شما کامیت {{oldCommit}} را استفاده می‌کنید.",
"check_for_updates": "<1>بررسی</1> برای به‌روزرسانی‌ها",
"latest_development_version": "شما در نسخه توسعه‌ی جدیدتر هستید، کامیت {{commit}}. برای استفاده از نسخه پایدار، به {{link}} بروید.",
"latest_stable_version": "شما در آخرین نسخه پایدار، plebchan v{{version}} هستید.",
"check": "بررسی کنید",
"update": "به‌روزرسانی",
"style": "سبک",
"interface_language": "زبان رابط",
"delete_confirm": "آیا مطمئن هستید که می‌خواهید {{value}} را حذف کنید؟",
"double_confirm": "آیا مطمئن هستید؟ این عمل غیرقابل برگشت است."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projektit",
"challenge_counter": "{{index}} / {{total}}",
"embed": "upota",
"remove": "poista"
"remove": "poista",
"download_latest_desktop": "Lataa uusin työpöytäversio täältä: {{link}}",
"new_stable_version": "Uusi vakaa versio saatavilla, plebchan v{{newVersion}}. Käytät plebchan v{{oldVersion}}.",
"refresh_to_update": "Päivitä sivu päivittääksesi",
"new_development_version": "Uusi kehitysversion saatavilla, commit {{newCommit}}. Käytät commit {{oldCommit}}.",
"check_for_updates": "<1>Tarkista</1> päivitykset",
"latest_development_version": "Olet uusimmassa kehitysversion, commit {{commit}}. Käyttääksesi vakaa versio, siirry osoitteeseen {{link}}.",
"latest_stable_version": "Olet viimeisimmässä vakaa versio, plebchan v{{version}}.",
"check": "tarkista",
"update": "Päivitä",
"style": "Tyyli",
"interface_language": "käyttöliittymän kieli",
"delete_confirm": "Haluatko varmasti poistaa {{value}}?",
"double_confirm": "Oletko varma? Tämä toiminto on peruuttamaton."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "mga proyekto",
"challenge_counter": "{{index}} ng {{total}}",
"embed": "i-embed",
"remove": "alisin"
"remove": "alisin",
"download_latest_desktop": "I-download ang pinakabagong bersyon ng desktop dito: {{link}}",
"new_stable_version": "Bagong stable na bersyon na magagamit, plebchan v{{newVersion}}. Ginagamit mo ang plebchan v{{oldVersion}}.",
"refresh_to_update": "I-refresh ang pahina upang i-update",
"new_development_version": "Bagong development version na magagamit, commit {{newCommit}}. Ginagamit mo ang commit {{oldCommit}}.",
"check_for_updates": "<1>Tingnan</1> para sa mga update",
"latest_development_version": "Nasa pinakabagong bersyon ng pag-unlad, commit {{commit}}. Upang gamitin ang stable na bersyon, pumunta sa {{link}}.",
"latest_stable_version": "Nasa pinakabagong stable na bersyon, plebchan v{{version}}.",
"check": "suriin",
"update": "I-update",
"style": "Estilo",
"interface_language": "wika ng interface",
"delete_confirm": "Sigurado ka bang nais mong burahin ang {{value}}?",
"double_confirm": "Sigurado ka ba talaga? Ang aksyon na ito ay hindi mababawi."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projets",
"challenge_counter": "{{index}} sur {{total}}",
"embed": "intégrer",
"remove": "supprimer"
"remove": "supprimer",
"download_latest_desktop": "Téléchargez la dernière version de bureau ici : {{link}}",
"new_stable_version": "Nouvelle version stable disponible, plebchan v{{newVersion}}. Vous utilisez plebchan v{{oldVersion}}.",
"refresh_to_update": "Actualisez la page pour mettre à jour",
"new_development_version": "Nouvelle version de développement disponible, commit {{newCommit}}. Vous utilisez commit {{oldCommit}}.",
"check_for_updates": "<1>Vérifiez</1> les mises à jour",
"latest_development_version": "Vous êtes sur la dernière version de développement, commit {{commit}}. Pour utiliser la version stable, allez sur {{link}}.",
"latest_stable_version": "Vous êtes sur la dernière version stable, plebchan v{{version}}.",
"check": "vérifier",
"update": "Mettre à jour",
"style": "Style",
"interface_language": "langue de linterface",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer {{value}}?",
"double_confirm": "Êtes-vous vraiment sûr? Cette action est irréversible."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "פרויקטים",
"challenge_counter": "{{index}} מתוך {{total}}",
"embed": "הטמע",
"remove": "הסר"
"remove": "הסר",
"download_latest_desktop": "הורד את הגרסה האחרונה לשולחן העבודה כאן: {{link}}",
"new_stable_version": "גרסה יציבה חדשה זמינה, plebchan v{{newVersion}}. אתה משתמש plebchan v{{oldVersion}}.",
"refresh_to_update": "רענן את העמוד כדי לעדכן",
"new_development_version": "גרסת פיתוח חדשה זמינה, קומיט {{newCommit}}. אתה משתמש בקומיט {{oldCommit}}.",
"check_for_updates": "<1>בדוק</1> עבור עדכונים",
"latest_development_version": "אתה נמצא בגרסת הפיתוח האחרונה, קומיט {{commit}}. כדי להשתמש בגרסה יציבה, עבור אל {{link}}.",
"latest_stable_version": "אתה נמצא בגרסה היציבה האחרונה, plebchan v{{version}}.",
"check": "בדוק",
"update": "עדכן",
"style": "סגנון",
"interface_language": "שפת ממשק",
"delete_confirm": "האם אתה בטוח שברצונך למחוק את {{value}}?",
"double_confirm": "האם אתה באמת בטוח? הפעולה הזו היא לא הפיכה."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "परियोजनाएं",
"challenge_counter": "{{index}} में से {{total}}",
"embed": "एम्बेड",
"remove": "हटाएं"
"remove": "हटाएं",
"download_latest_desktop": "यहां सबसे नवीन डेस्कटॉप संस्करण डाउनलोड करें: {{link}}",
"new_stable_version": "नई स्थिर संस्करण उपलब्ध है, plebchan v{{newVersion}}। आप plebchan v{{oldVersion}} का उपयोग कर रहे हैं।",
"refresh_to_update": "अपडेट करने के लिए पृष्ठ को रिफ्रेश करें",
"new_development_version": "नई डेवलपमेंट संस्करण उपलब्ध है, कमिट {{newCommit}}। आप कमिट {{oldCommit}} का उपयोग कर रहे हैं।",
"check_for_updates": "<1>जाँचें</1> अपडेट के लिए",
"latest_development_version": "आप नवीनतम विकास संस्करण पर हैं, कमिट {{commit}}। स्थिर संस्करण का उपयोग करने के लिए, {{link}} पर जाएं।",
"latest_stable_version": "आप नवीनतम स्थिर संस्करण पर हैं, plebchan v{{version}}।",
"check": "जांचें",
"update": "अपडेट करें",
"style": "शैली",
"interface_language": "इंटरफ़ेस भाषा",
"delete_confirm": "क्या आप निश्चित हैं कि आप {{value}} को हटाना चाहते हैं?",
"double_confirm": "क्या आप वास्तव में सुनिश्चित हैं? यह क्रिया अपरिवर्तनीय है।"
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projektek",
"challenge_counter": "{{index}} a(z) {{total}}-ból/ből",
"embed": "beágyaz",
"remove": "eltávolít"
"remove": "eltávolít",
"download_latest_desktop": "Töltsd le a legújabb asztali verziót itt: {{link}}",
"new_stable_version": "Új stabil verzió elérhető, plebchan v{{newVersion}}. A plebchan v{{oldVersion}}-t használod.",
"refresh_to_update": "Frissítse az oldalt az frissítéshez",
"new_development_version": "Új fejlesztési verzió elérhető, commit {{newCommit}}. A commit {{oldCommit}}-t használod.",
"check_for_updates": "<1>Ellenőrizd</1> a frissítéseket",
"latest_development_version": "A legújabb fejlesztői verziót használod, commit {{commit}}. A stabil verzió használatához látogass el ide: {{link}}.",
"latest_stable_version": "A legújabb stabil verziót használod, plebchan v{{version}}.",
"check": "ellenőriz",
"update": "Frissítés",
"style": "Stílus",
"interface_language": "felület nyelve",
"delete_confirm": "Biztosan törölni szeretné {{value}}?",
"double_confirm": "Biztos vagy benne? Ez a művelet visszafordíthatatlan."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "proyek",
"challenge_counter": "{{index}} dari {{total}}",
"embed": "sematkan",
"remove": "hapus"
"remove": "hapus",
"download_latest_desktop": "Unduh versi desktop terbaru di sini: {{link}}",
"new_stable_version": "Versi stabil baru tersedia, plebchan v{{newVersion}}. Anda menggunakan plebchan v{{oldVersion}}.",
"refresh_to_update": "Segarkan halaman untuk memperbarui",
"new_development_version": "Versi pengembangan baru tersedia, commit {{newCommit}}. Anda menggunakan commit {{oldCommit}}.",
"check_for_updates": "<1>Periksa</1> pembaruan",
"latest_development_version": "Anda menggunakan versi pengembangan terbaru, commit {{commit}}. Untuk menggunakan versi stabil, pergi ke {{link}}.",
"latest_stable_version": "Anda menggunakan versi stabil terbaru, plebchan v{{version}}.",
"check": "periksa",
"update": "Perbarui",
"style": "Gaya",
"interface_language": "bahasa antarmuka",
"delete_confirm": "Apakah Anda yakin ingin menghapus {{value}}?",
"double_confirm": "Apakah Anda benar-benar yakin? Tindakan ini tidak dapat diurungkan."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "progetti",
"challenge_counter": "{{index}} di {{total}}",
"embed": "incorpora",
"remove": "rimuovi"
"remove": "rimuovi",
"download_latest_desktop": "Scarica l'ultima versione desktop qui: {{link}}",
"new_stable_version": "Nuova versione stabile disponibile, plebchan v{{newVersion}}. Stai utilizzando plebchan v{{oldVersion}}.",
"refresh_to_update": "Ricarica la pagina per aggiornare",
"new_development_version": "Nuova versione di sviluppo disponibile, commit {{newCommit}}. Stai utilizzando commit {{oldCommit}}.",
"check_for_updates": "<1>Controlla</1> aggiornamenti",
"latest_development_version": "Stai utilizzando la versione per sviluppatori più recente, commit {{commit}}. Per utilizzare la versione stabile, vai su {{link}}.",
"latest_stable_version": "Stai utilizzando l'ultima versione stabile, plebchan v{{version}}.",
"check": "controlla",
"update": "Aggiorna",
"style": "Stile",
"interface_language": "lingua interfaccia",
"delete_confirm": "Confermi di voler cancellare {{value}}?",
"double_confirm": "Sei davvero sicuro? Questa azione è irreversibile."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "プロジェクト",
"challenge_counter": "{{index}} / {{total}}",
"embed": "埋め込み",
"remove": "削除"
"remove": "削除",
"download_latest_desktop": "最新のデスクトップバージョンをこちらからダウンロード: {{link}}",
"new_stable_version": "新しい安定版が利用可能です、plebchan v{{newVersion}}。あなたはplebchan v{{oldVersion}} を使用しています。",
"refresh_to_update": "更新するにはページを更新してください",
"new_development_version": "新しい開発バージョンが利用可能です、コミット {{newCommit}}。あなたはコミット {{oldCommit}} を使用しています。",
"check_for_updates": "<1>更新</1> を確認",
"latest_development_version": "最新の開発バージョン、コミット{{commit}}を使用しています。安定版を使用するには、{{link}}に移動してください。",
"latest_stable_version": "最新の安定版、plebchan v{{version}}を使用しています。",
"check": "チェック",
"update": "更新",
"style": "スタイル",
"interface_language": "インターフェース言語",
"delete_confirm": "{{value}} を削除してもよろしいですか?",
"double_confirm": "本当によろしいですか?このアクションは取り消せません。"
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "프로젝트",
"challenge_counter": "{{index}} 중 {{total}}",
"embed": "임베드",
"remove": "제거"
"remove": "제거",
"download_latest_desktop": "최신 데스크톱 버전을 여기에서 다운로드하세요: {{link}}",
"new_stable_version": "새로운 안정 버전이 사용 가능합니다, plebchan v{{newVersion}}. plebchan v{{oldVersion}}을(를) 사용 중입니다.",
"refresh_to_update": "업데이트를 위해 페이지를 새로 고칩니다",
"new_development_version": "새로운 개발 버전이 사용 가능합니다, 커밋 {{newCommit}}. 커밋 {{oldCommit}}을(를) 사용 중입니다.",
"check_for_updates": "<1>업데이트</1> 확인",
"latest_development_version": "최신 개발 버전, 커밋 {{commit}}을 사용 중입니다. 안정 버전을 사용하려면 {{link}}로 이동하세요.",
"latest_stable_version": "최신 안정 버전, plebchan v{{version}}을 사용 중입니다.",
"check": "확인",
"update": "업데이트",
"style": "스타일",
"interface_language": "인터페이스 언어",
"delete_confirm": "{{value}}를 삭제하시겠습니까?",
"double_confirm": "정말로 확실합니까? 이 작업은 되돌릴 수 없습니다."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "प्रकल्प",
"challenge_counter": "{{index}} पैकी {{total}}",
"embed": "एम्बेड",
"remove": "काढा"
"remove": "काढा",
"download_latest_desktop": "येथे नवीन डेस्कटॉप संस्करण डाउनलोड करा: {{link}}",
"new_stable_version": "नवीन स्थिर संस्करण उपलब्ध आहे, plebchan v{{newVersion}}. आपण plebchan v{{oldVersion}} वापरत आहात.",
"refresh_to_update": "अपडेट करण्यासाठी पृष्ठ पुन्हा लोड करा",
"new_development_version": "नवीन विकास संस्करण उपलब्ध आहे, कमिट {{newCommit}}. आपण कमिट {{oldCommit}} वापरत आहात.",
"check_for_updates": "<1>चेक</1> अपडेट्ससाठी",
"latest_development_version": "तुम्ही आधुनिक विकास संस्करणावर आहात, कमिट {{commit}}. स्थिर संस्करण वापरण्यासाठी, {{link}} जा.",
"latest_stable_version": "तुम्ही आधुनिक स्थिर संस्करणावर आहात, plebchan v{{version}}.",
"check": "तपासा",
"update": "अद्यतनित करा",
"style": "शैली",
"interface_language": "इंटरफेस भाषा",
"delete_confirm": "तुम्हाला खात्री आहे का की तुम्ही {{value}} काढून टाकणार आहात?",
"double_confirm": "खात्री आहात का? हा क्रियेचा परत न लागणारा आहे."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projecten",
"challenge_counter": "{{index}} van {{total}}",
"embed": "insluiten",
"remove": "verwijderen"
"remove": "verwijderen",
"download_latest_desktop": "Download de nieuwste desktopversie hier: {{link}}",
"new_stable_version": "Nieuwe stabiele versie beschikbaar, plebchan v{{newVersion}}. Je gebruikt plebchan v{{oldVersion}}.",
"refresh_to_update": "Vernieuw de pagina om bij te werken",
"new_development_version": "Nieuwe ontwikkelingsversie beschikbaar, commit {{newCommit}}. Je gebruikt commit {{oldCommit}}.",
"check_for_updates": "<1>Controleer</1> op updates",
"latest_development_version": "Je gebruikt de nieuwste ontwikkelingsversie, commit {{commit}}. Ga naar {{link}} om de stabiele versie te gebruiken.",
"latest_stable_version": "Je gebruikt de nieuwste stabiele versie, plebchan v{{version}}.",
"check": "controleren",
"update": "Bijwerken",
"style": "Stijl",
"interface_language": "interface taal",
"delete_confirm": "Weet je zeker dat je {{value}} wilt verwijderen?",
"double_confirm": "Weet u het zeker? Deze actie is onomkeerbaar."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "prosjekter",
"challenge_counter": "{{index}} av {{total}}",
"embed": "bygg inn",
"remove": "fjern"
"remove": "fjern",
"download_latest_desktop": "Last ned den nyeste skrivebordsversjonen her: {{link}}",
"new_stable_version": "Ny stabil versjon tilgjengelig, plebchan v{{newVersion}}. Du bruker plebchan v{{oldVersion}}.",
"refresh_to_update": "Oppdater siden for å oppdatere",
"new_development_version": "Ny utviklingsversjon tilgjengelig, commit {{newCommit}}. Du bruker commit {{oldCommit}}.",
"check_for_updates": "<1>Sjekk</1> for oppdateringer",
"latest_development_version": "Du bruker den nyeste utviklingsversjonen, commit {{commit}}. For å bruke den stabile versjonen, gå til {{link}}.",
"latest_stable_version": "Du bruker den nyeste stabile versjonen, plebchan v{{version}}.",
"check": "sjekk",
"update": "Oppdater",
"style": "Stil",
"interface_language": "grensesnittspråk",
"delete_confirm": "Er du sikker på at du vil slette {{value}}?",
"double_confirm": "Er du virkelig sikker? Denne handlingen er ugjenkallelig."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projekty",
"challenge_counter": "{{index}} z {{total}}",
"embed": "osadź",
"remove": "usuń"
"remove": "usuń",
"download_latest_desktop": "Pobierz najnowszą wersję na pulpit tutaj: {{link}}",
"new_stable_version": "Nowa stabilna wersja dostępna, plebchan v{{newVersion}}. Używasz plebchan v{{oldVersion}}.",
"refresh_to_update": "Odśwież stronę, aby zaktualizować",
"new_development_version": "Nowa wersja rozwojowa dostępna, commit {{newCommit}}. Używasz commit {{oldCommit}}.",
"check_for_updates": "<1>Sprawdź</1> aktualizacje",
"latest_development_version": "Korzystasz z najnowszej wersji rozwojowej, commit {{commit}}. Aby użyć wersji stabilnej, przejdź pod {{link}}.",
"latest_stable_version": "Korzystasz z najnowszej wersji stabilnej, plebchan v{{version}}.",
"check": "sprawdź",
"update": "Aktualizuj",
"style": "Styl",
"interface_language": "język interfejsu",
"delete_confirm": "Czy na pewno chcesz usunąć {{value}}?",
"double_confirm": "Jesteś naprawdę pewien? Ta akcja jest nieodwracalna."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projetos",
"challenge_counter": "{{index}} de {{total}}",
"embed": "embutir",
"remove": "remover"
"remove": "remover",
"download_latest_desktop": "Baixe a versão mais recente para desktop aqui: {{link}}",
"new_stable_version": "Nova versão estável disponível, plebchan v{{newVersion}}. Você está usando plebchan v{{oldVersion}}.",
"refresh_to_update": "Atualize a página para atualizar",
"new_development_version": "Nova versão de desenvolvimento disponível, commit {{newCommit}}. Você está usando o commit {{oldCommit}}.",
"check_for_updates": "<1>Verifique</1> as atualizações",
"latest_development_version": "Você está na última versão de desenvolvimento, commit {{commit}}. Para usar a versão estável, vá para {{link}}.",
"latest_stable_version": "Você está na versão estável mais recente, plebchan v{{version}}.",
"check": "verificar",
"update": "Atualizar",
"style": "Estilo",
"interface_language": "idioma da interface",
"delete_confirm": "Tem certeza de que deseja excluir {{value}}?",
"double_confirm": "Tem certeza? Esta ação é irreversível."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "proiecte",
"challenge_counter": "{{index}} din {{total}}",
"embed": "încorpora",
"remove": "elimina"
"remove": "elimina",
"download_latest_desktop": "Descărcați cea mai recentă versiune de desktop aici: {{link}}",
"new_stable_version": "Noua versiune stabilă disponibilă, plebchan v{{newVersion}}. Folosiți plebchan v{{oldVersion}}.",
"refresh_to_update": "Actualizați pagina pentru a actualiza",
"new_development_version": "Noua versiune de dezvoltare disponibilă, commit {{newCommit}}. Folosiți commit {{oldCommit}}.",
"check_for_updates": "<1>Verifică</1> pentru actualizări",
"latest_development_version": "Ești pe cea mai recentă versiune de dezvoltare, commit {{commit}}. Pentru a folosi versiunea stabilă, mergi la {{link}}.",
"latest_stable_version": "Ești pe cea mai recentă versiune stabilă, plebchan v{{version}}.",
"check": "verifică",
"update": "Actualizează",
"style": "Stil",
"interface_language": "limba interfeței",
"delete_confirm": "Sunteți sigur că doriți să ștergeți {{value}}?",
"double_confirm": "Sunteți sigur? Această acțiune este ireversibilă."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "проекты",
"challenge_counter": "{{index}} из {{total}}",
"embed": "встроить",
"remove": "удалить"
"remove": "удалить",
"download_latest_desktop": "Скачать последнюю версию для рабочего стола здесь: {{link}}",
"new_stable_version": "Доступна новая стабильная версия, plebchan v{{newVersion}}. Вы используете plebchan v{{oldVersion}}.",
"refresh_to_update": "Обновите страницу, чтобы обновить",
"new_development_version": "Доступна новая версия разработки, коммит {{newCommit}}. Вы используете коммит {{oldCommit}}.",
"check_for_updates": "<1>Проверить</1> наличие обновлений",
"latest_development_version": "Вы используете последнюю версию разработки, коммит {{commit}}. Чтобы использовать стабильную версию, перейдите по ссылке {{link}}.",
"latest_stable_version": "Вы используете последнюю стабильную версию, plebchan v{{version}}.",
"check": "проверить",
"update": "Обновить",
"style": "Стиль",
"interface_language": "язык интерфейса",
"delete_confirm": "Вы уверены, что хотите удалить {{value}}?",
"double_confirm": "Вы действительно уверены? Это действие необратимо."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projekte",
"challenge_counter": "{{index}} nga {{total}}",
"embed": "integro",
"remove": "hiq"
"remove": "hiq",
"download_latest_desktop": "Shkarko versionin më të ri të desktopit këtu: {{link}}",
"new_stable_version": "Version i ri i qëndrueshëm është në dispozicion, plebchan v{{newVersion}}. Ju po përdorni plebchan v{{oldVersion}}.",
"refresh_to_update": "Rifresko faqen për të rifreskuar",
"new_development_version": "Versioni i ri i zhvillimit është në dispozicion, komiti {{newCommit}}. Ju po përdorni komitin {{oldCommit}}.",
"check_for_updates": "<1>Kontrolloni</1> për përditësime",
"latest_development_version": "Jeni në versionin më të fundit të zhvillimit, komitimi {{commit}}. Për të përdorur versionin e qëndrueshëm, shkoni te {{link}}.",
"latest_stable_version": "Jeni në versionin më të fundit të qëndrueshëm, plebchan v{{version}}.",
"check": "kontrollo",
"update": "Përditëso",
"style": "Stil",
"interface_language": "gjuha e ndërfaqes",
"delete_confirm": "A jeni të sigurt se dëshironi të fshini {{value}}?",
"double_confirm": "A jeni të sigurtë? Ky veprim është i papërkthyeshëm."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projekt",
"challenge_counter": "{{index}} av {{total}}",
"embed": "bädda in",
"remove": "ta bort"
"remove": "ta bort",
"download_latest_desktop": "Ladda ner den senaste skrivbordsversionen här: {{link}}",
"new_stable_version": "Ny stabil version tillgänglig, plebchan v{{newVersion}}. Du använder plebchan v{{oldVersion}}.",
"refresh_to_update": "Uppdatera sidan för att uppdatera",
"new_development_version": "Ny utvecklingsversion tillgänglig, commit {{newCommit}}. Du använder commit {{oldCommit}}.",
"check_for_updates": "<1>Kontrollera</1> uppdateringar",
"latest_development_version": "Du är på den senaste utvecklingsversionen, commit {{commit}}. För att använda den stabila versionen, gå till {{link}}.",
"latest_stable_version": "Du är på den senaste stabila versionen, plebchan v{{version}}.",
"check": "kontrollera",
"update": "Uppdatera",
"style": "Stil",
"interface_language": "gränssnittsspråk",
"delete_confirm": "Är du säker på att du vill ta bort {{value}}?",
"double_confirm": "Är du verkligen säker? Denna åtgärd är oåterkallelig."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "ప్రాజెక్టులు",
"challenge_counter": "{{index}} లో {{total}}",
"embed": "ఎంబెడ్",
"remove": "తొలగించు"
"remove": "తొలగించు",
"download_latest_desktop": "ఇక్కడ తాజా డెస్క్టాప్ వెర్షన్‌ను డౌన్‌లోడ్ చేయండి: {{link}}",
"new_stable_version": "కొత్త స్థిర వెర్షన్ అందుబాటులో ఉంది, plebchan v{{newVersion}}. మీరు plebchan v{{oldVersion}} ను ఉపయోగిస్తున్నారు.",
"refresh_to_update": "అప్డేట్ చేయడానికి పేజీను రిఫ్రెష్ చేయండి",
"new_development_version": "కొత్త డెవలప్మెంట్ వెర్షన్ అందుబాటులో ఉంది, కమిట్ {{newCommit}}. మీరు కమిట్ {{oldCommit}} ను ఉపయోగిస్తున్నారు.",
"check_for_updates": "<1>తనిఖీ</1> అప్డేట్లను",
"latest_development_version": "మీరు తొలగించే త్వరిత అప్డేటు, కమిట్ {{commit}} పరిపాలన ముగింది స్థిర అప్డేటు కోసం {{link}}.",
"latest_stable_version": "మీరు తొలగించిన తొలగిన సంస్కరణం, plebchan v{{version}} నందు.",
"check": "తనిఖీ చేయండి",
"update": "నవీకరణ",
"style": "శైలి",
"interface_language": "ఇంటర్ఫేస్ భాష",
"delete_confirm": "మీరు {{value}} ను తొలగించడానికి ఖచ్చితంగా ఉన్నారా?",
"double_confirm": "మీరు నిజంగా ఖచ్చితముగా ఉన్నారా? ఈ చర్య రద్దు చేయలేదు."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "โครงการ",
"challenge_counter": "{{index}} จาก {{total}}",
"embed": "ฝัง",
"remove": "ลบ"
"remove": "ลบ",
"download_latest_desktop": "ดาวน์โหลดเวอร์ชันเดสก์ท็อปล่าสุดที่นี่: {{link}}",
"new_stable_version": "มีเวอร์ชันที่มีความเสถียรใหม่ที่ใช้ได้, plebchan v{{newVersion}} คุณกำลังใช้ plebchan v{{oldVersion}}",
"refresh_to_update": "รีเฟรชหน้าเพื่ออัปเดต",
"new_development_version": "มีเวอร์ชันการพัฒนาใหม่ที่ใช้ได้, คอมมิต {{newCommit}} คุณกำลังใช้คอมมิต {{oldCommit}}",
"check_for_updates": "<1>ตรวจสอบ</1> อัปเดต",
"latest_development_version": "คุณกำลังใช้รุ่นการพัฒนาล่าสุด, คอมมิต {{commit}} ในการใช้รุ่นเสถียร ไปที่ {{link}}.",
"latest_stable_version": "คุณกำลังใช้รุ่นเสถียรล่าสุด, plebchan v{{version}}.",
"check": "ตรวจสอบ",
"update": "อัปเดต",
"style": "สไตล์",
"interface_language": "ภาษาอินเทอร์เฟซ",
"delete_confirm": "คุณแน่ใจหรือไม่ว่าต้องการลบ {{value}}?",
"double_confirm": "คุณแน่ใจหรือไม่? การดำเนินการนี้ไม่สามารถย้อนกลับได้"
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "projeler",
"challenge_counter": "{{index}} / {{total}}",
"embed": "göm",
"remove": "kaldır"
"remove": "kaldır",
"download_latest_desktop": "Son masaüstü sürümünü buradan indirin: {{link}}",
"new_stable_version": "Yeni stabil sürüm kullanılabilir, plebchan v{{newVersion}}. plebchan v{{oldVersion}} kullanıyorsunuz.",
"refresh_to_update": "Güncellemek için sayfayı yenileyin",
"new_development_version": "Yeni geliştirme sürümü kullanılabilir, commit {{newCommit}}. Commit {{oldCommit}} kullanıyorsunuz.",
"check_for_updates": "<1>Güncellemeleri</1> kontrol et",
"latest_development_version": "En son geliştirme sürümündesiniz, commit {{commit}}. Kararlı sürümü kullanmak için {{link}} gidin.",
"latest_stable_version": "En son kararlı sürümünde, plebchan v{{version}}s.",
"check": "kontrol et",
"update": "Güncelle",
"style": "Stil",
"interface_language": "arayüz dili",
"delete_confirm": "{{value}}'yi silmek istediğinizden emin misiniz?",
"double_confirm": "Gerçekten emin misiniz? Bu eylem geri alınamaz."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "проекти",
"challenge_counter": "{{index}} з {{total}}",
"embed": "вбудувати",
"remove": "видалити"
"remove": "видалити",
"download_latest_desktop": "Завантажте останню версію для робочого столу тут: {{link}}",
"new_stable_version": "Нова стабільна версія доступна, plebchan v{{newVersion}}. Ви використовуєте plebchan v{{oldVersion}}.",
"refresh_to_update": "Оновіть сторінку, щоб оновити",
"new_development_version": "Нова версія розробки доступна, коміт {{newCommit}}. Ви використовуєте коміт {{oldCommit}}.",
"check_for_updates": "<1>Перевірити</1> оновлення",
"latest_development_version": "Ви використовуєте останню версію розробки, коміт {{commit}}. Щоб використовувати стабільну версію, перейдіть за посиланням {{link}}.",
"latest_stable_version": "Ви використовуєте останню стабільну версію, plebchan v{{version}}.",
"check": "перевірте",
"update": "Оновити",
"style": "Стиль",
"interface_language": "мова інтерфейсу",
"delete_confirm": "Ви впевнені, що хочете видалити {{value}}?",
"double_confirm": "Ви впевнені? Ця дія незворотня."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "منصوبے",
"challenge_counter": "{{index}} میں سے {{total}}",
"embed": "ایمبیڈ",
"remove": "ہٹائیں"
"remove": "ہٹائیں",
"download_latest_desktop": "یہاں سب سے تازہ ڈیسک ٹاپ ورژن ڈاؤن لوڈ کریں: {{link}}",
"new_stable_version": "نیو مستقر ورژن دستیاب ہے, plebchan v{{newVersion}}۔ آپ plebchan v{{oldVersion}} استعمال کر رہے ہیں۔",
"refresh_to_update": "اپ ڈیٹ کرنے کے لئے صفحہ تازہ کریں",
"new_development_version": "نیو ڈویلپمنٹ ورژن دستیاب ہے, کمیٹ {{newCommit}}۔ آپ کمیٹ {{oldCommit}} استعمال کر رہے ہیں۔",
"check_for_updates": "<1>چیک</1> کریں اپ ڈیٹس کے لئے",
"latest_development_version": "آپ تازہ ترین ڈویلپمنٹ ورژن پر ہیں, کمیٹ {{commit}}۔ مستحکم ورژن استعمال کرنے کے لئے, {{link}} پر جائیں۔",
"latest_stable_version": "آپ تازہ ترین مستحکم ورژن پر ہیں, plebchan v{{version}}۔",
"check": "چیک کریں",
"update": "اپ ڈیٹ",
"style": "اسٹائل",
"interface_language": "انٹرفیس زبان",
"delete_confirm": "کیا آپ واقعی {{value}} کو حذف کرنا چاہتے ہیں؟",
"double_confirm": "کیا آپ واقعی میں یقینی ہیں؟ یہ کارروائی بے واپس ہے۔"
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "dự án",
"challenge_counter": "{{index}} trong {{total}}",
"embed": "nhúng",
"remove": "xóa"
"remove": "xóa",
"download_latest_desktop": "Tải xuống phiên bản máy tính để bàn mới nhất tại đây: {{link}}",
"new_stable_version": "Phiên bản ổn định mới có sẵn, plebchan v{{newVersion}}. Bạn đang sử dụng plebchan v{{oldVersion}}.",
"refresh_to_update": "Làm mới trang để cập nhật",
"new_development_version": "Phiên bản phát triển mới có sẵn, commit {{newCommit}}. Bạn đang sử dụng commit {{oldCommit}}.",
"check_for_updates": "<1>Kiểm tra</1> cập nhật",
"latest_development_version": "Bạn đang sử dụng phiên bản phát triển mới nhất, commit {{commit}}. Để sử dụng phiên bản ổn định, hãy truy cập {{link}}.",
"latest_stable_version": "Bạn đang sử dụng phiên bản ổn định mới nhất, plebchan v{{version}}.",
"check": "kiểm tra",
"update": "Cập nhật",
"style": "Phong cách",
"interface_language": "ngôn ngữ giao diện",
"delete_confirm": "Bạn có chắc chắn muốn xóa {{value}} không?",
"double_confirm": "Bạn có chắc chắn không? Hành động này không thể hoàn tác."
}
+14 -1
View File
@@ -75,5 +75,18 @@
"projects": "项目",
"challenge_counter": "{{index}} / {{total}}",
"embed": "嵌入",
"remove": "移除"
"remove": "移除",
"download_latest_desktop": "在这里下载最新的桌面版本: {{link}}",
"new_stable_version": "新的稳定版可用,plebchan v{{newVersion}}。您正在使用plebchan v{{oldVersion}}。",
"refresh_to_update": "刷新页面以更新",
"new_development_version": "新的开发版本可用,commit {{newCommit}}。您正在使用commit {{oldCommit}}。",
"check_for_updates": "<1>检查</1> 更新",
"latest_development_version": "您正在使用最新的开发版本,提交 {{commit}}。要使用稳定版本,请前往 {{link}}。",
"latest_stable_version": "您正在使用最新的稳定版本,plebchan v{{version}}。",
"check": "检查",
"update": "更新",
"style": "风格",
"interface_language": "界面语言",
"delete_confirm": "您确定要删除 {{value}} 吗?",
"double_confirm": "您真的确定吗?此操作不可逆转。"
}
+8 -3
View File
@@ -9,7 +9,6 @@ import Home from './views/home';
import NotFound from './views/not-found';
import PendingPost from './views/pending-post';
import PostPage from './views/post-page';
import Settings from './views/settings';
import BoardBanner from './components/board-banner';
import { DesktopBoardButtons, MobileBoardButtons } from './components/board-buttons';
import BoardNav from './components/board-nav';
@@ -70,17 +69,23 @@ const App = () => {
<Route path='/' element={<Home />} />
<Route element={<BoardLayout />}>
<Route path='/p/:subplebbitAddress' element={<Board />} />
<Route path='/p/:subplebbitAddress/settings' element={<Board />} />
<Route path='/p/:subplebbitAddress/catalog' element={<Catalog />} />
<Route path='/p/:subplebbitAddress/catalog/settings' element={<Catalog />} />
<Route path='/p/:subplebbitAddress/c/:commentCid' element={<PostPage />} />
<Route path='/p/:subplebbitAddress/c/:commentCid/settings' element={<PostPage />} />
<Route path='/p/:subplebbitAddress/description' element={<PostPage />} />
<Route path='/p/:subplebbitAddress/description/settings' element={<PostPage />} />
<Route path='/p/:subplebbitAddress/rules' element={<PostPage />} />
<Route path='/p/:subplebbitAddress/rules/settings' element={<PostPage />} />
<Route path='/profile/:accountCommentIndex' element={<PendingPost />} />
<Route path='/profile/:accountCommentIndex/settings' element={<PendingPost />} />
</Route>
<Route path='/settings' element={<Settings />} />
<Route path='*' element={<NotFound />} />
</Route>
</Routes>
+6 -3
View File
@@ -12,7 +12,9 @@ interface BoardNavProps {
const BoardNavDesktop = ({ subplebbitAddresses }: BoardNavProps) => {
const { t } = useTranslation();
const isInCatalogView = isCatalogView(useLocation().pathname, useParams());
const location = useLocation();
const params = useParams();
const isInCatalogView = isCatalogView(location.pathname, params);
return (
<div className={styles.boardNavDesktop}>
@@ -30,7 +32,8 @@ const BoardNavDesktop = ({ subplebbitAddresses }: BoardNavProps) => {
]
</span>
<span className={styles.navTopRight}>
[<Link to='/settings'>{t('settings')}</Link>] [<Link to='/'>{t('home')}</Link>]
[<Link to={!location.pathname.endsWith('settings') ? location.pathname + '/settings' : location.pathname}>{t('settings')}</Link>] [<Link to='/'>{t('home')}</Link>
]
</span>
</div>
);
@@ -68,7 +71,7 @@ const BoardNavMobile = ({ subplebbitAddresses, subplebbitAddress }: BoardNavProp
{boardSelect}
</div>
<div className={styles.pageJump}>
<Link to='settings'>{t('settings')}</Link>
<Link to={useLocation().pathname + '/settings'}>{t('settings')}</Link>
<Link to='/'>{t('home')}</Link>
</div>
</div>
@@ -56,8 +56,13 @@
border: var(--reply-modal-field-input-border-focus, revert);
}
.content {
position: relative;
}
.content textarea {
vertical-align: top;
padding-top: 2em;
}
.footer button {
@@ -66,12 +71,20 @@
cursor: pointer;
}
.parentCid input[type="text"] {
margin-bottom: -1px !important;
.parentCidWrapper {
position: absolute;
background-color: var(--post-form-field-input-background-color, white);
width: 105px;
height: 15px;
left: 1px;
top: 1px;
padding: 5px;
}
.parentCid input[type="text"]:focus {
border: var(--reply-modal-field-input-border, revert) !important;
.parentCid {
color: var(--post-form-field-input-color);
position: absolute;
text-decoration: underline;
}
@media (max-width: 640px) {
+15 -3
View File
@@ -63,6 +63,16 @@ const ReplyModal = ({ closeModal, parentCid, scrollY }: ReplyModalProps) => {
}
}, [isMobile, scrollY]);
const parentCidRef = useRef<HTMLSpanElement>(null);
const parentCidWrapperRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (parentCidRef.current && parentCidRef.current) {
const cidWidth = parentCidRef.current.offsetWidth;
parentCidRef.current.style.width = `${cidWidth}px`;
}
}, [parentCid]);
const modalContent = (
<div className={styles.container} ref={nodeRef}>
<div className={`replyModalHandle ${styles.title}`}>
@@ -88,10 +98,12 @@ const ReplyModal = ({ closeModal, parentCid, scrollY }: ReplyModalProps) => {
<div className={styles.link}>
<input type='text' ref={urlRef} placeholder={_.capitalize(t('link'))} onChange={(e) => setContent.link(e.target.value)} />
</div>
<div className={styles.parentCid}>
<input type='text' readOnly value={`c/${parentCid && Plebbit.getShortCid(parentCid)}`} />
</div>
<div className={styles.content}>
<span className={styles.parentCidWrapper} ref={parentCidWrapperRef}>
<span className={styles.parentCid} ref={parentCidRef}>
{`c/${parentCid && Plebbit.getShortCid(parentCid)}`}
</span>
</span>
<textarea
cols={48}
rows={4}
+1
View File
@@ -0,0 +1 @@
export { default } from './settings-modal';
@@ -0,0 +1,175 @@
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.25);
z-index: 900;
}
.settingsModal {
top: 25px;
width: 394px;
height: auto;
max-height: 80%;
left: calc(50% - 22px);
overflow-y: auto;
margin-left: -178px;
position: fixed;
z-index: 1000;
padding: 2px;
font-size: 14px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.25);
background-color: var(--settings-modal-background-color);
border-top: var(--settings-modal-border-top);
border-right: var(--settings-modal-border-right);
border-bottom: var(--settings-modal-border-bottom);
border-left: var(--settings-modal-border-left);
}
.settingsModal select, .settingsModal button, .settingsModal textarea {
filter: var(--filter80);
}
.header {
font-size: 16px;
font-weight: 700;
margin-bottom: 5px;
margin-top: 5px;
padding-bottom: 5px;
text-align: center;
line-height: 14px;
border-bottom: var(--settings-modal-header-border-bottom);
}
.title {
text-transform: capitalize;
}
.version {
font-size: 11px;
position: absolute;
display: block;
margin-left: 5px;
}
.version a {
color: inherit;
text-decoration: none;
}
.version a:hover {
text-decoration: underline;
}
.closeButton {
right: 5px;
width: 18px;
height: 18px;
display: block;
background-size: 100%;
cursor: pointer;
position: absolute;
top: 5px;
image-rendering: pixelated;
background-image: var(--settings-modal-close-button-background-image);
}
.languageSettings {
display: inline-block;
}
.setting {
margin-bottom: 8px;
text-transform: capitalize;
}
.hideButton, .showButton {
vertical-align: text-bottom;
margin-right: 5px;
cursor: pointer;
width: 18px;
height: 18px;
background-repeat: no-repeat;
background-position: center;
display: inline-block;
image-rendering: pixelated;
}
.hideButton {
background-image: var(--settings-modal-hide-button-background-image);
}
.showButton {
background-image: var(--settings-modal-show-button-background-image);
}
.category {
margin: 10px 0;
}
.category label {
cursor: pointer;
font-weight: 700;
}
.checkForUpdatesButton {
text-transform: capitalize;
}
.setting, .category {
margin-left: 5px;
}
.accountSettings {
margin-left: 10px;
}
.accountSettings textarea {
display: block;
font-family: dejavu sans mono, consolas, andale mono, lucida console, monospace;
outline: none;
border: 1px solid #aaa;
font-size: 11px;
margin: 0 2px 0 0;
padding: 2px 4px 3px;
min-height: 150px;
width: 95%;
}
.accountSettings textarea:focus {
border-color: 1px solid #98e;
}
.accountSettings button {
cursor: pointer;
}
.saveResetAccount {
margin-top: 15px;
}
.accountSettings textarea {
margin-bottom: 5px;
}
.accountSettings div {
margin-top: 5px;
}
.deleteAccount, .deleteAccount button {
color: red;
}
.accountSettings .createAccount {
margin-left: 5px;
}
@media (max-width: 640px) {
.settingsModal {
width: 350px !important;
max-height: 60% !important;
left: calc(50% - 2px) !important;
}
}
@@ -0,0 +1,348 @@
import { useEffect, useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { createAccount, deleteAccount, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts } from '@plebbit/plebbit-react-hooks';
import stringify from 'json-stringify-pretty-compact';
import styles from './settings-modal.module.css';
import useTheme from '../../hooks/use-theme';
import packageJson from '../../../package.json';
const commitRef = process.env.REACT_APP_COMMIT_REF;
const isElectron = window.isElectron === true;
const CheckForUpdates = () => {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const checkForUpdates = async () => {
try {
setLoading(true);
const packageRes = await fetch('https://raw.githubusercontent.com/plebbit/plebchan/master/package.json', { cache: 'no-cache' });
const packageData = await packageRes.json();
let updateAvailable = false;
if (packageJson.version !== packageData.version) {
const newVersionText = t('new_stable_version', { newVersion: packageData.version, oldVersion: packageJson.version });
const updateActionText = isElectron
? t('download_latest_desktop', { link: 'https://github.com/plebbit/plebchan/releases/latest', interpolation: { escapeValue: false } })
: t('refresh_to_update');
alert(newVersionText + ' ' + updateActionText);
updateAvailable = true;
}
if (commitRef && commitRef.length > 0) {
const commitRes = await fetch('https://api.github.com/repos/plebbit/plebchan/commits?per_page=1&sha=development', { cache: 'no-cache' });
const commitData = await commitRes.json();
const latestCommitHash = commitData[0].sha;
if (latestCommitHash.trim() !== commitRef.trim()) {
const newVersionText =
t('new_development_version', { newCommit: latestCommitHash.slice(0, 7), oldCommit: commitRef.slice(0, 7) }) + ' ' + t('refresh_to_update');
alert(newVersionText);
updateAvailable = true;
}
}
if (!updateAvailable) {
alert(
commitRef
? `${t('latest_development_version', { commit: commitRef.slice(0, 7), link: 'https://plebchan.eth.limo/#/', interpolation: { escapeValue: false } })}`
: `${t('latest_stable_version', { version: packageJson.version })}`,
);
}
} catch (error) {
alert('Failed to fetch latest version info: ' + error);
} finally {
setLoading(false);
}
};
return (
<button className={styles.checkForUpdatesButton} onClick={checkForUpdates} disabled={loading}>
{t('check')}
</button>
);
};
const Style = () => {
const [theme, setTheme] = useTheme();
return (
<select className={styles.themeSettings} value={theme} onChange={(e) => setTheme(e.target.value)}>
<option value='yotsuba'>Yotsuba</option>
<option value='yotsuba-b'>Yotsuba B</option>
<option value='futaba'>Futaba</option>
<option value='burichan'>Burichan</option>
<option value='tomorrow'>Tomorrow</option>
<option value='photon'>Photon</option>
</select>
);
};
// prettier-ignore
const availableLanguages = ['ar', 'bn', 'cs', 'da', 'de', 'el', 'en', 'es', 'fa', 'fi', 'fil', 'fr', 'he', 'hi', 'hu', 'id', 'it', 'ja', 'ko', 'mr', 'nl', 'no', 'pl', 'pt', 'ro', 'ru', 'sq', 'sv', 'te', 'th', 'tr', 'uk', 'ur', 'vi', 'zh'];
const InterfaceLanguage = () => {
const { i18n } = useTranslation();
const { changeLanguage, language } = i18n;
const onSelectLanguage = (e: React.ChangeEvent<HTMLSelectElement>) => {
changeLanguage(e.target.value);
};
return (
<div className={styles.languageSettings}>
<select value={language} onChange={onSelectLanguage}>
{availableLanguages.map((lang) => (
<option key={lang} value={lang}>
{lang}
</option>
))}
</select>
</div>
);
};
const AccountSettings = () => {
const { t } = useTranslation();
const account = useAccount();
const { accounts } = useAccounts();
const [text, setText] = useState('');
const [switchToLastAccount, setSwitchToLastAccount] = useState(false);
const accountJson = useMemo(
() => stringify({ account: { ...account, plebbit: undefined, karma: undefined, plebbitReactOptions: undefined, unreadNotificationCount: undefined } }),
[account],
);
useEffect(() => {
setText(accountJson);
}, [accountJson]);
useEffect(() => {
if (switchToLastAccount && accounts.length > 0) {
const lastAccount = accounts[accounts.length - 1];
setActiveAccount(lastAccount.name);
setSwitchToLastAccount(false);
}
}, [accounts, switchToLastAccount]);
const _createAccount = async () => {
try {
await createAccount();
} catch (error) {
if (error instanceof Error) {
alert(error.message);
console.log(error);
} else {
console.error('An unknown error occurred:', error);
}
}
setSwitchToLastAccount(true);
};
const _deleteAccount = (accountName: string) => {
if (!accountName) {
return;
} else if (window.confirm(t('delete_confirm', { value: accountName, interpolation: { escapeValue: false } }))) {
if (window.confirm(t('double_confirm'))) {
deleteAccount(accountName);
}
} else {
return;
}
};
const saveAccount = async () => {
try {
const newAccount = JSON.parse(text).account;
// force keeping the same id, makes it easier to copy paste
await setAccount({ ...newAccount, id: account?.id });
alert(`Saved ${newAccount.name}`);
} catch (error) {
if (error instanceof Error) {
alert(error.message);
console.log(error);
} else {
console.error('An unknown error occurred:', error);
}
}
};
const _exportAccount = async () => {
try {
const accountString = await exportAccount();
const accountObject = JSON.parse(accountString);
const formattedAccountJson = JSON.stringify(accountObject, null, 2);
// Create a Blob from the JSON string
const blob = new Blob([formattedAccountJson], { type: 'application/json' });
// Create a URL for the Blob
const fileUrl = URL.createObjectURL(blob);
// Create a temporary download link
const link = document.createElement('a');
link.href = fileUrl;
link.download = `${account.name}.json`;
// Append the link, trigger the download, then remove the link
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// Release the Blob URL
URL.revokeObjectURL(fileUrl);
} catch (error) {
if (error instanceof Error) {
alert(error.message);
console.log(error);
} else {
console.error('An unknown error occurred:', error);
}
}
};
const _importAccount = async () => {
// Create a file input element
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.accept = '.json';
// Handle file selection
fileInput.onchange = async (event) => {
try {
const files = (event.target as HTMLInputElement).files;
if (!files || files.length === 0) {
throw new Error('No file selected.');
}
const file = files[0];
// Read the file content
const reader = new FileReader();
reader.onload = async (e) => {
const fileContent = e.target!.result; // Non-null assertion
if (typeof fileContent !== 'string') {
throw new Error('File content is not a string.');
}
const newAccount = JSON.parse(fileContent);
await importAccount(fileContent);
setSwitchToLastAccount(true);
alert(`Imported ${newAccount.account?.name}`);
};
reader.readAsText(file);
} catch (error) {
if (error instanceof Error) {
alert(error.message);
console.log(error);
} else {
console.error('An unknown error occurred:', error);
}
}
};
// Trigger file selection dialog
fileInput.click();
};
const accountsOptions = accounts.map((account) => (
<option key={account?.id} value={account?.name}>
u/{account?.author?.shortAddress}
</option>
));
return (
<div className={styles.accountSettings}>
<div>
<select value={account?.name} onChange={(e) => setActiveAccount(e.target.value)}>
{accountsOptions}
</select>
<button className={styles.createAccount} onClick={_createAccount}>
+
</button>
</div>
<div></div>
<textarea value={text} onChange={(e) => setText(e.target.value)} autoCorrect='off' autoComplete='off' spellCheck='false' />
<div>
<button onClick={saveAccount}>Save</button> <button onClick={() => setText(accountJson)}>Reset</button>
</div>
<div>
<button onClick={_importAccount}>Import</button> full account data
</div>
<div>
<button onClick={_exportAccount}>Export</button> full account data
</div>
<div className={styles.deleteAccount}>
<button onClick={() => _deleteAccount(account?.name)}>Delete</button> this account
</div>
</div>
);
};
const PlebbitOptionsSettings = () => {
return (
<>
<div className={styles.setting}></div>
</>
);
};
const SettingsModal = () => {
const { t } = useTranslation();
const navigate = useNavigate();
const closeModal = () => {
navigate(-1);
};
const [showAccountSettings, setShowAccountSettings] = useState(false);
const [showPlebbitOptionsSettings, setShowPlebbitOptionsSettings] = useState(false);
return (
<>
<div className={styles.overlay} onClick={closeModal}></div>
<div className={styles.settingsModal}>
<div className={styles.header}>
<span className={styles.version}>
<a href={`https://github.com/plebbit/plebchan/releases/tag/v${packageJson.version}`} target='_blank' rel='noopener noreferrer'>
v{packageJson.version}
</a>
{commitRef && (
<a href={`https://github.com/plebbit/plebchan/commit/${commitRef}`} target='_blank' rel='noopener noreferrer'>
#{commitRef.slice(0, 7)}
</a>
)}
</span>
<span className={styles.title}>{t('settings')}</span>
<span className={styles.closeButton} title='close' onClick={closeModal} />
</div>
<div className={styles.setting}>
{t('update')}: <CheckForUpdates />
</div>
<div className={styles.setting}>
{t('style')}: <Style />
</div>
<div className={styles.setting}>
{t('interface_language')}: <InterfaceLanguage />
</div>
<div className={`${styles.setting} ${styles.category}`}>
<label onClick={() => setShowAccountSettings(!showAccountSettings)}>
<span className={showAccountSettings ? styles.hideButton : styles.showButton} />
Account
</label>
</div>
{showAccountSettings && <AccountSettings />}
<div className={`${styles.setting} ${styles.category}`}>
<label onClick={() => setShowPlebbitOptionsSettings(!showPlebbitOptionsSettings)}>
<span className={showPlebbitOptionsSettings ? styles.hideButton : styles.showButton} />
Plebbit Options
</label>
</div>
{showPlebbitOptionsSettings && <PlebbitOptionsSettings />}
</div>
</>
);
};
export default SettingsModal;
+55
View File
@@ -0,0 +1,55 @@
import { useEffect, useState } from 'react';
import { Subplebbit } from '@plebbit/plebbit-react-hooks';
import { getCommentMediaInfo, getHasThumbnail } from '../lib/utils/media-utils';
const usePopularPosts = (subplebbits: Subplebbit[]) => {
const [popularPosts, setPopularPosts] = useState<Comment[]>([]);
useEffect(() => {
const subplebbitToPost: { [key: string]: any } = {};
const uniqueLinks: Set<string> = new Set();
subplebbits.forEach((subplebbit: any) => {
let maxTimestamp = -Infinity;
let mostRecentPost = null;
if (subplebbit?.posts?.pages?.hot?.comments) {
for (const post of Object.values(subplebbit.posts.pages.hot.comments as Comment)) {
const { deleted, link, locked, pinned, removed, replyCount, timestamp } = post;
const commentMediaInfo = getCommentMediaInfo(post);
const isMediaShowed = getHasThumbnail(commentMediaInfo, link);
if (
isMediaShowed &&
replyCount > 0 &&
!deleted &&
!removed &&
!locked &&
!pinned &&
timestamp > Date.now() / 1000 - 60 * 60 * 24 * 30 &&
timestamp > maxTimestamp &&
!uniqueLinks.has(link)
) {
maxTimestamp = post.timestamp;
mostRecentPost = post;
uniqueLinks.add(link);
}
}
if (mostRecentPost) {
subplebbitToPost[subplebbit.address] = { post: mostRecentPost, timestamp: maxTimestamp };
}
}
});
const sortedPosts = Object.values(subplebbitToPost)
.sort((a, b) => b.timestamp - a.timestamp)
.slice(0, 8);
setPopularPosts(sortedPosts.map((item) => item.post));
}, [subplebbits]);
return popularPosts;
};
export default usePopularPosts;
+1 -1
View File
@@ -27,7 +27,7 @@ const useReplyModal = () => {
setShowReplyModal(true);
}
},
[activeCid, closeModal, isMobile],
[activeCid, isMobile],
);
return { activeCid, closeModal, openReplyModal, scrollY, showReplyModal };
+242 -173
View File
@@ -44,14 +44,6 @@
--button-desktop-text-color-hover: red;
--close-button-background-image: url("/public/assets/buttons/cross-red.png");
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #800;
--button-background-image-mobile: url("/public/assets/buttons/button-fade.png");
--button-background-color-mobile: #f0e0d6;
--button-border-mobile: 1px solid #c0a69d;
/* horizontal rule */
--hr-border: none;
--hr-border-top: 1px solid #d9bfb7;
@@ -87,9 +79,20 @@
/* media */
--media-thumbnail-background-color: rgba(0, 0, 0, 0.05);
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #800;
--button-background-image-mobile: url("/public/assets/buttons/button-fade.png");
--button-background-color-mobile: #f0e0d6;
--button-border-mobile: 1px solid #c0a69d;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post desktop */
--post-hide-button-background-image: url("/public/assets/buttons/post-expand-minus-red.png");
--post-unhide-button-background-image: url("/public/assets/buttons/post-expand-plus-red.png");
--post-hide-button-background-image: url("/public/assets/buttons/minus-red.png");
--post-unhide-button-background-image: url("/public/assets/buttons/plus-red.png");
--post-subject-text-color: #cc1105;
--post-subject-font-weight: 700;
--post-name-text-color: #117743;
@@ -97,7 +100,7 @@
--post-menu-button-color: #000080;
--post-menu-button-color-hover: red;
--post-greentext-color: #789922;
--post-replies-expand-button-background-image: url("/public/assets/buttons/post-expand-plus-red.png");
--post-replies-expand-button-background-image: url("/public/assets/buttons/plus-red.png");
/* post mobile */
--post-mobile-background-color: #f5e9e1;
@@ -116,9 +119,6 @@
--post-mobile-file-info-text-color: #707070;
--post-mobile-content-font-size: 11pt;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
@@ -133,10 +133,7 @@
--post-form-field-input-appearance: none;
--post-form-field-input-outline: none;
--post-form-field-input-focus-border: 1px solid #ea8;
/* reply modal */
--reply-modal-field-input-border: 1px solid #aaa;
--reply-modal-field-input-border-focus: 1px solid #ea8;
--post-form-field-input-color: #000;
/* quotelink */
--post-quotelink-text-color: navy;
@@ -149,6 +146,21 @@
--reply-desktop-background-color: #f0e0d6;
--reply-desktop-border: 1px solid #d9bfb7;
/* reply modal */
--reply-modal-field-input-border: 1px solid #aaa;
--reply-modal-field-input-border-focus: 1px solid #ea8;
/* settings modal */
--settings-modal-background-color: #f0e0d6;
--settings-modal-header-border-bottom: 1px solid #d9bfb7;
--settings-modal-border-top: none;
--settings-modal-border-right: 1px solid #d9bfb7;
--settings-modal-border-bottom: 1px solid #d9bfb7;
--settings-modal-border-left: none;
--settings-modal-close-button-background-image: url("/public/assets/buttons/cross-red.png");
--settings-modal-show-button-background-image: url("/public/assets/buttons/plus-red.png");
--settings-modal-hide-button-background-image: url("/public/assets/buttons/minus-red.png");
/* stats */
--stats-font-size: 11px;
}
@@ -196,6 +208,14 @@
--challenge-modal-title-font-size: 10pt;
--challenge-modal-title-font-weight: 700;
/* desktop buttons */
--button-desktop-text-color: #34345c;
--button-desktop-text-color-hover: #d00;
--close-button-background-image: url("/public/assets/buttons/cross-blue.png");
/* footer */
--footer-item-background-color-desktop: #eef2ff;
/* homepage */
--homepage-infobox-text-color: #000;
--homepage-infobox-bar-text-color: #000;
@@ -212,22 +232,6 @@
--homepage-box-link-text-decoration: none;
--homepage-box-link-text-decoration-hover: underline;
/* desktop buttons */
--button-desktop-text-color: #34345c;
--button-desktop-text-color-hover: #d00;
--close-button-background-image: url("/public/assets/buttons/cross-blue.png");
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #34345c;
--button-background-image-mobile: url("/public/assets/buttons/button-fade-blue.png");
--button-background-color-mobile: #d6daf0;
--button-border-mobile: 1px solid #b7c5d9;
/* footer */
--footer-item-background-color-desktop: #eef2ff;
/* horizontal rule */
--hr-border: none;
--hr-border-top: 1px solid #b7c5d9;
@@ -243,9 +247,20 @@
/* media */
--media-thumbnail-background-color: rgba(0, 0, 0, 0.05);
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #34345c;
--button-background-image-mobile: url("/public/assets/buttons/button-fade-blue.png");
--button-background-color-mobile: #d6daf0;
--button-border-mobile: 1px solid #b7c5d9;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post desktop */
--post-hide-button-background-image: url("/public/assets/buttons/post-expand-minus-blue.png");
--post-unhide-button-background-image: url("/public/assets/buttons/post-expand-plus-blue.png");
--post-hide-button-background-image: url("/public/assets/buttons/minus-blue.png");
--post-unhide-button-background-image: url("/public/assets/buttons/plus-blue.png");
--post-subject-text-color: #0f0c5d;
--post-subject-font-weight: 700;
--post-name-text-color: #117743;
@@ -253,7 +268,23 @@
--post-menu-button-color: #34345c;
--post-menu-button-color-hover: #d00;
--post-greentext-color: #789922;
--post-replies-expand-button-background-image: url("/public/assets/buttons/post-expand-plus-blue.png");
--post-replies-expand-button-background-image: url("/public/assets/buttons/plus-blue.png");
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #98e;
--post-form-field-title-color: #000;
--post-form-field-border: 1px solid #000;
--post-form-field-title-font-weight: 700;
--post-form-field-title-padding: 0 5px;
--post-form-field-title-font-size: 10pt;
--post-form-field-input-border: 1px solid #aaa;
--post-form-field-font-family: arial, helvetica, sans-serif;
--post-form-field-input-appearance: none;
--post-form-field-input-outline: none;
--post-form-field-input-focus-border: 1px solid #98e;
--post-form-field-input-color: #000;
/* post mobile */
--post-mobile-background-color: #d6daf0;
@@ -271,28 +302,6 @@
--post-mobile-abbr-font-size: 10pt;
--post-mobile-content-font-size: 11pt;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #98e;
--post-form-field-title-color: #000;
--post-form-field-border: 1px solid #000;
--post-form-field-title-font-weight: 700;
--post-form-field-title-padding: 0 5px;
--post-form-field-title-font-size: 10pt;
--post-form-field-input-border: 1px solid #aaa;
--post-form-field-font-family: arial, helvetica, sans-serif;
--post-form-field-input-appearance: none;
--post-form-field-input-outline: none;
--post-form-field-input-focus-border: 1px solid #98e;
/* reply modal */
--reply-modal-field-input-border: 1px solid #aaa;
--reply-modal-field-input-border-focus: 1px solid #98e;
/* quotelink */
--post-quotelink-text-color: #d00;
--post-quotelink-text-color-hover: #d00;
@@ -304,6 +313,21 @@
--reply-desktop-background-color: #d6daf0;
--reply-desktop-border: 1px solid #b7c5d9;
/* reply modal */
--reply-modal-field-input-border: 1px solid #aaa;
--reply-modal-field-input-border-focus: 1px solid #98e;
/* settings modal */
--settings-modal-background-color: #d6daf0;
--settings-modal-border-top: none;
--settings-modal-border-right: 1px solid #b7c5d9;
--settings-modal-border-bottom: 1px solid #b7c5d9;
--settings-modal-border-left: none;
--settings-modal-header-border-bottom: 1px solid #b7c5d9;
--settings-modal-close-button-background-image: url("/public/assets/buttons/cross-blue.png");
--settings-modal-show-button-background-image: url("/public/assets/buttons/plus-blue.png");
--settings-modal-hide-button-background-image: url("/public/assets/buttons/minus-blue.png");
/* stats */
--stats-font-size: 11px;
}
@@ -353,14 +377,6 @@
--button-text-decoration: underline;
--close-button-background-image: url("/public/assets/buttons/cross-red.png");
/* mobile buttons */
--button-font-size-mobile: 11pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #800;
--button-background-image-mobile: url("/public/assets/buttons/button-fade.png");
--button-background-color-mobile: #f0e0d6;
--button-border-mobile: 1px solid #c0a69d;
/* footer */
--footer-item-background-color-desktop: #fed;
@@ -375,9 +391,20 @@
/* media */
--media-thumbnail-background-color: rgba(0, 0, 0, 0.05);
/* mobile buttons */
--button-font-size-mobile: 11pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #800;
--button-background-image-mobile: url("/public/assets/buttons/button-fade.png");
--button-background-color-mobile: #f0e0d6;
--button-border-mobile: 1px solid #c0a69d;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post desktop */
--post-hide-button-background-image: url("/public/assets/buttons/post-expand-minus-red.png");
--post-unhide-button-background-image: url("/public/assets/buttons/post-expand-plus-red.png");
--post-hide-button-background-image: url("/public/assets/buttons/minus-red.png");
--post-unhide-button-background-image: url("/public/assets/buttons/plus-red.png");
--post-subject-text-color: #cc1105;
--post-subject-font-weight: 700;
--post-name-text-color: #117743;
@@ -385,7 +412,17 @@
--post-menu-button-color: #000080;
--post-menu-button-color-hover: red;
--post-greentext-color: #789922;
--post-replies-expand-button-background-image: url("/public/assets/buttons/post-expand-plus-red.png");
--post-replies-expand-button-background-image: url("/public/assets/buttons/plus-red.png");
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #ea8;
--post-form-field-title-color: #800;
--post-form-field-border: none;
--post-form-field-title-font-weight: 700;
--post-form-field-title-font-size: 16px;
--post-form-field-input-color: #000;
/* post mobile */
--post-mobile-background-color: #f5e9e1;
@@ -403,18 +440,6 @@
--post-mobile-abbr-font-size: 12pt;
--post-mobile-content-font-size: 13pt;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #ea8;
--post-form-field-title-color: #800;
--post-form-field-border: none;
--post-form-field-title-font-weight: 700;
--post-form-field-title-font-size: 16px;
/* quotelink */
--post-quotelink-text-color: navy;
--post-quotelink-text-color-hover: red;
@@ -426,6 +451,17 @@
--reply-desktop-background-color: #f0e0d6;
--reply-desktop-border: 1px solid #d9bfb7;
/* settings modal */
--settings-modal-background-color: #f0e0d6;
--settings-modal-border-top: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-border-right: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-border-bottom: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-border-left: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-header-border-bottom: 1px solid rgba(0,0,0,.2);
--settings-modal-close-button-background-image: url("/public/assets/buttons/cross-red.png");
--settings-modal-show-button-background-image: url("/public/assets/buttons/plus-red.png");
--settings-modal-hide-button-background-image: url("/public/assets/buttons/minus-red.png");
/* stats */
--stats-font-size: 10pt;
}
@@ -458,6 +494,12 @@
--body-font-family: times new roman, serif;
--body-font-size: 16px;
/* catalog post */
--catalog-post-menu-btn-color: navy;
--catalog-post-menu-btn-hover-color: red;
--catalog-post-menu-btn-opacity: 0.5;
--catalog-post-menu-btn-hover-opacity: 1;
/* challenge modal */
--challenge-modal-background-color: #d6daf0;
--challenge-modal-border: 1px solid #b7c5d9;
@@ -467,6 +509,15 @@
--challenge-modal-title-font-size: 12pt;
--challenge-modal-title-font-weight: 700;
/* desktop buttons */
--button-desktop-text-color: #34345c;
--button-text-decoration: underline;
--button-desktop-text-color-hover: #d00;
--close-button-background-image: url("/public/assets/buttons/cross-blue.png");
/* footer */
--footer-item-background-color-desktop: #eef2ff;
/* homepage */
--homepage-infobox-text-color: #000;
--homepage-infobox-bar-text-color: #000;
@@ -477,17 +528,8 @@
--homepage-box-bar-background-color: #98e;
--homepage-box-bar-text-color-hover: #fff;
/* catalog post */
--catalog-post-menu-btn-color: navy;
--catalog-post-menu-btn-hover-color: red;
--catalog-post-menu-btn-opacity: 0.5;
--catalog-post-menu-btn-hover-opacity: 1;
/* desktop buttons */
--button-desktop-text-color: #34345c;
--button-text-decoration: underline;
--button-desktop-text-color-hover: #d00;
--close-button-background-image: url("/public/assets/buttons/cross-blue.png");
/* media */
--media-thumbnail-background-color: rgba(0, 0, 0, 0.05);
/* mobile buttons */
--button-font-size-mobile: 11pt;
@@ -497,9 +539,6 @@
--button-background-color-mobile: #d6daf0;
--button-border-mobile: 1px solid #b7c5d9;
/* footer */
--footer-item-background-color-desktop: #eef2ff;
/* links */
--post-link-text-color: #34345c;
--post-link-text-decoration: underline;
@@ -508,12 +547,12 @@
--post-content-link-text-decoration: none;
--post-content-link-text-decoration-hover: none;
/* media */
--media-thumbnail-background-color: rgba(0, 0, 0, 0.05);
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post desktop */
--post-hide-button-background-image: url("/public/assets/buttons/post-expand-minus-blue.png");
--post-unhide-button-background-image: url("/public/assets/buttons/post-expand-plus-blue.png");
--post-hide-button-background-image: url("/public/assets/buttons/minus-blue.png");
--post-unhide-button-background-image: url("/public/assets/buttons/plus-blue.png");
--post-subject-text-color: #0f0c5d;
--post-subject-font-weight: 700;
--post-name-text-color: #117743;
@@ -521,7 +560,17 @@
--post-menu-button-color: #34345c;
--post-menu-button-color-hover: #d00;
--post-greentext-color: #789922;
--post-replies-expand-button-background-image: url("/public/assets/buttons/post-expand-plus-blue.png");
--post-replies-expand-button-background-image: url("/public/assets/buttons/plus-blue.png");
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #98e;
--post-form-field-title-color: #000;
--post-form-field-border: none;
--post-form-field-title-font-weight: 700;
--post-form-field-title-font-size: 16px;
--post-form-field-input-color: #000;
/* post mobile */
--post-mobile-background-color: #d6daf0;
@@ -539,18 +588,6 @@
--post-mobile-abbr-font-size: 12pt;
--post-mobile-content-font-size: 13pt;
/* post capcodes */
--post-capcode-mod-text-color: purple;
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #98e;
--post-form-field-title-color: #000;
--post-form-field-border: none;
--post-form-field-title-font-weight: 700;
--post-form-field-title-font-size: 16px;
/* quotelink */
--post-quotelink-text-color: #d00;
--post-quotelink-text-color-hover: #d00;
@@ -562,6 +599,17 @@
--reply-desktop-background-color: #d6daf0;
--reply-desktop-border: 1px solid #b7c5d9;
/* settings modal */
--settings-modal-background-color: #d6daf0;
--settings-modal-border-top: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-border-right: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-border-bottom: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-border-left: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-header-border-bottom: 1px solid rgba(0,0,0,.2);
--settings-modal-close-button-background-image: url("/public/assets/buttons/cross-blue.png");
--settings-modal-show-button-background-image: url("/public/assets/buttons/plus-blue.png");
--settings-modal-hide-button-background-image: url("/public/assets/buttons/minus-blue.png");
/* stats */
--stats-font-size: 10pt;
}
@@ -574,16 +622,6 @@
--body-font-family: arial, helvetica, sans-serif;
--body-font-size: 13px;
/* homepage */
--homepage-infobox-text-color: #c5c8c6;
--homepage-infobox-bar-text-color: #c5c8c6;
--homepage-infobox-bar-background-color: rgb(33, 35, 38);
--homepage-box-background-color: #282a2e;
--homepage-box-bar-background-color: rgb(33, 35, 38);
--homepage-box-border-color: rgb(45, 47, 51);
--homepage-box-bar-text-color: #c5c8c6;
--homepage-box-bar-text-color-hover: #c5c8c6;
/* board nav */
--boardnav-font-size: 9pt;
--boardnav-separator-color: #c5c8c6;
@@ -624,13 +662,15 @@
/* filter for inputs */
--filter80: brightness(85%);
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #707070;
--button-background-image-mobile: url("/public/assets/buttons/button-fade-dark.png");
--button-background-color-mobile: #1b1c1e;
--button-border-mobile: 1px solid #282a2e;
/* homepage */
--homepage-infobox-text-color: #c5c8c6;
--homepage-infobox-bar-text-color: #c5c8c6;
--homepage-infobox-bar-background-color: rgb(33, 35, 38);
--homepage-box-background-color: #282a2e;
--homepage-box-bar-background-color: rgb(33, 35, 38);
--homepage-box-border-color: rgb(45, 47, 51);
--homepage-box-bar-text-color: #c5c8c6;
--homepage-box-bar-text-color-hover: #c5c8c6;
/* horizontal rule */
--hr-border: none;
@@ -648,9 +688,20 @@
/* media */
--media-thumbnail-background-color: rgba(255, 255, 255, 0.01);
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #707070;
--button-background-image-mobile: url("/public/assets/buttons/button-fade-dark.png");
--button-background-color-mobile: #1b1c1e;
--button-border-mobile: 1px solid #282a2e;
/* post capcodes */
--post-capcode-mod-text-color: #81a2be;
/* post desktop */
--post-hide-button-background-image: url("/public/assets/buttons/post-expand-minus-dark.png");
--post-unhide-button-background-image: url("/public/assets/buttons/post-expand-plus-dark.png");
--post-hide-button-background-image: url("/public/assets/buttons/minus-dark.png");
--post-unhide-button-background-image: url("/public/assets/buttons/plus-dark.png");
--post-subject-text-color: #b294bb;
--post-subject-font-weight: 700;
--post-name-text-color: #c5c8c6;
@@ -658,7 +709,24 @@
--post-menu-button-color: #5F89AC;
--post-menu-button-color-hover: #81a2be;
--post-greentext-color: #b5bd68;
--post-replies-expand-button-background-image: url("/public/assets/buttons/post-expand-plus-dark.png");
--post-replies-expand-button-background-image: url("/public/assets/buttons/plus-dark.png");
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #282a2e;
--post-form-field-title-color: #c5c8c6;
--post-form-field-border: 1px solid #000;
--post-form-field-title-font-weight: 700;
--post-form-field-title-padding: 0 5px;
--post-form-field-title-font-size: 10pt;
--post-form-field-input-border: 1px solid #000;
--post-form-field-input-focus-border: 1px solid #515151;
--post-form-field-input-background-color: #282a2e;
--post-form-field-input-color: #c5c8c6;
--post-form-field-font-family: arial, helvetica, sans-serif;
--post-form-field-input-appearance: none;
--post-form-field-input-outline: none;
/* post mobile */
--post-mobile-background-color: #282A2E;
@@ -679,9 +747,6 @@
--post-mobile-abbr-font-size: 10pt;
--post-mobile-content-font-size: 11pt;
/* post capcodes */
--post-capcode-mod-text-color: #81a2be;
/* quotelink */
--post-quotelink-text-color: #5f89ac;
--post-quotelink-text-color-hover: #81a2be;
@@ -693,35 +758,27 @@
--reply-desktop-background-color: #282a2e;
--reply-desktop-border: 1px solid #282a2e;
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
--post-form-field-title-background-color: #282a2e;
--post-form-field-title-color: #c5c8c6;
--post-form-field-border: 1px solid #000;
--post-form-field-title-font-weight: 700;
--post-form-field-title-padding: 0 5px;
--post-form-field-title-font-size: 10pt;
--post-form-field-input-border: 1px solid #000;
--post-form-field-input-focus-border: 1px solid #515151;
--post-form-field-input-background-color: #282a2e;
--post-form-field-input-color: #c5c8c6;
--post-form-field-font-family: arial, helvetica, sans-serif;
--post-form-field-input-appearance: none;
--post-form-field-input-outline: none;
/* reply modal */
--reply-modal-field-input-border: 1px solid #515151;
--reply-modal-field-input-border-focus: 1px solid #757575;
/* reply modal */
--reply-modal-field-border-focus: 1px solid #757575;
--reply-modal-field-input-border-focus: 1px solid #757575;
/* select */
--select-border: 1px solid #575a60;
--select-background-color: #282a2e;
--select-color: #c5c8c6;
/* settings modal */
--settings-modal-background-color: #282a2e;
--settings-modal-border-top: 1px solid #111;
--settings-modal-border-right: 1px solid #111;
--settings-modal-border-bottom: 1px solid #111;
--settings-modal-border-left: 1px solid #111;
--settings-modal-header-border-bottom: 1px solid #111;
--settings-modal-close-button-background-image: url("/public/assets/buttons/cross-dark.png");
--settings-modal-show-button-background-image: url("/public/assets/buttons/plus-dark.png");
--settings-modal-hide-button-background-image: url("/public/assets/buttons/minus-dark.png");
/* stats */
--stats-font-size: 11px;
}
@@ -772,13 +829,6 @@
--button-desktop-text-color-hover: #f30;
--close-button-background-image: url("/public/assets/buttons/cross-photon.png");
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #333;
--button-background-image-mobile: linear-gradient(to bottom, rgba(238, 238, 238, 1) 0%, rgba(224, 224, 224, 1) 100%);
--button-border-mobile: 1px solid #ccc;
/* horizontal rule */
--hr-border: none;
--hr-border-top: 1px solid #ddd;
@@ -795,9 +845,19 @@
/* media */
--media-thumbnail-background-color: rgba(0, 0, 0, 0.05);
/* mobile buttons */
--button-font-size-mobile: 10pt;
--button-font-weight-mobile: 700;
--button-text-color-mobile: #333;
--button-background-image-mobile: linear-gradient(to bottom, rgba(238, 238, 238, 1) 0%, rgba(224, 224, 224, 1) 100%);
--button-border-mobile: 1px solid #ccc;
/* post capcodes */
--post-capcode-mod-text-color: #f60;
/* post desktop */
--post-hide-button-background-image: url("/public/assets/buttons/post-expand-minus-photon.png");
--post-unhide-button-background-image: url("/public/assets/buttons/post-expand-plus-photon.png");
--post-hide-button-background-image: url("/public/assets/buttons/minus-photon.png");
--post-unhide-button-background-image: url("/public/assets/buttons/plus-photon.png");
--post-subject-text-color: #111;
--post-subject-font-weight: 700;
--post-name-text-color: #004a99;
@@ -805,7 +865,7 @@
--post-menu-button-color: #FF6600;
--post-menu-button-color-hover: #FF3300;
--post-greentext-color: #789922;
--post-replies-expand-button-background-image: url("/public/assets/buttons/post-expand-plus-photon.png");
--post-replies-expand-button-background-image: url("/public/assets/buttons/plus-photon.png");
/* post mobile */
--post-mobile-background-color: #eee;
@@ -826,9 +886,6 @@
--post-mobile-abbr-font-size: 10pt;
--post-mobile-content-font-size: 11pt;
/* post capcodes */
--post-capcode-mod-text-color: #f60;
/* post form */
--post-form-toggle-font-size: 22px;
--post-form-toggle-font-weight: 700;
@@ -843,10 +900,7 @@
--post-form-field-input-appearance: none;
--post-form-field-input-outline: none;
--post-form-field-input-focus-border: 1px solid #ea8;
/* reply modal */
--reply-modal-field-input-border: 1px solid #aaa;
--reply-modal-field-input-border-focus: 1px solid #ea8;
--post-form-field-input-color: #000;
/* quotelink */
--post-quotelink-text-color: #f60;
@@ -859,6 +913,21 @@
--reply-desktop-background-color: #ddd;
--reply-desktop-border: 1px solid #ccc;
/* reply modal */
--reply-modal-field-input-border: 1px solid #aaa;
--reply-modal-field-input-border-focus: 1px solid #ea8;
/* settings modal */
--settings-modal-background-color: #ddd;
--settings-modal-border-top: 1px solid #ccc;
--settings-modal-border-right: 1px solid #ccc;
--settings-modal-border-bottom: 1px solid #ccc;
--settings-modal-border-left: 1px solid #ccc;
--settings-modal-header-border-bottom: 1px solid rgba(0, 0, 0, 0.20);
--settings-modal-close-button-background-image: url("/public/assets/buttons/cross-photon.png");
--settings-modal-show-button-background-image: url("/public/assets/buttons/plus-photon.png");
--settings-modal-hide-button-background-image: url("/public/assets/buttons/minus-photon.png");
/* stats */
--stats-font-size: 11px;
}
+4 -1
View File
@@ -1,5 +1,5 @@
import { useEffect, useMemo, useRef } from 'react';
import { useParams } from 'react-router-dom';
import { useLocation, useParams } from 'react-router-dom';
import { useFeed, useSubplebbit } from '@plebbit/plebbit-react-hooks';
import { Virtuoso, VirtuosoHandle, StateSnapshot } from 'react-virtuoso';
import { useTranslation } from 'react-i18next';
@@ -9,6 +9,7 @@ import useReplyModal from '../../hooks/use-reply-modal';
import LoadingEllipsis from '../../components/loading-ellipsis';
import Post from '../../components/post';
import ReplyModal from '../../components/reply-modal';
import SettingsModal from '../../components/settings-modal';
import SubplebbitDescription from '../../components/subplebbit-description';
import SubplebbitRules from '../../components/subplebbit-rules';
@@ -16,6 +17,7 @@ const lastVirtuosoStates: { [key: string]: StateSnapshot } = {};
const Board = () => {
const { t } = useTranslation();
const location = useLocation();
const { subplebbitAddress } = useParams<{ subplebbitAddress: string }>();
const subplebbitAddresses = useMemo(() => [subplebbitAddress], [subplebbitAddress]) as string[];
const sortType = 'active';
@@ -62,6 +64,7 @@ const Board = () => {
return (
<div className={styles.content}>
{location.pathname === `/p/${subplebbitAddress}/settings` && <SettingsModal />}
{showReplyModal && activeCid && <ReplyModal closeModal={closeModal} parentCid={activeCid} scrollY={scrollY} />}
{feed.length > 0 && (
<>
+4 -1
View File
@@ -1,5 +1,5 @@
import { useEffect, useMemo, useRef } from 'react';
import { useParams } from 'react-router-dom';
import { useLocation, useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { Subplebbit, useFeed, useSubplebbit } from '@plebbit/plebbit-react-hooks';
import { Virtuoso, VirtuosoHandle, StateSnapshot } from 'react-virtuoso';
@@ -7,6 +7,7 @@ import useFeedStateString from '../../hooks/use-feed-state-string';
import useWindowWidth from '../../hooks/use-window-width';
import CatalogRow from '../../components/catalog-row';
import LoadingEllipsis from '../../components/loading-ellipsis';
import SettingsModal from '../../components/settings-modal';
import styles from './catalog.module.css';
import _ from 'lodash';
@@ -69,6 +70,7 @@ const columnWidth = 180;
const Catalog = () => {
const { t } = useTranslation();
const location = useLocation();
const { subplebbitAddress } = useParams<{ subplebbitAddress: string }>();
const subplebbitAddresses = useMemo(() => [subplebbitAddress], [subplebbitAddress]) as string[];
@@ -122,6 +124,7 @@ const Catalog = () => {
return (
<div className={styles.content}>
{location.pathname === `/p/${subplebbitAddress}/catalog/settings` && <SettingsModal />}
<hr />
<div className={styles.catalog}>
<Virtuoso
+4 -56
View File
@@ -5,9 +5,11 @@ import { Trans, useTranslation } from 'react-i18next';
import { Comment, Subplebbit, useAccount, useAccountSubplebbits, useSubplebbits } from '@plebbit/plebbit-react-hooks';
import packageJson from '../../../package.json';
import useDefaultSubplebbits, { useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits';
import { getCommentMediaInfo, getHasThumbnail } from '../../lib/utils/media-utils';
import usePopularPosts from '../../hooks/use-popular-posts';
import { getCommentMediaInfo } from '../../lib/utils/media-utils';
import { CatalogPostMedia } from '../../components/catalog-row';
import LoadingEllipsis from '../../components/loading-ellipsis';
import { shuffle } from 'lodash';
// for temporary hook to fetch subplebbit stats
import { useMemo } from 'react';
@@ -207,61 +209,7 @@ const PopularThreadCard = ({ post, boardTitle, boardShortAddress }: PopularThrea
const PopularThreads = ({ subplebbits }: { subplebbits: any }) => {
const { t } = useTranslation();
const [popularPosts, setPopularPosts] = useState<any[]>([]);
useEffect(() => {
const subplebbitToPost: { [key: string]: any } = {};
const uniqueLinks: Set<string> = new Set();
subplebbits.forEach((subplebbit: any) => {
let maxTimestamp = -Infinity;
let mostRecentPost = null;
if (subplebbit?.posts?.pages?.hot?.comments) {
for (const post of Object.values(subplebbit.posts.pages.hot.comments as Comment)) {
const { deleted, link, locked, pinned, removed, replyCount, timestamp } = post;
const commentMediaInfo = getCommentMediaInfo(post);
const isMediaShowed = getHasThumbnail(commentMediaInfo, link);
if (
isMediaShowed &&
replyCount > 0 &&
!deleted &&
!removed &&
!locked &&
!pinned &&
timestamp > Date.now() / 1000 - 60 * 60 * 24 * 30 &&
timestamp > maxTimestamp &&
!uniqueLinks.has(link)
) {
maxTimestamp = post.timestamp;
mostRecentPost = post;
uniqueLinks.add(link);
}
}
if (mostRecentPost) {
subplebbitToPost[subplebbit.address] = { post: mostRecentPost, timestamp: maxTimestamp };
}
}
});
const sortedPosts = Object.values(subplebbitToPost)
.sort((a, b) => b.timestamp - a.timestamp)
.map((item) => item.post);
setPopularPosts((prevPosts) => {
const updatedPosts = [...prevPosts];
sortedPosts.forEach((post) => {
if (!updatedPosts.find((p) => p.cid === post.cid)) {
if (updatedPosts.length < 8) {
updatedPosts.push(post);
}
}
});
return updatedPosts;
});
}, [subplebbits]);
const popularPosts = usePopularPosts(subplebbits);
return (
<div className={styles.box}>
+9 -4
View File
@@ -7,21 +7,25 @@ import { isDescriptionView, isRulesView } from '../../lib/utils/view-utils';
import useReplyModal from '../../hooks/use-reply-modal';
import Post from '../../components/post';
import ReplyModal from '../../components/reply-modal';
import SettingsModal from '../../components/settings-modal';
import SubplebbitDescription from '../../components/subplebbit-description';
import SubplebbitRules from '../../components/subplebbit-rules';
const PostPage = () => {
const { t } = useTranslation();
const params = useParams();
const location = useLocation();
const { commentCid, subplebbitAddress } = params;
const showSettings =
location.pathname === `/p/${subplebbitAddress}/c/${commentCid}/settings` ||
location.pathname === `/p/${subplebbitAddress}/description/settings` ||
location.pathname === `/p/${subplebbitAddress}/rules/settings`;
const isInDescriptionView = isDescriptionView(location.pathname, params);
const isInRulesView = isRulesView(location.pathname, params);
const subplebbit = useSubplebbit({ subplebbitAddress });
const { createdAt, description, rules, shortAddress, suggested, title } = subplebbit;
const location = useLocation();
const isInDescriptionView = isDescriptionView(location.pathname, params);
const isInRulesView = isRulesView(location.pathname, params);
const { activeCid, closeModal, openReplyModal, showReplyModal, scrollY } = useReplyModal();
const post = useComment({ commentCid });
@@ -34,6 +38,7 @@ const PostPage = () => {
return (
<div className={styles.content}>
{showSettings && <SettingsModal />}
{showReplyModal && activeCid && <ReplyModal closeModal={closeModal} parentCid={activeCid} scrollY={scrollY} />}
{isInDescriptionView ? (
<SubplebbitDescription
-1
View File
@@ -1 +0,0 @@
export { default } from './settings';
-23
View File
@@ -1,23 +0,0 @@
.content {
position: absolute;
top: 20%;
left: 50%;
transform: translate(-50%, -50%);
}
.version {
display: block;
}
.content select {
background-color: var(--select-background-color, revert);
border: var(--select-border, revert);
color: var(--select-color, revert);
margin: 10px;
}
.content a {
margin: 10px;
margin-bottom: 40px;
display: block;
}
-76
View File
@@ -1,76 +0,0 @@
import { useTranslation } from 'react-i18next';
import useTheme from '../../hooks/use-theme';
import styles from './settings.module.css';
import { Link } from 'react-router-dom';
import packageJson from '../../../package.json';
const isElectron = window.isElectron === true;
const commitRef = process.env.REACT_APP_COMMIT_REF;
// TODO: remove theme and languages selectors for debugging
const ThemeSettings = () => {
const [theme, setTheme] = useTheme();
return (
<select className={styles.themeSettings} value={theme} onChange={(e) => setTheme(e.target.value)}>
<option value='yotsuba'>Yotsuba</option>
<option value='yotsuba-b'>Yotsuba B</option>
<option value='futaba'>Futaba</option>
<option value='burichan'>Burichan</option>
<option value='tomorrow'>Tomorrow</option>
<option value='photon'>Photon</option>
</select>
);
};
// prettier-ignore
const availableLanguages = ['ar', 'bn', 'cs', 'da', 'de', 'el', 'en', 'es', 'fa', 'fi', 'fil', 'fr', 'he', 'hi', 'hu', 'id', 'it', 'ja', 'ko', 'mr', 'nl', 'no', 'pl', 'pt', 'ro', 'ru', 'sq', 'sv', 'te', 'th', 'tr', 'uk', 'ur', 'vi', 'zh'];
const LanguageSettings = () => {
const { i18n } = useTranslation();
const { changeLanguage, language } = i18n;
const onSelectLanguage = (e: React.ChangeEvent<HTMLSelectElement>) => {
changeLanguage(e.target.value);
};
return (
<div className={styles.languageSettings}>
<select value={language} onChange={onSelectLanguage}>
{availableLanguages.map((lang) => (
<option key={lang} value={lang}>
{lang}
</option>
))}
</select>
</div>
);
};
const Settings = () => {
return (
<div className={styles.content}>
<div className={styles.version}>
<a href={`https://github.com/plebbit/plebchan/releases/tag/v${packageJson.version}`} target='_blank' rel='noopener noreferrer'>
v{packageJson.version}
</a>
{isElectron && (
<a className={styles.fullNodeStats} href='http://localhost:5001/webui/' target='_blank' rel='noreferrer'>
node stats
</a>
)}
{commitRef && (
<a href={`https://github.com/plebbit/plebchan/commit/${commitRef}`} target='_blank' rel='noopener noreferrer'>
{commitRef.slice(0, 7)}
</a>
)}
</div>
<div>
<Link to='/'>Home</Link>
</div>
<ThemeSettings />
<LanguageSettings />
</div>
);
};
export default Settings;