Merge pull request #719 from plebbit/development

Development
This commit is contained in:
plebeius
2025-06-03 22:21:20 +02:00
committed by GitHub
58 changed files with 268 additions and 281 deletions
@@ -2,13 +2,20 @@
"appId": "plebchan.android",
"appName": "plebchan",
"webDir": "build",
"bundledWebRuntime": false,
"plugins": {
"CapacitorHttp": {
"enabled": true
},
"FileUploader": {
"enabled": true
},
"StatusBar": {
"style": "Dark",
"backgroundColor": "#000000",
"overlay": false
},
"EdgeToEdge": {
"backgroundColor": "#000000"
}
},
"server": {
@@ -2,5 +2,13 @@
{
"pkg": "@capacitor/app",
"classpath": "com.capacitorjs.plugins.app.AppPlugin"
},
{
"pkg": "@capacitor/status-bar",
"classpath": "com.capacitorjs.plugins.statusbar.StatusBarPlugin"
},
{
"pkg": "@capawesome/capacitor-android-edge-to-edge-support",
"classpath": "io.capawesome.capacitorjs.plugins.androidedgetoedgesupport.EdgeToEdgePlugin"
}
]
@@ -2,11 +2,14 @@ package plebchan.android;
import android.os.Bundle;
import com.getcapacitor.BridgeActivity;
import com.capacitorjs.plugins.statusbar.StatusBarPlugin;
public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
registerPlugin(FileUploaderPlugin.class);
super.onCreate(savedInstanceState);
// Register custom and community plugins after initialization
registerPlugin(FileUploaderPlugin.class);
registerPlugin(StatusBarPlugin.class);
}
}
+9 -2
View File
@@ -4,14 +4,21 @@ const config: CapacitorConfig = {
appId: 'plebchan.android',
appName: 'plebchan',
webDir: 'build',
bundledWebRuntime: false,
plugins: {
CapacitorHttp: {
enabled: true,
},
FileUploader: {
enabled: true
}
},
StatusBar: {
style: 'Dark',
backgroundColor: '#000000',
overlay: false,
},
EdgeToEdge: {
backgroundColor: '#000000',
},
},
server: {
androidScheme: 'https'
+21 -1
View File
@@ -1,5 +1,5 @@
import './log.js';
import { app, BrowserWindow, Menu, MenuItem, Tray, shell, dialog, nativeTheme, ipcMain } from 'electron';
import { app, BrowserWindow, Menu, MenuItem, Tray, shell, dialog, nativeTheme, ipcMain, clipboard } from 'electron';
import isDev from 'electron-is-dev';
import fs from 'fs';
import path from 'path';
@@ -321,3 +321,23 @@ app.on('window-all-closed', () => {
app.quit();
}
});
// Handle request to copy text to clipboard
ipcMain.handle('copy-to-clipboard', async (event, text) => {
try {
clipboard.writeText(text);
return { success: true };
} catch (error) {
console.error('[Electron Main] Error copying to clipboard:', error);
return { success: false, error: error.message };
}
});
// Handle request for platform info
ipcMain.handle('get-platform', async () => {
return {
platform: process.platform,
arch: process.arch,
version: process.version,
};
});
+5 -1
View File
@@ -16,4 +16,8 @@ contextBridge.exposeInMainWorld('defaultMediaIpfsGatewayUrl', 'http://localhost:
ipcRenderer.on('plebbit-rpc-auth-key', (event, plebbitRpcAuthKey) => contextBridge.exposeInMainWorld('plebbitRpcAuthKey', plebbitRpcAuthKey));
ipcRenderer.send('get-plebbit-rpc-auth-key');
contextBridge.exposeInMainWorld('electronApi', { isElectron: true });
contextBridge.exposeInMainWorld('electronApi', {
isElectron: true,
copyToClipboard: (text) => ipcRenderer.invoke('copy-to-clipboard', text),
getPlatform: () => ipcRenderer.invoke('get-platform'),
});
+3 -1
View File
@@ -7,8 +7,10 @@
"private": true,
"dependencies": {
"@capacitor/app": "7.0.1",
"@capacitor/status-bar": "7.0.1",
"@capawesome/capacitor-android-edge-to-edge-support": "7.2.2",
"@floating-ui/react": "0.26.1",
"@plebbit/plebbit-react-hooks": "https://github.com/plebbit/plebbit-react-hooks.git#39cd7c09f1675949193498891fc448f68e42742b",
"@plebbit/plebbit-react-hooks": "https://github.com/plebbit/plebbit-react-hooks.git#090e70bed5f799fc140a31a6f2123f9125954fde",
"@react-spring/web": "9.7.5",
"@testing-library/jest-dom": "5.14.1",
"@testing-library/react": "13.0.0",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "رابط غير صالح",
"no_link_provided": "لم يتم توفير رابط",
"image_search": "البحث عن صورة",
"view_on": "عرض على",
"copy_link": "نسخ الرابط",
"hide_post": "إخفاء المنشور",
"hide_thread": "إخفاء الموضوع",
@@ -131,7 +130,6 @@
"search_image_on_google": "البحث عن صورة على جوجل",
"search_image_on_yandex": "البحث عن صورة على Yandex",
"search_image_on_saucenao": "البحث عن صورة على SauceNAO",
"view_on_client": "عرض على {{client}}",
"expand_all_settings": "توسيع جميع الإعدادات",
"collapse_all_settings": "طي جميع الإعدادات",
"refresh": "تحديث",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "অবৈধ ইউআরএল",
"no_link_provided": "কোনো লিঙ্ক উপস্থিত নেই",
"image_search": "চিত্র অনুসন্ধান",
"view_on": "উপর দেখুন",
"copy_link": "লিংক অনুলিপি করুন",
"hide_post": "পোস্ট লুকাও",
"hide_thread": "থ্রেড লুকাও",
@@ -131,7 +130,6 @@
"search_image_on_google": "গুগলে চিত্র অনুসন্ধান করুন",
"search_image_on_yandex": "Yandexে চিত্র অনুসন্ধান করুন",
"search_image_on_saucenao": "SauceNAO এ চিত্র অনুসন্ধান করুন",
"view_on_client": "{{client}} উপর দেখুন",
"expand_all_settings": "সমস্ত সেটিংস প্রসারিত করুন",
"collapse_all_settings": "সমস্ত সেটিংস সঙ্কুচিত করুন",
"refresh": "পুনরায় লোড করুন",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Neplatná adresa URL",
"no_link_provided": "Není poskytnut žádný odkaz",
"image_search": "hledání obrázku",
"view_on": "zobrazit na",
"copy_link": "kopírovat odkaz",
"hide_post": "skrýt příspěvek",
"hide_thread": "skrýt vlákno",
@@ -131,7 +130,6 @@
"search_image_on_google": "hledat obrázek na Googlu",
"search_image_on_yandex": "hledat obrázek na Yandexu",
"search_image_on_saucenao": "hledat obrázek na SauceNAO",
"view_on_client": "Zobrazit na {{client}}",
"expand_all_settings": "Rozbalit všechna nastavení",
"collapse_all_settings": "Sbalit všechna nastavení",
"refresh": "Obnovit",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Ugyldig webadresse",
"no_link_provided": "Ingen link angivet",
"image_search": "billedsøgning",
"view_on": "se på",
"copy_link": "kopier link",
"hide_post": "skjul post",
"hide_thread": "skjul tråd",
@@ -131,7 +130,6 @@
"search_image_on_google": "søg billede på Google",
"search_image_on_yandex": "søg billede på Yandex",
"search_image_on_saucenao": "søg billede på SauceNAO",
"view_on_client": "Se på {{client}}",
"expand_all_settings": "Udvid alle indstillinger",
"collapse_all_settings": "Sammenklap alle indstillinger",
"refresh": "Opdater",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Ungültige URL",
"no_link_provided": "Kein Link angegeben",
"image_search": "Bildersuche",
"view_on": "anzeigen auf",
"copy_link": "Link kopieren",
"hide_post": "Beitrag ausblenden",
"hide_thread": "Thread ausblenden",
@@ -131,7 +130,6 @@
"search_image_on_google": "Bild auf Google suchen",
"search_image_on_yandex": "Bild auf Yandex suchen",
"search_image_on_saucenao": "Bild auf SauceNAO suchen",
"view_on_client": "Anzeigen auf {{client}}",
"expand_all_settings": "Alle Einstellungen erweitern",
"collapse_all_settings": "Alle Einstellungen reduzieren",
"refresh": "Aktualisieren",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Μη έγκυρη διεύθυνση URL",
"no_link_provided": "Δεν παρέχεται σύνδεσμος",
"image_search": "αναζήτηση εικόνων",
"view_on": "προβολή σε",
"copy_link": "αντιγραφή συνδέσμου",
"hide_post": "απόκρυψη ανάρτησης",
"hide_thread": "απόκρυψη νήματος",
@@ -131,7 +130,6 @@
"search_image_on_google": "αναζήτηση εικόνας στο Google",
"search_image_on_yandex": "αναζήτηση εικόνας στο Yandex",
"search_image_on_saucenao": "αναζήτηση εικόνας στο SauceNAO",
"view_on_client": "Προβολή στο {{client}}",
"expand_all_settings": "Ανάπτυξη όλων των ρυθμίσεων",
"collapse_all_settings": "Σύμπτυξη όλων των ρυθμίσεων",
"refresh": "Ανανέωση",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Invalid URL",
"no_link_provided": "No link provided",
"image_search": "image search",
"view_on": "view on",
"copy_link": "Copy link",
"hide_post": "Hide post",
"hide_thread": "Hide thread",
@@ -131,7 +130,6 @@
"search_image_on_google": "Search image on Google",
"search_image_on_yandex": "Search image on Yandex",
"search_image_on_saucenao": "Search image on SauceNAO",
"view_on_client": "View on {{client}}",
"expand_all_settings": "Expand All Settings",
"collapse_all_settings": "Collapse All Settings",
"refresh": "Refresh",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL no válida",
"no_link_provided": "No se proporcionó ningún enlace",
"image_search": "búsqueda de imágenes",
"view_on": "ver en",
"copy_link": "Copiar enlace",
"hide_post": "Ocultar publicación",
"hide_thread": "Ocultar hilo",
@@ -131,7 +130,6 @@
"search_image_on_google": "Buscar imagen en Google",
"search_image_on_yandex": "Buscar imagen en Yandex",
"search_image_on_saucenao": "Buscar imagen en SauceNAO",
"view_on_client": "Ver en {{client}}",
"expand_all_settings": "Expandir todas las configuraciones",
"collapse_all_settings": "Contraer todas las configuraciones",
"refresh": "Actualizar",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "آدرس اینترنتی نامعتبر است",
"no_link_provided": "لینکی ارائه نشده است",
"image_search": "جستجوی تصویر",
"view_on": "نمایش در",
"copy_link": "رونوشت لینک",
"hide_post": "پنهان کردن پست",
"hide_thread": "پنهان کردن موضوع",
@@ -131,7 +130,6 @@
"search_image_on_google": "جستجوی تصویر در گوگل",
"search_image_on_yandex": "جستجوی تصویر در Yandex",
"search_image_on_saucenao": "جستجوی تصویر در SauceNAO",
"view_on_client": "مشاهده در {{client}}",
"expand_all_settings": "گسترش همه تنظیمات",
"collapse_all_settings": "تايید همه تنظیمات",
"refresh": "تازه‌سازی",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Virheellinen URL-osoite",
"no_link_provided": "Ei linkkiä annettu",
"image_search": "kuvahaku",
"view_on": "näytä",
"copy_link": "kopioi linkki",
"hide_post": "piilota viesti",
"hide_thread": "piilota keskustelu",
@@ -131,7 +130,6 @@
"search_image_on_google": "etsi kuva Googlesta",
"search_image_on_yandex": "etsi kuva Yandexistä",
"search_image_on_saucenao": "etsi kuva SauceNAO: sta",
"view_on_client": "Näytä {{client}}: ssä",
"expand_all_settings": "Laajenna kaikki asetukset",
"collapse_all_settings": "Sulje kaikki asetukset",
"refresh": "Päivitä",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Hindi wastong URL",
"no_link_provided": "Walang link na ibinigay",
"image_search": "paghahanap ng larawan",
"view_on": "tingnan sa",
"copy_link": "kopyahin ang link",
"hide_post": "itago ang post",
"hide_thread": "itago ang thread",
@@ -131,7 +130,6 @@
"search_image_on_google": "maghanap ng larawan sa Google",
"search_image_on_yandex": "maghanap ng larawan sa Yandex",
"search_image_on_saucenao": "maghanap ng larawan sa SauceNAO",
"view_on_client": "Tingnan sa {{client}}",
"expand_all_settings": "I-expand ang lahat ng mga setting",
"collapse_all_settings": "I-collapse ang lahat ng mga setting",
"refresh": "I-refresh",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL non valide",
"no_link_provided": "Aucun lien fourni",
"image_search": "recherche d'images",
"view_on": "voir sur",
"copy_link": "Copier le lien",
"hide_post": "Masquer la publication",
"hide_thread": "Masquer le fil",
@@ -131,7 +130,6 @@
"search_image_on_google": "Rechercher une image sur Google",
"search_image_on_yandex": "Rechercher une image sur Yandex",
"search_image_on_saucenao": "Rechercher une image sur SauceNAO",
"view_on_client": "Voir sur {{client}}",
"expand_all_settings": "Développer toutes les configurations",
"collapse_all_settings": "Réduire toutes les configurations",
"refresh": "Actualiser",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "כתובת אינטרנט לא תקינה",
"no_link_provided": "לא סופק קישור",
"image_search": "חיפוש תמונות",
"view_on": "צפה ב",
"copy_link": "העתק קישור",
"hide_post": "הסתר פוסט",
"hide_thread": "הסתר ת’רד",
@@ -131,7 +130,6 @@
"search_image_on_google": "חפש תמונה ב-Google",
"search_image_on_yandex": "חפש תמונה ב-Yandex",
"search_image_on_saucenao": "חפש תמונה ב- SauceNAO",
"view_on_client": "הצג ב {{client}}",
"expand_all_settings": "הרחב את כל ההגדרות",
"collapse_all_settings": "קפל את כל ההגדרות",
"refresh": "רענן",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "अमान्य URL",
"no_link_provided": "कोई लिंक नहीं दिया गया है",
"image_search": "चित्र खोज",
"view_on": "पर देखें",
"copy_link": "लिंक कॉपी करें",
"hide_post": "पोस्ट छुपाएं",
"hide_thread": "धागा छुपाएं",
@@ -131,7 +130,6 @@
"search_image_on_google": "गूगल पर छवि खोजें",
"search_image_on_yandex": "Yandex पर छवि खोजें",
"search_image_on_saucenao": "SauceNAO पर छवि खोजें",
"view_on_client": "{{client}} पर देखें",
"expand_all_settings": "सभी सेटिंग्स का विस्तार करें",
"collapse_all_settings": "सभी सेटिंग्स को संक्षेपित करें",
"refresh": "ताज़ा करें",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Érvénytelen URL-cím",
"no_link_provided": "Nincs megadva link",
"image_search": "képkeresés",
"view_on": "nézet",
"copy_link": "link másolása",
"hide_post": "bejegyzés elrejtése",
"hide_thread": "szál elrejtése",
@@ -131,7 +130,6 @@
"search_image_on_google": "keresés kép a Google-ben",
"search_image_on_yandex": "keresés kép a Yandex-ben",
"search_image_on_saucenao": "keresés kép a SauceNAO-n",
"view_on_client": "Megtekintés itt: {{client}}",
"expand_all_settings": "Az összes beállítás kibontása",
"collapse_all_settings": "Az összes beállítás összevonása",
"refresh": "Frissítés",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL tidak valid",
"no_link_provided": "Tidak ada tautan yang diberikan",
"image_search": "pencarian gambar",
"view_on": "lihat di",
"copy_link": "salin tautan",
"hide_post": "sembunyikan pos",
"hide_thread": "sembunyikan utas",
@@ -131,7 +130,6 @@
"search_image_on_google": "cari gambar di Google",
"search_image_on_yandex": "cari gambar di Yandex",
"search_image_on_saucenao": "cari gambar di SauceNAO",
"view_on_client": "Lihat di {{client}}",
"expand_all_settings": "Perluas Semua Pengaturan",
"collapse_all_settings": "Ciutkan Semua Pengaturan",
"refresh": "Segarkan",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL non valido",
"no_link_provided": "Nessun link fornito",
"image_search": "ricerca immagini",
"view_on": "Vedi su",
"copy_link": "Copia link",
"hide_post": "Nascondi post",
"hide_thread": "Nascondi thread",
@@ -131,7 +130,6 @@
"search_image_on_google": "Cerca immagine su Google",
"search_image_on_yandex": "Cerca immagine su Yandex",
"search_image_on_saucenao": "Cerca immagine su SauceNAO",
"view_on_client": "Vedi su {{client}}",
"expand_all_settings": "Espandi tutte le impostazioni",
"collapse_all_settings": "Comprimi tutte le impostazioni",
"refresh": "Aggiorna",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "無効なURL",
"no_link_provided": "リンクが指定されていません",
"image_search": "画像検索",
"view_on": "で表示",
"copy_link": "リンクをコピー",
"hide_post": "投稿を非表示",
"hide_thread": "スレッドを非表示",
@@ -131,7 +130,6 @@
"search_image_on_google": "Google で画像を検索",
"search_image_on_yandex": "Yandex で画像を検索",
"search_image_on_saucenao": "SauceNAO で画像を検索",
"view_on_client": "{{client}} で表示",
"expand_all_settings": "すべての設定を展開",
"collapse_all_settings": "すべての設定を折りたたむ",
"refresh": "更新",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "잘못된 URL",
"no_link_provided": "링크가 제공되지 않았습니다",
"image_search": "이미지 검색",
"view_on": "보기",
"copy_link": "링크 복사",
"hide_post": "게시물 숨기기",
"hide_thread": "스레드 숨기기",
@@ -131,7 +130,6 @@
"search_image_on_google": "Google 이미지 검색",
"search_image_on_yandex": "Yandex 이미지 검색",
"search_image_on_saucenao": "SauceNAO 이미지 검색",
"view_on_client": "{{client}}에서 보기",
"expand_all_settings": "모든 설정 펼치기",
"collapse_all_settings": "모든 설정 축소",
"refresh": "새로 고침",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "अवैध URL",
"no_link_provided": "कोणतेही लिंक दिले नाहीत",
"image_search": "प्रतिमा शोध",
"view_on": "पाहा",
"copy_link": "लिंक कॉपी करा",
"hide_post": "पोस्ट लपवा",
"hide_thread": "थ्रेड लपवा",
@@ -131,7 +130,6 @@
"search_image_on_google": "Google वर छायाचित्र शोधा",
"search_image_on_yandex": "Yandex वर छायाचित्र शोधा",
"search_image_on_saucenao": "SauceNAO वर छायाचित्र शोधा",
"view_on_client": "{{client}} वर पहा",
"expand_all_settings": "सर्व सेटिंग्ज विस्तार",
"collapse_all_settings": "सर्व सेटिंग्ज संक्षेपित",
"refresh": "ताजेतर करा",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Ongeldige URL",
"no_link_provided": "Geen link opgegeven",
"image_search": "afbeeldingen zoeken",
"view_on": "bekijk op",
"copy_link": "link kopiëren",
"hide_post": "bericht verbergen",
"hide_thread": "thread verbergen",
@@ -131,7 +130,6 @@
"search_image_on_google": "zoek afbeelding op Google",
"search_image_on_yandex": "zoek afbeelding op Yandex",
"search_image_on_saucenao": "zoek afbeelding op SauceNAO",
"view_on_client": "Bekijk op {{client}}",
"expand_all_settings": "Alle instellingen uitvouwen",
"collapse_all_settings": "Alle instellingen samenvouwen",
"refresh": "Vernieuwen",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Ugyldig URL",
"no_link_provided": "Ingen lenke oppgitt",
"image_search": "bilde søk",
"view_on": "se på",
"copy_link": "kopier lenke",
"hide_post": "skjul innlegg",
"hide_thread": "skjul tråd",
@@ -131,7 +130,6 @@
"search_image_on_google": "søk etter bilde på Google",
"search_image_on_yandex": "søk etter bilde på Yandex",
"search_image_on_saucenao": "søk etter bilde på SauceNAO",
"view_on_client": "Vis på {{client}}",
"expand_all_settings": "Utvid alle innstillinger",
"collapse_all_settings": "Sammenlegge alle innstillinger",
"refresh": "Oppdater",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Nieprawidłowy adres URL",
"no_link_provided": "Nie podano linku",
"image_search": "wyszukiwanie obrazów",
"view_on": "zobacz na",
"copy_link": "skopiuj link",
"hide_post": "ukryj post",
"hide_thread": "ukryj wątek",
@@ -131,7 +130,6 @@
"search_image_on_google": "szukaj obrazu w Google",
"search_image_on_yandex": "szukaj obrazu w Yandex",
"search_image_on_saucenao": "szukaj obrazu w SauceNAO",
"view_on_client": "Zobacz na {{client}}",
"expand_all_settings": "Rozwiń wszystkie ustawienia",
"collapse_all_settings": "Zwiń wszystkie ustawienia",
"refresh": "Odśwież",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL inválida",
"no_link_provided": "Nenhum link fornecido",
"image_search": "pesquisa de imagens",
"view_on": "ver em",
"copy_link": "Copiar link",
"hide_post": "Ocultar postagem",
"hide_thread": "Ocultar tópico",
@@ -131,7 +130,6 @@
"search_image_on_google": "Pesquisar imagem no Google",
"search_image_on_yandex": "Pesquisar imagem no Yandex",
"search_image_on_saucenao": "Pesquisar imagem no SauceNAO",
"view_on_client": "Ver no {{client}}",
"expand_all_settings": "Expandir todas as configurações",
"collapse_all_settings": "Recolher todas as configurações",
"refresh": "Atualizar",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL invalid",
"no_link_provided": "Nu s-a furnizat niciun link",
"image_search": "căutare de imagini",
"view_on": "vezi pe",
"copy_link": "copiați linkul",
"hide_post": "ascundeți postarea",
"hide_thread": "ascundeți firul",
@@ -131,7 +130,6 @@
"search_image_on_google": "căutați imaginea pe Google",
"search_image_on_yandex": "căutați imaginea pe Yandex",
"search_image_on_saucenao": "căutați imaginea pe SauceNAO",
"view_on_client": "Vezi pe {{client}}",
"expand_all_settings": "Extindeți toate setările",
"collapse_all_settings": "Recoltați toate setările",
"refresh": "Reîmprospătați",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Недействительный URL",
"no_link_provided": "Ссылка не предоставлена",
"image_search": "поиск изображений",
"view_on": "просмотр на",
"copy_link": "копировать ссылку",
"hide_post": "скрыть пост",
"hide_thread": "скрыть ветку",
@@ -131,7 +130,6 @@
"search_image_on_google": "поиск изображения в Google",
"search_image_on_yandex": "поиск изображения в Yandex",
"search_image_on_saucenao": "поиск изображения на SauceNAO",
"view_on_client": "Посмотреть на {{client}}",
"expand_all_settings": "Развернуть все настройки",
"collapse_all_settings": "Свернуть все настройки",
"refresh": "Обновить",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL jo e vlefshëm",
"no_link_provided": "Nuk është dhënë asnjë lidhje",
"image_search": "kërkim imazhesh",
"view_on": "shiko në",
"copy_link": "kopjo linkun",
"hide_post": "fsheh postën",
"hide_thread": "fsheh fijen",
@@ -131,7 +130,6 @@
"search_image_on_google": "kërko imazhin në Google",
"search_image_on_yandex": "kërko imazhin në Yandex",
"search_image_on_saucenao": "kërko imazhin në SauceNAO",
"view_on_client": "Shiko në {{client}}",
"expand_all_settings": "Zgjeroni të gjitha cilësimet",
"collapse_all_settings": "Zvogëlo të gjitha cilësimet",
"refresh": "Rifresko",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Ogiltig URL",
"no_link_provided": "Ingen länk angiven",
"image_search": "bildsökning",
"view_on": "se på",
"copy_link": "kopiera länk",
"hide_post": "dölj inlägg",
"hide_thread": "dölj tråd",
@@ -131,7 +130,6 @@
"search_image_on_google": "sök bild på Google",
"search_image_on_yandex": "sök bild på Yandex",
"search_image_on_saucenao": "sök bild på SauceNAO",
"view_on_client": "Visa på {{client}}",
"expand_all_settings": "Expandera alla inställningar",
"collapse_all_settings": "Kollapsa alla inställningar",
"refresh": "Uppdatera",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "చెల్లని URL",
"no_link_provided": "లింక్ ఇవ్వబడలేదు",
"image_search": "చిత్రాల శోధన",
"view_on": "వీక్షించు",
"copy_link": "లింక్ ను కాపీ చేయండి",
"hide_post": "పోస్ట్ దాచు",
"hide_thread": "థ్రెడ్ దాచు",
@@ -131,7 +130,6 @@
"search_image_on_google": "గూగుల్‌లో చిత్రాన్ని వెతుకోండి",
"search_image_on_yandex": "యాండెక్స్‌లో చిత్రాన్ని వెతుకోండి",
"search_image_on_saucenao": "SauceNAOలో చిత్రాన్ని వెతుకోండి",
"view_on_client": "{{client}} లో చూడండి",
"expand_all_settings": "అన్ని సెట్టింగ్‌లను విస్తరించండి",
"collapse_all_settings": "అన్ని సెట్టింగ్‌లను సంక్షిప్తము చేయండి",
"refresh": "రీఫ్రెష్",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL ไม่ถูกต้อง",
"no_link_provided": "ไม่มีการให้ลิงก์",
"image_search": "ค้นหารูปภาพ",
"view_on": "ดูที่",
"copy_link": "คัดลอกลิงก์",
"hide_post": "ซ่อนโพสต์",
"hide_thread": "ซ่อนเธรด",
@@ -131,7 +130,6 @@
"search_image_on_google": "ค้นหารูปภาพใน Google",
"search_image_on_yandex": "ค้นหารูปภาพใน Yandex",
"search_image_on_saucenao": "ค้นหารูปภาพใน SauceNAO",
"view_on_client": "ดูบน {{client}}",
"expand_all_settings": "ขยายการตั้งค่าทั้งหมด",
"collapse_all_settings": "ยุบการตั้งค่าทั้งหมด",
"refresh": "รีเฟรช",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Geçersiz URL",
"no_link_provided": "Hiçbir bağlantı sağlanmadı",
"image_search": "resim arama",
"view_on": "üzerinde görüntüle",
"copy_link": "bağlantıyı kopyala",
"hide_post": "gönderiyi gizle",
"hide_thread": "konuyu gizle",
@@ -131,7 +130,6 @@
"search_image_on_google": "Google'da resim ara",
"search_image_on_yandex": "Yandex'da resim ara",
"search_image_on_saucenao": "SauceNAO'da resim ara",
"view_on_client": "{{client}}'de görüntüle",
"expand_all_settings": "Tüm Ayarları Genişlet",
"collapse_all_settings": "Tüm Ayarları Daralt",
"refresh": "Yenile",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "Недійсний URL",
"no_link_provided": "Не надано жодного посилання",
"image_search": "пошук зображень",
"view_on": "перегляд на",
"copy_link": "копіювати посилання",
"hide_post": "сховати допис",
"hide_thread": "сховати нитку",
@@ -131,7 +130,6 @@
"search_image_on_google": "пошук зображення в Google",
"search_image_on_yandex": "пошук зображення в Yandex",
"search_image_on_saucenao": "пошук зображення в SauceNAO",
"view_on_client": "Переглянути на {{client}}",
"expand_all_settings": "Розгорнути всі налаштування",
"collapse_all_settings": "Згорнути всі налаштування",
"refresh": "Оновити",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "غیر درست یو آر ایل",
"no_link_provided": "کوئی لنک فراہم نہیں کیا گیا",
"image_search": "تصویر کی تلاش",
"view_on": "پر دیکھیں",
"copy_link": "لنک کاپی کریں",
"hide_post": "پوسٹ چھپائیں",
"hide_thread": "دھاگہ چھپائیں",
@@ -131,7 +130,6 @@
"search_image_on_google": "گوگل پر تصویر کا مطالعہ کریں",
"search_image_on_yandex": "یانڈیکس پر تصویر کا مطالعہ کریں",
"search_image_on_saucenao": "SauceNAO پر تصویر کا مطالعہ کریں",
"view_on_client": "{{client}} پر دیکھیں",
"expand_all_settings": "تمام ترتیبات کو بڑھائیں",
"collapse_all_settings": "تمام ترتیبات کو مختصر کریں",
"refresh": "تازہ کاری",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "URL không hợp lệ",
"no_link_provided": "Không có liên kết được cung cấp",
"image_search": "tìm kiếm hình ảnh",
"view_on": "xem trên",
"copy_link": "sao chép liên kết",
"hide_post": "Ẩn bài viết",
"hide_thread": "Ẩn chủ đề",
@@ -131,7 +130,6 @@
"search_image_on_google": "Tìm kiếm hình ảnh trên Google",
"search_image_on_yandex": "Tìm kiếm hình ảnh trên Yandex",
"search_image_on_saucenao": "Tìm kiếm hình ảnh trên SauceNAO",
"view_on_client": "Xem trên {{client}}",
"expand_all_settings": "Mở rộng tất cả các thiết lập",
"collapse_all_settings": "Thu gọn tất cả các thiết lập",
"refresh": "Làm mới",
-2
View File
@@ -122,7 +122,6 @@
"invalid_url": "无效的网址",
"no_link_provided": "未提供链接",
"image_search": "图像搜索",
"view_on": "查看",
"copy_link": "复制链接",
"hide_post": "隐藏帖子",
"hide_thread": "隐藏主题",
@@ -131,7 +130,6 @@
"search_image_on_google": "在Google上搜索图像",
"search_image_on_yandex": "在Yandex上搜索图像",
"search_image_on_saucenao": "在SauceNAO上搜索图像",
"view_on_client": "在{{client}}上查看",
"expand_all_settings": "展开所有设置",
"collapse_all_settings": "折叠所有设置",
"refresh": "刷新",
+16 -4
View File
@@ -1,8 +1,13 @@
import {execSync} from 'child_process'
import path from 'path'
import {fileURLToPath} from 'url'
import {readFileSync} from 'fs'
const dirname = path.join(path.dirname(fileURLToPath(import.meta.url)))
const conventionalChangelog = path.join(dirname, '..', 'node_modules', '.bin', 'conventional-changelog')
const packageJsonPath = path.join(dirname, '..', 'package.json')
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'))
const version = packageJson.version
// sometimes release-count 1 is empty
let releaseChangelog =
@@ -12,10 +17,17 @@ let releaseChangelog =
// format
releaseChangelog = releaseChangelog.trim().replace(/\n\n+/g, '\n\n')
const releaseBody = `- Web app: https://plebchan.app
- Mobile app: available for Android. Download link under "Assets" ⬇️
- Desktop app (full P2P node, run your own community): available for Mac/Windows/Linux. Download links under "Assets" ⬇️
- Command Line Interface (full P2P node, run your own community): https://github.com/plebbit/plebbit-cli/releases/latest
const releaseBody = `This version fixes a bug where the android app would launch in fullscreen mode.
- Web app: https://plebchan.app
- Decentralized web app: https://plebchan.eth (only works on [Brave Browser](https://brave.com/) or via [IPFS Companion](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites))
## Downloads
- Android app: [Download APK](https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.apk)
- Linux app: [Download AppImage](https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.AppImage)
- macOS app: [Download DMG](https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.dmg)
- Windows app: [Download EXE](https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan.Setup.${version}.exe)
${releaseChangelog}`
@@ -0,0 +1,11 @@
.errorMessage {
color: red;
}
.clickableErrorMessage {
cursor: pointer;
}
.feedbackSuccessMessage {
color: inherit;
}
@@ -0,0 +1,64 @@
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { copyToClipboard } from '../../lib/utils/clipboard-utils';
import styles from './error-display.module.css';
const ErrorDisplay = ({ error }: { error: any }) => {
const { t } = useTranslation();
const [feedbackMessageKey, setFeedbackMessageKey] = useState<string | null>(null);
const originalDisplayMessage = error?.message ? `${t('error')}: ${error.message}` : null;
const handleMessageClick = async () => {
if (!error || !error.message || feedbackMessageKey) return;
const errorString = JSON.stringify(error, null, 2);
try {
await copyToClipboard(errorString);
setFeedbackMessageKey('copied');
setTimeout(() => {
setFeedbackMessageKey(null);
}, 1500);
} catch (err) {
console.error('Failed to copy error: ', err);
setFeedbackMessageKey('failed');
setTimeout(() => {
setFeedbackMessageKey(null);
}, 1500);
}
};
let currentDisplayMessage = '';
const classNames = [styles.errorMessage];
let isClickable = false;
if (feedbackMessageKey === 'copied') {
currentDisplayMessage = t('fullErrorCopiedToClipboard', 'full error copied to the clipboard');
classNames.pop();
classNames.push(styles.feedbackSuccessMessage);
} else if (feedbackMessageKey === 'failed') {
currentDisplayMessage = t('copyFailed', 'copy failed');
} else if (originalDisplayMessage) {
currentDisplayMessage = originalDisplayMessage;
isClickable = true;
classNames.push(styles.clickableErrorMessage);
}
return (
(error?.message || error?.stack || error?.details || error) && (
<div className={styles.error}>
{currentDisplayMessage && (
<span
className={classNames.join(' ')}
onClick={isClickable ? handleMessageClick : undefined}
title={isClickable ? t('clickToCopyFullError', 'Click to copy full error') : undefined}
>
{currentDisplayMessage}
</span>
)}
</div>
)
);
};
export default ErrorDisplay;
+1
View File
@@ -0,0 +1 @@
export { default } from './error-display';
+8 -5
View File
@@ -450,11 +450,14 @@ const PostDesktop = ({ post, roles, showAllReplies, showReplies = true }: PostPr
!isInPendingPostView &&
replies &&
showReplies &&
(showAllReplies || showOmittedReplies[cid] ? replies : replies.slice(-5)).map((reply, index) => (
<div key={index} className={styles.replyContainer}>
<Reply reply={reply} roles={roles} postReplyCount={replyCount} />
</div>
))}
(showAllReplies || showOmittedReplies[cid] ? replies : replies.slice(-5))
// Don't render deleted replies that have no children (replyCount = 0)
.filter((reply) => !(reply.deleted && (reply.replyCount === 0 || !reply.replyCount)))
.map((reply, index) => (
<div key={index} className={styles.replyContainer}>
<Reply reply={reply} roles={roles} postReplyCount={replyCount} />
</div>
))}
{isDescription && subplebbit?.rules && subplebbit?.rules.length > 0 && (
<div className={styles.replyContainer}>
<Reply reply={subplebbitRulesReply} />
@@ -68,48 +68,6 @@ const ImageSearchButton = ({ url, onClose }: { url: string; onClose: () => void
);
};
const ViewOnButton = ({ cid, isDescription, isRules, subplebbitAddress, onClose }: PostMenuDesktopProps) => {
const { t } = useTranslation();
const [isClientRedirectMenuOpen, setIsClientRedirectMenuOpen] = useState(false);
const getViewOnOtherClientLink = () => {
if (isDescription || isRules) {
return `${subplebbitAddress}`;
} else {
return `${subplebbitAddress}/c/${cid}`;
}
};
const viewOnOtherClientLink = getViewOnOtherClientLink();
const { refs, floatingStyles } = useFloating({
placement: 'right-start',
middleware: [flip(), shift({ padding: 10 })],
});
return (
<div
className={`${styles.postMenuItem} ${styles.dropdown}`}
onMouseOver={() => setIsClientRedirectMenuOpen(true)}
onMouseLeave={() => setIsClientRedirectMenuOpen(false)}
ref={refs.setReference}
onClick={onClose}
>
{_.capitalize(t('view_on'))} »
{isClientRedirectMenuOpen && (
<div ref={refs.setFloating} style={floatingStyles} className={styles.dropdownMenu}>
<a href={`https://seedit.eth.limo/#/p/${viewOnOtherClientLink}`} target='_blank' rel='noreferrer'>
<div className={styles.postMenuItem}>Seedit</div>
</a>
<a href={`https://plebones.eth.limo/#/p/${viewOnOtherClientLink}`} target='_blank' rel='noreferrer'>
<div className={styles.postMenuItem}>Plebones</div>
</a>
</div>
)}
</div>
);
};
const BlockUserButton = ({ address }: { address: string }) => {
const { t } = useTranslation();
const { blocked, unblock, block } = useBlock({ address });
@@ -197,7 +155,6 @@ const PostMenuDesktop = ({ post }: { post: Comment }) => {
</div>
)}
{link && isValidURL(link) && (type === 'image' || type === 'gif' || thumbnail) && url && <ImageSearchButton url={url} onClose={handleClose} />}
<ViewOnButton cid={cid} isDescription={isDescription} isRules={isRules} subplebbitAddress={subplebbitAddress} onClose={handleClose} />
{!isDescription && !isRules && <BlockUserButton address={author?.address} />}
{(isInAllView || isInSubscriptionsView) && <BlockBoardButton address={subplebbitAddress} />}
</div>
@@ -55,31 +55,6 @@ const ImageSearchButtons = ({ url, onClose }: { url: string; onClose: () => void
);
};
const ViewOnButtons = ({ cid, isDescription, isRules, subplebbitAddress, onClose }: PostMenuMobileProps) => {
const { t } = useTranslation();
const getViewOnOtherClientLink = () => {
if (isDescription || isRules) {
return `${subplebbitAddress}`;
} else {
return `${subplebbitAddress}/c/${cid}`;
}
};
const viewOnOtherClientLink = getViewOnOtherClientLink();
return (
<div onClick={onClose}>
<a href={`https://seedit.eth.limo/#/p/${viewOnOtherClientLink}`} target='_blank' rel='noreferrer'>
<div className={styles.postMenuItem}>{t('view_on_client', { client: 'Seedit' })}</div>
</a>
<a href={`https://plebones.eth.limo/#/p/${viewOnOtherClientLink}`} target='_blank' rel='noreferrer'>
<div className={styles.postMenuItem}>{t('view_on_client', { client: 'Plebones' })}</div>
</a>
</div>
);
};
const HidePostButton = ({ cid, isReply, onClose, postCid }: PostMenuMobileProps) => {
const { t } = useTranslation();
const { hide, hidden, unhide } = useHide({ cid });
@@ -167,7 +142,6 @@ const PostMenuMobile = ({ post }: { post: Comment }) => {
{cid && subplebbitAddress && !isDescription && !isRules && <BlockUserButton address={author?.address} />}
{cid && subplebbitAddress && !isInBoardView && !isDescription && !isRules && <BlockBoardButton address={subplebbitAddress} />}
{link && isValidURL(link) && (type === 'image' || type === 'gif' || thumbnail) && url && <ImageSearchButtons url={url} onClose={handleClose} />}
<ViewOnButtons cid={cid} isDescription={isDescription} isRules={isRules} subplebbitAddress={subplebbitAddress} onClose={handleClose} />
</div>
</FloatingFocusManager>,
document.body,
+8 -5
View File
@@ -359,11 +359,14 @@ const PostMobile = ({ post, roles, showAllReplies, showReplies = true }: PostPro
!isInPendingPostView &&
replies &&
showReplies &&
(showAllReplies ? replies : replies.slice(-5)).map((reply, index) => (
<div key={index} className={styles.replyContainer}>
<Reply postReplyCount={replyCount} reply={reply} roles={roles} />
</div>
))}
(showAllReplies ? replies : replies.slice(-5))
// Don't render deleted replies that have no children (replyCount = 0)
.filter((reply) => !(reply.deleted && (reply.replyCount === 0 || !reply.replyCount)))
.map((reply, index) => (
<div key={index} className={styles.replyContainer}>
<Reply postReplyCount={replyCount} reply={reply} roles={roles} />
</div>
))}
{showRules && (
<div className={styles.replyContainer}>
<Reply reply={subplebbitRulesReply} />
@@ -52,7 +52,7 @@ const CheckForUpdates = () => {
if (!updateAvailable) {
alert(
commitRef
? `${t('latest_development_version', { commit: commitRef.slice(0, 7), link: 'https://plebchan.eth.limo/#/', interpolation: { escapeValue: false } })}`
? `${t('latest_development_version', { commit: commitRef.slice(0, 7), link: 'https://plebchan.app/#/', interpolation: { escapeValue: false } })}`
: `${t('latest_stable_version', { version: packageJson.version })}`,
);
}
+1 -1
View File
@@ -116,7 +116,7 @@ const TopBarDesktop = () => {
</span>
] [
<span className={styles.temporaryButton}>
<a href='https://seedit.eth.limo/#/communities/vote' target='_blank' rel='noopener noreferrer'>
<a href='https://seedit.app/#/communities/vote' target='_blank' rel='noopener noreferrer'>
{t('vote')}
</a>
</span>
+30
View File
@@ -0,0 +1,30 @@
/**
* Universal clipboard utility that works in both Electron and web environments
*/
export const copyToClipboard = async (text: string): Promise<void> => {
// Check if we're in Electron and use its clipboard API
if (typeof window !== 'undefined' && (window as any).electronApi?.copyToClipboard) {
try {
const result = await (window as any).electronApi.copyToClipboard(text);
if (!result.success) {
throw new Error(result.error || 'Failed to copy to clipboard');
}
return;
} catch (error) {
console.error('Electron clipboard failed:', error);
// Fall back to web clipboard API
}
}
// Fallback to web clipboard API
if (navigator.clipboard) {
try {
await navigator.clipboard.writeText(text);
} catch (error) {
console.error('Web clipboard failed:', error);
throw new Error('Failed to copy to clipboard. Your browser may not support this feature.');
}
} else {
throw new Error('Your browser does not support clipboard API');
}
};
+5 -8
View File
@@ -1,3 +1,5 @@
import { copyToClipboard } from './clipboard-utils';
export const getHostname = (url: string) => {
try {
return new URL(url).hostname.replace(/^www\./, '');
@@ -15,12 +17,7 @@ export const isValidURL = (url: string) => {
}
};
export const copyShareLinkToClipboard = (subplebbitAddress: string, cid: string) => {
const shareLink = `https://pleb.bz/p/${subplebbitAddress}/c/${cid}?redirect=plebchan.eth.limo`;
if (navigator.clipboard) {
navigator.clipboard.writeText(shareLink);
} else {
alert('Your browser does not support clipboard API');
}
export const copyShareLinkToClipboard = async (subplebbitAddress: string, cid: string) => {
const shareLink = `https://pleb.bz/p/${subplebbitAddress}/c/${cid}?redirect=plebchan.app`;
await copyToClipboard(shareLink);
};
+16 -6
View File
@@ -13,6 +13,7 @@ import useTimeFilter from '../../hooks/use-time-filter';
import useInterfaceSettingsStore from '../../stores/use-interface-settings-store';
import useFeedResetStore from '../../stores/use-feed-reset-store';
import useSortingStore from '../../stores/use-sorting-store';
import ErrorDisplay from '../../components/error-display/error-display';
import LoadingEllipsis from '../../components/loading-ellipsis';
import SubplebbitDescription from '../../components/subplebbit-description';
import SubplebbitRules from '../../components/subplebbit-rules';
@@ -227,12 +228,6 @@ const Board = () => {
) : (
hasMore && <LoadingEllipsis string={loadingStateString} />
)}
{error && (
<div className='red'>
<br />
{error.message}
</div>
)}
{blocked && (
<>
&nbsp;&nbsp;[
@@ -274,6 +269,16 @@ const Board = () => {
document.title = boardTitle + ' - plebchan';
}, [title, shortAddress, subplebbitAddress]);
// probably not necessary to show the error to the user if the feed loaded successfully
const [shouldShowErrorToUser, setShouldShowErrorToUser] = useState(false);
useEffect(() => {
if (error?.message && feed.length === 0) {
setShouldShowErrorToUser(true);
} else if (feed.length > 0) {
setShouldShowErrorToUser(false);
}
}, [error, feed]);
return (
<>
{shouldShowSnow() && <hr />}
@@ -289,6 +294,11 @@ const Board = () => {
title={title}
/>
)}
{shouldShowErrorToUser && (
<div className={styles.error}>
<ErrorDisplay error={error} />
</div>
)}
{rules && !description && rules.length > 0 && <SubplebbitRules subplebbitAddress={subplebbitAddress} createdAt={createdAt} rules={rules} />}
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
+17 -2
View File
@@ -1,10 +1,11 @@
import { useEffect } from 'react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Comment, Role, useComment, useEditedComment, useSubplebbit } from '@plebbit/plebbit-react-hooks';
import useSubplebbitsStore from '@plebbit/plebbit-react-hooks/dist/stores/subplebbits';
import { useLocation, useParams } from 'react-router-dom';
import { isAllView, isDescriptionView, isRulesView } from '../../lib/utils/view-utils';
import useIsMobile from '../../hooks/use-is-mobile';
import ErrorDisplay from '../../components/error-display/error-display';
import PostDesktop from '../../components/post-desktop';
import PostMobile from '../../components/post-mobile';
import SubplebbitDescription from '../../components/subplebbit-description';
@@ -83,11 +84,25 @@ const PostPage = () => {
document.title = isInAllView ? `${t('all')} - plebchan` : postDucumentTitle;
}, [title, shortAddress, subplebbitAddress, post?.title, post?.content, isInAllView, t]);
// probably not necessary to show the error to the user if the post loaded successfully
const [shouldShowErrorToUser, setShouldShowErrorToUser] = useState(false);
useEffect(() => {
if (post?.error && ((post?.replyCount > 0 && post?.replies?.length === 0) || (post?.state === 'failed' && post?.error))) {
setShouldShowErrorToUser(true);
} else if (post?.replyCount > 0 && post?.replies?.length > 0) {
setShouldShowErrorToUser(false);
}
}, [post]);
return (
<div className={styles.content}>
{/* TODO: remove this replyCount error once api supports scrolling replies pages */}
{replyCount > 60 && <span className={styles.error}>Error: this thread has too many replies, some of them cannot be displayed right now.</span>}
{error && <span className={styles.error}>Error: {error?.message || error?.toString?.()}</span>}
{shouldShowErrorToUser && (
<div className={styles.error}>
<ErrorDisplay error={error} />
</div>
)}
{isInDescriptionView ? (
<SubplebbitDescription
avatarUrl={suggested?.avatarUrl}
+1 -1
View File
@@ -173,7 +173,7 @@ export default defineConfig({
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom', 'react-router-dom']
vendor: ['react', 'react-dom', 'react-router-dom', 'react-i18next', 'i18next', 'i18next-browser-languagedetector', 'i18next-http-backend']
}
}
}
+31 -102
View File
@@ -1139,6 +1139,16 @@
dependencies:
tslib "^2.1.0"
"@capacitor/status-bar@7.0.1":
version "7.0.1"
resolved "https://registry.yarnpkg.com/@capacitor/status-bar/-/status-bar-7.0.1.tgz#6bd3769ef35158c961ff2a6b571c03e9bce55809"
integrity sha512-iDv3mXYo9CdxYRVwt3/pRyuk25p7Sn4GfaS/zMZyVIqTzsvKLCIIH3GdKK+ta+nsNcAVpCw/t5jFEBt1D18ctA==
"@capawesome/capacitor-android-edge-to-edge-support@7.2.2":
version "7.2.2"
resolved "https://registry.yarnpkg.com/@capawesome/capacitor-android-edge-to-edge-support/-/capacitor-android-edge-to-edge-support-7.2.2.tgz#830720988b9db29a5bf18db907c4b8b1f8545f97"
integrity sha512-AAqCFswAVlA6WX0iaVbMCEnt/2mNBZGmU3JbbFlqWAg61NCMxm8+JlmiNoG+6wf/6S/BWVRL8Ac3L9csaZH/8w==
"@chainsafe/as-chacha20poly1305@^0.1.0":
version "0.1.0"
resolved "https://registry.yarnpkg.com/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz#7da6f8796f9b42dac6e830a086d964f1f9189e09"
@@ -2610,12 +2620,11 @@
dependencies:
buffer "^6.0.3"
"@keyv/sqlite@4.0.2":
version "4.0.2"
resolved "https://registry.yarnpkg.com/@keyv/sqlite/-/sqlite-4.0.2.tgz#c64bdcc6ff50280e0c56257a85c7c178fef581da"
integrity sha512-0tMWhvoe5gSkMYxnpkbnV6/f8ZAle1prm9drCyhKPQb3Pconk3zx+/3TX7adf6uY6ZF6xrGQE3o3ENcv/9QLUw==
"@keyv/sqlite@4.0.3":
version "4.0.3"
resolved "https://registry.yarnpkg.com/@keyv/sqlite/-/sqlite-4.0.3.tgz#269c7cd8fb150edb3374b2ef5930a794278f9b43"
integrity sha512-tdgelzrlng0cIiOZpxuDd/Ii/79h9On/0lcEyZ2s0Ml+9NXS6JnRrlb01+nfUWY53ioSDGvPKt4yL+s76uTWSg==
dependencies:
keyv "^5.3.2"
sqlite3 "^5.1.7"
"@leichtgewicht/ip-codec@^2.0.1":
@@ -3592,9 +3601,9 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@plebbit/plebbit-js@https://github.com/plebbit/plebbit-js.git#a2cb6ca6462b2e2e3b66f71204375a81ed05cf80":
"@plebbit/plebbit-js@https://github.com/plebbit/plebbit-js.git#692ec349f01aa6d8e939ff1d6d07315ab92e4099":
version "0.0.7"
resolved "https://github.com/plebbit/plebbit-js.git#a2cb6ca6462b2e2e3b66f71204375a81ed05cf80"
resolved "https://github.com/plebbit/plebbit-js.git#692ec349f01aa6d8e939ff1d6d07315ab92e4099"
dependencies:
"@bonfida/spl-name-service" "3.0.10"
"@chainsafe/libp2p-gossipsub" "14.1.0"
@@ -3602,7 +3611,7 @@
"@helia/delegated-routing-v1-http-api-client" "4.2.1"
"@helia/ipns" "8.0.2"
"@helia/unixfs" "4.0.2"
"@keyv/sqlite" "4.0.2"
"@keyv/sqlite" "4.0.3"
"@libp2p/fetch" "3.0.0"
"@libp2p/identify" "3.0.15"
"@libp2p/interfaces" "3.3.2"
@@ -3612,7 +3621,7 @@
"@plebbit/proper-lockfile" "github:plebbit/node-proper-lockfile#7fd6332117340c1d3d98dd0afee2d31cc06f72b8"
"@types/proper-lockfile" "4.1.2"
assert "2.1.0"
better-sqlite3 "11.9.1"
better-sqlite3 "11.10.0"
blockstore-core "5.0.2"
blockstore-fs "2.0.2"
blockstore-idb "2.0.1"
@@ -3630,8 +3639,7 @@
jose "4.11.0"
js-sha256 "0.11.0"
js-sha512 "0.9.0"
keyv "5.3.2"
knex "3.1.0"
keyv "5.3.3"
kubo-rpc-client "5.1.0"
libp2p-crypto "0.21.2"
limiter-es6-compat "2.1.2"
@@ -3671,11 +3679,11 @@
dependencies:
debug "4.3.4"
"@plebbit/plebbit-react-hooks@https://github.com/plebbit/plebbit-react-hooks.git#39cd7c09f1675949193498891fc448f68e42742b":
"@plebbit/plebbit-react-hooks@https://github.com/plebbit/plebbit-react-hooks.git#090e70bed5f799fc140a31a6f2123f9125954fde":
version "0.0.1"
resolved "https://github.com/plebbit/plebbit-react-hooks.git#39cd7c09f1675949193498891fc448f68e42742b"
resolved "https://github.com/plebbit/plebbit-react-hooks.git#090e70bed5f799fc140a31a6f2123f9125954fde"
dependencies:
"@plebbit/plebbit-js" "https://github.com/plebbit/plebbit-js.git#a2cb6ca6462b2e2e3b66f71204375a81ed05cf80"
"@plebbit/plebbit-js" "https://github.com/plebbit/plebbit-js.git#692ec349f01aa6d8e939ff1d6d07315ab92e4099"
"@plebbit/plebbit-logger" "https://github.com/plebbit/plebbit-logger.git"
assert "2.0.0"
ethers "5.6.9"
@@ -5550,10 +5558,10 @@ bech32@1.1.4:
resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
better-sqlite3@11.9.1:
version "11.9.1"
resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb"
integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ==
better-sqlite3@11.10.0:
version "11.10.0"
resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.10.0.tgz#2b1b14c5acd75a43fd84d12cc291ea98cef57d98"
integrity sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==
dependencies:
bindings "^1.5.0"
prebuild-install "^7.1.1"
@@ -6321,11 +6329,6 @@ color@^4.0.1:
color-convert "^2.0.1"
color-string "^1.9.0"
colorette@2.0.19:
version "2.0.19"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
colorette@^2.0.16:
version "2.0.20"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
@@ -6343,11 +6346,6 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee"
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
commander@^10.0.0:
version "10.0.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
commander@^12.0.0, commander@^12.1.0:
version "12.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
@@ -7999,11 +7997,6 @@ eslint@8.56.0:
strip-ansi "^6.0.1"
text-table "^0.2.0"
esm@^3.2.25:
version "3.2.25"
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
esniff@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
@@ -8634,11 +8627,6 @@ get-own-enumerable-property-symbols@^3.0.0:
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
get-package-type@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
get-port@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/get-port/-/get-port-7.1.0.tgz#d5a500ebfc7aa705294ec2b83cc38c5d0e364fec"
@@ -8681,11 +8669,6 @@ get-symbol-description@^1.1.0:
es-errors "^1.3.0"
get-intrinsic "^1.2.6"
getopts@2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4"
integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==
git-raw-commits@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285"
@@ -9462,11 +9445,6 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
interpret@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
ip-address@^9.0.5:
version "9.0.5"
resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a"
@@ -10606,10 +10584,10 @@ just-performance-es6-compat@4.3.2:
resolved "https://registry.yarnpkg.com/just-performance-es6-compat/-/just-performance-es6-compat-4.3.2.tgz#7877f34cbe25fd994bc2265d0c919bf728dcc42e"
integrity sha512-bNPuqRaV8PrqYVivdN8FsKi0rmXaQ0Y63oasFUQFJooJPH0r26LdfBAfoodhUQI6I6cek9yNo+tnGiF0R3pIHw==
keyv@5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.3.2.tgz#32edd461b51d44d42926eb72946236d79c71ae78"
integrity sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==
keyv@5.3.3:
version "5.3.3"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.3.3.tgz#ec2d723fbd7b908de5ee7f56b769d46dbbeaf8ba"
integrity sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==
dependencies:
"@keyv/serialize" "^1.0.3"
@@ -10620,13 +10598,6 @@ keyv@^4.0.0, keyv@^4.5.3:
dependencies:
json-buffer "3.0.1"
keyv@^5.3.2:
version "5.3.3"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.3.3.tgz#ec2d723fbd7b908de5ee7f56b769d46dbbeaf8ba"
integrity sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==
dependencies:
"@keyv/serialize" "^1.0.3"
kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
@@ -10642,26 +10613,6 @@ kleur@^4.0.3, kleur@^4.1.5:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780"
integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==
knex@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/knex/-/knex-3.1.0.tgz#b6ddd5b5ad26a6315234a5b09ec38dc4a370bd8c"
integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==
dependencies:
colorette "2.0.19"
commander "^10.0.0"
debug "4.3.4"
escalade "^3.1.1"
esm "^3.2.25"
get-package-type "^0.1.0"
getopts "2.3.0"
interpret "^2.2.0"
lodash "^4.17.21"
pg-connection-string "2.6.2"
rechoir "^0.8.0"
resolve-from "^5.0.0"
tarn "^3.0.2"
tildify "2.0.0"
kubo-rpc-client@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/kubo-rpc-client/-/kubo-rpc-client-5.1.0.tgz#06f9216b2b8a62487a150261b16fd941a75adb34"
@@ -12683,11 +12634,6 @@ pend@~1.2.0:
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
pg-connection-string@2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475"
integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
@@ -13236,13 +13182,6 @@ readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.8:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
rechoir@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
dependencies:
resolve "^1.20.0"
redent@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
@@ -13415,7 +13354,7 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4:
resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.4:
version "1.22.10"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
@@ -14491,11 +14430,6 @@ tar@^6.0.2, tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2, tar@^6.2.1:
mkdirp "^1.0.3"
yallist "^4.0.0"
tarn@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693"
integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==
tcp-port-used@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea"
@@ -14581,11 +14515,6 @@ thunky@^1.0.2:
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
tildify@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
time-span@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/time-span/-/time-span-5.1.0.tgz#80c76cf5a0ca28e0842d3f10a4e99034ce94b90d"