import { BellIcon, ComposeFilledIcon, HorizontalDotsIcon, PlusIcon, SearchIcon, } from "@lume/icons"; import { Event, Kind } from "@lume/types"; import { User } from "@/components/user"; import { cn, decodeZapInvoice, displayNpub, sendNativeNotification, } from "@lume/utils"; import { Outlet, createFileRoute } from "@tanstack/react-router"; import { invoke } from "@tauri-apps/api/core"; import { getCurrent } from "@tauri-apps/api/window"; import { useEffect, useMemo, useState } from "react"; import { toast } from "sonner"; import * as Popover from "@radix-ui/react-popover"; export const Route = createFileRoute("/$account")({ beforeLoad: async ({ context }) => { const ark = context.ark; const accounts = await ark.get_all_accounts(); return { accounts }; }, component: Screen, }); function Screen() { const { ark, platform } = Route.useRouteContext(); const navigate = Route.useNavigate(); return (
); } function Accounts() { const { ark, accounts } = Route.useRouteContext(); const { account } = Route.useParams(); const [windowWidth, setWindowWidth] = useState(null); const navigate = Route.useNavigate(); const sortedList = useMemo(() => { const list = accounts; for (const [i, item] of list.entries()) { if (item === account) { list.splice(i, 1); list.unshift(item); } } return list; }, [accounts]); const changeAccount = async (npub: string) => { if (npub === account) { return await ark.open_profile(account); } // change current account and update signer const select = await ark.load_selected_account(npub); if (select) { return navigate({ to: "/$account/home", params: { account: npub } }); } else { toast.warning("Something wrong."); } }; const getWindowDimensions = () => { const { innerWidth: width, innerHeight: height } = window; return { width, height, }; }; useEffect(() => { function handleResize() { setWindowWidth(getWindowDimensions().width); } if (!windowWidth) setWindowWidth(getWindowDimensions().width); window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); }, []); return (
{sortedList .slice(0, windowWidth > 500 ? account.length : 2) .map((user) => ( ))} {accounts.length >= 3 && windowWidth <= 700 ? ( {sortedList.slice(2).map((user) => ( ))} ) : null}
); } function Bell() { const { ark } = Route.useRouteContext(); const { account } = Route.useParams(); const [count, setCount] = useState(0); useEffect(() => { const unlisten = getCurrent().listen( "activity", async (payload) => { setCount((prevCount) => prevCount + 1); await invoke("set_badge", { count }); const event: Event = JSON.parse(payload.payload); const user = await ark.get_profile(event.pubkey); const userName = user.display_name || user.name || displayNpub(event.pubkey, 16); switch (event.kind) { case Kind.Text: { sendNativeNotification("Mentioned you in a note", userName); break; } case Kind.Repost: { sendNativeNotification("Reposted your note", userName); break; } case Kind.ZapReceipt: { const amount = decodeZapInvoice(event.tags); sendNativeNotification( `Zapped ₿ ${amount.bitcoinFormatted}`, userName, ); break; } default: break; } }, ); return () => { unlisten.then((f) => f()); }; }, []); return ( ); }