From f28a7ae82fddcae45f08b883aa2f1c975473140b Mon Sep 17 00:00:00 2001 From: reya Date: Fri, 16 Feb 2024 14:11:49 +0700 Subject: [PATCH] wip: update design --- apps/desktop2/src/routes/app/home.lazy.tsx | 4 +- .../src/routes/events/$eventId.lazy.tsx | 14 ++- packages/ark/src/ark.ts | 58 ++++++++--- packages/ui/src/editor/replyForm.tsx | 4 +- packages/ui/src/index.ts | 1 + packages/ui/src/note/buttons/reaction.tsx | 32 +++++- packages/ui/src/note/buttons/repost.tsx | 4 +- packages/ui/src/note/content.tsx | 6 +- packages/ui/src/note/mentions/note.tsx | 19 +--- packages/ui/src/note/menu.tsx | 7 +- packages/ui/src/note/preview/image.tsx | 97 ++++++++++--------- packages/ui/src/note/preview/link.tsx | 8 +- packages/ui/src/note/preview/video.tsx | 50 +++++----- packages/ui/src/note/primitives/thread.tsx | 12 +-- packages/ui/src/note/thread.tsx | 16 ++- packages/ui/src/note/user.tsx | 14 +-- packages/ui/src/replyList.tsx | 39 ++------ src-tauri/capabilities/main.json | 1 + src-tauri/gen/schemas/capabilities.json | 2 +- src-tauri/src/main.rs | 2 +- 20 files changed, 218 insertions(+), 172 deletions(-) diff --git a/apps/desktop2/src/routes/app/home.lazy.tsx b/apps/desktop2/src/routes/app/home.lazy.tsx index 39c6a685..051b8212 100644 --- a/apps/desktop2/src/routes/app/home.lazy.tsx +++ b/apps/desktop2/src/routes/app/home.lazy.tsx @@ -63,13 +63,13 @@ function Home() { {data.map((item) => renderItem(item))} )} -
+
{hasNextPage ? ( diff --git a/packages/ui/src/note/buttons/repost.tsx b/packages/ui/src/note/buttons/repost.tsx index d26651c9..db0144a3 100644 --- a/packages/ui/src/note/buttons/repost.tsx +++ b/packages/ui/src/note/buttons/repost.tsx @@ -7,8 +7,10 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { useNoteContext } from "../provider"; +import { useArk } from "@lume/ark"; export function NoteRepost() { + const ark = useArk(); const event = useNoteContext(); const setEditorValue = useSetAtom(editorValueAtom); const setIsEditorOpen = useSetAtom(editorAtom); @@ -23,7 +25,7 @@ export function NoteRepost() { setLoading(true); // repost - await event.repost(true); + await ark.repost(event.id, event.pubkey); // update state setLoading(false); diff --git a/packages/ui/src/note/content.tsx b/packages/ui/src/note/content.tsx index 0563b9a8..f68f8717 100644 --- a/packages/ui/src/note/content.tsx +++ b/packages/ui/src/note/content.tsx @@ -39,9 +39,7 @@ export function NoteContent({ className }: { className?: string }) { const richContent = useMemo(() => { if (event.kind !== Kind.Text) return content; - let parsedContent: string | ReactNode[] = stripHtml( - content.replace(/\n{2,}\s*/g, "\n"), - ).result; + let parsedContent: string | ReactNode[] = stripHtml(content).result; let linkPreview: string = undefined; let images: string[] = []; let videos: string[] = []; @@ -176,7 +174,7 @@ export function NoteContent({ className }: { className?: string }) { ); parsedContent = reactStringReplace(parsedContent, "\n", () => { - return
; + return
; }); if (typeof parsedContent[0] === "string") { diff --git a/packages/ui/src/note/mentions/note.tsx b/packages/ui/src/note/mentions/note.tsx index f2cda761..95097ba7 100644 --- a/packages/ui/src/note/mentions/note.tsx +++ b/packages/ui/src/note/mentions/note.tsx @@ -21,10 +21,7 @@ export function MentionNote({ const richContent = useMemo(() => { if (!data) return ""; - let parsedContent: string | ReactNode[] = data.content.replace( - /\n+/g, - "\n", - ); + let parsedContent: string | ReactNode[] = data.content; const text = parsedContent as string; const words = text.split(/( |\n)/); @@ -106,11 +103,11 @@ export function MentionNote({ } return ( -
+
- -
+ + ) : (
diff --git a/packages/ui/src/note/menu.tsx b/packages/ui/src/note/menu.tsx index 9ce794d9..dfae551d 100644 --- a/packages/ui/src/note/menu.tsx +++ b/packages/ui/src/note/menu.tsx @@ -32,8 +32,11 @@ export function NoteMenu() { return ( - diff --git a/packages/ui/src/note/preview/image.tsx b/packages/ui/src/note/preview/image.tsx index fc15ceae..04803da2 100644 --- a/packages/ui/src/note/preview/image.tsx +++ b/packages/ui/src/note/preview/image.tsx @@ -5,57 +5,60 @@ import { download } from "@tauri-apps/plugin-upload"; import { SyntheticEvent, useState } from "react"; export function ImagePreview({ url }: { url: string }) { - const [downloaded, setDownloaded] = useState(false); + const [downloaded, setDownloaded] = useState(false); - const downloadImage = async (e: { stopPropagation: () => void }) => { - try { - e.stopPropagation(); + const downloadImage = async (e: { stopPropagation: () => void }) => { + try { + e.stopPropagation(); - const downloadDirPath = await downloadDir(); - const filename = url.substring(url.lastIndexOf("/") + 1); - await download(url, `${downloadDirPath}/${filename}`); + const downloadDirPath = await downloadDir(); + const filename = url.substring(url.lastIndexOf("/") + 1); + await download(url, `${downloadDirPath}/${filename}`); - setDownloaded(true); - } catch (e) { - console.error(e); - } - }; + setDownloaded(true); + } catch (e) { + console.error(e); + } + }; - const open = async () => { - const name = new URL(url).pathname.split("/").pop(); - return new WebviewWindow("image-viewer", { - url, - title: name, - }); - }; + const open = async () => { + const name = new URL(url).pathname.split("/").pop(); + return new WebviewWindow("image-viewer", { + url, + title: name, + }); + }; - const fallback = (event: SyntheticEvent) => { - event.currentTarget.src = "/fallback-image.jpg"; - }; + const fallback = (event: SyntheticEvent) => { + event.currentTarget.src = "/fallback-image.jpg"; + }; - return ( - // biome-ignore lint/a11y/useKeyWithClickEvents: -
- {url} - -
- ); + return ( + // biome-ignore lint/a11y/useKeyWithClickEvents: +
+ {url} + +
+ ); } diff --git a/packages/ui/src/note/preview/link.tsx b/packages/ui/src/note/preview/link.tsx index 029e3c18..64a6fc05 100644 --- a/packages/ui/src/note/preview/link.tsx +++ b/packages/ui/src/note/preview/link.tsx @@ -10,7 +10,7 @@ export function LinkPreview({ url }: { url: string }) { if (isLoading) { return ( -
+
@@ -29,7 +29,7 @@ export function LinkPreview({ url }: { url: string }) { href={url} target="_blank" rel="noreferrer" - className="text-blue-500 hover:text-blue-600" + className="inline-block text-blue-500 hover:text-blue-600" > {url} @@ -42,7 +42,7 @@ export function LinkPreview({ url }: { url: string }) { href={url} target="_blank" rel="noreferrer" - className="text-blue-500 hover:text-blue-600" + className="inline-block text-blue-500 hover:text-blue-600" > {url} @@ -54,7 +54,7 @@ export function LinkPreview({ url }: { url: string }) { href={url} target="_blank" rel="noreferrer" - className="mb-2.5 mt-1 flex w-full flex-col overflow-hidden rounded-xl border border-black/5 bg-neutral-100 dark:border-white/5 dark:bg-neutral-900" + className="my-1.5 flex w-full flex-col overflow-hidden rounded-xl bg-neutral-100 ring-1 ring-black/5 dark:bg-neutral-900 dark:ring-white/5" > {isImage(data.image) ? ( - - -
- ); + return ( +
+ + +
+ ); } diff --git a/packages/ui/src/note/primitives/thread.tsx b/packages/ui/src/note/primitives/thread.tsx index 38c682ae..28c69819 100644 --- a/packages/ui/src/note/primitives/thread.tsx +++ b/packages/ui/src/note/primitives/thread.tsx @@ -11,11 +11,11 @@ export function ThreadNote({ eventId }: { eventId: string }) { return ( - -
+ +
- +
@@ -29,9 +29,9 @@ export function ThreadNote({ eventId }: { eventId: string }) {
- -
- + +
+
diff --git a/packages/ui/src/note/thread.tsx b/packages/ui/src/note/thread.tsx index 43151c46..a98c7771 100644 --- a/packages/ui/src/note/thread.tsx +++ b/packages/ui/src/note/thread.tsx @@ -1,4 +1,3 @@ -import { PinIcon } from "@lume/icons"; import { cn } from "@lume/utils"; import { useTranslation } from "react-i18next"; import { Note } from "."; @@ -19,7 +18,7 @@ export function NoteThread({ className }: { className?: string }) { return (
-
+
{thread.rootEventId ? ( ) : null} @@ -27,17 +26,14 @@ export function NoteThread({ className }: { className?: string }) { ) : null}
diff --git a/packages/ui/src/note/user.tsx b/packages/ui/src/note/user.tsx index 17a9014f..f1fe8886 100644 --- a/packages/ui/src/note/user.tsx +++ b/packages/ui/src/note/user.tsx @@ -2,8 +2,10 @@ import { cn } from "@lume/utils"; import * as HoverCard from "@radix-ui/react-hover-card"; import { User } from "../user"; import { useNoteContext } from "./provider"; +import { useArk } from "@lume/ark"; export function NoteUser({ className }: { className?: string }) { + const ark = useArk(); const event = useNoteContext(); return ( @@ -23,12 +25,12 @@ export function NoteUser({ className }: { className?: string }) {
@@ -39,12 +41,12 @@ export function NoteUser({ className }: { className?: string }) {
- ark.open_profile(event.pubkey)} + className="mt-2 inline-flex h-9 w-full items-center justify-center rounded-lg bg-neutral-100 text-sm font-medium hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800" > View profile - +
diff --git a/packages/ui/src/replyList.tsx b/packages/ui/src/replyList.tsx index 4ae6b05e..1c142550 100644 --- a/packages/ui/src/replyList.tsx +++ b/packages/ui/src/replyList.tsx @@ -1,11 +1,11 @@ import { useArk } from "@lume/ark"; import { LoaderIcon } from "@lume/icons"; import { cn } from "@lume/utils"; -import { NDKKind, type NDKSubscription } from "@nostr-dev-kit/ndk"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { ReplyForm } from "./editor/replyForm"; import { Reply } from "./note/primitives/reply"; +import { EventWithReplies } from "@lume/types"; export function ReplyList({ eventId, @@ -17,41 +17,14 @@ export function ReplyList({ const ark = useArk(); const [t] = useTranslation(); - const [data, setData] = useState(null); + const [data, setData] = useState(null); useEffect(() => { - let sub: NDKSubscription = undefined; - let isCancelled = false; - - async function fetchRepliesAndSub() { - const id = ark.getCleanEventId(eventId); - const events = await ark.getThreads(id); - - if (!isCancelled) { - setData(events); - } - - if (!sub) { - sub = ark.subscribe({ - filter: { - "#e": [id], - kinds: [NDKKind.Text], - since: Math.floor(Date.now() / 1000), - }, - closeOnEose: false, - cb: (event: NDKEventWithReplies) => - setData((prev) => [event, ...prev]), - }); - } + async function getReplies() { + const events = await ark.get_event_thread(eventId); + setData(events); } - - // subscribe for new replies - fetchRepliesAndSub(); - - return () => { - isCancelled = true; - if (sub) sub.stop(); - }; + getReplies(); }, [eventId]); return ( diff --git a/src-tauri/capabilities/main.json b/src-tauri/capabilities/main.json index 20a52d54..ecc24d81 100644 --- a/src-tauri/capabilities/main.json +++ b/src-tauri/capabilities/main.json @@ -26,6 +26,7 @@ "clipboard-manager:allow-write", "clipboard-manager:allow-read", "webview:allow-create-webview-window", + "webview:allow-create-webview", { "identifier": "http:default", "allow": [ diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json index 21e2604b..edf3cf92 100644 --- a/src-tauri/gen/schemas/capabilities.json +++ b/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"desktop-capability":{"identifier":"desktop-capability","description":"Capability for the desktop","context":"local","windows":["main","settings","event-*","user-*","column-*"],"permissions":["path:default","event:default","window:default","app:default","resources:default","menu:default","tray:default","theme:allow-set-theme","theme:allow-get-theme","notification:allow-is-permission-granted","notification:allow-request-permission","notification:default","os:allow-locale","os:allow-platform","updater:allow-check","updater:default","window:allow-start-dragging","store:allow-get","clipboard-manager:allow-write","clipboard-manager:allow-read","webview:allow-create-webview-window",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"}]}],"platforms":["linux","macOS","windows"]}} \ No newline at end of file +{"desktop-capability":{"identifier":"desktop-capability","description":"Capability for the desktop","context":"local","windows":["main","settings","event-*","user-*","column-*"],"permissions":["path:default","event:default","window:default","app:default","resources:default","menu:default","tray:default","theme:allow-set-theme","theme:allow-get-theme","notification:allow-is-permission-granted","notification:allow-request-permission","notification:default","os:allow-locale","os:allow-platform","updater:allow-check","updater:default","window:allow-start-dragging","store:allow-get","clipboard-manager:allow-write","clipboard-manager:allow-read","webview:allow-create-webview-window","webview:allow-create-webview",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"}]}],"platforms":["linux","macOS","windows"]}} \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0198d9c1..1d749b1d 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -87,7 +87,7 @@ fn main() { .await .expect("Failed to add bootstrap relay."); client - .add_relay("wss://bostr.nokotaro.com") + .add_relay("wss://bostr.yonle.lecturify.net") .await .expect("Failed to add bootstrap relay.");