diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index 54e1bf39..0c7f7232 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -6,6 +6,7 @@ export * from "./column";
// Note Primities
export * from "./note/primitives/text";
export * from "./note/primitives/repost";
+export * from "./note/primitives/thread";
// Deprecated
export * from "./routes/event";
diff --git a/packages/ui/src/note/buttons/reaction.tsx b/packages/ui/src/note/buttons/reaction.tsx
index 5ed77cd9..b7c2774d 100644
--- a/packages/ui/src/note/buttons/reaction.tsx
+++ b/packages/ui/src/note/buttons/reaction.tsx
@@ -1,22 +1,50 @@
import { ArrowDownIcon, ArrowUpIcon } from "@lume/icons";
import { useState } from "react";
import { useNoteContext } from "../provider";
+import { useArk } from "@lume/ark";
+import { cn } from "@lume/utils";
export function NoteReaction() {
+ const ark = useArk();
const event = useNoteContext();
+
const [reaction, setReaction] = useState<"+" | "-">(null);
+ const up = async () => {
+ const res = await ark.upvote(event.id, event.pubkey);
+ if (res) setReaction("+");
+ };
+
+ const down = async () => {
+ const res = await ark.downvote(event.id, event.pubkey);
+ if (res) setReaction("-");
+ };
+
return (
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:
-
-
-
downloadImage(e)}
- className="absolute z-10 items-center justify-center hidden size-10 bg-white/10 text-black/70 backdrop-blur-xl rounded-lg right-2 top-2 group-hover:inline-flex hover:bg-blue-500 hover:text-white"
- >
- {downloaded ? (
-
- ) : (
-
- )}
-
-
- );
+ return (
+ // biome-ignore lint/a11y/useKeyWithClickEvents:
+
+
+
downloadImage(e)}
+ className="absolute right-2 top-2 z-10 hidden size-10 items-center justify-center rounded-lg bg-white/20 text-black/70 backdrop-blur-2xl hover:bg-blue-500 hover:text-white group-hover:inline-flex"
+ >
+ {downloaded ? (
+
+ ) : (
+
+ )}
+
+
+ );
}
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 (
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.");