diff --git a/apps/desktop/public/heading.png b/apps/desktop/public/heading.png index 50335ce1..fb740945 100644 Binary files a/apps/desktop/public/heading.png and b/apps/desktop/public/heading.png differ diff --git a/apps/desktop/public/heading@2x.png b/apps/desktop/public/heading@2x.png index 72aa9d52..802c679b 100644 Binary files a/apps/desktop/public/heading@2x.png and b/apps/desktop/public/heading@2x.png differ diff --git a/apps/desktop/src/routes/auth/create.tsx b/apps/desktop/src/routes/auth/create.tsx index 69623dcb..eee72673 100644 --- a/apps/desktop/src/routes/auth/create.tsx +++ b/apps/desktop/src/routes/auth/create.tsx @@ -197,10 +197,6 @@ export function CreateAccountScreen() {

Let's get you set up on Nostr.

-

- Get started with familiar way, but all data belong to you and you - have ability controls everything. -

{!services ? (
@@ -220,59 +216,75 @@ export function CreateAccountScreen() { > Username * -
- - - - @{getDomainName(serviceId)} - - - - - - - - - - Public handles - - {services.map((service) => ( - - ))} - - - - - +
+
+ + + + + @{getDomainName(serviceId)} + + + + + + + + + + + Choose a Provider + + {services.map((service) => ( + + ))} + + + + + +
+ + Use to login to Lume and other Nostr apps. You can choose + provider you trust to manage your account +
-
- - +
+
+ + +
+ + Use for recover your account if you lose your password +
@@ -297,12 +309,12 @@ export function CreateAccountScreen() {
- Or + Or manage your own keys
- More compatible with other Nostr clients + Mostly compatible with other Nostr clients
diff --git a/apps/desktop/src/routes/auth/welcome.tsx b/apps/desktop/src/routes/auth/welcome.tsx index 6b4095cb..a9986055 100644 --- a/apps/desktop/src/routes/auth/welcome.tsx +++ b/apps/desktop/src/routes/auth/welcome.tsx @@ -23,9 +23,9 @@ export function WelcomeScreen() { className="w-2/3" />

- Lume is your safe Nostr client to meet, explore and + Lume is a magnificent client for Nostr to meet, explore
- freely sharing your though to everyone in nostrverse + and freely share your thoughts with everyone.

diff --git a/apps/desktop/src/routes/relays/components/relayForm.tsx b/apps/desktop/src/routes/relays/components/relayForm.tsx index 7e9d81be..27808861 100644 --- a/apps/desktop/src/routes/relays/components/relayForm.tsx +++ b/apps/desktop/src/routes/relays/components/relayForm.tsx @@ -1,17 +1,14 @@ import { useRelaylist } from "@lume/ark"; import { PlusIcon } from "@lume/icons"; -import { NDKRelayUrl } from "@nostr-dev-kit/ndk"; import { normalizeRelayUrl } from "nostr-fetch"; import { useState } from "react"; import { toast } from "sonner"; -const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/; - export function RelayForm() { const { connectRelay } = useRelaylist(); const [relay, setRelay] = useState<{ - url: NDKRelayUrl; + url: WebSocket["url"]; purpose: "read" | "write" | undefined; }>({ url: "", purpose: undefined }); @@ -19,10 +16,8 @@ export function RelayForm() { if (relay.url.length < 1) return toast.info("Please enter relay url"); try { const relayUrl = new URL(relay.url.replace(/\s/g, "")); - if ( - domainRegex.test(relayUrl.host) && - (relayUrl.protocol === "wss:" || relayUrl.protocol === "ws:") - ) { + + if (relayUrl.protocol === "wss:" || relayUrl.protocol === "ws:") { connectRelay.mutate(normalizeRelayUrl(relay.url)); setRelay({ url: "", purpose: undefined }); } else { diff --git a/packages/ark/src/components/column/provider.tsx b/packages/ark/src/components/column/provider.tsx index b727bdf5..115dd017 100644 --- a/packages/ark/src/components/column/provider.tsx +++ b/packages/ark/src/components/column/provider.tsx @@ -9,6 +9,7 @@ import { useEffect, useState, } from "react"; +import { toast } from "sonner"; type ColumnContext = { columns: IColumn[]; @@ -52,6 +53,11 @@ export function ColumnProvider({ children }: { children: ReactNode }) { }, []); const removeColumn = useCallback(async (id: number) => { + if (id === 9998 || id === 9999) { + toast.info("You cannot remove default column"); + return; + } + await storage.removeColumn(id); setColumns((prev) => prev.filter((t) => t.id !== id)); }, []); diff --git a/packages/ark/src/components/note/child.tsx b/packages/ark/src/components/note/child.tsx index 607be70a..af85440c 100644 --- a/packages/ark/src/components/note/child.tsx +++ b/packages/ark/src/components/note/child.tsx @@ -1,4 +1,5 @@ import { NOSTR_MENTIONS } from "@lume/utils"; +import { nanoid } from "nanoid"; import { nip19 } from "nostr-tools"; import { ReactNode, useMemo } from "react"; import { Link } from "react-router-dom"; @@ -33,13 +34,10 @@ export function NoteChild({ try { if (hashtags.length) { for (const hashtag of hashtags) { - parsedContent = reactStringReplace( - parsedContent, - hashtag, - (match, i) => { - return ; - }, - ); + const regex = new RegExp(`(|^)${hashtag}\\b`, "g"); + parsedContent = reactStringReplace(parsedContent, regex, () => { + return ; + }); } } diff --git a/packages/ark/src/components/note/content.tsx b/packages/ark/src/components/note/content.tsx index 119a7e4f..1ef1ffde 100644 --- a/packages/ark/src/components/note/content.tsx +++ b/packages/ark/src/components/note/content.tsx @@ -126,15 +126,12 @@ export function NoteContent({ if (hashtags.length) { for (const hashtag of hashtags) { - parsedContent = reactStringReplace( - parsedContent, - hashtag, - (match, i) => { - if (storage.settings.hashtag) - return ; - return null; - }, - ); + const regex = new RegExp(`(|^)${hashtag}\\b`, "g"); + parsedContent = reactStringReplace(parsedContent, regex, () => { + if (storage.settings.hashtag) + return ; + return null; + }); } } diff --git a/packages/ark/src/components/note/preview/image.tsx b/packages/ark/src/components/note/preview/image.tsx index db432175..abb5d1ae 100644 --- a/packages/ark/src/components/note/preview/image.tsx +++ b/packages/ark/src/components/note/preview/image.tsx @@ -13,7 +13,7 @@ export function ImagePreview({ url }: { url: string }) { const downloadDirPath = await downloadDir(); const filename = url.substring(url.lastIndexOf("/") + 1); - await download(url, downloadDirPath + `/${filename}`); + await download(url, `${downloadDirPath}/${filename}`); setDownloaded(true); } catch (e) { @@ -35,7 +35,7 @@ export function ImagePreview({ url }: { url: string }) { return ( // biome-ignore lint/a11y/useKeyWithClickEvents: -
+
{url} -
-