Compare commits

..
5 Commits
Author SHA1 Message Date
reya 7449000f5f chore: bump version 2024-05-23 08:01:04 +07:00
reya dc7762ca11 fix: column lose state when navigate back 2024-05-23 08:00:33 +07:00
XIAO YUandGitHub 3a3f960dde refactor: use borrowed references for adding and connecting relays (#191) 2024-05-23 07:08:39 +07:00
reya 12e066ff2e fix: web 2024-05-22 15:36:41 +07:00
reya fe4f965ed5 chore: update website 2024-05-22 15:35:41 +07:00
21 changed files with 10220 additions and 7792 deletions
+6 -6
View File
@@ -23,11 +23,7 @@ export const Route = createFileRoute("/create-group")({
}); });
function Screen() { function Screen() {
const contacts = Route.useLoaderData();
const navigate = Route.useNavigate();
const { ark } = Route.useRouteContext(); const { ark } = Route.useRouteContext();
const { label, redirect } = Route.useSearch();
const [title, setTitle] = useState(""); const [title, setTitle] = useState("");
const [npub, setNpub] = useState(""); const [npub, setNpub] = useState("");
@@ -36,6 +32,10 @@ function Screen() {
]); ]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const contacts = Route.useLoaderData();
const search = Route.useSearch();
const navigate = Route.useNavigate();
const toggleUser = (pubkey: string) => { const toggleUser = (pubkey: string) => {
setUsers((prev) => setUsers((prev) =>
prev.includes(pubkey) prev.includes(pubkey)
@@ -56,11 +56,11 @@ function Screen() {
try { try {
setIsLoading(true); setIsLoading(true);
const key = `lume_group_${label}`; const key = `lume_group_${search.label}`;
const createGroup = await ark.set_nstore(key, JSON.stringify(users)); const createGroup = await ark.set_nstore(key, JSON.stringify(users));
if (createGroup) { if (createGroup) {
return navigate({ to: redirect }); return navigate({ to: search.redirect, search: { ...search } });
} }
} catch (e) { } catch (e) {
setIsLoading(false); setIsLoading(false);
+3 -3
View File
@@ -18,12 +18,12 @@ export const Route = createFileRoute("/create-topic")({
}); });
function Screen() { function Screen() {
const { label, redirect } = Route.useSearch();
const { ark } = Route.useRouteContext(); const { ark } = Route.useRouteContext();
const [topics, setTopics] = useState<Topic[]>([]); const [topics, setTopics] = useState<Topic[]>([]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const search = Route.useSearch();
const navigate = Route.useNavigate(); const navigate = Route.useNavigate();
const toggleTopic = (topic: Topic) => { const toggleTopic = (topic: Topic) => {
@@ -38,11 +38,11 @@ function Screen() {
try { try {
setIsLoading(true); setIsLoading(true);
const key = `lume_topic_${label}`; const key = `lume_topic_${search.label}`;
const createTopic = await ark.set_nstore(key, JSON.stringify(topics)); const createTopic = await ark.set_nstore(key, JSON.stringify(topics));
if (createTopic) { if (createTopic) {
return navigate({ to: redirect }); return navigate({ to: search.redirect, search: { ...search } });
} }
} catch (e) { } catch (e) {
setIsLoading(false); setIsLoading(false);
+1 -1
View File
@@ -12,7 +12,7 @@
"dependencies": { "dependencies": {
"@astrojs/check": "^0.5.10", "@astrojs/check": "^0.5.10",
"@astrojs/tailwind": "^5.1.0", "@astrojs/tailwind": "^5.1.0",
"@fontsource/geist-mono": "^5.0.3", "@fontsource/alice": "^5.0.13",
"astro": "^4.8.3", "astro": "^4.8.3",
"astro-seo-meta": "^4.1.1", "astro-seo-meta": "^4.1.1",
"astro-seo-schema": "^4.0.2", "astro-seo-schema": "^4.0.2",
Binary file not shown.

After

Width:  |  Height:  |  Size: 889 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

-37
View File
@@ -1,37 +0,0 @@
<svg width="824" height="824" viewBox="0 0 824 824" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_564_71)">
<rect width="824" height="824" rx="184" fill="white" style="fill:white;fill-opacity:1;"/>
<circle cx="267" cy="594" r="42" fill="black" style="fill:black;fill-opacity:1;"/>
<circle cx="267" cy="594" r="42" fill="url(#paint0_radial_564_71)" fill-opacity="0.5" style=""/>
<circle cx="267" cy="594" r="42" fill="url(#paint1_radial_564_71)" fill-opacity="0.3" style=""/>
<circle cx="557" cy="594" r="42" fill="black" style="fill:black;fill-opacity:1;"/>
<circle cx="557" cy="594" r="42" fill="url(#paint2_radial_564_71)" fill-opacity="0.5" style=""/>
<circle cx="557" cy="594" r="42" fill="url(#paint3_radial_564_71)" fill-opacity="0.3" style=""/>
<path d="M412 691C382.859 691 353.717 686.063 337.654 682.804C333.024 681.865 329.866 686.676 333.074 690.144C345.098 703.138 370.814 724 412 724C453.186 724 478.902 703.138 490.926 690.144C494.134 686.676 490.976 681.865 486.346 682.804C470.283 686.063 441.141 691 412 691Z" fill="url(#paint4_linear_564_71)" style=""/>
</g>
<defs>
<radialGradient id="paint0_radial_564_71" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(241.807 578.038) rotate(112.103) scale(88.2816 69.6512)">
<stop stop-color="white" style="stop-color:white;stop-opacity:1;"/>
<stop offset="1" stop-opacity="0" style="stop-color:none;stop-opacity:0;"/>
</radialGradient>
<radialGradient id="paint1_radial_564_71" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(288.309 621.165) rotate(126.504) scale(25.5816 15.4047)">
<stop stop-color="white" style="stop-color:white;stop-opacity:1;"/>
<stop offset="1" stop-opacity="0" style="stop-color:none;stop-opacity:0;"/>
</radialGradient>
<radialGradient id="paint2_radial_564_71" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(531.807 578.038) rotate(112.103) scale(88.2816 69.6512)">
<stop stop-color="white" style="stop-color:white;stop-opacity:1;"/>
<stop offset="1" stop-opacity="0" style="stop-color:none;stop-opacity:0;"/>
</radialGradient>
<radialGradient id="paint3_radial_564_71" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(578.309 621.165) rotate(126.504) scale(25.5816 15.4047)">
<stop stop-color="white" style="stop-color:white;stop-opacity:1;"/>
<stop offset="1" stop-opacity="0" style="stop-color:none;stop-opacity:0;"/>
</radialGradient>
<linearGradient id="paint4_linear_564_71" x1="293.565" y1="686.595" x2="316.497" y2="774.784" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF9F5A" style="stop-color:#FF9F5A;stop-color:color(display-p3 1.0000 0.6235 0.3529);stop-opacity:1;"/>
<stop offset="1" stop-color="#FF9F5A" style="stop-color:#FF9F5A;stop-color:color(display-p3 1.0000 0.6235 0.3529);stop-opacity:1;"/>
</linearGradient>
<clipPath id="clip0_564_71">
<rect width="824" height="824" fill="white" style="fill:white;fill-opacity:1;"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 318 KiB

+92 -149
View File
@@ -3,153 +3,96 @@ import { Seo } from "astro-seo-meta";
--- ---
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} /> <meta name="generator" content={Astro.generator} />
<title>Lume</title> <title>Lume: The nostr client for desktop</title>
<Seo <Seo
title="Lume" title="Lume"
description="A multiple columns Nostr client for desktop." description="A friendly and scalable Nostr desktop client."
keywords={[ keywords={[
"nostr", "nostr",
"nostr client", "nostr client",
"social network", "social network",
"desktop app", "desktop app",
"timeline", "timeline",
"application", "application",
"columns", "columns",
]} "tweetdeck",
themeColor="#fafafa" ]}
colorScheme="light" themeColor="#fafafa"
facebook={{ colorScheme="light"
image: "/og-image.jpg", facebook={{
url: "https://lume.nu", image: "/og-image.jpg",
type: "website", url: "https://lume.nu",
}} type: "website",
twitter={{ }}
image: "/og-image.jpg", twitter={{
card: "summary", image: "/og-image.jpg",
}} card: "summary",
/> }}
</head> />
<body </head>
class="w-full h-full antialiased font-mono bg-neutral-50 dark:bg-neutral-950 text-neutral-950 dark:text-neutral-50" <body
> class="w-full h-full antialiased bg-neutral-50 dark:bg-neutral-950 text-neutral-950 dark:text-neutral-50"
<div class="max-w-2xl mx-auto w-full py-16 md:px-0 px-2"> >
<div class="flex flex-col gap-16"> <div class="py-10 flex flex-col gap-10">
<div class="prose dark:prose-invert prose-neutral max-w-none"> <div class="mx-auto max-w-xl w-full flex flex-col gap-2">
<h3>About Lume</h3> <div class="mb-5">
<p> <img
Lume is a <b>Nostr client</b> for desktop include Linux, Windows and src="/icon.png"
macOS. It is free and open source, you can look at source code <a alt="App Icon"
href="https://github.com/lumehq/lume" class="size-14 shadow-md shadow-neutral-500/50 rounded-xl object-cover transform-gpu -rotate-6 hover:animate-spin"
target="_blank">on Github</a />
>. Lume is actively improving the app and adding new features, you </div>
can expect new update every month. <h1 class="text-xl font-serif font-semibold">
</p> A friendly and scalable Nostr desktop client.
<a href="#download">Download</a> </h1>
<h3>What is nostr & how does it work?</h3> <p class="text-sm font-medium text-neutral-700">
<p> Lume is a <b>Nostr client</b> for desktop, including Linux, Windows, and
Nostr stands for Notes and Other Stuff Transmitted by Relays. It is macOS. It is free and open-source; you can look at the source code on <a
an open, permission-less protocol that aims to provide href="https://github.com/lumehq/lume">GitHub</a
censorship-resistance and interoperability. It can be used to create >. Lume is actively improving the app and adding new features; you can
social networks or just about any other type of app (other stuff expect a new update every month.
part of the acronym). It is not a single website or app, but the </p>
glue that holds together many apps (clients) and <b>Lume</b> is one of <p class="text-sm font-medium text-neutral-700">
it. <b>Latest version</b>: 4.0.4
</p> </p>
<p> <div
At its core, nostr consists of relays and events. A person does class="w-full h-[120px] sm:h-[80px] flex flex-col sm:flex-row sm:items-center sm:justify-start justify-center gap-2"
something (event) and this event is sent to a relay. The relay >
stores the event, then waits for another person to request it. The <a
most common types of events are notes and reactions - the stuff href="https://github.com/lumehq/lume/releases/latest"
social media is made of, but there are many other types of events. class="inline-flex items-center justify-center w-44 h-11 rounded-full bg-black hover:ring-2 ring-blue-500 ring-offset-2 text-white font-medium text-sm"
It works very similar to how any other app would work with a >Download for macOS</a
database, except in nostr there is no single database, rather a >
large number of relays that store the events. <span class="italic text-xs text-neutral-700"
</p> >(Windows & Linux are coming later)</span
<h3>Lume is multiple columns experience</h3> >
<p> </div>
Lume is display your timeline as multiple column, each column is <div class="text-sm italic text-neutral-600">
each different content and you can define your experience * If you still need to use Lume on Windows and Linux, you can try v3 <a
</p> href="https://github.com/lumehq/lume/releases/tag/v3.0.2"
<p> class="text-blue-500">here</a
You can create a column to display newsfeed from specific people, >
you can create a column to display all contents related to some </div>
hashtags. It all up to you. </div>
</p> <div class="sm:max-w-3xl w-full mx-auto px-3 sm:px-0">
<img <video
src="https://image.nostr.build/fd3e3cdeb4fb9f0f3de5c5e668a11dcae55f50cc9a78fc2b57b063240191a0f9.png" class="aspect-video w-full h-auto rounded-xl"
alt="columns" autoplay
loading="lazy" muted
decoding="async" controls
class="w-full h-auto rounded-lg" >
/> <source
<h3>"For You"</h3> src="https://video.nostr.build/4cc4df88caeb861b62e3f73bddbb5e0b5cf63617472a97d22f427e273ee0e127.mp4"
<p> type="video/mp4"
Unlike some social networks, they feed you by algorithm. In Lume, />
you totally control what to will see Your browser does not support the video tag.
</p> </video>
<img </div>
src="https://image.nostr.build/5afd79de15929a4ac6f6e933791c942555baa4206fecee54fed61dde9fe167e1.png" </div>
alt="for you" </body>
loading="lazy"
decoding="async"
class="w-full h-auto rounded-lg"
/>
<h3 id="download">Download and Explore</h3>
<p>
(Universal) macOS: <a
href="https://github.com/lumehq/lume/releases/download/v3.0.0/Lume_3.0.0_universal.dmg"
>Lume_3.0.0_universal.dmg
</a>
</p>
<p>
(x86-64) Windows 11: <a
href="https://github.com/lumehq/lume/releases/download/v3.0.0/Lume_3.0.0_x64-setup.exe"
>Lume_3.0.0_x64-setup.exe
</a>
</p>
<p>
(x86-64) Ubuntu: <a
href="https://github.com/lumehq/lume/releases/download/v3.0.0/lume_3.0.0_amd64.deb"
>lume_3.0.0_amd64.deb
</a>
</p>
<p>
(x86-64) Fedora: <a
href="https://github.com/lumehq/lume/releases/download/v3.0.0/lume-3.0.0-1.x86_64.rpm"
>lume-3.0.0-1.x86_64.rpm
</a>
</p>
<p>
(x86-64) Linux Flatpak: <a
href="https://github.com/lumehq/lume/releases/download/v3.0.0/lume_3.0.0_amd64.flatpak"
>lume_3.0.0_amd64.flatpak
</a>
</p>
<p>
(x86-64) Linux AppImage: <a
href="https://github.com/lumehq/lume/releases/download/v3.0.0/lume_3.0.0_amd64.AppImage"
>lume_3.0.0_amd64.AppImage
</a>
</p>
<p>
Support for ARM, RISC-V and Loongarch architecture are coming soon.
</p>
</div>
<div class="text-center">
<p class="text-sm text-neutral-500 dark:text-neutral-600">
Supported by <a
href="https://opensats.org"
target="_blank"
class="text-orange-500">Open Sats</a
> and Community
</p>
</div>
</div>
</div>
</body>
</html> </html>
+1 -1
View File
@@ -7,7 +7,7 @@ export default {
theme: { theme: {
extend: { extend: {
fontFamily: { fontFamily: {
mono: ["Geist Mono", ...defaultTheme.fontFamily.mono], serif: ["Alice", ...defaultTheme.fontFamily.serif],
}, },
}, },
}, },
+6 -5
View File
@@ -214,9 +214,9 @@ importers:
'@astrojs/tailwind': '@astrojs/tailwind':
specifier: ^5.1.0 specifier: ^5.1.0
version: 5.1.0(astro@4.8.3)(tailwindcss@3.4.3) version: 5.1.0(astro@4.8.3)(tailwindcss@3.4.3)
'@fontsource/geist-mono': '@fontsource/alice':
specifier: ^5.0.3 specifier: ^5.0.13
version: 5.0.3 version: 5.0.13
astro: astro:
specifier: ^4.8.3 specifier: ^4.8.3
version: 4.8.3(typescript@5.4.5) version: 4.8.3(typescript@5.4.5)
@@ -1465,8 +1465,8 @@ packages:
resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==}
dev: false dev: false
/@fontsource/geist-mono@5.0.3: /@fontsource/alice@5.0.13:
resolution: {integrity: sha512-ekY5FNiK7aMxan/c6lgVQa/rIwQ/AMEJZJWY7768jBrLVdkrCxfEfCe1ePpe7C3JnySy7c9R6HC4Xh4ksfjTaw==} resolution: {integrity: sha512-7ncjjSpRSRKvjJEoru092iFiEoC89lz4oG4+SGg9hh7DI/5SXf+kE+dg+6Fv/bwiK/WJCo4Q2gvPZGRlCE5mcA==}
dev: false dev: false
/@getalby/sdk@3.5.1(typescript@5.4.5): /@getalby/sdk@3.5.1(typescript@5.4.5):
@@ -6251,6 +6251,7 @@ packages:
/tslib@2.6.2: /tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
requiresBuild: true
dev: false dev: false
/turbo-darwin-64@1.13.3: /turbo-darwin-64@1.13.3:
+80 -80
View File
@@ -1,82 +1,82 @@
{ {
"$schema": "../gen/schemas/desktop-schema.json", "$schema": "../gen/schemas/desktop-schema.json",
"identifier": "desktop-capability", "identifier": "desktop-capability",
"description": "Capability for the desktop", "description": "Capability for the desktop",
"platforms": ["linux", "macOS", "windows"], "platforms": ["linux", "macOS", "windows"],
"windows": [ "windows": [
"main", "main",
"splash", "splash",
"settings", "settings",
"search", "search",
"nwc", "nwc",
"activity", "activity",
"zap-*", "zap-*",
"event-*", "event-*",
"user-*", "user-*",
"editor-*", "editor-*",
"column-*" "column-*"
], ],
"permissions": [ "permissions": [
"path:default", "path:default",
"event:default", "event:default",
"window:default", "window:default",
"app:default", "app:default",
"resources:default", "resources:default",
"menu:default", "menu:default",
"tray:default", "tray:default",
"notification:allow-is-permission-granted", "notification:allow-is-permission-granted",
"notification:allow-request-permission", "notification:allow-request-permission",
"notification:default", "notification:default",
"os:allow-locale", "os:allow-locale",
"os:allow-platform", "os:allow-platform",
"updater:default", "updater:default",
"updater:allow-check", "updater:allow-check",
"updater:allow-download-and-install", "updater:allow-download-and-install",
"window:allow-start-dragging", "window:allow-start-dragging",
"window:allow-create", "window:allow-create",
"window:allow-close", "window:allow-close",
"window:allow-set-focus", "window:allow-set-focus",
"window:allow-center", "window:allow-center",
"window:allow-minimize", "window:allow-minimize",
"window:allow-maximize", "window:allow-maximize",
"window:allow-set-size", "window:allow-set-size",
"window:allow-set-focus", "window:allow-set-focus",
"window:allow-start-dragging", "window:allow-start-dragging",
"decorum:allow-show-snap-overlay", "decorum:allow-show-snap-overlay",
"clipboard-manager:allow-write-text", "clipboard-manager:allow-write-text",
"clipboard-manager:allow-read-text", "clipboard-manager:allow-read-text",
"webview:allow-create-webview-window", "webview:allow-create-webview-window",
"webview:allow-create-webview", "webview:allow-create-webview",
"webview:allow-set-webview-size", "webview:allow-set-webview-size",
"webview:allow-set-webview-position", "webview:allow-set-webview-position",
"webview:allow-webview-close", "webview:allow-webview-close",
"dialog:allow-open", "dialog:allow-open",
"dialog:allow-ask", "dialog:allow-ask",
"dialog:allow-message", "dialog:allow-message",
"process:allow-restart", "process:allow-restart",
"fs:allow-read-file", "fs:allow-read-file",
"shell:allow-open", "shell:allow-open",
{ {
"identifier": "http:default", "identifier": "http:default",
"allow": [ "allow": [
{ {
"url": "http://**/" "url": "http://**/"
}, },
{ {
"url": "https://**/" "url": "https://**/"
} }
] ]
}, },
{ {
"identifier": "fs:allow-read-text-file", "identifier": "fs:allow-read-text-file",
"allow": [ "allow": [
{ {
"path": "$RESOURCE/locales/*" "path": "$RESOURCE/locales/*"
}, },
{ {
"path": "$RESOURCE/resources/*" "path": "$RESOURCE/resources/*"
} }
] ]
} }
] ]
} }
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+296 -296
View File
@@ -1,298 +1,298 @@
{ {
"global": { "global": {
"relay": "Relay", "relay": "Relay",
"back": "Back", "back": "Back",
"continue": "Continue", "continue": "Continue",
"loading": "Loading", "loading": "Loading",
"error": "Error", "error": "Error",
"moveLeft": "Move Left", "moveLeft": "Move Left",
"moveRight": "Move Right", "moveRight": "Move Right",
"newColumn": "New Column", "newColumn": "New Column",
"inspect": "Inspect", "inspect": "Inspect",
"loadMore": "Load more", "loadMore": "Load more",
"delete": "Delete", "delete": "Delete",
"refresh": "Refresh", "refresh": "Refresh",
"cancel": "Cancel", "cancel": "Cancel",
"save": "Save", "save": "Save",
"post": "Post", "post": "Post",
"update": "Update", "update": "Update",
"noResult": "No results found.", "noResult": "No results found.",
"emptyFeedTitle": "This feed is empty", "emptyFeedTitle": "This feed is empty",
"emptyFeedSubtitle": "You can follow more users to build up your timeline", "emptyFeedSubtitle": "You can follow more users to build up your timeline",
"apiKey": "API Key", "apiKey": "API Key",
"skip": "Skip", "skip": "Skip",
"close": "Close" "close": "Close"
}, },
"nip89": { "nip89": {
"unsupported": "Lume isn't support this event", "unsupported": "Lume isn't support this event",
"openWith": "Open with" "openWith": "Open with"
}, },
"note": { "note": {
"showThread": "Show thread", "showThread": "Show thread",
"showMore": "Show more", "showMore": "Show more",
"error": "Failed to fetch event.", "error": "Failed to fetch event.",
"posted": "posted", "posted": "posted",
"replied": "replied", "replied": "replied",
"reposted": "reposted", "reposted": "reposted",
"menu": { "menu": {
"viewThread": "View thread", "viewThread": "View thread",
"copyLink": "Copy shareable link", "copyLink": "Copy shareable link",
"copyNoteId": "Copy note ID", "copyNoteId": "Copy note ID",
"copyAuthorId": "Copy author ID", "copyAuthorId": "Copy author ID",
"viewAuthor": "View author", "viewAuthor": "View author",
"pinAuthor": "Pin author", "pinAuthor": "Pin author",
"copyRaw": "Copy raw event", "copyRaw": "Copy raw event",
"mute": "Mute" "mute": "Mute"
}, },
"buttons": { "buttons": {
"pin": "Pin", "pin": "Pin",
"pinTooltip": "Pin Note", "pinTooltip": "Pin Note",
"repost": "Repost", "repost": "Repost",
"quote": "Quote", "quote": "Quote",
"viewProfile": "View profile", "viewProfile": "View profile",
"reply": "Reply this note", "reply": "Reply this note",
"open": "Open in new window" "open": "Open in new window"
}, },
"zap": { "zap": {
"zap": "Zap", "zap": "Zap",
"tooltip": "Send zap", "tooltip": "Send zap",
"modalTitle": "Send zap to", "modalTitle": "Send zap to",
"messagePlaceholder": "Enter message (optional)", "messagePlaceholder": "Enter message (optional)",
"buttonFinish": "Zapped", "buttonFinish": "Zapped",
"buttonLoading": "Processing...", "buttonLoading": "Processing...",
"invoiceButton": "Scan to zap", "invoiceButton": "Scan to zap",
"invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..." "invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
}, },
"reply": { "reply": {
"single": "reply", "single": "reply",
"plural": "replies", "plural": "replies",
"empty": "Be the first to Reply!" "empty": "Be the first to Reply!"
} }
}, },
"user": { "user": {
"avatar": "Avatar", "avatar": "Avatar",
"displayName": "Display Name", "displayName": "Display Name",
"name": "Name", "name": "Name",
"bio": "Bio", "bio": "Bio",
"lna": "Lightning address", "lna": "Lightning address",
"website": "Website", "website": "Website",
"verified": "Verified", "verified": "Verified",
"unverified": "Unverified", "unverified": "Unverified",
"follow": "Follow", "follow": "Follow",
"unfollow": "Unfollow", "unfollow": "Unfollow",
"latestPosts": "Latest posts", "latestPosts": "Latest posts",
"avatarButton": "Change avatar", "avatarButton": "Change avatar",
"coverButton": "Change cover", "coverButton": "Change cover",
"editProfile": "Edit profile", "editProfile": "Edit profile",
"settings": "Settings", "settings": "Settings",
"logout": "Log out", "logout": "Log out",
"logoutConfirmTitle": "Are you sure!", "logoutConfirmTitle": "Are you sure!",
"logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account." "logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
}, },
"editor": { "editor": {
"title": "New Post", "title": "New Post",
"placeholder": "What are you up to?", "placeholder": "What are you up to?",
"successMessage": "Your note has been published successfully.", "successMessage": "Your note has been published successfully.",
"replyPlaceholder": "Post your reply" "replyPlaceholder": "Post your reply"
}, },
"search": { "search": {
"placeholder": "Type something to search...", "placeholder": "Type something to search...",
"empty": "Try searching for people, notes, or keywords" "empty": "Try searching for people, notes, or keywords"
}, },
"welcome": { "welcome": {
"title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.", "title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
"signup": "Join Nostr", "signup": "Join Nostr",
"login": "Login", "login": "Login",
"footer": "Before joining Nostr, you can take time to learn more about Nostr" "footer": "Before joining Nostr, you can take time to learn more about Nostr"
}, },
"login": { "login": {
"title": "Welcome back, anon!", "title": "Welcome back, anon!",
"subtitle": "We're so excited to see you again!", "subtitle": "We're so excited to see you again!",
"footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID", "footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
"loginWithAddress": "Login with Nostr Address", "loginWithAddress": "Login with Nostr Address",
"loginWithBunker": "Login with nsecBunker", "loginWithBunker": "Login with nsecBunker",
"or": "Or continue with", "or": "Or continue with",
"loginWithPrivkey": "Login with Private Key" "loginWithPrivkey": "Login with Private Key"
}, },
"loginWithAddress": { "loginWithAddress": {
"title": "Enter your Nostr Address" "title": "Enter your Nostr Address"
}, },
"loginWithBunker": { "loginWithBunker": {
"title": "Enter your nsecbunker token" "title": "Enter your nsecbunker token"
}, },
"loginWithPrivkey": { "loginWithPrivkey": {
"title": "Enter your Private Key", "title": "Enter your Private Key",
"subtitle": "Lume will put your private key to <1>{{service}}</1>.\nIt will be secured by your OS." "subtitle": "Lume will put your private key to <1>{{service}}</1>.\nIt will be secured by your OS."
}, },
"signup": { "signup": {
"title": "Let's Get Started", "title": "Let's Get Started",
"subtitle": "Choose one of methods below to create your account", "subtitle": "Choose one of methods below to create your account",
"selfManageMethod": "Self-Managed", "selfManageMethod": "Self-Managed",
"selfManageMethodDescription": "You create your keys and keep them safe.", "selfManageMethodDescription": "You create your keys and keep them safe.",
"providerMethod": "Managed by Provider", "providerMethod": "Managed by Provider",
"providerMethodDescription": "A 3rd party provider will handle your sign in keys for you." "providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
}, },
"backup": { "backup": {
"title": "This is your new sign in key", "title": "This is your new sign in key",
"subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.", "subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
"confirm1": "I understand the risk of lost private key.", "confirm1": "I understand the risk of lost private key.",
"confirm2": "I will make sure keep it safe and not sharing with anyone.", "confirm2": "I will make sure keep it safe and not sharing with anyone.",
"confirm3": "I understand I cannot recover private key.", "confirm3": "I understand I cannot recover private key.",
"button": "Save & Continue" "button": "Save & Continue"
}, },
"signupWithProvider": { "signupWithProvider": {
"title": "Let's set up your account on Nostr", "title": "Let's set up your account on Nostr",
"username": "Username *", "username": "Username *",
"chooseProvider": "Choose a Provider", "chooseProvider": "Choose a Provider",
"usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account", "usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
"email": "Backup Email (optional)", "email": "Backup Email (optional)",
"emailFooter": "Use for recover your account if you lose your password" "emailFooter": "Use for recover your account if you lose your password"
}, },
"onboardingSettings": { "onboardingSettings": {
"title": "You're almost ready to use Lume.", "title": "You're almost ready to use Lume.",
"subtitle": "Let's start personalizing your experience.", "subtitle": "Let's start personalizing your experience.",
"notification": { "notification": {
"title": "Push notification", "title": "Push notification",
"subtitle": "Enabling push notifications will allow you to receive notifications from Lume." "subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
}, },
"lowPower": { "lowPower": {
"title": "Low Power Mode", "title": "Low Power Mode",
"subtitle": "Limited relay connection and hide all media, sustainable for low network environment." "subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
}, },
"translation": { "translation": {
"title": "Translation (nostr.wine)", "title": "Translation (nostr.wine)",
"subtitle": "Translate text to your preferred language, powered by Nostr Wine." "subtitle": "Translate text to your preferred language, powered by Nostr Wine."
}, },
"footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later." "footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
}, },
"relays": { "relays": {
"global": "Global", "global": "Global",
"follows": "Follows", "follows": "Follows",
"sidebar": { "sidebar": {
"title": "Connected relays", "title": "Connected relays",
"empty": "Empty." "empty": "Empty."
}, },
"relayView": { "relayView": {
"empty": "Could not load relay information 😬", "empty": "Could not load relay information 😬",
"owner": "Owner", "owner": "Owner",
"contact": "Contact", "contact": "Contact",
"software": "Software", "software": "Software",
"nips": "Supported NIPs", "nips": "Supported NIPs",
"limit": "Limitation", "limit": "Limitation",
"payment": "Open payment website", "payment": "Open payment website",
"paymentNote": "You need to make a payment to connect this relay" "paymentNote": "You need to make a payment to connect this relay"
} }
}, },
"suggestion": { "suggestion": {
"title": "Suggested Follows", "title": "Suggested Follows",
"error": "Error. Cannot get trending users", "error": "Error. Cannot get trending users",
"button": "Save & Go back" "button": "Save & Go back"
}, },
"interests": { "interests": {
"title": "Interests", "title": "Interests",
"subtitle": "Pick things you'd like to see in your home feed.", "subtitle": "Pick things you'd like to see in your home feed.",
"edit": "Edit Interest", "edit": "Edit Interest",
"followAll": "Follow All", "followAll": "Follow All",
"unfollowAll": "Unfollow All" "unfollowAll": "Unfollow All"
}, },
"settings": { "settings": {
"general": { "general": {
"title": "General", "title": "General",
"update": { "update": {
"title": "Update", "title": "Update",
"subtitle": "Automatically download new update" "subtitle": "Automatically download new update"
}, },
"lowPower": { "lowPower": {
"title": "Low Power", "title": "Low Power",
"subtitle": "Sustainable for low network environment" "subtitle": "Sustainable for low network environment"
}, },
"startup": { "startup": {
"title": "Startup", "title": "Startup",
"subtitle": "Launch Lume at Login" "subtitle": "Launch Lume at Login"
}, },
"media": { "media": {
"title": "Media", "title": "Media",
"subtitle": "Automatically load media" "subtitle": "Automatically load media"
}, },
"hashtag": { "hashtag": {
"title": "Hashtag", "title": "Hashtag",
"subtitle": "Show all hashtags in content" "subtitle": "Show all hashtags in content"
}, },
"notification": { "notification": {
"title": "Notification", "title": "Notification",
"subtitle": "Automatically send notification" "subtitle": "Automatically send notification"
}, },
"translation": { "translation": {
"title": "Translation", "title": "Translation",
"subtitle": "Translate text to your language" "subtitle": "Translate text to your language"
}, },
"appearance": { "appearance": {
"title": "Appearance", "title": "Appearance",
"light": "Light", "light": "Light",
"dark": "Dark", "dark": "Dark",
"system": "System" "system": "System"
} }
}, },
"user": { "user": {
"title": "Account" "title": "Account"
}, },
"zap": { "zap": {
"title": "Zap", "title": "Zap",
"nwc": "Connection String" "nwc": "Connection String"
}, },
"backup": { "backup": {
"title": "Backup", "title": "Backup",
"privkey": { "privkey": {
"title": "Private key", "title": "Private key",
"button": "Remove private key" "button": "Remove private key"
} }
}, },
"advanced": { "advanced": {
"title": "Advanced", "title": "Advanced",
"cache": { "cache": {
"title": "Cache", "title": "Cache",
"subtitle": "Use for boost up nostr connection", "subtitle": "Use for boost up nostr connection",
"button": "Clear" "button": "Clear"
}, },
"instant": { "instant": {
"title": "Instant Zap", "title": "Instant Zap",
"subtitle": "Zap with default amount, no confirmation" "subtitle": "Zap with default amount, no confirmation"
}, },
"defaultAmount": "Default amount" "defaultAmount": "Default amount"
}, },
"about": { "about": {
"title": "About", "title": "About",
"version": "Version", "version": "Version",
"checkUpdate": "Check for update", "checkUpdate": "Check for update",
"installUpdate": "Install" "installUpdate": "Install"
} }
}, },
"onboarding": { "onboarding": {
"home": { "home": {
"title": "Your account was successfully created!", "title": "Your account was successfully created!",
"subtitle": "For starters, let's set up your profile.", "subtitle": "For starters, let's set up your profile.",
"profileSettings": "Profile Settings" "profileSettings": "Profile Settings"
}, },
"profile": { "profile": {
"title": "About you", "title": "About you",
"subtitle": "Tell Lume about yourself to start building your home feed." "subtitle": "Tell Lume about yourself to start building your home feed."
}, },
"finish": { "finish": {
"title": "Profile setup complete!", "title": "Profile setup complete!",
"subtitle": "You can exit the setup here and start using Lume.", "subtitle": "You can exit the setup here and start using Lume.",
"report": "Report a issue" "report": "Report a issue"
} }
}, },
"activity": { "activity": {
"title": "Activity", "title": "Activity",
"empty": "Yo! Nothing new yet.", "empty": "Yo! Nothing new yet.",
"mention": "mention you", "mention": "mention you",
"repost": "reposted", "repost": "reposted",
"zap": "zapped", "zap": "zapped",
"newReply": "New reply", "newReply": "New reply",
"boost": "Boost", "boost": "Boost",
"boostSubtitle": "@ Someone has reposted to your note", "boostSubtitle": "@ Someone has reposted to your note",
"conversation": "Conversation", "conversation": "Conversation",
"conversationSubtitle": "@ Someone has replied to your note" "conversationSubtitle": "@ Someone has replied to your note"
} }
} }
+50 -50
View File
@@ -1,52 +1,52 @@
[ [
{ {
"label": "lZfXLFgPPR4NNrgjlWDxn", "label": "lZfXLFgPPR4NNrgjlWDxn",
"name": "Newsfeed", "name": "Newsfeed",
"content": "/newsfeed", "content": "/newsfeed",
"logo": "", "logo": "",
"cover": "/newsfeed.png", "cover": "/newsfeed.png",
"coverRetina": "/newsfeed@2x.png", "coverRetina": "/newsfeed@2x.png",
"author": "Lume", "author": "Lume",
"description": "Keep up to date with the people you're following." "description": "Keep up to date with the people you're following."
}, },
{ {
"label": "rRtguZwIpd5G8Wt54OTb7", "label": "rRtguZwIpd5G8Wt54OTb7",
"name": "Topic", "name": "Topic",
"content": "/topic", "content": "/topic",
"logo": "", "logo": "",
"cover": "/foryou.png", "cover": "/foryou.png",
"coverRetina": "/foryou@2x.png", "coverRetina": "/foryou@2x.png",
"author": "Lume", "author": "Lume",
"description": "Keep up to date with content based on your interests." "description": "Keep up to date with content based on your interests."
}, },
{ {
"label": "fve9fk2fVyFWORPBkjd79", "label": "fve9fk2fVyFWORPBkjd79",
"name": "Group", "name": "Group",
"content": "/group", "content": "/group",
"logo": "", "logo": "",
"cover": "/group.png", "cover": "/group.png",
"coverRetina": "/group@2x.png", "coverRetina": "/group@2x.png",
"author": "Lume", "author": "Lume",
"description": "Focus feeds for people you like." "description": "Focus feeds for people you like."
}, },
{ {
"label": "gxtcIbgD8YNPbeI5o92I8", "label": "gxtcIbgD8YNPbeI5o92I8",
"name": "Trending", "name": "Trending",
"content": "/trending/notes", "content": "/trending/notes",
"logo": "", "logo": "",
"cover": "/trending.png", "cover": "/trending.png",
"coverRetina": "/trending@2x.png", "coverRetina": "/trending@2x.png",
"author": "Lume", "author": "Lume",
"description": "What is trending on Nostr?." "description": "What is trending on Nostr?."
}, },
{ {
"label": "GLFm44za8rhJDP04LMr3M", "label": "GLFm44za8rhJDP04LMr3M",
"name": "Global", "name": "Global",
"content": "/global", "content": "/global",
"logo": "", "logo": "",
"cover": "/global.png", "cover": "/global.png",
"coverRetina": "/global@2x.png", "coverRetina": "/global@2x.png",
"author": "Lume", "author": "Lume",
"description": "All events from connected relays." "description": "All events from connected relays."
} }
] ]
+5 -5
View File
@@ -1,7 +1,7 @@
[ [
{ "label": "onboarding", "name": "Onboarding", "content": "/onboarding" }, { "label": "onboarding", "name": "Onboarding", "content": "/onboarding" },
{ "label": "lume_newsfeed", "name": "Newsfeed", "content": "/newsfeed" }, { "label": "lume_newsfeed", "name": "Newsfeed", "content": "/newsfeed" },
{ "label": "lume_topic", "name": "Topic", "content": "/topic" }, { "label": "lume_topic", "name": "Topic", "content": "/topic" },
{ "label": "lume_group", "name": "Group", "content": "/group" }, { "label": "lume_group", "name": "Group", "content": "/group" },
{ "label": "open", "name": "Open", "content": "/open" } { "label": "open", "name": "Open", "content": "/open" }
] ]
+9 -3
View File
@@ -13,8 +13,8 @@ pub async fn get_event(id: &str, state: State<'_, Nostr>) -> Result<String, Stri
let relays = event.relays; let relays = event.relays;
for relay in relays.into_iter() { for relay in relays.into_iter() {
let url = Url::from_str(&relay).unwrap(); let url = Url::from_str(&relay).unwrap();
let _ = client.add_relay(url.clone()).await.unwrap_or_default(); let _ = client.add_relay(&url).await.unwrap_or_default();
client.connect_relay(url).await.unwrap_or_default(); client.connect_relay(&url).await.unwrap_or_default();
} }
Some(event.event_id) Some(event.event_id)
} }
@@ -109,7 +109,13 @@ pub async fn get_local_events(
}; };
let authors: Vec<PublicKey> = pubkeys let authors: Vec<PublicKey> = pubkeys
.into_iter() .into_iter()
.map(|p| PublicKey::from_hex(p).unwrap()) .map(|p| {
if p.starts_with("npub1") {
PublicKey::from_bech32(p).unwrap()
} else {
PublicKey::from_hex(p).unwrap()
}
})
.collect(); .collect();
let filter = Filter::new() let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Repost]) .kinds(vec![Kind::TextNote, Kind::Repost])
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json", "$schema": "../node_modules/@tauri-apps/cli/schema.json",
"productName": "Lume", "productName": "Lume",
"version": "4.0.4", "version": "4.0.5",
"identifier": "nu.lume.Lume", "identifier": "nu.lume.Lume",
"build": { "build": {
"beforeBuildCommand": "pnpm desktop:build", "beforeBuildCommand": "pnpm desktop:build",
+14 -14
View File
@@ -1,16 +1,16 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json", "$schema": "../node_modules/@tauri-apps/cli/schema.json",
"app": { "app": {
"windows": [ "windows": [
{ {
"title": "Lume", "title": "Lume",
"label": "main", "label": "main",
"titleBarStyle": "Overlay", "titleBarStyle": "Overlay",
"width": 500, "width": 500,
"height": 800, "height": 800,
"minWidth": 500, "minWidth": 500,
"minHeight": 800 "minHeight": 800
} }
] ]
} }
} }
+20 -20
View File
@@ -1,22 +1,22 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json", "$schema": "../node_modules/@tauri-apps/cli/schema.json",
"app": { "app": {
"windows": [ "windows": [
{ {
"title": "Lume", "title": "Lume",
"label": "main", "label": "main",
"titleBarStyle": "Overlay", "titleBarStyle": "Overlay",
"width": 500, "width": 500,
"height": 800, "height": 800,
"minWidth": 500, "minWidth": 500,
"minHeight": 800, "minHeight": 800,
"hiddenTitle": true, "hiddenTitle": true,
"decorations": true, "decorations": true,
"transparent": true, "transparent": true,
"windowEffects": { "windowEffects": {
"effects": ["windowBackground"] "effects": ["windowBackground"]
} }
} }
] ]
} }
} }