Merge pull request #531 from plebbit/development

Development
This commit is contained in:
Tom (plebeius.eth)
2025-03-03 17:27:38 +01:00
committed by GitHub
53 changed files with 264 additions and 244 deletions

View File

@@ -298,7 +298,7 @@
"hide_settings": "إخفاء الإعدادات",
"wallet": "محفظة",
"undelete": "إلغاء الحذف",
"loading_comments": "تحميل التعليقات",
"loading_comments": "جاري تحميل التعليقات",
"you_blocked_community": "لقد حظرت هذه المجتمعة",
"show": "اظهر",
"plebbit_options": "خيارات plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "أنت مشرف في هذه المجتمع",
"you_are_owner": "أنت مالك هذا المجتمع",
"looking_for_more_posts": "البحث عن المزيد من المشاركات",
"loading_feed": "تحميل الخلاصة"
"loading_feed": "تحميل الخلاصة",
"loading_posts": "جاري تحميل المشاركات"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "আপনি এই কমিউনিটির একজন প্রশাসক",
"you_are_owner": "আপনি এই কমিউনিটির মালিক",
"looking_for_more_posts": "আরও পোস্ট খুঁজছি",
"loading_feed": "লোডিং ফিড"
"loading_feed": "লোডিং ফিড",
"loading_posts": "পোস্ট লোড হচ্ছে"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Jste administrátorem této komunity",
"you_are_owner": "Jste vlastníkem této komunity",
"looking_for_more_posts": "Hledání dalších příspěvků",
"loading_feed": "Načítání kanálu"
"loading_feed": "Načítání kanálu",
"loading_posts": "Načítání příspěvků"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Du er administrator af dette fællesskab",
"you_are_owner": "Du er ejer af dette fællesskab",
"looking_for_more_posts": "Leder efter flere indlæg",
"loading_feed": "Indlæser feed"
"loading_feed": "Indlæser feed",
"loading_posts": "Indlæser indlæg"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Einstellungen ausblenden",
"wallet": "Wallet",
"undelete": "Wiederherstellen",
"loading_comments": "Lade Kommentare",
"loading_comments": "Lädt Kommentare",
"you_blocked_community": "Du hast diese Gemeinschaft blockiert",
"show": "zeigen",
"plebbit_options": "plebbit optionen",
@@ -360,5 +360,6 @@
"you_are_admin": "Du bist ein Administrator dieser Community",
"you_are_owner": "Du bist der Eigentümer dieser Community",
"looking_for_more_posts": "Suche nach weiteren Beiträgen",
"loading_feed": "Lädt Feed"
"loading_feed": "Lädt Feed",
"loading_posts": "Lade Beiträge"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Απόκρυψη ρυθμίσεων",
"wallet": "Πορτοφόλι",
"undelete": "Ανάκτηση διαγραφής",
"loading_comments": όρτωση σχολίων",
"loading_comments": ορτώνει σχόλια",
"you_blocked_community": "Έχετε αποκλείσει αυτή την κοινότητα",
"show": "εμφάνιση",
"plebbit_options": "επιλογές plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "Είσαι διαχειριστής αυτής της κοινότητας",
"you_are_owner": "Είσαι ο ιδιοκτήτης αυτής της κοινότητας",
"looking_for_more_posts": "Ψάχνει για περισσότερες αναρτήσεις",
"loading_feed": "Φόρτωση ροής"
"loading_feed": "Φόρτωση ροής",
"loading_posts": "Φόρτωση δημοσιεύσεων"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "You are an admin of this community.",
"you_are_owner": "You are the owner of this community.",
"looking_for_more_posts": "Looking for more posts",
"loading_feed": "Loading feed"
"loading_feed": "Loading feed",
"loading_posts": "Loading posts"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Eres un administrador de esta comunidad",
"you_are_owner": "Eres el dueño de esta comunidad",
"looking_for_more_posts": "Buscando más publicaciones",
"loading_feed": "Cargando feed"
"loading_feed": "Cargando feed",
"loading_posts": "Cargando publicaciones"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "مخفی کردن تنظیمات",
"wallet": "کیف پول",
"undelete": "بازیابی",
"loading_comments": "بارگذاری نظرات",
"loading_comments": "در حال بارگذاری نظرات",
"you_blocked_community": "شما این انجمن را مسدود کرده‌اید",
"show": "نمایش",
"plebbit_options": "گزینه های plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "شما مدیر این جامعه هستید",
"you_are_owner": "شما مالک این جامعه هستید",
"looking_for_more_posts": "در جستجوی پست‌های بیشتر",
"loading_feed": "در حال بارگذاری فید"
"loading_feed": "در حال بارگذاری فید",
"loading_posts": "در حال بارگذاری پست‌ها"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Olet tämän yhteisön ylläpitäjä",
"you_are_owner": "Olet tämän yhteisön omistaja",
"looking_for_more_posts": "Etsii lisää viestejä",
"loading_feed": "Ladataan syöte"
"loading_feed": "Ladataan syöte",
"loading_posts": "Ladataan viestejä"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Ikaw ay isang admin ng komunidad na ito",
"you_are_owner": "Ikaw ang may-ari ng komunidad na ito",
"looking_for_more_posts": "Naghahanap ng higit pang mga post",
"loading_feed": "Naglo-load ng feed"
"loading_feed": "Naglo-load ng feed",
"loading_posts": "Naglo-load ng mga post"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Vous êtes un administrateur de cette communauté",
"you_are_owner": "Vous êtes le propriétaire de cette communauté",
"looking_for_more_posts": "Recherche de plus de publications",
"loading_feed": "Chargement du flux"
"loading_feed": "Chargement du flux",
"loading_posts": "Chargement des publications"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "הסתר הגדרות",
"wallet": "ארנק",
"undelete": "שחזור מחיקה",
"loading_comments": "טוען תגובות",
"loading_comments": "טעינת תגובות",
"you_blocked_community": "חסמת את הקהילה הזו",
"show": "תצוגה",
"plebbit_options": "אפשרויות plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "אתה מנהל מערכת של קהילה זו",
"you_are_owner": "אתה הבעלים של קהילה זו",
"looking_for_more_posts": "מחפש פוסטים נוספים",
"loading_feed": "טוען פיד"
"loading_feed": "טוען פיד",
"loading_posts": "טעינת פוסטים"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "आप इस समुदाय के व्यवस्थापक हैं",
"you_are_owner": "आप इस समुदाय के मालिक हैं",
"looking_for_more_posts": "अधिक पोस्ट ढूंढ रहे हैं",
"loading_feed": "लोडिंग फीड"
"loading_feed": "लोडिंग फीड",
"loading_posts": "पोस्ट लोड हो रही हैं"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Beállítások elrejtése",
"wallet": "Pénztárca",
"undelete": "Visszaállítás",
"loading_comments": "Megjegyzések betöltése",
"loading_comments": "Kommentárok betöltése",
"you_blocked_community": "Blokkoltad ezt a közösséget",
"show": "mutat",
"plebbit_options": "plebbit lehetőségek",
@@ -360,5 +360,6 @@
"you_are_admin": "Adminisztrátor vagy ennek a közösségnek",
"you_are_owner": "Te vagy a közösség tulajdonosa",
"looking_for_more_posts": "Több bejegyzés keresése",
"loading_feed": "Betöltés a hírcsatornára"
"loading_feed": "Betöltés a hírcsatornára",
"loading_posts": "Bejegyzések betöltése"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Anda adalah admin komunitas ini",
"you_are_owner": "Anda adalah pemilik komunitas ini",
"looking_for_more_posts": "Mencari lebih banyak pos",
"loading_feed": "Memuat feed"
"loading_feed": "Memuat feed",
"loading_posts": "Memuat pos"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Nascondi impostazioni",
"wallet": "Wallet",
"undelete": "Annulla eliminazione",
"loading_comments": "Caricamento commenti",
"loading_comments": "Caricamento dei commenti",
"you_blocked_community": "Hai bloccato questa comunità",
"show": "mostra",
"plebbit_options": "opzioni plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "Sei un admin di questa comunità",
"you_are_owner": "Sei il proprietario di questa comunità",
"looking_for_more_posts": "Cercando più post",
"loading_feed": "Caricamento feed"
"loading_feed": "Caricamento feed",
"loading_posts": "Caricamento dei post"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "設定を非表示",
"wallet": "ウォレット",
"undelete": "削除を取り消す",
"loading_comments": "コメントを読み込み中",
"loading_comments": "コメントを読み込んでいます",
"you_blocked_community": "このコミュニティをブロックしました",
"show": "表示",
"plebbit_options": "plebbitのオプション",
@@ -360,5 +360,6 @@
"you_are_admin": "あなたはこのコミュニティの管理者です",
"you_are_owner": "あなたはこのコミュニティのオーナーです",
"looking_for_more_posts": "さらに投稿を探しています",
"loading_feed": "フィードを読み込んでいます"
"loading_feed": "フィードを読み込んでいます",
"loading_posts": "投稿を読み込んでいます"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "설정 숨기기",
"wallet": "지갑",
"undelete": "삭제 취소",
"loading_comments": "댓글 로드 중",
"loading_comments": "댓글 로드 중",
"you_blocked_community": "이 커뮤니티를 차단했습니다",
"show": "보여주다",
"plebbit_options": "plebbit 옵션",
@@ -360,5 +360,6 @@
"you_are_admin": "당신은 이 커뮤니티의 관리자입니다",
"you_are_owner": "당신은 이 커뮤니티의 소유자입니다",
"looking_for_more_posts": "더 많은 게시물을 찾고 있습니다",
"loading_feed": "피드를 로딩 중"
"loading_feed": "피드를 로딩 중",
"loading_posts": "게시물 로딩 중"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "सेटिंग्ज लपवा",
"wallet": "बटवा",
"undelete": "डिलीट करा",
"loading_comments": "टिप्पण लोड होत आहे",
"loading_comments": "टिप्पण्या लोड होत आहे",
"you_blocked_community": "तुम्ही ह्या समुदायाला ब्लॉक केलं आहे",
"show": "दाखवा",
"plebbit_options": "प्लेबिट पर्याय",
@@ -360,5 +360,6 @@
"you_are_admin": "तुम्ही या समुदायाचे प्रशासक आहात",
"you_are_owner": "तुम्ही या समुदायाचे मालक आहात",
"looking_for_more_posts": "अधिक पोस्ट शोधत आहे",
"loading_feed": "फीड लोड करत आहे"
"loading_feed": "फीड लोड करत आहे",
"loading_posts": "पोस्ट लोड करत आहे"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Je bent een beheerder van deze gemeenschap",
"you_are_owner": "Je bent de eigenaar van deze gemeenschap",
"looking_for_more_posts": "Op zoek naar meer berichten",
"loading_feed": "Laad feed"
"loading_feed": "Laad feed",
"loading_posts": "Berichten laden"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Skjul innstillinger",
"wallet": "Lommebok",
"undelete": "Gjenopprette",
"loading_comments": "Laster inn kommentarer",
"loading_comments": "Laster kommentarer",
"you_blocked_community": "Du har blokkert dette fellesskapet",
"show": "vise",
"plebbit_options": "plebbit alternativer",
@@ -360,5 +360,6 @@
"you_are_admin": "Du er administrator for dette fellesskapet",
"you_are_owner": "Du er eier av dette fellesskapet",
"looking_for_more_posts": "Leter etter flere innlegg",
"loading_feed": "Laster feed"
"loading_feed": "Laster feed",
"loading_posts": "Laster innlegg"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Jesteś administratorem tej społeczności",
"you_are_owner": "Jesteś właścicielem tej społeczności",
"looking_for_more_posts": "Szukam więcej postów",
"loading_feed": "Ładowanie kanału"
"loading_feed": "Ładowanie kanału",
"loading_posts": "Ładowanie postów"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Você é um administrador desta comunidade",
"you_are_owner": "Você é o proprietário desta comunidade",
"looking_for_more_posts": "Procurando mais postagens",
"loading_feed": "Carregando feed"
"loading_feed": "Carregando feed",
"loading_posts": "Carregando postagens"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Ascunde setările",
"wallet": "Portofel",
"undelete": "Recuperare",
"loading_comments": "Se încarcă comentariile",
"loading_comments": "Se încarcă comentarii",
"you_blocked_community": "Ați blocat această comunitate",
"show": "arată",
"plebbit_options": "opțiuni plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "Ești administrator al acestei comunități",
"you_are_owner": "Ești proprietarul acestei comunități",
"looking_for_more_posts": "Căutând mai multe postări",
"loading_feed": "Încărcare feed"
"loading_feed": "Încărcare feed",
"loading_posts": "Se încarcă postările"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Вы администратор этой сообщества",
"you_are_owner": "Вы являетесь владельцем этой сообщества",
"looking_for_more_posts": "Ищу больше постов",
"loading_feed": "Загрузка ленты"
"loading_feed": "Загрузка ленты",
"loading_posts": "Загрузка постов"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "Fshih rregullimet",
"wallet": "Wallet",
"undelete": "Rikuperimi",
"loading_comments": "Duke u ngarkuar komentet",
"loading_comments": "Po ngarkohen komentet",
"you_blocked_community": "Ju keni bllokuar këtë komunitet",
"show": "shfaq",
"plebbit_options": "opsione plebbit",
@@ -360,5 +360,6 @@
"you_are_admin": "Jeni administrator i kësaj komune",
"you_are_owner": "Jeni pronari i kësaj komune",
"looking_for_more_posts": "Po kërkoni më shumë postime",
"loading_feed": "Po ngarkoni feed-in"
"loading_feed": "Po ngarkoni feed-in",
"loading_posts": "Duke ngarkuar postimet"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Du är administratör för denna gemenskap",
"you_are_owner": "Du är ägaren av denna gemenskap",
"looking_for_more_posts": "Letar efter fler inlägg",
"loading_feed": "Laddar flöde"
"loading_feed": "Laddar flöde",
"loading_posts": "Laddar inlägg"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "సెట్టింగులను దాచు",
"wallet": "వాలెట్",
"undelete": "తొలగించడం రద్దు చేయండి",
"loading_comments": "వ్యాఖ్యలను లోడ్ అవుతోంది",
"loading_comments": "కామెంట్లు లోడవుతున్నాయి",
"you_blocked_community": "ఈ సముదాయాన్ని మీరు నిరోధించారు",
"show": "చూపించు",
"plebbit_options": "plebbit ఎంపికలు",
@@ -360,5 +360,6 @@
"you_are_admin": "మీరు ఈ కమ్యూనిటీలో అడ్మిన్ అయితే",
"you_are_owner": "మీరు ఈ కమ్యూనిటీ యొక్క యజమాని",
"looking_for_more_posts": "మరింత పోస్ట్‌ల కోసం చూస్తున్నాను",
"loading_feed": "లోడింగ్ ఫీడ్"
"loading_feed": "లోడింగ్ ఫీడ్",
"loading_posts": "పోస్ట్స్ లోడవుతున్నాయి"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "คุณเป็นผู้ดูแลระบบของชุมชนนี้",
"you_are_owner": "คุณเป็นเจ้าของชุมชนนี้",
"looking_for_more_posts": "กำลังมองหาบทความเพิ่มเติม",
"loading_feed": "กำลังโหลดฟีด"
"loading_feed": "กำลังโหลดฟีด",
"loading_posts": "กำลังโหลดโพสต์"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Bu topluluğun yöneticisisiniz",
"you_are_owner": "Bu topluluğun sahibi sizsiniz",
"looking_for_more_posts": "Daha fazla gönderi arıyorum",
"loading_feed": "Yükleniyor besleme"
"loading_feed": "Yükleniyor besleme",
"loading_posts": "Gönderiler yükleniyor"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Ви є адміністратором цієї спільноти",
"you_are_owner": "Ви є власником цієї спільноти",
"looking_for_more_posts": "Шукаю більше дописів",
"loading_feed": "Завантаження потоку"
"loading_feed": "Завантаження потоку",
"loading_posts": "Завантаження постів"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "ترتیبات چھپائیں",
"wallet": "والیٹ",
"undelete": "حذف کو واپس لائیں",
"loading_comments": "تبصرے لوڈ ہو رہے ہیں",
"loading_comments": "کمنٹس لوڈ ہو رہے ہیں",
"you_blocked_community": "آپ نے یہ سماج بلاک کر دی ہے",
"show": "دکھائیں",
"plebbit_options": "پلیبٹ اختیارات",
@@ -360,5 +360,6 @@
"you_are_admin": "آپ اس کمیونٹی کے ایڈمن ہیں",
"you_are_owner": "آپ اس کمیونٹی کے مالک ہیں",
"looking_for_more_posts": "مزید پوسٹس تلاش کر رہے ہیں",
"loading_feed": "لوڈ ہو رہا ہے فیڈ"
"loading_feed": "لوڈ ہو رہا ہے فیڈ",
"loading_posts": "پوسٹس لوڈ ہو رہی ہیں"
}

View File

@@ -360,5 +360,6 @@
"you_are_admin": "Bạn là quản trị viên của cộng đồng này",
"you_are_owner": "Bạn là chủ sở hữu của cộng đồng này",
"looking_for_more_posts": "Tìm kiếm thêm bài viết",
"loading_feed": "Đang tải feed"
"loading_feed": "Đang tải feed",
"loading_posts": "Đang tải bài viết"
}

View File

@@ -298,7 +298,7 @@
"hide_settings": "隐藏设置",
"wallet": "钱包",
"undelete": "取消删除",
"loading_comments": "正在加载评论",
"loading_comments": "加载评论",
"you_blocked_community": "您已封锁了此社区",
"show": "显示",
"plebbit_options": "plebbit选项",
@@ -360,5 +360,6 @@
"you_are_admin": "您是这个社区的管理员",
"you_are_owner": "您是这个社区的拥有者",
"looking_for_more_posts": "寻找更多帖子",
"loading_feed": "加载中..."
"loading_feed": "加载中...",
"loading_posts": "加载帖子"
}

View File

@@ -1,5 +1,5 @@
import { useEffect } from 'react';
import { Outlet, Route, Routes, useLocation, useNavigate } from 'react-router-dom';
import { Outlet, Route, Routes } from 'react-router-dom';
import useTheme from './hooks/use-theme';
import styles from './app.module.css';
import AboutView from './views/about';
@@ -57,17 +57,6 @@ const App = () => {
document.body.classList.add(theme);
}, [theme]);
// react router doesn't handle the %23 hash correctly, so we need to replace it with #
const navigate = useNavigate();
const location = useLocation();
useEffect(() => {
const currentPath = location.pathname + location.hash;
if (currentPath.includes('%23')) {
const correctedPath = currentPath.replace('%23', '#');
navigate(correctedPath, { replace: true });
}
}, [location, navigate]);
return (
<div className={`${styles.app} ${theme}`}>
<Routes>
@@ -132,6 +121,7 @@ const App = () => {
<Route path='/u/:authorAddress/c/:commentCid?/submitted/:sortType?/:timeFilterName?' element={<Author />} />
<Route path='*' element={<NotFound />} />
<Route path='/not-found' element={<NotFound />} />
</Route>
</Route>
</Routes>

View File

@@ -13,10 +13,6 @@
text-transform: lowercase;
}
.stateString {
display: inline-block;
}
.morePostsSuggestion {
padding-bottom: 15px;
}

View File

@@ -2,7 +2,7 @@ import { useState, useEffect } from 'react';
import { Link, useLocation, useParams } from 'react-router-dom';
import { Trans, useTranslation } from 'react-i18next';
import { isModView } from '../../lib/utils/view-utils';
import useFeedStateString from '../../hooks/use-feed-state-string';
import { useFeedStateString } from '../../hooks/use-state-string';
import LoadingEllipsis from '../loading-ellipsis';
import styles from './feed-footer.module.css';
@@ -43,9 +43,9 @@ const FeedFooter = ({
};
const feedStateString = useFeedStateString(subplebbitAddresses);
const [isHovering, setIsHovering] = useState(false);
const loadingStateString =
!hasFeedLoaded || (feedLength === 0 && !(weeklyFeedLength > feedLength || monthlyFeedLength > feedLength)) ? t('loading_feed') : t('looking_for_more_posts');
useFeedStateString(subplebbitAddresses) ||
(!hasFeedLoaded || (feedLength === 0 && !(weeklyFeedLength > feedLength || monthlyFeedLength > feedLength)) ? t('loading_feed') : t('looking_for_more_posts'));
// Add state to track initial loading
const [hasFetchedSubplebbitAddresses, setHasFetchedSubplebbitAddresses] = useState(false);
@@ -101,7 +101,7 @@ const FeedFooter = ({
</div>
)
)}
<div className={styles.stateString} onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)}>
<div className={styles.stateString}>
{subplebbitAddresses.length === 0 ? (
isInModView ? (
<div className={styles.notModerator}>{t('not_moderator')}</div>
@@ -116,7 +116,7 @@ const FeedFooter = ({
</div>
)
) : (
<LoadingEllipsis string={isHovering ? feedStateString || loadingStateString : loadingStateString} />
<LoadingEllipsis string={feedStateString || loadingStateString} />
)}
</div>
</>

View File

@@ -23,11 +23,9 @@ import {
import Markdown from '../markdown';
import SearchBar from '../search-bar';
import SubscribeButton from '../subscribe-button';
import packageJson from '../../../package.json';
import LoadingEllipsis from '../loading-ellipsis';
import Version from '../version';
const { version } = packageJson;
const commitRef = process.env.REACT_APP_COMMIT_REF;
const isElectron = window.isElectron === true;
const RulesList = ({ rules }: { rules: string[] }) => {
@@ -108,23 +106,6 @@ const ModerationTools = ({ address }: { address?: string }) => {
);
};
const downloadAppLink = (() => {
const platform = navigator.platform;
if (platform === 'Linux' || platform === 'Linux x86_64' || platform === 'Linux i686' || platform === 'Linux aarch64') {
return `https://github.com/plebbit/seedit/releases/download/v${version}/seedit-${version}.AppImage`;
} else if (platform === 'Win32' || platform === 'Win64' || platform === 'Windows') {
return `https://github.com/plebbit/seedit/releases/download/v${version}/seedit.Portable.${version}.exe`;
} else if (platform === 'MacIntel' || platform === 'Macintosh') {
return `https://github.com/plebbit/seedit/releases/download/v${version}/seedit-${version}.dmg`;
} else if (platform === 'Android') {
return undefined;
} else if (platform === 'iPhone' || platform === 'iPad') {
return undefined;
} else {
return undefined;
}
})();
interface SidebarProps {
comment?: Comment;
isSubCreatedButNotYetPublished?: boolean;
@@ -134,7 +115,6 @@ interface SidebarProps {
}
export const Footer = () => {
const { t } = useTranslation();
const location = useLocation();
const isMobile = useIsMobile();
const isInHomeAboutView = isHomeAboutView(location.pathname);
@@ -148,7 +128,7 @@ export const Footer = () => {
<ul>
<li>
<a href='https://plebbit.com' target='_blank' rel='noopener noreferrer'>
plebbit
about
</a>
<span className={styles.footerSeparator}>|</span>
</li>
@@ -177,28 +157,14 @@ export const Footer = () => {
</a>
<span className={styles.footerSeparator}>|</span>
</li>
{downloadAppLink && (
<li>
<a href={downloadAppLink} target='_blank' rel='noopener noreferrer'>
{t('download_app')}
</a>
<span className={styles.footerSeparator}>|</span>
</li>
)}
<li>
<a href={`https://github.com/plebbit/seedit/releases/tag/v${version}`} target='_blank' rel='noopener noreferrer'>
v{version}
<a href='https://plebbit.github.io/docs/learn/clients/seedit/what-is-seedit' target='_blank' rel='noopener noreferrer'>
docs
</a>
{commitRef && (
<>
{' '}
(
<a href={`https://github.com/plebbit/seedit/commit/${commitRef}`} target='_blank' rel='noopener noreferrer'>
{commitRef.slice(0, 7)}
</a>
)
</>
)}
<span className={styles.footerSeparator}>|</span>
</li>
<li>
<Version />
</li>
</ul>
</div>

View File

@@ -4,7 +4,9 @@
position: fixed;
width: 100%;
z-index: 6;
transition: top 0.2s ease-in-out;
will-change: transform;
transform: translateY(0);
transition: transform 0.2s ease-in-out;
align-items: center;
justify-content: space-around;
}

View File

@@ -24,7 +24,7 @@ const StickyHeader = () => {
}, []);
return (
<div className={styles.content} style={{ top: visible ? 0 : '-40px' }}>
<div className={styles.content} style={{ transform: visible ? 'translateY(0)' : 'translateY(-40px)' }}>
<TopBar />
<AccountBar />
</div>

View File

@@ -0,0 +1 @@
export { default } from './version';

View File

@@ -0,0 +1,18 @@
import packageJson from '../../../package.json';
const { version } = packageJson;
const commitRef = process.env.REACT_APP_COMMIT_REF;
const Version = () => {
return (
<a
href={commitRef ? `https://github.com/plebbit/seedit/commit/${commitRef}` : `https://github.com/plebbit/seedit/releases/tag/v${version}`}
target='_blank'
rel='noopener noreferrer'
>
seedit v{commitRef ? '-dev' : version}
</a>
);
};
export default Version;

View File

@@ -15,6 +15,7 @@ export interface MultisubSubplebbit {
tags?: string[];
features?: string[];
seeditAutoSubscribe?: boolean;
lowUptime?: boolean;
}
let cacheSubplebbits: MultisubSubplebbit[] | null = null;
@@ -34,14 +35,17 @@ export const useDefaultSubplebbits = () => {
'https://raw.githubusercontent.com/plebbit/temporary-default-subplebbits/master/multisub.json',
// { cache: 'no-cache' }
).then((res) => res.json());
cacheSubplebbits = multisub.subplebbits;
const filteredSubplebbits = multisub.subplebbits.filter((sub: MultisubSubplebbit) => !sub.lowUptime);
cacheSubplebbits = filteredSubplebbits;
// Cache auto-subscribe addresses when we fetch subplebbits
cacheAutoSubscribeAddresses = multisub.subplebbits
cacheAutoSubscribeAddresses = filteredSubplebbits
.filter((sub: MultisubSubplebbit) => sub.seeditAutoSubscribe && sub.address)
.map((sub: MultisubSubplebbit) => sub.address);
setSubplebbits(multisub.subplebbits);
setSubplebbits(filteredSubplebbits);
} catch (e) {
console.warn(e);
}
@@ -51,6 +55,8 @@ export const useDefaultSubplebbits = () => {
return cacheSubplebbits || subplebbits;
};
export const getAutoSubscribeAddresses = () => cacheAutoSubscribeAddresses || [];
export const useDefaultSubplebbitAddresses = () => {
const defaultSubplebbits = useDefaultSubplebbits();
const { hideAdultCommunities, hideGoreCommunities, hideAntiCommunities, hideVulgarCommunities } = useContentOptionsStore();
@@ -108,5 +114,3 @@ const getUniqueTags = (multisub: any) => {
export const useDefaultSubplebbitTags = (subplebbits: any) => {
return useMemo(() => getUniqueTags(subplebbits), [subplebbits]);
};
export const getAutoSubscribeAddresses = () => cacheAutoSubscribeAddresses || [];

View File

@@ -1,99 +0,0 @@
import { useMemo } from 'react';
import useStateString from './use-state-string';
import { useSubplebbit, useSubplebbitsStates } from '@plebbit/plebbit-react-hooks';
const clientHosts: { [key: string]: string } = {};
const getClientHost = (clientUrl: string): string => {
if (!clientHosts[clientUrl]) {
try {
clientHosts[clientUrl] = new URL(clientUrl).hostname || clientUrl;
} catch (e) {
clientHosts[clientUrl] = clientUrl;
}
}
return clientHosts[clientUrl];
};
const useFeedStateString = (subplebbitAddresses?: string[]): string | undefined => {
// single subplebbit feed state string
const subplebbitAddress = subplebbitAddresses?.length === 1 ? subplebbitAddresses[0] : undefined;
const subplebbit = useSubplebbit({ subplebbitAddress });
const singleSubplebbitFeedStateString = useStateString(subplebbit);
// multiple subplebbit feed state string
const { states } = useSubplebbitsStates({ subplebbitAddresses });
const multipleSubplebbitsFeedStateString = useMemo(() => {
if (subplebbitAddress) {
return;
}
// e.g. Resolving 2 addresses from infura.io, fetching 2 IPNS, 1 IPFS from cloudflare-ipfs.com, ipfs.io
let stateString = '';
if (states['resolving-address']) {
const { subplebbitAddresses, clientUrls } = states['resolving-address'];
if (subplebbitAddresses.length && clientUrls.length) {
stateString += `resolving ${subplebbitAddresses.length} ${subplebbitAddresses.length === 1 ? 'address' : 'addresses'} from ${clientUrls
.map(getClientHost)
.join(', ')}`;
}
}
// find all page client and sub addresses
const pagesStatesClientHosts = new Set();
const pagesStatesSubplebbitAddresses = new Set();
for (const state in states) {
if (state.match('page')) {
states[state].clientUrls.forEach((clientUrl) => pagesStatesClientHosts.add(getClientHost(clientUrl)));
states[state].subplebbitAddresses.forEach((subplebbitAddress) => pagesStatesSubplebbitAddresses.add(subplebbitAddress));
}
}
if (states['fetching-ipns'] || states['fetching-ipfs'] || pagesStatesSubplebbitAddresses.size) {
// separate 2 different states using ', '
if (stateString) {
stateString += ', ';
}
// find all client urls
const clientHosts = new Set([...pagesStatesClientHosts]);
states['fetching-ipns']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
states['fetching-ipfs']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
if (clientHosts.size) {
stateString += 'fetching ';
if (states['fetching-ipns']) {
stateString += `${states['fetching-ipns'].subplebbitAddresses.length} IPNS`;
}
if (states['fetching-ipfs']) {
if (states['fetching-ipns']) {
stateString += ', ';
}
stateString += `${states['fetching-ipfs'].subplebbitAddresses.length} IPFS`;
}
if (pagesStatesSubplebbitAddresses.size) {
if (states['fetching-ipns'] || states['fetching-ipfs']) {
stateString += ', ';
}
stateString += `${pagesStatesSubplebbitAddresses.size} ${pagesStatesSubplebbitAddresses.size === 1 ? 'page' : 'pages'}`;
}
stateString += ` from ${[...clientHosts].join(', ')}`;
}
}
// capitalize first letter
stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1);
// if string is empty, return undefined instead
return stateString === '' ? undefined : stateString;
}, [states, subplebbitAddress]);
if (singleSubplebbitFeedStateString) {
return singleSubplebbitFeedStateString;
}
return multipleSubplebbitsFeedStateString;
};
export default useFeedStateString;

View File

@@ -1,5 +1,5 @@
import { useMemo } from 'react';
import { useClientsStates } from '@plebbit/plebbit-react-hooks';
import { useClientsStates, useSubplebbit, useSubplebbitsStates } from '@plebbit/plebbit-react-hooks';
import { debounce } from 'lodash';
interface CommentOrSubplebbit {
@@ -59,7 +59,12 @@ const useStateString = (commentOrSubplebbit: CommentOrSubplebbit): string | unde
stateString = commentOrSubplebbit.updatingState;
}
if (stateString) {
stateString = stateString.replaceAll('-', ' ').replace('ipfs', 'IPFS').replace('ipns', 'IPNS');
stateString = stateString
.replaceAll('-', ' ')
.replace('ipfs', 'post')
.replace('ipns', 'subplebbit')
.replace('fetching', 'downloading')
.replace('subplebbit subplebbit', 'community');
}
}
@@ -71,4 +76,85 @@ const useStateString = (commentOrSubplebbit: CommentOrSubplebbit): string | unde
}, [debouncedStates, commentOrSubplebbit]);
};
export const useFeedStateString = (subplebbitAddresses?: string[]): string | undefined => {
// single subplebbit feed state string
const subplebbitAddress = subplebbitAddresses?.length === 1 ? subplebbitAddresses[0] : undefined;
const subplebbit = useSubplebbit({ subplebbitAddress });
const singleSubplebbitFeedStateString = useStateString(subplebbit);
// multiple subplebbit feed state string
const { states } = useSubplebbitsStates({ subplebbitAddresses });
const multipleSubplebbitsFeedStateString = useMemo(() => {
if (subplebbitAddress) {
return;
}
// e.g. Resolving 2 addresses from infura.io, fetching 2 IPNS, 1 IPFS from cloudflare-ipfs.com, ipfs.io
let stateString = '';
if (states['resolving-address']) {
const { subplebbitAddresses, clientUrls } = states['resolving-address'];
if (subplebbitAddresses.length && clientUrls.length) {
stateString += `resolving ${subplebbitAddresses.length} ${subplebbitAddresses.length === 1 ? 'address' : 'addresses'} from ${clientUrls
.map(getClientHost)
.join(', ')}`;
}
}
// find all page client and sub addresses
const pagesStatesClientHosts = new Set();
const pagesStatesSubplebbitAddresses = new Set();
for (const state in states) {
if (state.match('page')) {
states[state].clientUrls.forEach((clientUrl) => pagesStatesClientHosts.add(getClientHost(clientUrl)));
states[state].subplebbitAddresses.forEach((subplebbitAddress) => pagesStatesSubplebbitAddresses.add(subplebbitAddress));
}
}
if (states['fetching-ipns'] || states['fetching-ipfs'] || pagesStatesSubplebbitAddresses.size) {
// separate 2 different states using ', '
if (stateString) {
stateString += ', ';
}
// find all client urls
const clientHosts = new Set([...pagesStatesClientHosts]);
states['fetching-ipns']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
states['fetching-ipfs']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
if (clientHosts.size) {
stateString += 'downloading ';
if (states['fetching-ipns']) {
stateString += `${states['fetching-ipns'].subplebbitAddresses.length} communities`;
}
if (states['fetching-ipfs']) {
if (states['fetching-ipns']) {
stateString += ', ';
}
stateString += `${states['fetching-ipfs'].subplebbitAddresses.length} posts`;
}
if (pagesStatesSubplebbitAddresses.size) {
if (states['fetching-ipns'] || states['fetching-ipfs']) {
stateString += ', ';
}
stateString += `${pagesStatesSubplebbitAddresses.size} ${pagesStatesSubplebbitAddresses.size === 1 ? 'page' : 'pages'}`;
}
stateString += ` from ${[...clientHosts].join(', ')}`;
}
}
// capitalize first letter
stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1);
// if string is empty, return undefined instead
return stateString === '' ? undefined : stateString;
}, [states, subplebbitAddress]);
if (singleSubplebbitFeedStateString) {
return singleSubplebbitFeedStateString;
}
return multipleSubplebbitsFeedStateString;
};
export default useStateString;

View File

@@ -6,6 +6,20 @@ div[data-viewport-type="window"] {
position: relative !important;
}
.loadingString {
display: flex;
text-transform: lowercase;
font-size: 12px;
padding-left: 5px;
margin-top: 5px;
}
.noPosts {
color: var(--red);
font-size: 13px;
text-transform: lowercase;
}
@media (max-width: 640px) {
.sidebarDesktop {
display: none;

View File

@@ -29,8 +29,14 @@ const Author = () => {
const replyComments = useMemo(() => authorComments?.filter((comment) => comment && comment.parentCid) || [], [authorComments]);
const postComments = useMemo(() => authorComments?.filter((comment) => comment && !comment.parentCid) || [], [authorComments]);
const loadingString = isInAuthorCommentsView ? t('loading_comments') : t('loading_posts');
const Footer = () => {
return hasMore ? <LoadingEllipsis string={'loading'} /> : null;
return hasMore ? (
<span className={styles.loadingString}>
<LoadingEllipsis string={loadingString || t('loading')} />
</span>
) : null;
};
const virtuosoRef = useRef<VirtuosoHandle | null>(null);
@@ -76,7 +82,6 @@ const Author = () => {
<div className={isMobile ? styles.sidebarMobile : styles.sidebarDesktop}>
<AuthorSidebar />
</div>
{authorComments?.length === 0 && !hasMore && <div className={styles.noPosts}>{t('no_posts_found')}</div>}
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 600 }}
totalCount={authorComments?.length || 0}
@@ -92,6 +97,7 @@ const Author = () => {
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
{virtuosoData?.length === 0 && !hasMore && <div className={styles.noPosts}>{t('nothing_found')}</div>}
</div>
);
};

View File

@@ -1,6 +1,6 @@
import { useEffect } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import { useAccountComment } from '@plebbit/plebbit-react-hooks';
import { useAccountComment, useAccountComments } from '@plebbit/plebbit-react-hooks';
import { useTranslation } from 'react-i18next';
import styles from './pending-post.module.css';
import Post from '../../components/post';
@@ -9,6 +9,7 @@ import LoadingEllipsis from '../../components/loading-ellipsis';
const PendingPost = () => {
const { t } = useTranslation();
const { accountComments } = useAccountComments();
const { accountCommentIndex } = useParams<{ accountCommentIndex?: string }>();
const commentIndex = accountCommentIndex ? parseInt(accountCommentIndex) : undefined;
const post = useAccountComment({ commentIndex });
@@ -17,6 +18,19 @@ const PendingPost = () => {
useEffect(() => window.scrollTo(0, 0), []);
const isValidAccountCommentIndex =
!accountCommentIndex ||
(!isNaN(parseInt(accountCommentIndex)) &&
parseInt(accountCommentIndex) >= 0 &&
accountComments?.length > 0 &&
parseInt(accountCommentIndex) < accountComments.length);
useEffect(() => {
if (!isValidAccountCommentIndex) {
navigate('/not-found', { replace: true });
}
}, [isValidAccountCommentIndex, navigate]);
useEffect(() => {
if (post?.cid && post?.subplebbitAddress) {
navigate(`/p/${post?.subplebbitAddress}/c/${post?.cid}`, { replace: true });

View File

@@ -115,6 +115,7 @@
.loadingString {
padding: 5px;
text-transform: lowercase;
}
.stateString {

View File

@@ -138,8 +138,6 @@ const Post = ({ post }: { post: Comment }) => {
const lockedState = deleted ? t('deleted') : locked ? t('locked') : removed ? t('removed') : '';
const [isHovering, setIsHovering] = useState(false);
return (
<>
{(deleted || locked || removed) && (
@@ -180,10 +178,10 @@ const Post = ({ post }: { post: Comment }) => {
</div>
</div>
)}
<span className={styles.loadingString} onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)}>
<span className={styles.loadingString}>
{stateString && stateString !== 'Failed' ? (
<div className={styles.stateString}>
<LoadingEllipsis string={isHovering ? stateString : t('loading')} />
<LoadingEllipsis string={stateString || t('loading')} />
</div>
) : (
state === 'failed' && t('failed')

View File

@@ -6,6 +6,7 @@ import { setAccount, useAccount } from '@plebbit/plebbit-react-hooks';
import { isSettingsPlebbitOptionsView } from '../../lib/utils/view-utils';
import useContentOptionsStore from '../../stores/use-content-options-store';
import useTheme from '../../hooks/use-theme';
import Version from '../../components/version';
import AccountSettings from './account-settings';
import AddressSettings from './address-settings';
import AvatarSettings from './avatar-settings';
@@ -206,25 +207,12 @@ const GeneralSettings = () => {
<span className={styles.categoryTitle}>{t('version')}</span>
<span className={styles.categorySettings}>
<div className={styles.version}>
seedit{' '}
<a href={`https://github.com/plebbit/seedit/releases/tag/v${packageJson.version}`} target='_blank' rel='noopener noreferrer'>
v{packageJson.version}
</a>
seedit <Version />
{isElectron && (
<a className={styles.fullNodeStats} href='http://localhost:50019/webui/' target='_blank' rel='noreferrer'>
{t('node_stats')}
</a>
)}
{commitRef && (
<>
{' '}
(
<a href={`https://github.com/plebbit/seedit/commit/${commitRef}`} target='_blank' rel='noopener noreferrer'>
{commitRef.slice(0, 7)}
</a>
)
</>
)}
</div>
<CheckForUpdates />
</span>

View File

@@ -7,7 +7,7 @@ import styles from '../home/home.module.css';
import LoadingEllipsis from '../../components/loading-ellipsis';
import Post from '../../components/post';
import Sidebar from '../../components/sidebar';
import useFeedStateString from '../../hooks/use-feed-state-string';
import { useFeedStateString } from '../../hooks/use-state-string';
import useTimeFilter from '../../hooks/use-time-filter';
import { usePinnedPostsStore } from '../../stores/use-pinned-posts-store';
import { useIsBroadlyNsfwSubplebbit } from '../../hooks/use-is-broadly-nsfw-subplebbit';