Merge pull request #248 from plebbit/development

Development
This commit is contained in:
Tom (plebeius.eth)
2024-02-16 11:54:15 +01:00
committed by GitHub
50 changed files with 511 additions and 180 deletions

View File

@@ -264,5 +264,11 @@
"submit_to_string": "إرسال إلى {{string}}",
"page_not_found": "الصفحة غير موجودة",
"not_found_description": "الصفحة التي طلبتها غير موجودة",
"last_edited": "آخر تعديل {{timestamp}}"
"last_edited": "آخر تعديل {{timestamp}}",
"view_spoiler": "عرض الحاضر",
"more": "المزيد",
"default_communities": "المجتمعات الافتراضية",
"avatar": "الصورة الرمزية",
"pending_edit": "تحرير معلق",
"failed_edit": "فشل التعديل"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} এ জমা দিন",
"page_not_found": "পৃষ্ঠাটি খুঁজে পাওয়া যায়নি",
"not_found_description": "আপনি যে পৃষ্ঠাটি অনুরোধ করেছেন সেটি অস্তিত্বে নেই",
"last_edited": "শেষ সম্পাদনা {{timestamp}}"
"last_edited": "শেষ সম্পাদনা {{timestamp}}",
"view_spoiler": "স্পোয়ালার দেখুন",
"more": "আরও",
"default_communities": "ডিফল্ট কমিউনিটিস",
"avatar": "অবতার",
"pending_edit": "মুলতুবি সম্পাদনা",
"failed_edit": "ব্যর্থ সম্পাদনা"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Odeslat do {{string}}",
"page_not_found": "Stránka nenalezena",
"not_found_description": "Požadovaná stránka neexistuje",
"last_edited": "Poslední úprava {{timestamp}}"
"last_edited": "Poslední úprava {{timestamp}}",
"view_spoiler": "zobrazit spoiler",
"more": "více",
"default_communities": "výchozí komunity",
"avatar": "avatar",
"pending_edit": "čekající úprava",
"failed_edit": "neúspěšná úprava"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Indsend til {{string}}",
"page_not_found": "Side ikke fundet",
"not_found_description": "Den side, du har anmodet om, findes ikke",
"last_edited": "Sidst redigeret {{timestamp}}"
"last_edited": "Sidst redigeret {{timestamp}}",
"view_spoiler": "vis spoiler",
"more": "mere",
"default_communities": "standardfællesskaber",
"avatar": "avatar",
"pending_edit": "ventende redigering",
"failed_edit": "mislykket redigering"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Einreichen bei {{string}}",
"page_not_found": "Seite nicht gefunden",
"not_found_description": "Die von Ihnen angeforderte Seite existiert nicht",
"last_edited": "Zuletzt bearbeitet am {{timestamp}}"
"last_edited": "Zuletzt bearbeitet am {{timestamp}}",
"view_spoiler": "Spoiler anzeigen",
"more": "mehr",
"default_communities": "Standard-Communities",
"avatar": "Avatar",
"pending_edit": "ausstehende Bearbeitung",
"failed_edit": "fehlgeschlagene Bearbeitung"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Υποβολή στο {{string}}",
"page_not_found": "Η σελίδα δεν βρέθηκε",
"not_found_description": "Η σελίδα που ζητήσατε δεν υπάρχει",
"last_edited": "Τελευταία επεξεργασία {{timestamp}}"
"last_edited": "Τελευταία επεξεργασία {{timestamp}}",
"view_spoiler": "προβολή spoiler",
"more": "περισσότερα",
"default_communities": "προεπιλεγμένες κοινότητες",
"avatar": "εικόνα προφίλ",
"pending_edit": "εκκρεμής επεξεργασία",
"failed_edit": "αποτυχημένη επεξεργασία"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Submit to {{string}}",
"page_not_found": "Page not found",
"not_found_description": "The page you requested does not exist",
"last_edited": "last edited {{timestamp}}"
"last_edited": "last edited {{timestamp}}",
"view_spoiler": "view spoiler",
"more": "more",
"default_communities": "default communities",
"avatar": "avatar",
"pending_edit": "pending edit",
"failed_edit": "failed edit"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Enviar a {{string}}",
"page_not_found": "Página no encontrada",
"not_found_description": "La página que solicitaste no existe",
"last_edited": "última edición {{timestamp}}"
"last_edited": "última edición {{timestamp}}",
"view_spoiler": "ver spoiler",
"more": "más",
"default_communities": "comunidades predeterminadas",
"avatar": "avatar",
"pending_edit": "edición pendiente",
"failed_edit": "edición fallida"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "ارسال به {{string}}",
"page_not_found": "صفحه یافت نشد",
"not_found_description": "صفحه‌ای که درخواست کرده‌اید وجود ندارد",
"last_edited": "آخرین ویرایش {{timestamp}}"
"last_edited": "آخرین ویرایش {{timestamp}}",
"view_spoiler": "نمایش اسپویلر",
"more": "بیشتر",
"default_communities": "جوامع پیش‌فرض",
"avatar": "آواتار",
"pending_edit": "ویرایش در انتظار",
"failed_edit": "ویرایش ناموفق"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Lähetä kohteeseen {{string}}",
"page_not_found": "Sivua ei löytynyt",
"not_found_description": "Pyytämääsi sivua ei löydy",
"last_edited": "Viimeksi muokattu {{timestamp}}"
"last_edited": "Viimeksi muokattu {{timestamp}}",
"view_spoiler": "näytä spoiler",
"more": "lisää",
"default_communities": "oletusyhteisöt",
"avatar": "avatar",
"pending_edit": "odottava muokkaus",
"failed_edit": "epäonnistunut muokkaus"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Isusumite sa {{string}}",
"page_not_found": "Hindi makita ang pahina",
"not_found_description": "Ang pahinang hiniling mo ay hindi umiiral",
"last_edited": "huling inedit {{timestamp}}"
"last_edited": "huling inedit {{timestamp}}",
"view_spoiler": "tingnan ang spoiler",
"more": "higit pa",
"default_communities": "default na mga komunidad",
"avatar": "avatar",
"pending_edit": "naka-pending na edit",
"failed_edit": "nakabigong edit"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Soumettre à {{string}}",
"page_not_found": "Page non trouvée",
"not_found_description": "La page que vous avez demandée n'existe pas",
"last_edited": "dernière édition {{timestamp}}"
"last_edited": "dernière édition {{timestamp}}",
"view_spoiler": "voir le spoiler",
"more": "plus",
"default_communities": "communautés par défaut",
"avatar": "avatar",
"pending_edit": "modification en attente",
"failed_edit": "modification échouée"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "שליחה אל {{string}}",
"page_not_found": "הדף לא נמצא",
"not_found_description": "הדף שביקשת אינו קיים",
"last_edited": "עריכה אחרונה {{timestamp}}"
"last_edited": "עריכה אחרונה {{timestamp}}",
"view_spoiler": "הצג ספוילר",
"more": "יותר",
"default_communities": "קהילות ברירת מחדל",
"avatar": "אוואטר",
"pending_edit": "עריכה ממתינה",
"failed_edit": "עריכה נכשלה"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} को सबमिट करें",
"page_not_found": "पृष्ठ नहीं मिला",
"not_found_description": "आपके द्वारा अनुरोधित पृष्ठ मौजूद नहीं है",
"last_edited": "अंतिम संशोधन {{timestamp}}"
"last_edited": "अंतिम संशोधन {{timestamp}}",
"view_spoiler": "स्पॉइलर देखें",
"more": "अधिक",
"default_communities": "डिफ़ॉल्ट समुदाय",
"avatar": "अवतार",
"pending_edit": "अपूर्ण संपादन",
"failed_edit": "विफल संपादन"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Beküldés ide: {{string}}",
"page_not_found": "Az oldal nem található",
"not_found_description": "Az általad kért oldal nem létezik",
"last_edited": "utoljára szerkesztve: {{timestamp}}"
"last_edited": "utoljára szerkesztve: {{timestamp}}",
"view_spoiler": "spoiler megtekintése",
"more": "több",
"default_communities": "alapértelmezett közösségek",
"avatar": "avatár",
"pending_edit": "folyamatban lévő szerkesztés",
"failed_edit": "sikertelen szerkesztés"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Kirim ke {{string}}",
"page_not_found": "Halaman tidak ditemukan",
"not_found_description": "Halaman yang Anda minta tidak ada",
"last_edited": "terakhir diubah {{timestamp}}"
"last_edited": "terakhir diubah {{timestamp}}",
"view_spoiler": "lihat spoiler",
"more": "lebih",
"default_communities": "komunitas default",
"avatar": "avatar",
"pending_edit": "pengeditan tertunda",
"failed_edit": "edit gagal"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Invia a {{string}}",
"page_not_found": "Pagina non trovata",
"not_found_description": "La pagina che hai richiesto non esiste",
"last_edited": "ultima modifica {{timestamp}}"
"last_edited": "ultima modifica {{timestamp}}",
"view_spoiler": "mostra spoiler",
"more": "altri",
"default_communities": "comunità predefinite",
"avatar": "avatar",
"pending_edit": "modifica in attesa",
"failed_edit": "modifica fallita"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} に提出",
"page_not_found": "ページが見つかりません",
"not_found_description": "要求されたページは存在しません",
"last_edited": "最終編集 {{timestamp}}"
"last_edited": "最終編集 {{timestamp}}",
"view_spoiler": "スポイラーを表示",
"more": "もっと",
"default_communities": "デフォルトコミュニティ",
"avatar": "アバター",
"pending_edit": "保留中の編集",
"failed_edit": "失敗した編集"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} 로 제출",
"page_not_found": "페이지를 찾을 수 없음",
"not_found_description": "요청하신 페이지가 존재하지 않습니다",
"last_edited": "마지막으로 편집한 날짜: {{timestamp}}"
"last_edited": "마지막으로 편집한 날짜: {{timestamp}}",
"view_spoiler": "스포일러 보기",
"more": "더 보기",
"default_communities": "기본 커뮤니티",
"avatar": "아바타",
"pending_edit": "대기 중인 편집",
"failed_edit": "실패한 편집"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} वर सबमिट करा",
"page_not_found": "पृष्ठ सापडला नाही",
"not_found_description": "आपण विनंती केलेला पृष्ठ अस्तित्वात नाही",
"last_edited": "शेवटचा संपादन {{timestamp}}"
"last_edited": "शेवटचा संपादन {{timestamp}}",
"view_spoiler": "स्पॉईलर पहा",
"more": "अधिक",
"default_communities": "डिफॉल्ट समुदाय",
"avatar": "अवतार",
"pending_edit": "प्रलंबित संपादन",
"failed_edit": "अयशस्वी संपादन"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Indienen bij {{string}}",
"page_not_found": "Pagina niet gevonden",
"not_found_description": "De pagina die je hebt opgevraagd, bestaat niet",
"last_edited": "laatst bewerkt {{timestamp}}"
"last_edited": "laatst bewerkt {{timestamp}}",
"view_spoiler": "bekijk spoiler",
"more": "meer",
"default_communities": "standaardgemeenschappen",
"avatar": "avatar",
"pending_edit": "in afwachting van bewerking",
"failed_edit": "mislukte bewerking"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Send til {{string}}",
"page_not_found": "Siden ble ikke funnet",
"not_found_description": "Siden du ba om, finnes ikke",
"last_edited": "sist endret {{timestamp}}"
"last_edited": "sist endret {{timestamp}}",
"view_spoiler": "se spoiler",
"more": "mer",
"default_communities": "standardfellesskap",
"avatar": "avatar",
"pending_edit": "ventende redigering",
"failed_edit": "mislykket redigering"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Prześlij do {{string}}",
"page_not_found": "Strona nie znaleziona",
"not_found_description": "Strona, którą żądasz, nie istnieje",
"last_edited": "ostatnio edytowano {{timestamp}}"
"last_edited": "ostatnio edytowano {{timestamp}}",
"view_spoiler": "pokaż spoiler",
"more": "więcej",
"default_communities": "domyślne społeczności",
"avatar": "avatar",
"pending_edit": "edycja oczekująca",
"failed_edit": "nieudana edycja"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Enviar para {{string}}",
"page_not_found": "Página não encontrada",
"not_found_description": "A página que você solicitou não existe",
"last_edited": "última edição {{timestamp}}"
"last_edited": "última edição {{timestamp}}",
"view_spoiler": "ver spoiler",
"more": "mais",
"default_communities": "comunidades padrão",
"avatar": "avatar",
"pending_edit": "edição pendente",
"failed_edit": "edição falhada"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Trimite la {{string}}",
"page_not_found": "Pagina nu a fost găsită",
"not_found_description": "Pagina pe care ai solicitat-o nu există",
"last_edited": "ultima editare {{timestamp}}"
"last_edited": "ultima editare {{timestamp}}",
"view_spoiler": "vezi spoilerul",
"more": "mai multe",
"default_communities": "comunități implicite",
"avatar": "avatar",
"pending_edit": "editare în așteptare",
"failed_edit": "editare eșuată"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Отправить на {{string}}",
"page_not_found": "Страница не найдена",
"not_found_description": "Запрошенная вами страница не существует",
"last_edited": "последнее редактирование {{timestamp}}"
"last_edited": "последнее редактирование {{timestamp}}",
"view_spoiler": "посмотреть спойлер",
"more": "больше",
"default_communities": "стандартные сообщества",
"avatar": "аватар",
"pending_edit": "редактирование ожидается",
"failed_edit": "не удалось отредактировать"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Dërgo në {{string}}",
"page_not_found": "Faqja nuk u gjet",
"not_found_description": "Faqja që keni kërkuar nuk ekziston",
"last_edited": "i fundit i ndryshuar {{timestamp}}"
"last_edited": "i fundit i ndryshuar {{timestamp}}",
"view_spoiler": "shikoni spoiler",
"more": "më shumë",
"default_communities": "komunitete parazgjedhur",
"avatar": "avatar",
"pending_edit": "ndryshimi në pritje",
"failed_edit": "ndryshimi i dështuar"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Skicka till {{string}}",
"page_not_found": "Sidan kunde inte hittas",
"not_found_description": "Sidan du begärde finns inte",
"last_edited": "senast redigerad {{timestamp}}"
"last_edited": "senast redigerad {{timestamp}}",
"view_spoiler": "visa spoiler",
"more": "mer",
"default_communities": "standardgemenskaper",
"avatar": "avatar",
"pending_edit": "avvaktande redigering",
"failed_edit": "misslyckad redigering"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} కు సబ్‌మిట్ చేయండి",
"page_not_found": "పేజీ కనబడలేదు",
"not_found_description": "మీ అభ్యర్థించిన పేజీ లేదు",
"last_edited": "చివరి సవరించబడినది {{timestamp}}"
"last_edited": "చివరి సవరించబడినది {{timestamp}}",
"view_spoiler": "స్పోయ్లర్ వీక్షించండి",
"more": "మరింత",
"default_communities": "డిఫాల్ట్ సముదాయాలు",
"avatar": "అవతార్",
"pending_edit": "పెండింగ్ సవరించడం",
"failed_edit": "విఫలమైన సవరించడం"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "ส่งไปยัง {{string}}",
"page_not_found": "ไม่พบหน้า",
"not_found_description": "หน้าที่คุณขอไม่มีอยู่จริง",
"last_edited": "แก้ไขล่าสุด {{timestamp}}"
"last_edited": "แก้ไขล่าสุด {{timestamp}}",
"view_spoiler": "ดูสปอยล์เลอร์",
"more": "มากกว่า",
"default_communities": "ชุมชนเริ่มต้น",
"avatar": "อวตาร์",
"pending_edit": "การแก้ไขที่รอดำเนินการ",
"failed_edit": "การแก้ไขล้มเหลว"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} e gönder",
"page_not_found": "Sayfa bulunamadı",
"not_found_description": "İstediğiniz sayfa mevcut değil",
"last_edited": "son düzenleme {{timestamp}}"
"last_edited": "son düzenleme {{timestamp}}",
"view_spoiler": "spoileri görüntüle",
"more": "daha fazla",
"default_communities": "varsayılan topluluklar",
"avatar": "avatar",
"pending_edit": "bekleyen düzenleme",
"failed_edit": "başarısız düzenleme"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Надіслати до {{string}}",
"page_not_found": "Сторінка не знайдена",
"not_found_description": "Сторінка, яку ви запросили, не існує",
"last_edited": "остання редакція {{timestamp}}"
"last_edited": "остання редакція {{timestamp}}",
"view_spoiler": "переглянути спойлер",
"more": "більше",
"default_communities": "типові спільноти",
"avatar": "аватар",
"pending_edit": "очікуване редагування",
"failed_edit": "невдале редагування"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "{{string}} کو جمع کرائیں",
"page_not_found": "صفحہ نہیں ملا",
"not_found_description": "آپ نے جو صفحہ درخواست کیا ہے وہ موجود نہیں ہے",
"last_edited": "آخری ترمیم {{timestamp}}"
"last_edited": "آخری ترمیم {{timestamp}}",
"view_spoiler": "اسپوائلر دیکھیں",
"more": "مزید",
"default_communities": "ڈیفالٹ کمیونٹیز",
"avatar": "اوتار",
"pending_edit": "زیر التواء ترتیبات",
"failed_edit": "ناکام ترتیبات"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "Gửi đến {{string}}",
"page_not_found": "Không tìm thấy trang",
"not_found_description": "Trang bạn yêu cầu không tồn tại",
"last_edited": "sửa lần cuối {{timestamp}}"
"last_edited": "sửa lần cuối {{timestamp}}",
"view_spoiler": "xem spoiler",
"more": "thêm",
"default_communities": "các cộng đồng mặc định",
"avatar": "avatar",
"pending_edit": "chỉnh sửa đang chờ",
"failed_edit": "chỉnh sửa thất bại"
}

View File

@@ -264,5 +264,11 @@
"submit_to_string": "提交到{{string}}",
"page_not_found": "页面未找到",
"not_found_description": "您请求的页面不存在",
"last_edited": "上次编辑时间:{{timestamp}}"
"last_edited": "上次编辑时间:{{timestamp}}",
"view_spoiler": "查看剧透",
"more": "更多",
"default_communities": "默认社区",
"avatar": "头像",
"pending_edit": "待处理的编辑",
"failed_edit": "编辑失败"
}

View File

@@ -14,6 +14,7 @@ interface CommentToolsProps {
cid: string;
deleted?: boolean;
failed?: boolean;
editState?: string;
hasLabel?: boolean;
index?: number;
isAuthor?: boolean;
@@ -137,9 +138,11 @@ const SingleReplyTools = ({ author, cid, hasLabel, index, isAuthor, isMod, paren
);
};
const CommentToolsLabel = ({ cid, deleted, failed, isReply, removed, spoiler }: CommentToolsProps) => {
const CommentToolsLabel = ({ cid, deleted, failed, editState, isReply, removed, spoiler }: CommentToolsProps) => {
const { t } = useTranslation();
const pending = cid === undefined && !isReply && !failed;
const failedEdit = editState === 'failed';
const pendingEdit = editState === 'pending';
return (
<>
@@ -148,6 +151,8 @@ const CommentToolsLabel = ({ cid, deleted, failed, isReply, removed, spoiler }:
{failed && <Label color='red' text={t('failed')} />}
{deleted && <Label color='red' text={t('deleted')} />}
{removed && <Label color='red' text={t('removed')} />}
{failedEdit && <Label color='red' text={t('failed_edit')} />}
{pendingEdit && <Label color='yellow' text={t('pending_edit')} />}
</>
);
};
@@ -157,6 +162,7 @@ const CommentTools = ({
cid,
deleted,
failed,
editState,
hasLabel = false,
index,
isReply,
@@ -178,7 +184,16 @@ const CommentTools = ({
return (
<ul className={`${styles.buttons} ${isReply && !isInInboxView ? styles.buttonsReply : ''} ${hasLabel ? styles.buttonsLabel : ''}`}>
<CommentToolsLabel cid={cid} deleted={deleted} failed={failed} isReply={isReply} removed={removed} spoiler={spoiler} subplebbitAddress={subplebbitAddress} />
<CommentToolsLabel
cid={cid}
deleted={deleted}
failed={failed}
editState={editState}
isReply={isReply}
removed={removed}
spoiler={spoiler}
subplebbitAddress={subplebbitAddress}
/>
{isReply ? (
isSingleReply ? (
<SingleReplyTools

View File

@@ -45,6 +45,34 @@
background-color: var(--background-thumbnail);
}
.mediaPreview iframe {
width: 100%;
height: 100%;
border: none;
background-color: var(--background-thumbnail);
}
.hideSpoiler {
width: calc(100% - 7px);
height: calc(100% - 12px);
border-radius: 7px;
position: absolute;
border: 1px solid var(--text-primary);
background-color: black;
color: black;
cursor: pointer;
}
.showSpoilerButton {
color: white;
text-transform: lowercase;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
cursor: pointer;
}
@media (max-width: 768px) {
.mediaPreview img {
max-width: 100%;
@@ -60,10 +88,3 @@
padding-right: 5px;
}
}
.mediaPreview iframe {
width: 100%;
height: 100%;
border: none;
background-color: var(--background-thumbnail);
}

View File

@@ -1,3 +1,4 @@
import { useState } from 'react';
import { Link } from 'react-router-dom';
import styles from './expando.module.css';
import Embed from '../embed';
@@ -13,12 +14,15 @@ interface ExpandoProps {
reason?: string;
removed?: boolean;
showContent: boolean;
spoiler?: boolean;
toggleExpanded?: () => void;
}
const Expando = ({ commentMediaInfo, content, expanded, link, reason, removed, showContent, toggleExpanded }: ExpandoProps) => {
const Expando = ({ commentMediaInfo, content, expanded, link, reason, removed, showContent, spoiler = false, toggleExpanded }: ExpandoProps) => {
const { t } = useTranslation();
const [showSpoiler, setShowSpoiler] = useState(false);
let mediaComponent = null;
let noExpandButton = false;
@@ -37,8 +41,13 @@ const Expando = ({ commentMediaInfo, content, expanded, link, reason, removed, s
}
return (
<div className={expanded ? styles.expando : styles.expandoHidden}>
{link && !removed && (
<div
className={expanded ? styles.expando : styles.expandoHidden}
onClick={() => {
spoiler && !showSpoiler && setShowSpoiler(true);
}}
>
{link && !removed && !(spoiler && !showSpoiler) && (
<div className={styles.mediaPreview}>
<Link
to={link}
@@ -55,7 +64,9 @@ const Expando = ({ commentMediaInfo, content, expanded, link, reason, removed, s
)}
{content && showContent && (
<div className={styles.usertext}>
<div className={spoiler && !showSpoiler ? styles.hideSpoiler : ''} />
<div className={styles.markdown}>
{spoiler && !showSpoiler && <div className={styles.showSpoilerButton}>{t('view_spoiler')}</div>}
<Markdown content={content} />
{reason && (
<div className={styles.modReason}>

View File

@@ -1,7 +1,7 @@
.content {
display: flex;
flex-direction: column;
padding: 4px 0;
padding-bottom: 8px;
}
.row {
@@ -68,11 +68,7 @@
font-weight: normal;
}
.removedTitle {
filter: blur(4px);
}
.removedThumbnail {
.blur {
filter: blur(4px);
}

View File

@@ -77,9 +77,9 @@ const Post = ({ index, post = {} }: PostProps) => {
post = op;
}
// handle pending mod or author edit
const { editedComment: editedPost } = useEditedComment({ comment: post });
if (editedPost) {
post = editedPost;
const { state: editState, editedComment } = useEditedComment({ comment: post });
if (editedComment) {
post = editedComment;
}
const {
author,
@@ -156,122 +156,134 @@ const Post = ({ index, post = {} }: PostProps) => {
};
return (
<div className={`${styles.content} ${isLastClicked && !isInPostView ? styles.lastClicked : ''}`} key={index}>
<div className={`${styles.hiddenPost} ${blocked ? styles.visible : styles.hidden}`}>
<div className={styles.hiddenPostText}>{t('post_hidden').charAt(0).toUpperCase() + t('post_hidden').slice(1)}</div>
<div className={styles.undoHiddenPost} onClick={unblock}>
{t('undo')}
<div className={styles.content} key={index}>
<div className={isLastClicked && !isInPostView ? styles.lastClicked : ''}>
<div className={`${styles.hiddenPost} ${blocked ? styles.visible : styles.hidden}`}>
<div className={styles.hiddenPostText}>{t('post_hidden').charAt(0).toUpperCase() + t('post_hidden').slice(1)}</div>
<div className={styles.undoHiddenPost} onClick={unblock}>
{t('undo')}
</div>
</div>
</div>
<div className={`${styles.container} ${blocked ? styles.hidden : styles.visible}`}>
<div className={styles.row}>
<div className={styles.leftcol}>
<div className={styles.midcol}>
<div className={styles.arrowWrapper}>
<div className={`${styles.arrowCommon} ${upvoted ? styles.upvoted : styles.arrowUp}`} onClick={() => cid && upvote()} />
</div>
<div className={styles.score}>{postScore}</div>
<div className={styles.arrowWrapper}>
<div className={`${styles.arrowCommon} ${downvoted ? styles.downvoted : styles.arrowDown}`} onClick={() => cid && downvote()} />
<div className={`${styles.container} ${blocked ? styles.hidden : styles.visible}`}>
<div className={styles.row}>
<div className={styles.leftcol}>
<div className={styles.midcol}>
<div className={styles.arrowWrapper}>
<div className={`${styles.arrowCommon} ${upvoted ? styles.upvoted : styles.arrowUp}`} onClick={() => cid && upvote()} />
</div>
<div className={styles.score}>{postScore}</div>
<div className={styles.arrowWrapper}>
<div className={`${styles.arrowCommon} ${downvoted ? styles.downvoted : styles.arrowDown}`} onClick={() => cid && downvote()} />
</div>
</div>
{hasThumbnail && !isInPostView && (
<span className={removed ? styles.blur : ''}>
<Thumbnail
cid={cid}
commentMediaInfo={commentMediaInfo}
isReply={false}
link={link}
linkHeight={linkHeight}
linkWidth={linkWidth}
subplebbitAddress={subplebbitAddress}
/>
</span>
)}
</div>
{hasThumbnail && !isInPostView && (
<span className={removed ? styles.removedThumbnail : ''}>
<Thumbnail
<div className={styles.entry}>
<div className={styles.topMatter}>
<p className={`${styles.title} ${removed && !isInPostView ? styles.blur : ''}`} onClick={handlePostClick}>
{isInPostView && link ? (
<a href={link} className={linkClass} target='_blank' rel='noopener noreferrer'>
{postTitle ?? '-'}
</a>
) : (
<Link className={linkClass} to={cid ? `/p/${subplebbitAddress}/c/${cid}` : `/profile/${post?.index}`}>
{postTitle ?? '-'}
</Link>
)}
{flair && (
<>
{' '}
<Flair flair={flair} />
</>
)}{' '}
{linkUrl && (
<span className={styles.domain}>
(
<a href={link} target='_blank' rel='noopener noreferrer'>
{linkUrl}
</a>
)
</span>
)}
</p>
{!isInPostView && (
<ExpandButton
commentMediaInfo={commentMediaInfo}
content={content}
expanded={isExpanded}
hasThumbnail={hasThumbnail}
link={link}
toggleExpanded={toggleExpanded}
/>
)}
<div className={styles.tagline}>
{t('submitted')} {getFormattedTimeAgo(timestamp)} {edit && <span title={t('last_edited', { timestamp: getFormattedTimeAgo(edit.timestamp) })}>*</span>}{' '}
{t('post_by')}{' '}
<PostAuthor
authorAddress={author?.address}
authorRole={authorRole}
cid={cid}
displayName={displayName}
imageUrl={imageUrl}
index={post?.index}
shortAddress={shortAddress}
shortAuthorAddress={shortAuthorAddress}
authorAddressChanged={authorAddressChanged}
/>
{!isInSubplebbitView && (
<>
 {t('post_to')}{' '}
<Link className={styles.subplebbit} to={`/p/${subplebbitAddress}`}>
p/{subplebbit?.shortAddress || subplebbitAddress}
</Link>
</>
)}
{pinned && <span className={styles.announcement}> - {t('announcement')}</span>}
</div>
{state === 'pending' && <p className={styles.pending}>{loadingString}</p>}
<CommentTools
author={author}
cid={cid}
commentMediaInfo={commentMediaInfo}
isReply={false}
link={link}
linkHeight={linkHeight}
linkWidth={linkWidth}
deleted={deleted}
failed={state === 'failed'}
editState={editState}
index={post?.index}
removed={removed}
replyCount={replyCount}
showEditForm={showEditForm}
spoiler={spoiler}
subplebbitAddress={subplebbitAddress}
/>
</span>
)}
</div>
<div className={styles.entry}>
<div className={styles.topMatter}>
<p className={`${styles.title} ${removed && !isInPostView ? styles.removedTitle : ''}`} onClick={handlePostClick}>
{isInPostView && link ? (
<a href={link} className={linkClass} target='_blank' rel='noopener noreferrer'>
{postTitle}
</a>
) : (
<Link className={linkClass} to={cid ? `/p/${subplebbitAddress}/c/${cid}` : `/profile/${post?.index}`}>
{postTitle}
</Link>
)}
{flair && (
<>
{' '}
<Flair flair={flair} />
</>
)}{' '}
{linkUrl && (
<span className={styles.domain}>
(
<a href={link} target='_blank' rel='noopener noreferrer'>
{linkUrl}
</a>
)
</span>
)}
</p>
{!isInPostView && (
<ExpandButton
commentMediaInfo={commentMediaInfo}
content={content}
expanded={isExpanded}
hasThumbnail={hasThumbnail}
link={link}
toggleExpanded={toggleExpanded}
/>
)}
<div className={styles.tagline}>
{t('submitted')} {getFormattedTimeAgo(timestamp)} {edit && <span title={t('last_edited', { timestamp: getFormattedTimeAgo(edit.timestamp) })}>*</span>}{' '}
{t('post_by')}{' '}
<PostAuthor
authorAddress={author?.address}
authorRole={authorRole}
cid={cid}
displayName={displayName}
imageUrl={imageUrl}
index={post?.index}
shortAddress={shortAddress}
shortAuthorAddress={shortAuthorAddress}
authorAddressChanged={authorAddressChanged}
/>
{!isInSubplebbitView && (
<>
 {t('post_to')}{' '}
<Link className={styles.subplebbit} to={`/p/${subplebbitAddress}`}>
p/{subplebbit?.shortAddress || subplebbitAddress}
</Link>
</>
)}
{pinned && <span className={styles.announcement}> - {t('announcement')}</span>}
</div>
{state === 'pending' && <p className={styles.pending}>{loadingString}</p>}
<CommentTools
author={author}
cid={cid}
deleted={deleted}
failed={state === 'failed'}
index={post?.index}
removed={removed}
replyCount={replyCount}
showEditForm={showEditForm}
spoiler={spoiler}
subplebbitAddress={subplebbitAddress}
/>
</div>
</div>
{isEditing ? (
<EditForm commentCid={cid} content={content} hideEditForm={hideEditForm} subplebbitAddress={subplebbitAddress} />
) : (
<Expando
commentMediaInfo={commentMediaInfo}
content={content}
expanded={isExpanded}
link={link}
reason={reason}
removed={removed}
showContent={true}
spoiler={spoiler}
/>
)}
</div>
{isEditing ? (
<EditForm commentCid={cid} content={content} hideEditForm={hideEditForm} subplebbitAddress={subplebbitAddress} />
) : (
<Expando commentMediaInfo={commentMediaInfo} content={content} expanded={isExpanded} link={link} reason={reason} removed={removed} showContent={true} />
)}
</div>
</div>
);

View File

@@ -2,6 +2,7 @@
position: relative;
float: left;
padding-right: 5px;
padding-bottom: 2px;
width: var(--width, 70px); /* Fallback to 70px if variable not set */
height: var(--height, 70px); /* Fallback to 70px if variable not set */
}

View File

@@ -104,6 +104,7 @@
font-size: small;
unicode-bidi: isolate;
margin-top: 5px;
position: relative;
}
.highlightMedia {
@@ -128,6 +129,25 @@
color: var(--markdown-link) !important;
}
.hideSpoiler {
width: 100%;
height: 100%;
position: absolute;
background-color: black;
color: black;
cursor: pointer;
}
.showSpoilerButton {
color: white;
text-transform: lowercase;
position: absolute;
cursor: pointer;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.highlightContent {
background-color: var(--yellow-highlight);
padding: 2px 5px;

View File

@@ -201,9 +201,9 @@ interface ReplyProps {
const Reply = ({ cidOfReplyWithContext, depth = 0, isSingleComment, isSingleReply, isNotification = false, reply = {} }: ReplyProps) => {
// handle pending mod or author edit
const { editedComment: editedPost } = useEditedComment({ comment: reply });
if (editedPost) {
reply = editedPost;
const { state: editState, editedComment } = useEditedComment({ comment: reply });
if (editedComment) {
reply = editedComment;
}
const {
author,
@@ -230,6 +230,8 @@ const Reply = ({ cidOfReplyWithContext, depth = 0, isSingleComment, isSingleRepl
} = reply || {};
const subplebbit = useSubplebbit({ subplebbitAddress });
const [showSpoiler, setShowSpoiler] = useState(false);
const { blocked, unblock } = useBlock({ address: cid });
const [collapsed, setCollapsed] = useState(blocked);
useEffect(() => {
@@ -279,6 +281,8 @@ const Reply = ({ cidOfReplyWithContext, depth = 0, isSingleComment, isSingleRepl
<span className={styles.stateLabel}>
{state === 'failed' && <Label color='red' text={t('failed')} />}
{cid === undefined && state !== 'failed' && <Label color='yellow' text={t('pending')} />}
{editState === 'failed' && <Label color='red' text={t('failed_edit')} />}
{editState === 'pending' && <Label color='yellow' text={t('pending_edit')} />}
</span>
);
@@ -348,8 +352,14 @@ const Reply = ({ cidOfReplyWithContext, depth = 0, isSingleComment, isSingleRepl
/>
)}
{!collapsed && (
<div className={`${styles.usertext} ${cid && commentMediaInfo && (isSingleComment || cidOfReplyWithContext === cid) ? styles.highlightMedia : ''}`}>
{commentMediaInfo && (!removed || !deleted) && (
<div
className={`${styles.usertext} ${cid && commentMediaInfo && (isSingleComment || cidOfReplyWithContext === cid) ? styles.highlightMedia : ''}`}
onClick={() => {
spoiler && !showSpoiler && setShowSpoiler(true);
}}
>
<div className={spoiler && !showSpoiler ? styles.hideSpoiler : ''} />
{commentMediaInfo && !(removed || deleted || (spoiler && !showSpoiler)) && (
<ReplyMedia
commentMediaInfo={commentMediaInfo}
content={content}
@@ -365,6 +375,7 @@ const Reply = ({ cidOfReplyWithContext, depth = 0, isSingleComment, isSingleRepl
<EditForm commentCid={cid} content={content} hideEditForm={hideEditForm} subplebbitAddress={subplebbitAddress} />
) : (
<div className={`${styles.md} ${cid && (isSingleComment || cidOfReplyWithContext === cid) ? styles.highlightContent : ''}`}>
{spoiler && !showSpoiler && <div className={styles.showSpoilerButton}>{t('view_spoiler')}</div>}
{content &&
(removed ? (
<div className={styles.removedContent}>[{t('removed')}]</div>

View File

@@ -126,6 +126,9 @@ const TopBar = () => {
<Link to='/communities/subscriber' className={`${styles.dropdownItem} ${styles.editSubscriptions}`}>
{t('edit_subscriptions')}
</Link>
<Link to='/communities/vote' className={`${styles.dropdownItem} ${styles.editSubscriptions}`}>
{t('default_communities')}
</Link>
</div>
</div>
<div className={styles.dropdown} ref={sortsDropdownRef} onClick={toggleSortsDropdown}>
@@ -179,7 +182,7 @@ const TopBar = () => {
</ul>
</div>
<Link to='/communities/vote' className={styles.moreLink}>
{t('edit')} »
{t('more')} »
</Link>
</div>
</div>

View File

@@ -44,4 +44,12 @@
position: relative;
bottom: 2px;
margin-bottom: -2px;
}
.copyAddressSetting {
padding-bottom: 10px;
}
.copyAddressSetting button {
margin-left: 0;
}

View File

@@ -131,6 +131,9 @@ const AddressSettings = () => {
return (
<div className={styles.addressSettings}>
<div className={styles.copyAddressSetting}>
<button onClick={() => navigator.clipboard.writeText(account?.signer?.address)}>copy</button> full address
</div>
<div className={styles.cryptoAddressSetting}>
<span className={styles.settingTitle}>{t('crypto_address')}</span>
<button className={styles.infoButton} onClick={cryptoAddressInfo}>

View File

@@ -78,7 +78,6 @@
.avatar {
width: 70px;
height: 70px;
margin-bottom: 5px;
border: 1px solid var(--border-text);
}

View File

@@ -105,10 +105,21 @@ const ThemeSettings = () => {
);
};
const ProfileSettings = () => {
const AvatarSettings = () => {
const { t } = useTranslation();
const account = useAccount();
const { imageUrl } = useAuthorAvatar({ author: account?.author });
return (
<div className={styles.avatarSettings}>
<div className={styles.avatar}>{imageUrl ? <img src={imageUrl} alt='avatar' /> : <span className={styles.emptyAvatar}>+{t('add')}</span>}</div>
</div>
);
};
const DisplayNameSetting = () => {
const { t } = useTranslation();
const account = useAccount();
const [displayName, setDisplayName] = useState(account?.author.displayName || '');
const [savedDisplayName, setSavedDisplayName] = useState(false);
@@ -127,6 +138,7 @@ const ProfileSettings = () => {
}, 2000);
}
}, [savedDisplayName]);
const saveUsername = async () => {
try {
await setAccount({ ...account, author: { ...account?.author, displayName } });
@@ -142,10 +154,7 @@ const ProfileSettings = () => {
};
return (
<div className={styles.profileSettings}>
<span className={styles.settingTitle}>avatar</span>
<div className={styles.avatar}>{imageUrl ? <img src={imageUrl} alt='avatar' /> : <span className={styles.emptyAvatar}>+{t('add')}</span>}</div>
<span className={styles.settingTitle}>{t('display_name')}</span>
<div className={styles.displayNameSetting}>
<div className={styles.usernameInput}>
<input type='text' placeholder='My Name' value={displayName} onChange={(e) => setDisplayName(e.target.value)} />
<button className={styles.button} onClick={saveUsername}>
@@ -210,9 +219,15 @@ const Settings = () => {
</span>
</div>
<div className={styles.category}>
<span className={styles.categoryTitle}>{t('profile')}</span>
<span className={styles.categoryTitle}>{t('avatar')}</span>
<span className={styles.categorySettings}>
<ProfileSettings />
<AvatarSettings />
</span>
</div>
<div className={styles.category}>
<span className={styles.categoryTitle}>{t('display_name')}</span>
<span className={styles.categorySettings}>
<DisplayNameSetting />
</span>
</div>
<div className={styles.category}>

View File

@@ -76,6 +76,7 @@ h1 {
.contentPreviewMarkdown {
font-size: 14px;
word-wrap: break-word;
}
.contentPreviewTitle {

View File

@@ -3,9 +3,6 @@ import { Link, useLocation } from 'react-router-dom';
import { Trans, useTranslation } from 'react-i18next';
import { Subplebbit as SubplebbitType, useAccount, useAccountSubplebbits, useSubplebbits, useSubplebbitStats } from '@plebbit/plebbit-react-hooks';
import styles from './subplebbits.module.css';
import Label from '../../components/post/label';
import Sidebar from '../../components/sidebar';
import SubscribeButton from '../../components/subscribe-button';
import { getFormattedTimeDuration } from '../../lib/utils/time-utils';
import {
isSubplebbitsView,
@@ -18,6 +15,10 @@ import {
isSubplebbitsVoteRejectingView,
} from '../../lib/utils/view-utils';
import { useDefaultSubplebbitAddresses } from '../../lib/utils/addresses-utils';
import Markdown from '../../components/markdown';
import Label from '../../components/post/label';
import Sidebar from '../../components/sidebar';
import SubscribeButton from '../../components/subscribe-button';
interface SubplebbitProps {
index?: number;
@@ -181,7 +182,11 @@ const Subplebbit = ({ subplebbit }: SubplebbitProps) => {
</div>
</span>
</div>
{description && showDescription && <div className={styles.description}>{description}</div>}
{description && showDescription && (
<div className={styles.description}>
<Markdown content={description} />
</div>
)}
</div>
</div>
);