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) => (