From c843626bca270fa95d5a81bdf4abefa8a14c81ae Mon Sep 17 00:00:00 2001 From: reya <123083837+reyamir@users.noreply.github.com> Date: Mon, 6 May 2024 15:17:34 +0700 Subject: [PATCH] feat: add notification screen --- apps/desktop2/src/components/col.tsx | 2 +- apps/desktop2/src/components/conversation.tsx | 13 +- apps/desktop2/src/components/notification.tsx | 34 +++++ apps/desktop2/src/routes/$account.tsx | 45 +++--- .../src/routes/activity.$account.messages.tsx | 5 + .../src/routes/activity.$account.texts.tsx | 60 ++++++++ .../desktop2/src/routes/activity.$account.tsx | 50 +++++++ .../src/routes/activity.$account.zaps.tsx | 64 ++++++++ apps/desktop2/src/routes/index.tsx | 14 +- apps/desktop2/src/routes/trending.notes.tsx | 3 +- apps/desktop2/src/routes/trending.tsx | 2 +- .../src/routes/users/$pubkey.lazy.tsx | 43 ------ apps/desktop2/src/routes/users/$pubkey.tsx | 95 ++++++++++++ .../routes/users/-components/eventList.tsx | 4 +- packages/ark/src/ark.ts | 83 ++++++----- packages/icons/src/bell.tsx | 5 +- packages/tsconfig/base.json | 40 ++--- packages/ui/src/container.tsx | 9 +- packages/ui/src/note/activity.tsx | 26 ++++ packages/ui/src/note/buttons/reply.tsx | 2 +- packages/ui/src/note/buttons/zap.tsx | 2 +- packages/ui/src/note/child.tsx | 2 - packages/ui/src/note/content.tsx | 1 - packages/ui/src/note/contentLarge.tsx | 4 +- packages/ui/src/note/index.ts | 2 + packages/utils/index.ts | 2 + packages/utils/package.json | 1 + packages/utils/src/groupBy.ts | 21 +++ packages/utils/src/invoice.ts | 17 +++ pnpm-lock.yaml | 9 ++ src-tauri/capabilities/main.json | 141 +++++++++--------- src-tauri/gen/schemas/capabilities.json | 2 +- src-tauri/src/commands/window.rs | 30 ++++ src-tauri/src/main.rs | 27 ++-- src-tauri/src/nostr/event.rs | 2 +- src-tauri/src/nostr/keys.rs | 35 +++++ src-tauri/src/nostr/metadata.rs | 95 ++++++++---- 37 files changed, 729 insertions(+), 263 deletions(-) create mode 100644 apps/desktop2/src/components/notification.tsx create mode 100644 apps/desktop2/src/routes/activity.$account.messages.tsx create mode 100644 apps/desktop2/src/routes/activity.$account.texts.tsx create mode 100644 apps/desktop2/src/routes/activity.$account.tsx create mode 100644 apps/desktop2/src/routes/activity.$account.zaps.tsx delete mode 100644 apps/desktop2/src/routes/users/$pubkey.lazy.tsx create mode 100644 apps/desktop2/src/routes/users/$pubkey.tsx create mode 100644 packages/ui/src/note/activity.tsx create mode 100644 packages/utils/src/groupBy.ts create mode 100644 packages/utils/src/invoice.ts diff --git a/apps/desktop2/src/components/col.tsx b/apps/desktop2/src/components/col.tsx index c6e06b8a..4dbf28f2 100644 --- a/apps/desktop2/src/components/col.tsx +++ b/apps/desktop2/src/components/col.tsx @@ -78,7 +78,7 @@ export function Col({ }); } }; - }, [webview]); + }, []); return (
diff --git a/apps/desktop2/src/components/conversation.tsx b/apps/desktop2/src/components/conversation.tsx index 212577e8..c344558f 100644 --- a/apps/desktop2/src/components/conversation.tsx +++ b/apps/desktop2/src/components/conversation.tsx @@ -12,10 +12,7 @@ export function Conversation({ className?: string; }) { const { ark } = useRouteContext({ strict: false }); - const thread = ark.parse_event_thread({ - content: event.content, - tags: event.tags, - }); + const thread = ark.parse_event_thread(event.tags); return ( @@ -26,9 +23,7 @@ export function Conversation({ )} >
- {thread?.rootEventId ? ( - - ) : null} + {thread?.root ? : null}
@@ -36,9 +31,7 @@ export function Conversation({
- {thread?.replyEventId ? ( - - ) : null} + {thread?.reply ? : null}
diff --git a/apps/desktop2/src/components/notification.tsx b/apps/desktop2/src/components/notification.tsx new file mode 100644 index 00000000..2af26d55 --- /dev/null +++ b/apps/desktop2/src/components/notification.tsx @@ -0,0 +1,34 @@ +import type { Event } from "@lume/types"; +import { Note } from "@lume/ui"; +import { cn } from "@lume/utils"; + +export function Notification({ + event, + className, +}: { + event: Event; + className?: string; +}) { + return ( + + +
+
+
+ +
+ +
+
+
+ +
+
+
+ ); +} diff --git a/apps/desktop2/src/routes/$account.tsx b/apps/desktop2/src/routes/$account.tsx index 740810f6..fcd713a4 100644 --- a/apps/desktop2/src/routes/$account.tsx +++ b/apps/desktop2/src/routes/$account.tsx @@ -1,5 +1,4 @@ -import { ComposeFilledIcon, PlusIcon, SearchIcon } from "@lume/icons"; -import type { Account } from "@lume/types"; +import { BellIcon, ComposeFilledIcon, PlusIcon, SearchIcon } from "@lume/icons"; import { User } from "@lume/ui"; import { cn } from "@lume/utils"; import { Outlet, createFileRoute } from "@tanstack/react-router"; @@ -10,9 +9,11 @@ export const Route = createFileRoute("/$account")({ }); function Screen() { - const navigate = Route.useNavigate(); + const { account } = Route.useParams(); const { ark, platform } = Route.useRouteContext(); + const navigate = Route.useNavigate(); + return (
-
-
+
+ +
@@ -63,7 +72,7 @@ export function Accounts() { const { ark } = Route.useRouteContext(); const { account } = Route.useParams(); - const [accounts, setAccounts] = useState([]); + const [accounts, setAccounts] = useState([]); const changeAccount = async (npub: string) => { if (npub === account) return; @@ -84,16 +93,12 @@ export function Accounts() { return (
{accounts.map((user) => ( - +
+ } + > + + {(events) => + events.map((event) => ( +
+ + +
+ + +
+ + +
+ +
+
+
+
+ )) + } +
+ + + ); +} diff --git a/apps/desktop2/src/routes/activity.$account.tsx b/apps/desktop2/src/routes/activity.$account.tsx new file mode 100644 index 00000000..41da28e8 --- /dev/null +++ b/apps/desktop2/src/routes/activity.$account.tsx @@ -0,0 +1,50 @@ +import { Box, Container } from "@lume/ui"; +import { cn } from "@lume/utils"; +import { Link, Outlet } from "@tanstack/react-router"; +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/activity/$account")({ + component: Screen, +}); + +function Screen() { + const { account } = Route.useParams(); + + return ( + + +
+
+ + {({ isActive }) => ( +
+ Notes +
+ )} + + + {({ isActive }) => ( +
+ Zaps +
+ )} + +
+
+
+ +
+
+
+ ); +} diff --git a/apps/desktop2/src/routes/activity.$account.zaps.tsx b/apps/desktop2/src/routes/activity.$account.zaps.tsx new file mode 100644 index 00000000..31349223 --- /dev/null +++ b/apps/desktop2/src/routes/activity.$account.zaps.tsx @@ -0,0 +1,64 @@ +import { Note, Spinner, User } from "@lume/ui"; +import { decodeZapInvoice } from "@lume/utils"; +import { Await, createFileRoute, defer } from "@tanstack/react-router"; +import { Suspense } from "react"; +import { Virtualizer } from "virtua"; + +export const Route = createFileRoute("/activity/$account/zaps")({ + loader: async ({ context, params }) => { + const ark = context.ark; + return { data: defer(ark.get_activities(params.account, "9735")) }; + }, + component: Screen, +}); + +function Screen() { + const { data } = Route.useLoaderData(); + + return ( + + + +
+ } + > + + {(events) => + events.map((event) => ( +
+ + +
+ ₿ {decodeZapInvoice(event.tags).bitcoinFormatted} +
+
+
+ + +
+
+ zapped you +
+
+
+
+
+ )) + } +
+ + + ); +} diff --git a/apps/desktop2/src/routes/index.tsx b/apps/desktop2/src/routes/index.tsx index 3cf16e63..204a4279 100644 --- a/apps/desktop2/src/routes/index.tsx +++ b/apps/desktop2/src/routes/index.tsx @@ -2,6 +2,7 @@ import { PlusIcon } from "@lume/icons"; import { Spinner, User } from "@lume/ui"; import { Link } from "@tanstack/react-router"; import { createFileRoute, redirect } from "@tanstack/react-router"; +import { invoke } from "@tauri-apps/api/core"; import { useState } from "react"; export const Route = createFileRoute("/")({ @@ -9,6 +10,11 @@ export const Route = createFileRoute("/")({ const ark = context.ark; const accounts = await ark.get_all_accounts(); + // Run notification service + if (accounts.length > 0) { + await invoke("run_notification", { accounts }); + } + switch (accounts.length) { // Guest account case 0: @@ -18,7 +24,7 @@ export const Route = createFileRoute("/")({ }); // Only 1 account, skip account selection screen case 1: { - const account = accounts[0].npub; + const account = accounts[0]; const loadedAccount = await ark.load_selected_account(account); if (loadedAccount) { @@ -83,10 +89,10 @@ function Screen() { {context.accounts.map((account) => (