Merge pull request #350 from plebbit/development

Development
This commit is contained in:
Tom (plebeius.eth)
2024-04-29 21:50:17 +02:00
committed by GitHub
50 changed files with 379 additions and 147 deletions
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "التعليق طويل جدًا. <1>اضغط هنا</1> لعرض النص الكامل.", "comment_too_long": "التعليق طويل جدًا. <1>اضغط هنا</1> لعرض النص الكامل.",
"replies_omitted": "{{repliesCount}} ردود محذوفة. <1>اضغط هنا</1> لعرضها.", "replies_omitted": "{{repliesCount}} ردود محذوفة. <1>اضغط هنا</1> لعرضها.",
"replies_and_links_omitted": "{{repliesCount}} ردود و{{linksCount}} روابط محذوفة. <1>اضغط هنا</1> لعرضها.", "replies_and_links_omitted": "{{repliesCount}} ردود و{{linksCount}} روابط محذوفة. <1>اضغط هنا</1> لعرضها.",
"thread_closed_alert": "الموضوع مغلق" "thread_closed_alert": "الموضوع مغلق",
"reply_to_cid": "الرد على {{cid}}",
"submit": "إرسال"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "মন্তব্য খুব দীর্ঘ। <1>পূর্ণ পাঠ্য দেখতে এখানে ক্লিক করুন</1>।", "comment_too_long": "মন্তব্য খুব দীর্ঘ। <1>পূর্ণ পাঠ্য দেখতে এখানে ক্লিক করুন</1>।",
"replies_omitted": "{{repliesCount}}টি উত্তর বাদ দেওয়া হয়েছে। <1>দেখতে এখানে ক্লিক করুন</1>।", "replies_omitted": "{{repliesCount}}টি উত্তর বাদ দেওয়া হয়েছে। <1>দেখতে এখানে ক্লিক করুন</1>।",
"replies_and_links_omitted": "{{repliesCount}}টি উত্তর এবং {{linksCount}}টি লিঙ্ক বাদ দেওয়া হয়েছে। <1>দেখতে এখানে ক্লিক করুন</1>।", "replies_and_links_omitted": "{{repliesCount}}টি উত্তর এবং {{linksCount}}টি লিঙ্ক বাদ দেওয়া হয়েছে। <1>দেখতে এখানে ক্লিক করুন</1>।",
"thread_closed_alert": "থ্রেডটি বন্ধ করা হয়েছে" "thread_closed_alert": "থ্রেডটি বন্ধ করা হয়েছে",
"reply_to_cid": "{{cid}}-এ উত্তর দিন",
"submit": "জমা দিন"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Komentář je příliš dlouhý. <1>Klikněte zde</1> pro zobrazení celého textu.", "comment_too_long": "Komentář je příliš dlouhý. <1>Klikněte zde</1> pro zobrazení celého textu.",
"replies_omitted": "{{repliesCount}} odpovědí vynecháno. <1>Klikněte zde</1> pro zobrazení.", "replies_omitted": "{{repliesCount}} odpovědí vynecháno. <1>Klikněte zde</1> pro zobrazení.",
"replies_and_links_omitted": "{{repliesCount}} odpovědí a {{linksCount}} odkazů vynecháno. <1>Klikněte zde</1> pro zobrazení.", "replies_and_links_omitted": "{{repliesCount}} odpovědí a {{linksCount}} odkazů vynecháno. <1>Klikněte zde</1> pro zobrazení.",
"thread_closed_alert": "Vlákno je uzavřeno" "thread_closed_alert": "Vlákno je uzavřeno",
"reply_to_cid": "Odpovědět na {{cid}}",
"submit": "Odeslat"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Kommentaren er for lang. <1>Klik her</1> for at se hele teksten.", "comment_too_long": "Kommentaren er for lang. <1>Klik her</1> for at se hele teksten.",
"replies_omitted": "{{repliesCount}} svar udeladt. <1>Klik her</1> for at se dem.", "replies_omitted": "{{repliesCount}} svar udeladt. <1>Klik her</1> for at se dem.",
"replies_and_links_omitted": "{{repliesCount}} svar og {{linksCount}} links udeladt. <1>Klik her</1> for at se dem.", "replies_and_links_omitted": "{{repliesCount}} svar og {{linksCount}} links udeladt. <1>Klik her</1> for at se dem.",
"thread_closed_alert": "Tråden er lukket" "thread_closed_alert": "Tråden er lukket",
"reply_to_cid": "Svar til {{cid}}",
"submit": "Indsend"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Kommentar zu lang. <1>Klicken Sie hier</1>, um den vollständigen Text anzuzeigen.", "comment_too_long": "Kommentar zu lang. <1>Klicken Sie hier</1>, um den vollständigen Text anzuzeigen.",
"replies_omitted": "{{repliesCount}} Antworten ausgelassen. <1>Klicken Sie hier</1>, um sie anzuzeigen.", "replies_omitted": "{{repliesCount}} Antworten ausgelassen. <1>Klicken Sie hier</1>, um sie anzuzeigen.",
"replies_and_links_omitted": "{{repliesCount}} Antworten und {{linksCount}} Links ausgelassen. <1>Klicken Sie hier</1>, um sie anzuzeigen.", "replies_and_links_omitted": "{{repliesCount}} Antworten und {{linksCount}} Links ausgelassen. <1>Klicken Sie hier</1>, um sie anzuzeigen.",
"thread_closed_alert": "Der Thread ist geschlossen" "thread_closed_alert": "Der Thread ist geschlossen",
"reply_to_cid": "Antwort an {{cid}}",
"submit": "Einreichen"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Το σχόλιο είναι πολύ μακροσκελές. <1>Κάντε κλικ εδώ</1> για να δείτε το πλήρες κείμενο.", "comment_too_long": "Το σχόλιο είναι πολύ μακροσκελές. <1>Κάντε κλικ εδώ</1> για να δείτε το πλήρες κείμενο.",
"replies_omitted": "{{repliesCount}} απαντήσεις παραλείφθηκαν. <1>Κάντε κλικ εδώ</1> για να τις δείτε.", "replies_omitted": "{{repliesCount}} απαντήσεις παραλείφθηκαν. <1>Κάντε κλικ εδώ</1> για να τις δείτε.",
"replies_and_links_omitted": "{{repliesCount}} απαντήσεις και {{linksCount}} σύνδεσμοι παραλείφθηκαν. <1>Κάντε κλικ εδώ</1> για να τις δείτε.", "replies_and_links_omitted": "{{repliesCount}} απαντήσεις και {{linksCount}} σύνδεσμοι παραλείφθηκαν. <1>Κάντε κλικ εδώ</1> για να τις δείτε.",
"thread_closed_alert": "Το νήμα έχει κλείσει" "thread_closed_alert": "Το νήμα έχει κλείσει",
"reply_to_cid": "Απάντηση σε {{cid}}",
"submit": "Υποβολή"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Comment too long. <1>Click here</1> to view the full text.", "comment_too_long": "Comment too long. <1>Click here</1> to view the full text.",
"replies_omitted": "{{repliesCount}} replies omitted. <1>Click here</1> to view.", "replies_omitted": "{{repliesCount}} replies omitted. <1>Click here</1> to view.",
"replies_and_links_omitted": "{{repliesCount}} replies and {{linksCount}} links omitted. <1>Click here</1> to view.", "replies_and_links_omitted": "{{repliesCount}} replies and {{linksCount}} links omitted. <1>Click here</1> to view.",
"thread_closed_alert": "This thread is closed" "thread_closed_alert": "This thread is closed",
"reply_to_cid": "Reply to {{cid}}",
"submit": "Submit"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Comentario demasiado largo. <1>Haz clic aquí</1> para ver el texto completo.", "comment_too_long": "Comentario demasiado largo. <1>Haz clic aquí</1> para ver el texto completo.",
"replies_omitted": "{{repliesCount}} respuestas omitidas. <1>Haz clic aquí</1> para verlas.", "replies_omitted": "{{repliesCount}} respuestas omitidas. <1>Haz clic aquí</1> para verlas.",
"replies_and_links_omitted": "{{repliesCount}} respuestas y {{linksCount}} enlaces omitidos. <1>Haz clic aquí</1> para verlos.", "replies_and_links_omitted": "{{repliesCount}} respuestas y {{linksCount}} enlaces omitidos. <1>Haz clic aquí</1> para verlos.",
"thread_closed_alert": "El hilo está cerrado" "thread_closed_alert": "El hilo está cerrado",
"reply_to_cid": "Responder a {{cid}}",
"submit": "Enviar"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "نظر بسیار طولانی است. <1>اینجا کلیک کنید</1> تا متن کامل را ببینید.", "comment_too_long": "نظر بسیار طولانی است. <1>اینجا کلیک کنید</1> تا متن کامل را ببینید.",
"replies_omitted": "{{repliesCount}} پاسخ حذف شده است. <1>اینجا کلیک کنید</1> تا آنها را مشاهده کنید.", "replies_omitted": "{{repliesCount}} پاسخ حذف شده است. <1>اینجا کلیک کنید</1> تا آنها را مشاهده کنید.",
"replies_and_links_omitted": "{{repliesCount}} پاسخ و {{linksCount}} لینک حذف شده است. <1>اینجا کلیک کنید</1> تا آنها را مشاهده کنید.", "replies_and_links_omitted": "{{repliesCount}} پاسخ و {{linksCount}} لینک حذف شده است. <1>اینجا کلیک کنید</1> تا آنها را مشاهده کنید.",
"thread_closed_alert": "موضوع بسته شده است" "thread_closed_alert": "موضوع بسته شده است",
"reply_to_cid": "پاسخ به {{cid}}",
"submit": "ارسال"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Kommentti on liian pitkä. <1>Napsauta tästä</1> nähdäksesi koko tekstin.", "comment_too_long": "Kommentti on liian pitkä. <1>Napsauta tästä</1> nähdäksesi koko tekstin.",
"replies_omitted": "{{repliesCount}} vastausta jätetty pois. <1>Napsauta tästä</1> nähdäksesi ne.", "replies_omitted": "{{repliesCount}} vastausta jätetty pois. <1>Napsauta tästä</1> nähdäksesi ne.",
"replies_and_links_omitted": "{{repliesCount}} vastausta ja {{linksCount}} linkkiä jätetty pois. <1>Napsauta tästä</1> nähdäksesi ne.", "replies_and_links_omitted": "{{repliesCount}} vastausta ja {{linksCount}} linkkiä jätetty pois. <1>Napsauta tästä</1> nähdäksesi ne.",
"thread_closed_alert": "Ketju on suljettu" "thread_closed_alert": "Ketju on suljettu",
"reply_to_cid": "Vastaa {{cid}}",
"submit": "Lähetä"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Masyadong mahaba ang komento. <1>I-click dito</1> upang makita ang buong teksto.", "comment_too_long": "Masyadong mahaba ang komento. <1>I-click dito</1> upang makita ang buong teksto.",
"replies_omitted": "{{repliesCount}} mga tugon ang hindi ipinakita. <1>I-click dito</1> upang makita.", "replies_omitted": "{{repliesCount}} mga tugon ang hindi ipinakita. <1>I-click dito</1> upang makita.",
"replies_and_links_omitted": "{{repliesCount}} mga tugon at {{linksCount}} mga link ang hindi ipinakita. <1>I-click dito</1> upang makita.", "replies_and_links_omitted": "{{repliesCount}} mga tugon at {{linksCount}} mga link ang hindi ipinakita. <1>I-click dito</1> upang makita.",
"thread_closed_alert": "Sarado na ang thread" "thread_closed_alert": "Sarado na ang thread",
"reply_to_cid": "Tumugon sa {{cid}}",
"submit": "Isumite"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Commentaire trop long. <1>Cliquez ici</1> pour voir le texte complet.", "comment_too_long": "Commentaire trop long. <1>Cliquez ici</1> pour voir le texte complet.",
"replies_omitted": "{{repliesCount}} réponses omises. <1>Cliquez ici</1> pour les afficher.", "replies_omitted": "{{repliesCount}} réponses omises. <1>Cliquez ici</1> pour les afficher.",
"replies_and_links_omitted": "{{repliesCount}} réponses et {{linksCount}} liens omis. <1>Cliquez ici</1> pour les afficher.", "replies_and_links_omitted": "{{repliesCount}} réponses et {{linksCount}} liens omis. <1>Cliquez ici</1> pour les afficher.",
"thread_closed_alert": "Le fil est fermé" "thread_closed_alert": "Le fil est fermé",
"reply_to_cid": "Répondre à {{cid}}",
"submit": "Soumettre"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "התגובה ארוכה מדי. <1>לחץ כאן</1> כדי לראות את הטקסט המלא.", "comment_too_long": "התגובה ארוכה מדי. <1>לחץ כאן</1> כדי לראות את הטקסט המלא.",
"replies_omitted": "{{repliesCount}} תגובות נשמטו. <1>לחץ כאן</1> לצפייה.", "replies_omitted": "{{repliesCount}} תגובות נשמטו. <1>לחץ כאן</1> לצפייה.",
"replies_and_links_omitted": "{{repliesCount}} תגובות ו{{linksCount}} קישורים נשמטו. <1>לחץ כאן</1> לצפייה.", "replies_and_links_omitted": "{{repliesCount}} תגובות ו{{linksCount}} קישורים נשמטו. <1>לחץ כאן</1> לצפייה.",
"thread_closed_alert": "האשכול סגור" "thread_closed_alert": "האשכול סגור",
"reply_to_cid": "תגובה ל{{cid}}",
"submit": "שלח"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "टिप्पणी बहुत लंबी है। <1>पूरा टेक्स्ट देखने के लिए यहां क्लिक करें</1>।", "comment_too_long": "टिप्पणी बहुत लंबी है। <1>पूरा टेक्स्ट देखने के लिए यहां क्लिक करें</1>।",
"replies_omitted": "{{repliesCount}} उत्तर छोड़े गए हैं। <1>देखने के लिए यहां क्लिक करें</1>।", "replies_omitted": "{{repliesCount}} उत्तर छोड़े गए हैं। <1>देखने के लिए यहां क्लिक करें</1>।",
"replies_and_links_omitted": "{{repliesCount}} उत्तर और {{linksCount}} लिंक छोड़े गए हैं। <1>देखने के लिए यहां क्लिक करें</1>।", "replies_and_links_omitted": "{{repliesCount}} उत्तर और {{linksCount}} लिंक छोड़े गए हैं। <1>देखने के लिए यहां क्लिक करें</1>।",
"thread_closed_alert": "यह थ्रेड बंद है" "thread_closed_alert": "यह थ्रेड बंद है",
"reply_to_cid": "{{cid}} का उत्तर दें",
"submit": "जमा करें"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "A megjegyzés túl hosszú. <1>Kattintson ide</1> a teljes szöveg megtekintéséhez.", "comment_too_long": "A megjegyzés túl hosszú. <1>Kattintson ide</1> a teljes szöveg megtekintéséhez.",
"replies_omitted": "{{repliesCount}} válasz kihagyva. <1>Kattintson ide</1> a megtekintéshez.", "replies_omitted": "{{repliesCount}} válasz kihagyva. <1>Kattintson ide</1> a megtekintéshez.",
"replies_and_links_omitted": "{{repliesCount}} válasz és {{linksCount}} link kihagyva. <1>Kattintson ide</1> a megtekintéshez.", "replies_and_links_omitted": "{{repliesCount}} válasz és {{linksCount}} link kihagyva. <1>Kattintson ide</1> a megtekintéshez.",
"thread_closed_alert": "A téma lezárva" "thread_closed_alert": "A téma lezárva",
"reply_to_cid": "Válasz erre: {{cid}}",
"submit": "Beküldés"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Komentar terlalu panjang. <1>Klik di sini</1> untuk melihat teks lengkap.", "comment_too_long": "Komentar terlalu panjang. <1>Klik di sini</1> untuk melihat teks lengkap.",
"replies_omitted": "{{repliesCount}} balasan dihilangkan. <1>Klik di sini</1> untuk melihat.", "replies_omitted": "{{repliesCount}} balasan dihilangkan. <1>Klik di sini</1> untuk melihat.",
"replies_and_links_omitted": "{{repliesCount}} balasan dan {{linksCount}} tautan dihilangkan. <1>Klik di sini</1> untuk melihat.", "replies_and_links_omitted": "{{repliesCount}} balasan dan {{linksCount}} tautan dihilangkan. <1>Klik di sini</1> untuk melihat.",
"thread_closed_alert": "Thread ini ditutup" "thread_closed_alert": "Thread ini ditutup",
"reply_to_cid": "Balas ke {{cid}}",
"submit": "Kirim"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Commento troppo lungo. <1>Clicca qui</1> per vedere il testo completo.", "comment_too_long": "Commento troppo lungo. <1>Clicca qui</1> per vedere il testo completo.",
"replies_omitted": "{{repliesCount}} risposte omesse. <1>Clicca qui</1> per visualizzare.", "replies_omitted": "{{repliesCount}} risposte omesse. <1>Clicca qui</1> per visualizzare.",
"replies_and_links_omitted": "{{repliesCount}} risposte e {{linksCount}} link omessi. <1>Clicca qui</1> per visualizzare.", "replies_and_links_omitted": "{{repliesCount}} risposte e {{linksCount}} link omessi. <1>Clicca qui</1> per visualizzare.",
"thread_closed_alert": "Questo thread è chiuso" "thread_closed_alert": "Questo thread è chiuso",
"reply_to_cid": "Rispondi a {{cid}}",
"submit": "Invia"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "コメントが長すぎます。 <1>ここをクリック</1>して全文を表示。", "comment_too_long": "コメントが長すぎます。 <1>ここをクリック</1>して全文を表示。",
"replies_omitted": "{{repliesCount}}件の返信が省略されました。 <1>ここをクリック</1>して表示。", "replies_omitted": "{{repliesCount}}件の返信が省略されました。 <1>ここをクリック</1>して表示。",
"replies_and_links_omitted": "{{repliesCount}}件の返信と{{linksCount}}件のリンクが省略されました。 <1>ここをクリック</1>して表示。", "replies_and_links_omitted": "{{repliesCount}}件の返信と{{linksCount}}件のリンクが省略されました。 <1>ここをクリック</1>して表示。",
"thread_closed_alert": "このスレッドは閉じられています" "thread_closed_alert": "このスレッドは閉じられています",
"reply_to_cid": "{{cid}}に返信",
"submit": "送信"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "댓글이 너무 깁니다. <1>여기를 클릭하십시오</1> 전체 텍스트를 보려면.", "comment_too_long": "댓글이 너무 깁니다. <1>여기를 클릭하십시오</1> 전체 텍스트를 보려면.",
"replies_omitted": "{{repliesCount}}개의 답글이 생략되었습니다. <1>여기를 클릭하십시오</1> 보려면.", "replies_omitted": "{{repliesCount}}개의 답글이 생략되었습니다. <1>여기를 클릭하십시오</1> 보려면.",
"replies_and_links_omitted": "{{repliesCount}}개의 답글과 {{linksCount}}개의 링크가 생략되었습니다. <1>여기를 클릭하십시오</1> 보려면.", "replies_and_links_omitted": "{{repliesCount}}개의 답글과 {{linksCount}}개의 링크가 생략되었습니다. <1>여기를 클릭하십시오</1> 보려면.",
"thread_closed_alert": "이 스레드는 닫혔습니다" "thread_closed_alert": "이 스레드는 닫혔습니다",
"reply_to_cid": "{{cid}}에 답변",
"submit": "제출"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "टिप्पणी खूप लांब आहे. <1>पूर्ण मजकूर पाहण्यासाठी येथे क्लिक करा</1>.", "comment_too_long": "टिप्पणी खूप लांब आहे. <1>पूर्ण मजकूर पाहण्यासाठी येथे क्लिक करा</1>.",
"replies_omitted": "{{repliesCount}} प्रतिसाद वगळले गेले आहेत. <1>पाहण्यासाठी येथे क्लिक करा</1>.", "replies_omitted": "{{repliesCount}} प्रतिसाद वगळले गेले आहेत. <1>पाहण्यासाठी येथे क्लिक करा</1>.",
"replies_and_links_omitted": "{{repliesCount}} प्रतिसाद आणि {{linksCount}} दुवे वगळले गेले आहेत. <1>पाहण्यासाठी येथे क्लिक करा</1>.", "replies_and_links_omitted": "{{repliesCount}} प्रतिसाद आणि {{linksCount}} दुवे वगळले गेले आहेत. <1>पाहण्यासाठी येथे क्लिक करा</1>.",
"thread_closed_alert": "हा थ्रेड बंद आहे" "thread_closed_alert": "हा थ्रेड बंद आहे",
"reply_to_cid": "{{cid}} ला उत्तर द्या",
"submit": "सबमिट करा"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Reactie te lang. <1>Klik hier</1> om de volledige tekst te bekijken.", "comment_too_long": "Reactie te lang. <1>Klik hier</1> om de volledige tekst te bekijken.",
"replies_omitted": "{{repliesCount}} reacties weggelaten. <1>Klik hier</1> om ze te bekijken.", "replies_omitted": "{{repliesCount}} reacties weggelaten. <1>Klik hier</1> om ze te bekijken.",
"replies_and_links_omitted": "{{repliesCount}} reacties en {{linksCount}} links weggelaten. <1>Klik hier</1> om ze te bekijken.", "replies_and_links_omitted": "{{repliesCount}} reacties en {{linksCount}} links weggelaten. <1>Klik hier</1> om ze te bekijken.",
"thread_closed_alert": "De thread is gesloten" "thread_closed_alert": "De thread is gesloten",
"reply_to_cid": "Reageren op {{cid}}",
"submit": "Verzenden"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Kommentaren er for lang. <1>Klikk her</1> for å se hele teksten.", "comment_too_long": "Kommentaren er for lang. <1>Klikk her</1> for å se hele teksten.",
"replies_omitted": "{{repliesCount}} svar utelatt. <1>Klikk her</1> for å se dem.", "replies_omitted": "{{repliesCount}} svar utelatt. <1>Klikk her</1> for å se dem.",
"replies_and_links_omitted": "{{repliesCount}} svar og {{linksCount}} lenker utelatt. <1>Klikk her</1> for å se dem.", "replies_and_links_omitted": "{{repliesCount}} svar og {{linksCount}} lenker utelatt. <1>Klikk her</1> for å se dem.",
"thread_closed_alert": "Tråden er stengt" "thread_closed_alert": "Tråden er stengt",
"reply_to_cid": "Svar til {{cid}}",
"submit": "Send inn"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Komentarz jest za długi. <1>Kliknij tutaj</1>, aby zobaczyć pełny tekst.", "comment_too_long": "Komentarz jest za długi. <1>Kliknij tutaj</1>, aby zobaczyć pełny tekst.",
"replies_omitted": "Pominięto {{repliesCount}} odpowiedzi. <1>Kliknij tutaj</1>, aby je zobaczyć.", "replies_omitted": "Pominięto {{repliesCount}} odpowiedzi. <1>Kliknij tutaj</1>, aby je zobaczyć.",
"replies_and_links_omitted": "Pominięto {{repliesCount}} odpowiedzi i {{linksCount}} linków. <1>Kliknij tutaj</1>, aby je zobaczyć.", "replies_and_links_omitted": "Pominięto {{repliesCount}} odpowiedzi i {{linksCount}} linków. <1>Kliknij tutaj</1>, aby je zobaczyć.",
"thread_closed_alert": "Wątek jest zamknięty" "thread_closed_alert": "Wątek jest zamknięty",
"reply_to_cid": "Odpowiedz na {{cid}}",
"submit": "Zatwierdź"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Comentário muito longo. <1>Clique aqui</1> para ver o texto completo.", "comment_too_long": "Comentário muito longo. <1>Clique aqui</1> para ver o texto completo.",
"replies_omitted": "{{repliesCount}} respostas omitidas. <1>Clique aqui</1> para visualizar.", "replies_omitted": "{{repliesCount}} respostas omitidas. <1>Clique aqui</1> para visualizar.",
"replies_and_links_omitted": "{{repliesCount}} respostas e {{linksCount}} links omitidos. <1>Clique aqui</1> para visualizar.", "replies_and_links_omitted": "{{repliesCount}} respostas e {{linksCount}} links omitidos. <1>Clique aqui</1> para visualizar.",
"thread_closed_alert": "O tópico está fechado" "thread_closed_alert": "O tópico está fechado",
"reply_to_cid": "Responder a {{cid}}",
"submit": "Enviar"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Comentariul este prea lung. <1>Click aici</1> pentru a vedea textul complet.", "comment_too_long": "Comentariul este prea lung. <1>Click aici</1> pentru a vedea textul complet.",
"replies_omitted": "{{repliesCount}} răspunsuri omise. <1>Click aici</1> pentru a le vizualiza.", "replies_omitted": "{{repliesCount}} răspunsuri omise. <1>Click aici</1> pentru a le vizualiza.",
"replies_and_links_omitted": "{{repliesCount}} răspunsuri și {{linksCount}} linkuri omise. <1>Click aici</1> pentru a le vizualiza.", "replies_and_links_omitted": "{{repliesCount}} răspunsuri și {{linksCount}} linkuri omise. <1>Click aici</1> pentru a le vizualiza.",
"thread_closed_alert": "Acest fir de discuție este închis" "thread_closed_alert": "Acest fir de discuție este închis",
"reply_to_cid": "Răspundeți la {{cid}}",
"submit": "Trimite"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Комментарий слишком длинный. <1>Нажмите здесь</1>, чтобы прочитать полный текст.", "comment_too_long": "Комментарий слишком длинный. <1>Нажмите здесь</1>, чтобы прочитать полный текст.",
"replies_omitted": "{{repliesCount}} ответов пропущено. <1>Нажмите здесь</1>, чтобы посмотреть.", "replies_omitted": "{{repliesCount}} ответов пропущено. <1>Нажмите здесь</1>, чтобы посмотреть.",
"replies_and_links_omitted": "{{repliesCount}} ответов и {{linksCount}} ссылок пропущено. <1>Нажмите здесь</1>, чтобы посмотреть.", "replies_and_links_omitted": "{{repliesCount}} ответов и {{linksCount}} ссылок пропущено. <1>Нажмите здесь</1>, чтобы посмотреть.",
"thread_closed_alert": "Тема закрыта" "thread_closed_alert": "Тема закрыта",
"reply_to_cid": "Ответить на {{cid}}",
"submit": "Отправить"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Komenti është shumë i gjatë. <1>Kliko këtu</1> për të parë tekstin e plotë.", "comment_too_long": "Komenti është shumë i gjatë. <1>Kliko këtu</1> për të parë tekstin e plotë.",
"replies_omitted": "{{repliesCount}} përgjigje janë lënë jashtë. <1>Kliko këtu</1> për t'i shikuar.", "replies_omitted": "{{repliesCount}} përgjigje janë lënë jashtë. <1>Kliko këtu</1> për t'i shikuar.",
"replies_and_links_omitted": "{{repliesCount}} përgjigje dhe {{linksCount}} lidhje janë lënë jashtë. <1>Kliko këtu</1> për t'i shikuar.", "replies_and_links_omitted": "{{repliesCount}} përgjigje dhe {{linksCount}} lidhje janë lënë jashtë. <1>Kliko këtu</1> për t'i shikuar.",
"thread_closed_alert": "Temë është mbyllur" "thread_closed_alert": "Temë është mbyllur",
"reply_to_cid": "Përgjigju në {{cid}}",
"submit": "Dorëzo"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Kommentaren är för lång. <1>Klicka här</1> för att se hela texten.", "comment_too_long": "Kommentaren är för lång. <1>Klicka här</1> för att se hela texten.",
"replies_omitted": "{{repliesCount}} svar utelämnade. <1>Klicka här</1> för att visa dem.", "replies_omitted": "{{repliesCount}} svar utelämnade. <1>Klicka här</1> för att visa dem.",
"replies_and_links_omitted": "{{repliesCount}} svar och {{linksCount}} länkar utelämnade. <1>Klicka här</1> för att visa dem.", "replies_and_links_omitted": "{{repliesCount}} svar och {{linksCount}} länkar utelämnade. <1>Klicka här</1> för att visa dem.",
"thread_closed_alert": "Tråden är stängd" "thread_closed_alert": "Tråden är stängd",
"reply_to_cid": "Svara på {{cid}}",
"submit": "Skicka in"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "వ్యాఖ్య చాలా పొడవుగా ఉంది. <1>పూర్తి టెక్స్ట్ చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.", "comment_too_long": "వ్యాఖ్య చాలా పొడవుగా ఉంది. <1>పూర్తి టెక్స్ట్ చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.",
"replies_omitted": "{{repliesCount}} స్పందనలు వదిలివేయబడ్డాయి. <1>చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.", "replies_omitted": "{{repliesCount}} స్పందనలు వదిలివేయబడ్డాయి. <1>చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.",
"replies_and_links_omitted": "{{repliesCount}} స్పందనలు మరియు {{linksCount}} లింకులు వదిలివేయబడ్డాయి. <1>చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.", "replies_and_links_omitted": "{{repliesCount}} స్పందనలు మరియు {{linksCount}} లింకులు వదిలివేయబడ్డాయి. <1>చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.",
"thread_closed_alert": "ఈ థ్రెడ్ మూసివేయబడింది" "thread_closed_alert": "ఈ థ్రెడ్ మూసివేయబడింది",
"reply_to_cid": "{{cid}}కి స్పందించండి",
"submit": "సమర్పించు"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "ความคิดเห็นยาวเกินไป <1>คลิกที่นี่</1> เพื่อดูข้อความเต็ม.", "comment_too_long": "ความคิดเห็นยาวเกินไป <1>คลิกที่นี่</1> เพื่อดูข้อความเต็ม.",
"replies_omitted": "ข้าม {{repliesCount}} คำตอบ <1>คลิกที่นี่</1> เพื่อดู.", "replies_omitted": "ข้าม {{repliesCount}} คำตอบ <1>คลิกที่นี่</1> เพื่อดู.",
"replies_and_links_omitted": "ข้าม {{repliesCount}} คำตอบและ {{linksCount}} ลิงก์ <1>คลิกที่นี่</1> เพื่อดู.", "replies_and_links_omitted": "ข้าม {{repliesCount}} คำตอบและ {{linksCount}} ลิงก์ <1>คลิกที่นี่</1> เพื่อดู.",
"thread_closed_alert": "กระทู้นี้ถูกปิด" "thread_closed_alert": "กระทู้นี้ถูกปิด",
"reply_to_cid": "ตอบกลับ {{cid}}",
"submit": "ส่ง"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Yorum çok uzun. <1>Buraya tıklayın</1> tam metni görüntülemek için.", "comment_too_long": "Yorum çok uzun. <1>Buraya tıklayın</1> tam metni görüntülemek için.",
"replies_omitted": "{{repliesCount}} yanıt göz ardı edildi. <1>Buraya tıklayın</1> görüntülemek için.", "replies_omitted": "{{repliesCount}} yanıt göz ardı edildi. <1>Buraya tıklayın</1> görüntülemek için.",
"replies_and_links_omitted": "{{repliesCount}} yanıt ve {{linksCount}} bağlantı göz ardı edildi. <1>Buraya tıklayın</1> görüntülemek için.", "replies_and_links_omitted": "{{repliesCount}} yanıt ve {{linksCount}} bağlantı göz ardı edildi. <1>Buraya tıklayın</1> görüntülemek için.",
"thread_closed_alert": "Bu konu kapatılmıştır" "thread_closed_alert": "Bu konu kapatılmıştır",
"reply_to_cid": "{{cid}}ye yanıt ver",
"submit": "Gönder"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Коментар занадто довгий. <1>Натисніть тут</1>, щоб переглянути повний текст.", "comment_too_long": "Коментар занадто довгий. <1>Натисніть тут</1>, щоб переглянути повний текст.",
"replies_omitted": "{{repliesCount}} відповідей пропущено. <1>Натисніть тут</1>, щоб переглянути.", "replies_omitted": "{{repliesCount}} відповідей пропущено. <1>Натисніть тут</1>, щоб переглянути.",
"replies_and_links_omitted": "{{repliesCount}} відповідей та {{linksCount}} посилань пропущено. <1>Натисніть тут</1>, щоб переглянути.", "replies_and_links_omitted": "{{repliesCount}} відповідей та {{linksCount}} посилань пропущено. <1>Натисніть тут</1>, щоб переглянути.",
"thread_closed_alert": "Тему закрито" "thread_closed_alert": "Тему закрито",
"reply_to_cid": "Відповісти на {{cid}}",
"submit": "Надіслати"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "تبصرہ بہت طویل ہے۔ <1>مکمل متن دیکھنے کے لیے یہاں کلک کریں</1>۔", "comment_too_long": "تبصرہ بہت طویل ہے۔ <1>مکمل متن دیکھنے کے لیے یہاں کلک کریں</1>۔",
"replies_omitted": "{{repliesCount}} جوابات چھوڑ دیے گئے ہیں۔ <1>مکمل دیکھنے کے لیے یہاں کلک کریں</1>۔", "replies_omitted": "{{repliesCount}} جوابات چھوڑ دیے گئے ہیں۔ <1>مکمل دیکھنے کے لیے یہاں کلک کریں</1>۔",
"replies_and_links_omitted": "{{repliesCount}} جوابات اور {{linksCount}} لنکس چھوڑ دیے گئے ہیں۔ <1>مکمل دیکھنے کے لیے یہاں کلک کریں</1>۔", "replies_and_links_omitted": "{{repliesCount}} جوابات اور {{linksCount}} لنکس چھوڑ دیے گئے ہیں۔ <1>مکمل دیکھنے کے لیے یہاں کلک کریں</1>۔",
"thread_closed_alert": "یہ دھاگہ بند ہے" "thread_closed_alert": "یہ دھاگہ بند ہے",
"reply_to_cid": "{{cid}} کا جواب دیں",
"submit": "جمع کرائیں"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "Bình luận quá dài. <1>Nhấn vào đây</1> để xem toàn bộ văn bản.", "comment_too_long": "Bình luận quá dài. <1>Nhấn vào đây</1> để xem toàn bộ văn bản.",
"replies_omitted": "{{repliesCount}} câu trả lời bị bỏ qua. <1>Nhấn vào đây</1> để xem.", "replies_omitted": "{{repliesCount}} câu trả lời bị bỏ qua. <1>Nhấn vào đây</1> để xem.",
"replies_and_links_omitted": "{{repliesCount}} câu trả lời và {{linksCount}} liên kết bị bỏ qua. <1>Nhấn vào đây</1> để xem.", "replies_and_links_omitted": "{{repliesCount}} câu trả lời và {{linksCount}} liên kết bị bỏ qua. <1>Nhấn vào đây</1> để xem.",
"thread_closed_alert": "Chủ đề này đã đóng" "thread_closed_alert": "Chủ đề này đã đóng",
"reply_to_cid": "Trả lời {{cid}}",
"submit": "Gửi"
} }
+3 -1
View File
@@ -59,5 +59,7 @@
"comment_too_long": "评论太长。 <1>点击这里</1>查看完整文本。", "comment_too_long": "评论太长。 <1>点击这里</1>查看完整文本。",
"replies_omitted": "省略了{{repliesCount}}条回复。 <1>点击这里</1>查看。", "replies_omitted": "省略了{{repliesCount}}条回复。 <1>点击这里</1>查看。",
"replies_and_links_omitted": "省略了{{repliesCount}}条回复和{{linksCount}}个链接。 <1>点击这里</1>查看。", "replies_and_links_omitted": "省略了{{repliesCount}}条回复和{{linksCount}}个链接。 <1>点击这里</1>查看。",
"thread_closed_alert": "该主题已关闭" "thread_closed_alert": "该主题已关闭",
"reply_to_cid": "回复{{cid}}",
"submit": "提交"
} }
+19 -1
View File
@@ -23,9 +23,27 @@
padding: 2px 4px; padding: 2px 4px;
background-color: var(--boardnav-mobile-background-color); background-color: var(--boardnav-mobile-background-color);
border-bottom: var(--boardnav-mobile-border-bottom); border-bottom: var(--boardnav-mobile-border-bottom);
font-size: var(--boardnav-mobile-font-size);
position: fixed; position: fixed;
width: 100%; width: 100%;
font-size: var(--boardnav-mobile-font-size); z-index: 6;
animation-name: stickyMenuAnimation;
animation-duration: 1s;
animation-timing-function: linear;
animation-iteration-count: 1;
animation-fill-mode: both;
animation-play-state: paused;
align-items: center;
justify-content: space-around;
}
@keyframes stickyMenuAnimation {
0% {
top: 0px;
}
100% {
top: -50px;
}
} }
.boardNavMobile .pageJump a { .boardNavMobile .pageJump a {
+47 -1
View File
@@ -62,7 +62,7 @@ const BoardNavMobile = ({ subplebbitAddresses, subplebbitAddress }: BoardNavProp
); );
return ( return (
<div className={styles.boardNavMobile}> <div className={styles.boardNavMobile} id='sticky-menu'>
<div className={styles.boardSelect}> <div className={styles.boardSelect}>
<strong>{t('board')}</strong> <strong>{t('board')}</strong>
{boardSelect} {boardSelect}
@@ -75,6 +75,52 @@ const BoardNavMobile = ({ subplebbitAddresses, subplebbitAddress }: BoardNavProp
); );
}; };
// sticky menu animation
// will trigger more than once with hot reloading during development
if (!window.STICKY_MENU_SCROLL_LISTENER) {
window.STICKY_MENU_SCROLL_LISTENER = true;
const scrollRange = 50; // the animation css px range in stickyMenuAnimation, must also edit css animation 100%: {top}
let currentScrollInRange = 0,
previousScroll = 0;
window.addEventListener('scroll', () => {
// find difference between current and last scroll position
const currentScroll = window.scrollY;
const scrollDifference = currentScroll - previousScroll;
previousScroll = currentScroll;
// find new current scroll in range
const previousScrollInRange = currentScrollInRange;
currentScrollInRange += scrollDifference;
if (currentScrollInRange > scrollRange) {
currentScrollInRange = scrollRange;
} else if (currentScrollInRange < 0) {
currentScrollInRange = 0;
}
// fix mobile overflow scroll bug
if (currentScroll <= 0) {
currentScrollInRange = 0;
}
// no changes
if (currentScrollInRange === previousScrollInRange) {
return;
}
// Get the menu element
const menuElement = document.getElementById('sticky-menu');
if (!menuElement) {
return;
}
// control progress of the animation using negative animation-delay (0 to -1s)
const animationPercent = currentScrollInRange / scrollRange;
menuElement.style.animationDelay = animationPercent * -1 + 's';
});
}
const BoardNav = () => { const BoardNav = () => {
const subplebbitAddresses = useDefaultSubplebbitAddresses(); const subplebbitAddresses = useDefaultSubplebbitAddresses();
@@ -77,4 +77,10 @@
cursor: pointer; cursor: pointer;
filter: var(--filter80); filter: var(--filter80);
text-transform: capitalize; text-transform: capitalize;
}
@media (max-width: 640px) {
.title {
cursor: default;
}
} }
@@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next';
import { Challenge as ChallengeType } from '@plebbit/plebbit-react-hooks'; import { Challenge as ChallengeType } from '@plebbit/plebbit-react-hooks';
import { getPublicationType } from '../../lib/utils/challenge-utils'; import { getPublicationType } from '../../lib/utils/challenge-utils';
import useChallenges from '../../hooks/use-challenges'; import useChallenges from '../../hooks/use-challenges';
import useWindowWidth from '../../hooks/use-window-width';
import styles from './challenge-modal.module.css'; import styles from './challenge-modal.module.css';
import _ from 'lodash'; import _ from 'lodash';
@@ -53,67 +54,74 @@ const Challenge = ({ challenge, closeModal }: ChallengeProps) => {
// react-draggable requires a ref to the modal node // react-draggable requires a ref to the modal node
const nodeRef = useRef(null); const nodeRef = useRef(null);
const isMobile = useWindowWidth() < 640;
return ( const modalContent = (
<Draggable handle='.challengeHandle' nodeRef={nodeRef}> <div className={styles.container} ref={nodeRef}>
<div className={styles.container} ref={nodeRef}> <div className={`challengeHandle ${styles.title}`}>
<div className={`challengeHandle ${styles.title}`}> Challenge for {publicationType}
Challenge for {publicationType} <button className={styles.closeIcon} onClick={closeModal} title='close' />
<button className={styles.closeIcon} onClick={closeModal} title='close' /> </div>
<div className={styles.publication}>
<div className={styles.name}>
<input type='text' value={displayName || _.capitalize(t('anonymous'))} disabled />
</div> </div>
<div className={styles.publication}> {title && (
<div className={styles.name}> <div className={styles.subject}>
<input type='text' value={displayName || _.capitalize(t('anonymous'))} disabled /> <input type='text' value={title} disabled />
</div> </div>
{title && ( )}
<div className={styles.subject}> {content && (
<input type='text' value={title} disabled /> <div className={styles.content}>
</div> <textarea value={content} disabled cols={48} rows={4} wrap='soft' />
)}
{content && (
<div className={styles.content}>
<textarea value={content} disabled cols={48} rows={4} wrap='soft' />
</div>
)}
{link && (
<div className={styles.link}>
<input type='text' value={link} disabled />
</div>
)}
<div className={styles.challengeContainer}>
<input
className={styles.challengeAnswer}
type='text'
autoComplete='off'
autoCorrect='off'
spellCheck='false'
placeholder='TYPE THE ANSWER HERE AND PRESS ENTER'
onKeyDown={onEnterKey}
onChange={onAnswersChange}
value={answers[currentChallengeIndex] || ''}
autoFocus
/>
<div className={styles.challengeMediaWrapper}>
{isTextChallenge && <div className={styles.challengeMedia}>{challenges[currentChallengeIndex]?.challenge}</div>}
{isImageChallenge && (
<img alt={t('loading')} className={styles.challengeMedia} src={`data:image/png;base64,${challenges[currentChallengeIndex]?.challenge}`} />
)}
</div>
</div> </div>
<div className={styles.challengeFooter}> )}
<div className={styles.counter}>{t('challenge_counter', { index: currentChallengeIndex + 1, total: challenges?.length })}</div> {link && (
<span className={styles.buttons}> <div className={styles.link}>
{!challenges[currentChallengeIndex + 1] && <button onClick={onSubmit}>{t('submit')}</button>} <input type='text' value={link} disabled />
{challenges.length > 1 && (
<button disabled={!challenges[currentChallengeIndex - 1]} onClick={() => setCurrentChallengeIndex((prev) => prev - 1)}>
{t('previous')}
</button>
)}
{challenges[currentChallengeIndex + 1] && <button onClick={() => setCurrentChallengeIndex((prev) => prev + 1)}>{t('next')}</button>}
</span>
</div> </div>
)}
<div className={styles.challengeContainer}>
<input
className={styles.challengeAnswer}
type='text'
autoComplete='off'
autoCorrect='off'
spellCheck='false'
placeholder='TYPE THE ANSWER HERE AND PRESS ENTER'
onKeyDown={onEnterKey}
onChange={onAnswersChange}
value={answers[currentChallengeIndex] || ''}
autoFocus
/>
<div className={styles.challengeMediaWrapper}>
{isTextChallenge && <div className={styles.challengeMedia}>{challenges[currentChallengeIndex]?.challenge}</div>}
{isImageChallenge && (
<img alt={t('loading')} className={styles.challengeMedia} src={`data:image/png;base64,${challenges[currentChallengeIndex]?.challenge}`} />
)}
</div>
</div>
<div className={styles.challengeFooter}>
<div className={styles.counter}>{t('challenge_counter', { index: currentChallengeIndex + 1, total: challenges?.length })}</div>
<span className={styles.buttons}>
{!challenges[currentChallengeIndex + 1] && <button onClick={onSubmit}>{t('submit')}</button>}
{challenges.length > 1 && (
<button disabled={!challenges[currentChallengeIndex - 1]} onClick={() => setCurrentChallengeIndex((prev) => prev - 1)}>
{t('previous')}
</button>
)}
{challenges[currentChallengeIndex + 1] && <button onClick={() => setCurrentChallengeIndex((prev) => prev + 1)}>{t('next')}</button>}
</span>
</div> </div>
</div> </div>
</div>
);
return isMobile ? (
modalContent
) : (
<Draggable handle='.challengeHandle' nodeRef={nodeRef}>
{modalContent}
</Draggable> </Draggable>
); );
}; };
-1
View File
@@ -128,7 +128,6 @@ const PostFormTable = () => {
useEffect(() => { useEffect(() => {
if (typeof replyIndex === 'number') { if (typeof replyIndex === 'number') {
resetContent(); resetContent();
window.scrollTo(0, document.body.scrollHeight);
} }
}, [replyIndex, resetContent]); }, [replyIndex, resetContent]);
+4
View File
@@ -426,6 +426,10 @@
font-weight: 700 !important; font-weight: 700 !important;
} }
.replyToPost {
cursor: pointer;
}
@media (max-width: 640px) { @media (max-width: 640px) {
.postDesktop { .postDesktop {
display: none; display: none;
@@ -38,17 +38,21 @@
background-image: var(--close-button-background-image); background-image: var(--close-button-background-image);
} }
.container input, .container textarea { .container input[type="text"], .container textarea {
border: 1px solid #aaa; border: var(--post-form-field-input-border, revert);
font-family: Arial, Helvetica, sans-serif; font-family: var(--post-form-field-font-family, revert);
font-size: 10pt; font-size: 10pt;
outline: medium none; outline: var(--post-form-field-input-outline, revert);
width: 298px; width: 298px;
filter: var(--filter80); filter: var(--filter80);
padding: 2px; padding: 2px;
margin-bottom: 1px; margin-bottom: 1px;
} }
.container input[type="text"]:focus, .container textarea:focus {
border: var(--post-form-field-input-focus-border, revert);
}
.content textarea { .content textarea {
vertical-align: top; vertical-align: top;
} }
@@ -57,4 +61,14 @@
text-transform: capitalize; text-transform: capitalize;
float: right; float: right;
cursor: pointer; cursor: pointer;
}
@media (max-width: 640px) {
.container {
position: absolute;
}
.title {
cursor: default;
}
} }
+60 -22
View File
@@ -3,9 +3,10 @@ import { useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import Draggable from 'react-draggable'; import Draggable from 'react-draggable';
import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js'; import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js';
import { useAccount } from '@plebbit/plebbit-react-hooks'; import { setAccount, useAccount } from '@plebbit/plebbit-react-hooks';
import { isValidURL } from '../../lib/utils/url-utils'; import { isValidURL } from '../../lib/utils/url-utils';
import useReply from '../../hooks/use-reply'; import useReply from '../../hooks/use-reply';
import useWindowWidth from '../../hooks/use-window-width';
import styles from './reply-modal.module.css'; import styles from './reply-modal.module.css';
import _ from 'lodash'; import _ from 'lodash';
@@ -48,31 +49,68 @@ const ReplyModal = ({ closeModal, parentCid }: ReplyModalProps) => {
} }
}, [replyIndex, resetContent, closeModal]); }, [replyIndex, resetContent, closeModal]);
// react-draggable requires a ref to the modal node const nodeRef = useRef<HTMLDivElement>(null);
const nodeRef = useRef(null); const isMobile = useWindowWidth() < 640;
return ( // on mobile, the position is absolute instead of fixed, so we need to calculate the top position
<Draggable handle='.replyModalHandle' nodeRef={nodeRef}> useEffect(() => {
<div className={styles.container} ref={nodeRef}> if (nodeRef.current && isMobile) {
<div className={`replyModalHandle ${styles.title}`}> const viewportHeight = window.innerHeight;
Reply to c/{parentCid && Plebbit.getShortCid(parentCid)} const scrollY = window.scrollY;
<button className={styles.closeIcon} onClick={closeModal} title='close' /> const modalHeight = 150;
const centeredPosition = scrollY + viewportHeight / 2 - modalHeight / 2;
nodeRef.current.style.top = `${centeredPosition}px`;
}
}, [isMobile]);
const modalContent = (
<div className={styles.container} ref={nodeRef}>
<div className={`replyModalHandle ${styles.title}`}>
{t('reply_to_cid', { cid: `c/${parentCid && Plebbit.getShortCid(parentCid)}`, interpolation: { escapeValue: false } })}
<button
className={styles.closeIcon}
onClick={(e) => {
e.stopPropagation();
closeModal();
}}
title='close'
/>
</div>
<div className={styles.replyForm}>
<div className={styles.name}>
<input
type='text'
defaultValue={displayName}
placeholder={displayName ? undefined : _.capitalize(t('anonymous'))}
onChange={(e) => setAccount({ ...account, author: { ...account?.author, displayName: e.target.value } })}
/>
</div> </div>
<div className={styles.replyForm}> <div className={styles.link}>
<div className={styles.name}> <input type='text' ref={urlRef} placeholder={_.capitalize(t('link'))} onChange={(e) => setContent.link(e.target.value)} />
<input type='text' defaultValue={displayName} placeholder={displayName ? undefined : _.capitalize(t('anonymous'))} /> </div>
</div> <div className={styles.content}>
<div className={styles.link}> <textarea
<input type='text' ref={urlRef} placeholder={_.capitalize(t('link'))} onChange={(e) => setContent.link(e.target.value)} /> cols={48}
</div> rows={4}
<div className={styles.content}> wrap='soft'
<textarea cols={48} rows={4} wrap='soft' ref={textRef} placeholder={_.capitalize(t('comment'))} onChange={(e) => setContent.content(e.target.value)} /> ref={textRef}
</div> placeholder={_.capitalize(t('comment'))}
<div className={styles.footer}> onChange={(e) => setContent.content(e.target.value)}
<button onClick={onPublishReply}>{t('reply')}</button> autoFocus
</div> />
</div>
<div className={styles.footer}>
<button onClick={onPublishReply}>{t('reply')}</button>
</div> </div>
</div> </div>
</div>
);
return isMobile ? (
modalContent
) : (
<Draggable handle='.replyModalHandle' nodeRef={nodeRef}>
{modalContent}
</Draggable> </Draggable>
); );
}; };
@@ -2,14 +2,15 @@ import Post from '../post';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
interface DescriptionPostProps { interface DescriptionPostProps {
subplebbitAddress: string | undefined; avatarUrl?: string;
createdAt: number; createdAt: number;
description: string; description: string;
avatarUrl?: string; shortAddress: string;
subplebbitAddress: string | undefined;
title: string; title: string;
} }
const SubplebbitDescription = ({ subplebbitAddress, createdAt, description, avatarUrl, title }: DescriptionPostProps) => { const SubplebbitDescription = ({ avatarUrl, createdAt, description, shortAddress, subplebbitAddress, title }: DescriptionPostProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const post = { const post = {
isDescription: true, isDescription: true,
@@ -18,7 +19,7 @@ const SubplebbitDescription = ({ subplebbitAddress, createdAt, description, avat
author: { displayName: '## Board Mods' }, author: { displayName: '## Board Mods' },
content: description, content: description,
link: avatarUrl, link: avatarUrl,
title: t('welcome_to_board', { board: title }), title: t('welcome_to_board', { board: title || `p/${shortAddress}` }),
pinned: true, pinned: true,
locked: true, locked: true,
}; };
+14 -3
View File
@@ -3,11 +3,22 @@ import { Comment, useAccountComments } from '@plebbit/plebbit-react-hooks';
import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils'; import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils';
const useRepliesAndAccountReplies = (comment: Comment) => { const useRepliesAndAccountReplies = (comment: Comment) => {
// filter only the parent cid // flatten all replies including nested ones from the original comment
const filter = useCallback((accountComment: Comment) => accountComment.parentCid === (comment?.cid || 'n/a'), [comment?.cid]);
const { accountComments } = useAccountComments({ filter });
const flattenedReplies = useMemo(() => flattenCommentsPages(comment.replies), [comment.replies]); const flattenedReplies = useMemo(() => flattenCommentsPages(comment.replies), [comment.replies]);
// gemerate a Set of CIDs from flattened replies for quick lookup
const replyCids = useMemo(() => new Set(flattenedReplies.map((reply) => reply.cid)), [flattenedReplies]);
// filter against all CIDs in flattened replies
const filter = useCallback(
(accountComment: Comment) => {
return replyCids.has(accountComment.parentCid);
},
[replyCids],
);
const { accountComments } = useAccountComments({ filter });
// the account's replies have a delay before getting published, so get them locally from accountComments instead // the account's replies have a delay before getting published, so get them locally from accountComments instead
const accountRepliesNotYetPublished = useMemo(() => { const accountRepliesNotYetPublished = useMemo(() => {
const replies = flattenedReplies || []; const replies = flattenedReplies || [];
+16 -14
View File
@@ -4,25 +4,27 @@ const useReplyModal = () => {
const [showReplyModal, setShowReplyModal] = useState(false); const [showReplyModal, setShowReplyModal] = useState(false);
const [activeCid, setActiveCid] = useState<string | null>(null); const [activeCid, setActiveCid] = useState<string | null>(null);
const openReplyModal = useCallback(
(cid: string) => {
if (activeCid && activeCid !== cid) {
closeModal(); // close modal if a different CID is clicked
setActiveCid(cid);
setShowReplyModal(true);
} else if (!activeCid) {
setActiveCid(cid);
setShowReplyModal(true);
}
},
[activeCid],
);
const closeModal = useCallback(() => { const closeModal = useCallback(() => {
setActiveCid(null); setActiveCid(null);
setShowReplyModal(false); setShowReplyModal(false);
}, []); }, []);
const openReplyModal = useCallback(
(cid: string) => {
if (activeCid && activeCid !== cid) {
closeModal();
setTimeout(() => {
setActiveCid(cid);
setShowReplyModal(true);
}, 0); // minimal timeout to allow for state reset
} else if (!activeCid) {
setActiveCid(cid);
setShowReplyModal(true);
}
},
[activeCid, closeModal],
);
return { showReplyModal, activeCid, openReplyModal, closeModal }; return { showReplyModal, activeCid, openReplyModal, closeModal };
}; };
+2 -2
View File
@@ -317,7 +317,7 @@
--boardnav-desktop-link-text-decoration-hover: underline; --boardnav-desktop-link-text-decoration-hover: underline;
--boardnav-mobile-background-color: #f0e0d6; --boardnav-mobile-background-color: #f0e0d6;
--boardnav-mobile-border-bottom: 2px solid #d9c5b7; --boardnav-mobile-border-bottom: 2px solid #d9c5b7;
--boardnav-mobile-font-size: 11pt; --boardnav-mobile-font-size: 10pt;
--boardnav-mobile-button-text-color: #00f; --boardnav-mobile-button-text-color: #00f;
/* board title */ /* board title */
@@ -440,7 +440,7 @@
--boardnav-desktop-link-text-decoration-hover: underline; --boardnav-desktop-link-text-decoration-hover: underline;
--boardnav-mobile-background-color: #d6daf0; --boardnav-mobile-background-color: #d6daf0;
--boardnav-mobile-border-bottom: 2px solid #b7c5d9; --boardnav-mobile-border-bottom: 2px solid #b7c5d9;
--boardnav-mobile-font-size: 11pt; --boardnav-mobile-font-size: 10pt;
--boardnav-mobile-button-text-color: #34345c; --boardnav-mobile-button-text-color: #34345c;
/* body */ /* body */
+8 -1
View File
@@ -67,7 +67,14 @@ const Board = () => {
<> <>
{rules && rules.length > 0 && <SubplebbitRules subplebbitAddress={subplebbitAddress} createdAt={createdAt} rules={rules} />} {rules && rules.length > 0 && <SubplebbitRules subplebbitAddress={subplebbitAddress} createdAt={createdAt} rules={rules} />}
{description && description.length > 0 && ( {description && description.length > 0 && (
<SubplebbitDescription avatarUrl={suggested?.avatarUrl} subplebbitAddress={subplebbitAddress} createdAt={createdAt} description={description} title={title} /> <SubplebbitDescription
avatarUrl={suggested?.avatarUrl}
subplebbitAddress={subplebbitAddress}
createdAt={createdAt}
description={description}
shortAddress={shortAddress}
title={title}
/>
)} )}
</> </>
)} )}
+4 -3
View File
@@ -8,6 +8,7 @@ import useWindowWidth from '../../hooks/use-window-width';
import CatalogRow from '../../components/catalog-row'; import CatalogRow from '../../components/catalog-row';
import LoadingEllipsis from '../../components/loading-ellipsis'; import LoadingEllipsis from '../../components/loading-ellipsis';
import styles from './catalog.module.css'; import styles from './catalog.module.css';
import _ from 'lodash';
const lastVirtuosoStates: { [key: string]: StateSnapshot } = {}; const lastVirtuosoStates: { [key: string]: StateSnapshot } = {};
@@ -32,7 +33,7 @@ const useFeedRows = (columnCount: number, feed: any, isFeedLoaded: boolean, subp
author: { displayName: '## Board Mods' }, author: { displayName: '## Board Mods' },
content: description, content: description,
link: avatarUrl, link: avatarUrl,
title: 'Welcome to ' + (title || `p/${shortAddress}`), title: t('welcome_to_board', { board: title || `p/${shortAddress}` }),
pinned: true, pinned: true,
locked: true, locked: true,
}); });
@@ -44,13 +45,13 @@ const useFeedRows = (columnCount: number, feed: any, isFeedLoaded: boolean, subp
timestamp: createdAt, timestamp: createdAt,
author: { displayName: '## Board Mods' }, author: { displayName: '## Board Mods' },
content: rules.map((rule: string, index: number) => `${index + 1}. ${rule}`).join('\n'), content: rules.map((rule: string, index: number) => `${index + 1}. ${rule}`).join('\n'),
title: 'Rules', title: _.capitalize(t('rules')),
pinned: true, pinned: true,
locked: true, locked: true,
}); });
} }
return _feed; return _feed;
}, [feed, description, rules, address, isFeedLoaded, createdAt, title, shortAddress, avatarUrl]); }, [feed, description, rules, address, isFeedLoaded, createdAt, title, shortAddress, avatarUrl, t]);
// Memoize rows calculation, ensuring it updates on changes to the modified feed or column count // Memoize rows calculation, ensuring it updates on changes to the modified feed or column count
const rows = useMemo(() => { const rows = useMemo(() => {
+9 -2
View File
@@ -16,7 +16,7 @@ const PostPage = () => {
const { commentCid, subplebbitAddress } = params; const { commentCid, subplebbitAddress } = params;
const subplebbit = useSubplebbit({ subplebbitAddress }); const subplebbit = useSubplebbit({ subplebbitAddress });
const { createdAt, description, rules, suggested, title } = subplebbit; const { createdAt, description, rules, shortAddress, suggested, title } = subplebbit;
const location = useLocation(); const location = useLocation();
const isInDescriptionView = isDescriptionView(location.pathname, params); const isInDescriptionView = isDescriptionView(location.pathname, params);
@@ -36,7 +36,14 @@ const PostPage = () => {
<div className={styles.content}> <div className={styles.content}>
{showReplyModal && activeCid && <ReplyModal closeModal={closeModal} parentCid={activeCid} />} {showReplyModal && activeCid && <ReplyModal closeModal={closeModal} parentCid={activeCid} />}
{isInDescriptionView ? ( {isInDescriptionView ? (
<SubplebbitDescription avatarUrl={suggested?.avatarUrl} createdAt={createdAt} description={description} subplebbitAddress={subplebbitAddress} title={title} /> <SubplebbitDescription
avatarUrl={suggested?.avatarUrl}
createdAt={createdAt}
description={description}
subplebbitAddress={subplebbitAddress}
shortAddress={shortAddress}
title={title}
/>
) : isInRulesView ? ( ) : isInRulesView ? (
<SubplebbitRules createdAt={createdAt} rules={rules} subplebbitAddress={subplebbitAddress} /> <SubplebbitRules createdAt={createdAt} rules={rules} subplebbitAddress={subplebbitAddress} />
) : ( ) : (