feat: opensats

This commit is contained in:
codytseng
2025-05-17 13:45:53 +08:00
parent d08e87ec10
commit 8d23c49908
19 changed files with 86 additions and 15 deletions

View File

@@ -42,7 +42,9 @@ npm install
# Run the app
npm run dev
```
## Run Docker
```bash
# Clone this repository
git clone https://github.com/CodyTseng/jumble.git
@@ -53,8 +55,15 @@ cd jumble
# Run the docker compose
docker compose up --build -d
```
After finishing, access: http://localhost:8089
## Sponsors
<a target="_blank" href="https://opensats.org/">
<img alt="open-sats-logo" src="./resources/open-sats-logo.svg" height="44">
</a>
## Donate
If you like this project, you can buy me a coffee :)

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,27 @@
import { useTranslation } from 'react-i18next'
import Image from '../Image'
import OpenSatsLogo from './open-sats-logo.svg'
export default function PlatinumSponsors() {
const { t } = useTranslation()
return (
<div className="space-y-2">
<div className="font-semibold text-center">{t('Platinum Sponsors')}</div>
<div className="flex flex-col gap-2 items-center">
<div
className="flex items-center gap-4 cursor-pointer"
onClick={() => window.open('https://opensats.org/', '_blank')}
>
<Image
image={{
url: OpenSatsLogo
}}
className="h-11"
/>
<div className="text-2xl font-semibold">OpenSats</div>
</div>
</div>
</div>
)
}

View File

@@ -1,9 +1,9 @@
import { formatAmount } from '@/lib/lightning'
import lightning, { TRecentSupporter } from '@/services/lightning.service'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import UserAvatar from '../UserAvatar'
import Username from '../Username'
import { useTranslation } from 'react-i18next'
export default function RecentSupporters() {
const { t } = useTranslation()
@@ -32,7 +32,9 @@ export default function RecentSupporters() {
<UserAvatar userId={item.pubkey} />
<div className="flex-1 w-0">
<Username className="font-semibold w-fit" userId={item.pubkey} />
<div className="text-xs text-muted-foreground line-clamp-3">{item.comment}</div>
<div className="text-xs text-muted-foreground line-clamp-3 select-text">
{item.comment}
</div>
</div>
</div>
<div className="font-semibold text-yellow-400 shrink-0">

View File

@@ -5,6 +5,7 @@ import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import ZapDialog from '../ZapDialog'
import RecentSupporters from './RecentSupporters'
import PlatinumSponsors from './PlatinumSponsors'
export default function Donation({ className }: { className?: string }) {
const { t } = useTranslation()
@@ -39,6 +40,7 @@ export default function Donation({ className }: { className?: string }) {
)
})}
</div>
<PlatinumSponsors />
<RecentSupporters />
<ZapDialog
open={open}

View File

@@ -0,0 +1 @@
<svg viewBox="344.564 330.278 111.737 91.218" width="53.87" height="43.61" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><radialGradient xlink:href="#logo_svg__a" id="logo_svg__b" cx="31.833" cy="29.662" fx="31.833" fy="29.662" r="42.553" gradientTransform="matrix(2 0 0 1.99696 -74.45 12.982)" gradientUnits="userSpaceOnUse"></radialGradient><radialGradient xlink:href="#logo_svg__a" id="logo_svg__c" cx="31.833" cy="29.662" fx="31.833" fy="29.662" r="42.553" gradientTransform="matrix(2 0 0 1.99696 -74.45 12.982)" gradientUnits="userSpaceOnUse"></radialGradient><linearGradient id="logo_svg__a"><stop style="stop-color:#ffb200;stop-opacity:1" offset="0"></stop><stop style="stop-color:#ff6b01;stop-opacity:1" offset="0.493"></stop></linearGradient></defs><path style="font-variation-settings:'wght' 700;opacity:1;fill:url(#logo_svg__b);fill-opacity:1;stroke-width:10.5833;stroke-linecap:round;stroke-linejoin:round" d="M32.574 39.319v3.81h16.11v-3.81z" transform="translate(324.22 304.883) scale(2.39915)"></path><path style="font-variation-settings:'wght' 700;fill:url(#logo_svg__c);fill-opacity:1;stroke-width:10.5833;stroke-linecap:round;stroke-linejoin:round" d="M14.85 16.062v4.551l8.944 5.681v.137l-8.945 5.68v4.551l13.029-8.555v-3.49Z" transform="translate(324.22 304.883) scale(2.39915)"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -229,6 +229,7 @@ export default {
'Paste or drop media files to upload': 'الصق أو اسحب ملفات الوسائط لتحميلها',
Preview: 'معاينة',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'أنت على وشك نشر حدث موقع من قبل [{{eventAuthorName}}]. أنت حالياً مسجل الدخول كـ [{{currentUsername}}]. هل أنت متأكد؟'
'أنت على وشك نشر حدث موقع من قبل [{{eventAuthorName}}]. أنت حالياً مسجل الدخول كـ [{{currentUsername}}]. هل أنت متأكد؟',
'Platinum Sponsors': 'الرعاة البلاتينيون'
}
}

View File

@@ -235,6 +235,7 @@ export default {
'Füge Medien-Dateien ein oder ziehe sie hierher, um sie hochzuladen',
Preview: 'Vorschau',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Du bist dabei, ein Ereignis zu veröffentlichen, das von [{{eventAuthorName}}] signiert wurde. Du bist derzeit als [{{currentUsername}}] angemeldet. Bist du sicher?'
'Du bist dabei, ein Ereignis zu veröffentlichen, das von [{{eventAuthorName}}] signiert wurde. Du bist derzeit als [{{currentUsername}}] angemeldet. Bist du sicher?',
'Platinum Sponsors': 'Platin-Sponsoren'
}
}

View File

@@ -229,6 +229,7 @@ export default {
'Paste or drop media files to upload': 'Paste or drop media files to upload',
Preview: 'Preview',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?'
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?',
'Platinum Sponsors': 'Platinum Sponsors'
}
}

View File

@@ -234,6 +234,7 @@ export default {
'Paste or drop media files to upload': 'Pegar o soltar archivos multimedia para cargar',
Preview: 'Vista previa',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Estás a punto de publicar un evento firmado por [{{eventAuthorName}}]. Actualmente has iniciado sesión como [{{currentUsername}}]. ¿Estás seguro?'
'Estás a punto de publicar un evento firmado por [{{eventAuthorName}}]. Actualmente has iniciado sesión como [{{currentUsername}}]. ¿Estás seguro?',
'Platinum Sponsors': 'Patrocinadores Platino'
}
}

View File

@@ -234,6 +234,7 @@ export default {
'Coller ou déposer des fichiers multimédias à télécharger',
Preview: 'Aperçu',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Vous êtes sur le point de publier un événement signé par [{{eventAuthorName}}]. Vous êtes actuellement connecté en tant que [{{currentUsername}}]. Êtes-vous sûr ?'
'Vous êtes sur le point de publier un événement signé par [{{eventAuthorName}}]. Vous êtes actuellement connecté en tant que [{{currentUsername}}]. Êtes-vous sûr ?',
'Platinum Sponsors': 'Sponsors Platine'
}
}

View File

@@ -233,6 +233,7 @@ export default {
'Paste or drop media files to upload': 'Incolla o trascina i file multimediali per caricarli',
Preview: 'Anteprima',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Stai per pubblicare un evento firmato da [{{eventAuthorName}}]. Attualmente sei connesso come [{{currentUsername}}]. Sei sicuro?'
'Stai per pubblicare un evento firmato da [{{eventAuthorName}}]. Attualmente sei connesso come [{{currentUsername}}]. Sei sicuro?',
'Platinum Sponsors': 'Sponsor Platino'
}
}

View File

@@ -230,6 +230,7 @@ export default {
'Paste or drop media files to upload': 'メディアファイルを貼り付けるかドロップしてアップロード',
Preview: 'プレビュー',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'あなたは[{{eventAuthorName}}]によって署名されたイベントを公開しようとしています。現在[{{currentUsername}}]としてログインしています。よろしいですか?'
'あなたは[{{eventAuthorName}}]によって署名されたイベントを公開しようとしています。現在[{{currentUsername}}]としてログインしています。よろしいですか?',
'Platinum Sponsors': 'プラチナスポンサー'
}
}

View File

@@ -232,6 +232,7 @@ export default {
'Paste or drop media files to upload': 'Wklej lub upuść pliki multimedialne, aby przesłać',
Preview: 'Podgląd',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Zaraz opublikujesz zdarzenie podpisane przez [{{eventAuthorName}}]. Obecnie jesteś zalogowany jako [{{currentUsername}}]. Czy jesteś pewien?'
'Zaraz opublikujesz zdarzenie podpisane przez [{{eventAuthorName}}]. Obecnie jesteś zalogowany jako [{{currentUsername}}]. Czy jesteś pewien?',
'Platinum Sponsors': 'Sponsorzy Platynowi'
}
}

View File

@@ -232,6 +232,7 @@ export default {
'Paste or drop media files to upload': 'Cole ou arraste arquivos de mídia para fazer upload',
Preview: 'Pré-visualização',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Você está prestes a publicar um evento assinado por [{{eventAuthorName}}]. Você está atualmente logado como [{{currentUsername}}]. Tem certeza?'
'Você está prestes a publicar um evento assinado por [{{eventAuthorName}}]. Você está atualmente logado como [{{currentUsername}}]. Tem certeza?',
'Platinum Sponsors': 'Patrocinadores Platinum'
}
}

View File

@@ -233,6 +233,7 @@ export default {
'Paste or drop media files to upload': 'Cole ou solte arquivos de mídia para fazer upload',
Preview: 'Pré-visualização',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Você está prestes a publicar um evento assinado por [{{eventAuthorName}}]. Você está atualmente logado como [{{currentUsername}}]. Tem certeza?'
'Você está prestes a publicar um evento assinado por [{{eventAuthorName}}]. Você está atualmente logado como [{{currentUsername}}]. Tem certeza?',
'Platinum Sponsors': 'Patrocinadores Platinum'
}
}

View File

@@ -233,6 +233,7 @@ export default {
'Paste or drop media files to upload': 'Вставьте или перетащите медиафайлы для загрузки',
Preview: 'Предварительный просмотр',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'Вы собираетесь опубликовать событие, подписанное [{{eventAuthorName}}]. Вы в данный момент вошли как [{{currentUsername}}]. Вы уверены?'
'Вы собираетесь опубликовать событие, подписанное [{{eventAuthorName}}]. Вы в данный момент вошли как [{{currentUsername}}]. Вы уверены?',
'Platinum Sponsors': 'Платиновые спонсоры'
}
}

View File

@@ -230,6 +230,7 @@ export default {
'Paste or drop media files to upload': '支持粘贴或拖放媒体文件进行上传',
Preview: '预览',
'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?':
'您即将发布一条由 [{{eventAuthorName}}] 签名的事件。您当前以 [{{currentUsername}}] 登录。确定吗?'
'您即将发布一条由 [{{eventAuthorName}}] 签名的事件。您当前以 [{{currentUsername}}] 登录。确定吗?',
'Platinum Sponsors': '白金赞助商'
}
}

View File

@@ -180,7 +180,9 @@ class LightningService {
if (!item.comment && comment) item.comment = comment
}
})
this.recentSupportersCache = Array.from(map.values()).sort((a, b) => b.amount - a.amount)
this.recentSupportersCache = Array.from(map.values())
.filter((item) => item.amount >= 1000)
.sort((a, b) => b.amount - a.amount)
return this.recentSupportersCache
}