feat(boards list): show 15 boards at a time + p/all, add load more button

This commit is contained in:
Tom (plebeius.eth)
2025-02-03 13:33:11 +01:00
parent 0488a6c629
commit cf849bab70
38 changed files with 117 additions and 41 deletions
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "التعليق طويل جدًا ({{length}}/2000).", "comment_field_too_long": "التعليق طويل جدًا ({{length}}/2000).",
"field_too_long": "الحقل طويل جدًا.", "field_too_long": "الحقل طويل جدًا.",
"title": "عنوان", "title": "عنوان",
"tags": "علامات" "tags": "علامات",
"load_more": "تحميل المزيد"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "মন্তব্য খুব লম্বা ({{length}}/2000)।", "comment_field_too_long": "মন্তব্য খুব লম্বা ({{length}}/2000)।",
"field_too_long": "ফিল্ডটি খুব লম্বা।", "field_too_long": "ফিল্ডটি খুব লম্বা।",
"title": "শিরোনাম", "title": "শিরোনাম",
"tags": "ট্যাগ" "tags": "ট্যাগ",
"load_more": "আরো লোড করুন"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Komentář je příliš dlouhý ({{length}}/2000).", "comment_field_too_long": "Komentář je příliš dlouhý ({{length}}/2000).",
"field_too_long": "Pole je příliš dlouhé.", "field_too_long": "Pole je příliš dlouhé.",
"title": "Název", "title": "Název",
"tags": "Štítky" "tags": "Štítky",
"load_more": "Načíst více"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Kommentar for lang ({{length}}/2000).", "comment_field_too_long": "Kommentar for lang ({{length}}/2000).",
"field_too_long": "Feltene er for lange.", "field_too_long": "Feltene er for lange.",
"title": "Titel", "title": "Titel",
"tags": "Tags" "tags": "Tags",
"load_more": "Indlæs mere"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Kommentar zu lang ({{length}}/2000).", "comment_field_too_long": "Kommentar zu lang ({{length}}/2000).",
"field_too_long": "Das Feld ist zu lang.", "field_too_long": "Das Feld ist zu lang.",
"title": "Titel", "title": "Titel",
"tags": "Tags" "tags": "Tags",
"load_more": "Mehr laden"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Το σχόλιο είναι πολύ μεγάλο ({{length}}/2000).", "comment_field_too_long": "Το σχόλιο είναι πολύ μεγάλο ({{length}}/2000).",
"field_too_long": "Το πεδίο είναι πολύ μεγάλο.", "field_too_long": "Το πεδίο είναι πολύ μεγάλο.",
"title": "Τίτλος", "title": "Τίτλος",
"tags": "Ετικέτες" "tags": "Ετικέτες",
"load_more": "Φορτώστε περισσότερα"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Comment too long ({{length}}/2000).", "comment_field_too_long": "Comment too long ({{length}}/2000).",
"field_too_long": "Field too long.", "field_too_long": "Field too long.",
"title": "Title", "title": "Title",
"tags": "Tags" "tags": "Tags",
"load_more": "Load More"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Comentario demasiado largo ({{length}}/2000).", "comment_field_too_long": "Comentario demasiado largo ({{length}}/2000).",
"field_too_long": "Campo demasiado largo.", "field_too_long": "Campo demasiado largo.",
"title": "Título", "title": "Título",
"tags": "Etiquetas" "tags": "Etiquetas",
"load_more": "Cargar más"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "کامنت خیلی طولانی است ({{length}}/2000).", "comment_field_too_long": "کامنت خیلی طولانی است ({{length}}/2000).",
"field_too_long": "فیلد خیلی طولانی است.", "field_too_long": "فیلد خیلی طولانی است.",
"title": "عنوان", "title": "عنوان",
"tags": "برچسب‌ها" "tags": "برچسب‌ها",
"load_more": "بارگذاری بیشتر"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Kommentti liian pitkä ({{length}}/2000).", "comment_field_too_long": "Kommentti liian pitkä ({{length}}/2000).",
"field_too_long": "Kenttä liian pitkä.", "field_too_long": "Kenttä liian pitkä.",
"title": "Otsikko", "title": "Otsikko",
"tags": "Tunnisteet" "tags": "Tunnisteet",
"load_more": "Lataa lisää"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Napakahabang komento ({{length}}/2000).", "comment_field_too_long": "Napakahabang komento ({{length}}/2000).",
"field_too_long": "Ang field ay masyadong mahaba.", "field_too_long": "Ang field ay masyadong mahaba.",
"title": "Pamagat", "title": "Pamagat",
"tags": "Mga tag" "tags": "Mga tag",
"load_more": "Mag-load ng higit pa"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Commentaire trop long ({{length}}/2000).", "comment_field_too_long": "Commentaire trop long ({{length}}/2000).",
"field_too_long": "Champ trop long.", "field_too_long": "Champ trop long.",
"title": "Titre", "title": "Titre",
"tags": "Tags" "tags": "Tags",
"load_more": "Charger plus"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "התגובה ארוכה מדי ({{length}}/2000).", "comment_field_too_long": "התגובה ארוכה מדי ({{length}}/2000).",
"field_too_long": "המשדה ארוך מדי.", "field_too_long": "המשדה ארוך מדי.",
"title": "כותרת", "title": "כותרת",
"tags": "תגיות" "tags": "תגיות",
"load_more": "טען עוד"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "टिप्पणी बहुत लंबी है ({{length}}/2000)।", "comment_field_too_long": "टिप्पणी बहुत लंबी है ({{length}}/2000)।",
"field_too_long": "क्षेत्र बहुत लंबा है।", "field_too_long": "क्षेत्र बहुत लंबा है।",
"title": "शीर्षक", "title": "शीर्षक",
"tags": "टैग" "tags": "टैग",
"load_more": "अधिक लोड करें"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Túl hosszú hozzászólás ({{length}}/2000).", "comment_field_too_long": "Túl hosszú hozzászólás ({{length}}/2000).",
"field_too_long": "A mező túl hosszú.", "field_too_long": "A mező túl hosszú.",
"title": "Cím", "title": "Cím",
"tags": "Címkék" "tags": "Címkék",
"load_more": "Töltsön be többet"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Komentar terlalu panjang ({{length}}/2000).", "comment_field_too_long": "Komentar terlalu panjang ({{length}}/2000).",
"field_too_long": "Kolom terlalu panjang.", "field_too_long": "Kolom terlalu panjang.",
"title": "Judul", "title": "Judul",
"tags": "Tag" "tags": "Tag",
"load_more": "Muat lebih banyak"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Commento troppo lungo ({{length}}/2000).", "comment_field_too_long": "Commento troppo lungo ({{length}}/2000).",
"field_too_long": "Campo troppo lungo.", "field_too_long": "Campo troppo lungo.",
"title": "Titolo", "title": "Titolo",
"tags": "Tag" "tags": "Tag",
"load_more": "Carica altro"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "コメントが長すぎます ({{length}}/2000)。", "comment_field_too_long": "コメントが長すぎます ({{length}}/2000)。",
"field_too_long": "フィールドが長すぎます。", "field_too_long": "フィールドが長すぎます。",
"title": "タイトル", "title": "タイトル",
"tags": "タグ" "tags": "タグ",
"load_more": "もっと読み込む"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "댓글이 너무 깁니다 ({{length}}/2000).", "comment_field_too_long": "댓글이 너무 깁니다 ({{length}}/2000).",
"field_too_long": "필드가 너무 깁니다.", "field_too_long": "필드가 너무 깁니다.",
"title": "제목", "title": "제목",
"tags": "태그" "tags": "태그",
"load_more": "더 보기"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "टिप्पणी खूप लांब आहे ({{length}}/2000).", "comment_field_too_long": "टिप्पणी खूप लांब आहे ({{length}}/2000).",
"field_too_long": "फील्ड खूप लांब आहे.", "field_too_long": "फील्ड खूप लांब आहे.",
"title": "सिरसक", "title": "सिरसक",
"tags": "टॅग" "tags": "टॅग",
"load_more": "अधिक लोड करा"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Commentaar te lang ({{length}}/2000).", "comment_field_too_long": "Commentaar te lang ({{length}}/2000).",
"field_too_long": "Veld te lang.", "field_too_long": "Veld te lang.",
"title": "Titel", "title": "Titel",
"tags": "Tags" "tags": "Tags",
"load_more": "Laad meer"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Kommentar for lang ({{length}}/2000).", "comment_field_too_long": "Kommentar for lang ({{length}}/2000).",
"field_too_long": "Feltet er for langt.", "field_too_long": "Feltet er for langt.",
"title": "Tittel", "title": "Tittel",
"tags": "Tags" "tags": "Tags",
"load_more": "Last inn mer"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Komentarz za długi ({{length}}/2000).", "comment_field_too_long": "Komentarz za długi ({{length}}/2000).",
"field_too_long": "Pole jest za długie.", "field_too_long": "Pole jest za długie.",
"title": "Tytuł", "title": "Tytuł",
"tags": "Tagi" "tags": "Tagi",
"load_more": "Załaduj więcej"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Comentário muito longo ({{length}}/2000).", "comment_field_too_long": "Comentário muito longo ({{length}}/2000).",
"field_too_long": "Campo muito longo.", "field_too_long": "Campo muito longo.",
"title": "Título", "title": "Título",
"tags": "Tags" "tags": "Tags",
"load_more": "Carregar mais"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Comentariu prea lung ({{length}}/2000).", "comment_field_too_long": "Comentariu prea lung ({{length}}/2000).",
"field_too_long": "Câmp prea lung.", "field_too_long": "Câmp prea lung.",
"title": "Titlu", "title": "Titlu",
"tags": "Etichete" "tags": "Etichete",
"load_more": "Încarcă mai mult"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Комментарий слишком длинный ({{length}}/2000).", "comment_field_too_long": "Комментарий слишком длинный ({{length}}/2000).",
"field_too_long": "Поле слишком длинное.", "field_too_long": "Поле слишком длинное.",
"title": "Заголовок", "title": "Заголовок",
"tags": "Теги" "tags": "Теги",
"load_more": "Загрузить больше"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Komentar shumë i gjatë ({{length}}/2000).", "comment_field_too_long": "Komentar shumë i gjatë ({{length}}/2000).",
"field_too_long": "Fusha është shumë e gjatë.", "field_too_long": "Fusha është shumë e gjatë.",
"title": "Titulli", "title": "Titulli",
"tags": "Etiketa" "tags": "Etiketa",
"load_more": "Ngarko më shumë"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Kommentar för lång ({{length}}/2000).", "comment_field_too_long": "Kommentar för lång ({{length}}/2000).",
"field_too_long": "Fältet är för långt.", "field_too_long": "Fältet är för långt.",
"title": "Titel", "title": "Titel",
"tags": "Taggar" "tags": "Taggar",
"load_more": "Läs mer"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "కమెంట్ చాలా పొడుగ్గా ఉంది ({{length}}/2000).", "comment_field_too_long": "కమెంట్ చాలా పొడుగ్గా ఉంది ({{length}}/2000).",
"field_too_long": "ఫీల్డ్ చాలా పొడుగ్గా ఉంది.", "field_too_long": "ఫీల్డ్ చాలా పొడుగ్గా ఉంది.",
"title": "శీర్షిక", "title": "శీర్షిక",
"tags": "ట్యాగ్స్" "tags": "ట్యాగ్స్",
"load_more": "మరింత లోడ్ చేయండి"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "คอมเมนต์ยาวเกินไป ({{length}}/2000)", "comment_field_too_long": "คอมเมนต์ยาวเกินไป ({{length}}/2000)",
"field_too_long": "ฟิลด์ยาวเกินไป", "field_too_long": "ฟิลด์ยาวเกินไป",
"title": "ชื่อเรื่อง", "title": "ชื่อเรื่อง",
"tags": "แท็ก" "tags": "แท็ก",
"load_more": "โหลดเพิ่มเติม"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Yorum çok uzun ({{length}}/2000).", "comment_field_too_long": "Yorum çok uzun ({{length}}/2000).",
"field_too_long": "Alan çok uzun.", "field_too_long": "Alan çok uzun.",
"title": "Başlık", "title": "Başlık",
"tags": "Etiketler" "tags": "Etiketler",
"load_more": "Daha fazla yükle"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Коментар занадто довгий ({{length}}/2000).", "comment_field_too_long": "Коментар занадто довгий ({{length}}/2000).",
"field_too_long": "Поле занадто довге.", "field_too_long": "Поле занадто довге.",
"title": "Заголовок", "title": "Заголовок",
"tags": "Теги" "tags": "Теги",
"load_more": "Завантажити більше"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "تبصرہ بہت طویل ہے ({{length}}/2000).", "comment_field_too_long": "تبصرہ بہت طویل ہے ({{length}}/2000).",
"field_too_long": "فیلڈ بہت طویل ہے۔", "field_too_long": "فیلڈ بہت طویل ہے۔",
"title": "عنوان", "title": "عنوان",
"tags": "ٹٰیگ" "tags": "ٹٰیگ",
"load_more": "مزید لوڈ کریں"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "Bình luận quá dài ({{length}}/2000).", "comment_field_too_long": "Bình luận quá dài ({{length}}/2000).",
"field_too_long": "Trường quá dài.", "field_too_long": "Trường quá dài.",
"title": "Tiêu đề", "title": "Tiêu đề",
"tags": "Thẻ" "tags": "Thẻ",
"load_more": "Tải thêm"
} }
+2 -1
View File
@@ -266,5 +266,6 @@
"comment_field_too_long": "评论太长 ({{length}}/2000)。", "comment_field_too_long": "评论太长 ({{length}}/2000)。",
"field_too_long": "字段太长。", "field_too_long": "字段太长。",
"title": "标题", "title": "标题",
"tags": "标签" "tags": "标签",
"load_more": "加载更多"
} }
+2 -2
View File
@@ -77,7 +77,7 @@ const renderBoardsList = (subplebbits: any, isInCatalogView: boolean, subscripti
<Link to={`/p/${sub.address}${isInCatalogView ? '/catalog' : ''}`}> <Link to={`/p/${sub.address}${isInCatalogView ? '/catalog' : ''}`}>
{sub.address.endsWith('.eth') || sub.address.endsWith('.sol') ? sub.address : sub.address.slice(0, 10).concat('...')} {sub.address.endsWith('.eth') || sub.address.endsWith('.sol') ? sub.address : sub.address.slice(0, 10).concat('...')}
</Link> </Link>
{index !== subplebbits.length - 1 ? ' /' : null} {index !== subplebbits?.length - 1 ? ' /' : null}
</span> </span>
))} ))}
]{' '} ]{' '}
@@ -90,7 +90,7 @@ const renderBoardsList = (subplebbits: any, isInCatalogView: boolean, subscripti
<Link to={`/p/${address}${isInCatalogView ? '/catalog' : ''}`}> <Link to={`/p/${address}${isInCatalogView ? '/catalog' : ''}`}>
{address.endsWith('.eth') || address.endsWith('.sol') ? address : address.slice(0, 10).concat('...')} {address.endsWith('.eth') || address.endsWith('.sol') ? address : address.slice(0, 10).concat('...')}
</Link> </Link>
{index !== subscriptions.length - 1 ? ' /' : null} {index !== subscriptions?.length - 1 ? ' /' : null}
</span> </span>
))} ))}
]{' '} ]{' '}
+28 -4
View File
@@ -5,6 +5,7 @@ import { Subplebbit } from '@plebbit/plebbit-react-hooks';
import useIsSubplebbitOffline from '../../../hooks/use-is-subplebbit-offline'; import useIsSubplebbitOffline from '../../../hooks/use-is-subplebbit-offline';
import styles from '../home.module.css'; import styles from '../home.module.css';
import { nsfwTags } from '../home'; import { nsfwTags } from '../home';
import { useState } from 'react';
const Board = ({ subplebbit, subplebbits }: { subplebbit: Subplebbit; subplebbits: any; useCatalog?: boolean }) => { const Board = ({ subplebbit, subplebbits }: { subplebbit: Subplebbit; subplebbits: any; useCatalog?: boolean }) => {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -14,17 +15,20 @@ const Board = ({ subplebbit, subplebbits }: { subplebbit: Subplebbit; subplebbit
const subplebbitData = subplebbits && subplebbits.find((sub: Subplebbit) => sub?.address === address); const subplebbitData = subplebbits && subplebbits.find((sub: Subplebbit) => sub?.address === address);
const { isOffline, isOnlineStatusLoading, offlineIconClass, offlineTitle } = useIsSubplebbitOffline(subplebbitData); const { isOffline, isOnlineStatusLoading, offlineIconClass, offlineTitle } = useIsSubplebbitOffline(subplebbitData);
const displayAddress = address === 'all' ? 'all' : Plebbit.getShortAddress(address);
const showOfflineIcon = address !== 'all' && (isOffline || isOnlineStatusLoading);
return ( return (
<tr className={styles.subplebbit} key={address}> <tr className={styles.subplebbit} key={address}>
<td className={styles.boardAddress}> <td className={styles.boardAddress}>
<p className={styles.boardCell}> <p className={styles.boardCell}>
<Link to={`/p/${address}`}>{address && Plebbit.getShortAddress(address)}</Link> <Link to={`/p/${address}`}>{displayAddress}</Link>
{(isOffline || isOnlineStatusLoading) && <span className={`${styles.offlineIcon} ${offlineIconClass}`} title={offlineTitle} />} {showOfflineIcon && <span className={`${styles.offlineIcon} ${offlineIconClass}`} title={offlineTitle} />}
{nsfwTag && <span className={styles.nsfw}> ({t(nsfwTag)})</span>} {nsfwTag && <span className={styles.nsfw}> ({t(nsfwTag)})</span>}
</p> </p>
</td> </td>
<td className={styles.boardTitle}> <td className={styles.boardTitle}>
<p className={styles.boardCell}>{title || (address && Plebbit.getShortAddress(address))}</p> <p className={styles.boardCell}>{title || displayAddress}</p>
</td> </td>
<td className={styles.boardTags}> <td className={styles.boardTags}>
<p className={styles.boardCell}>{tags.join(', ')}</p> <p className={styles.boardCell}>{tags.join(', ')}</p>
@@ -35,6 +39,20 @@ const Board = ({ subplebbit, subplebbits }: { subplebbit: Subplebbit; subplebbit
const BoardsList = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits: any }) => { const BoardsList = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits: any }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const [displayCount, setDisplayCount] = useState(15);
const handleLoadMore = () => {
setDisplayCount((prevCount) => prevCount + 15);
};
const visibleBoards = multisub.slice(0, displayCount);
const hasMoreBoards = displayCount < multisub.length;
const defaultBoard = {
address: 'all',
title: 'Temporary Default Subplebbits',
tags: ['multiboard'],
};
return ( return (
<div className={styles.boardsBox}> <div className={styles.boardsBox}>
@@ -51,11 +69,17 @@ const BoardsList = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subpleb
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{multisub.map((sub) => ( <Board key='all' subplebbit={defaultBoard} subplebbits={subplebbits} />
{visibleBoards.map((sub) => (
<Board key={sub.address} subplebbit={sub} subplebbits={subplebbits} /> <Board key={sub.address} subplebbit={sub} subplebbits={subplebbits} />
))} ))}
</tbody> </tbody>
</table> </table>
{hasMoreBoards && (
<div className={styles.loadMoreButton}>
[<span onClick={handleLoadMore}>{t('load_more')}</span>]
</div>
)}
</div> </div>
); );
}; };
+17
View File
@@ -89,6 +89,23 @@
color: inherit; color: inherit;
} }
.loadMoreButton {
text-align: center;
margin-bottom: 14px;
color: var(--topbar-separator-color);
}
.loadMoreButton span {
color: var(--topbar-desktop-link-text-color);
text-transform: capitalize;
}
.loadMoreButton span:hover {
cursor: pointer;
color: var(--button-desktop-text-color-hover);
text-decoration: underline;
}
.boxBar, .infoboxBar { .boxBar, .infoboxBar {
padding-left: 0.5em; padding-left: 0.5em;
line-height: 2em; line-height: 2em;