import { User } from "@/components/user"; import { ChevronDownIcon, ComposeFilledIcon, PlusIcon, SearchIcon, } from "@lume/icons"; import { LumeWindow, NostrAccount } from "@lume/system"; import { cn } from "@lume/utils"; import { Outlet, createFileRoute } from "@tanstack/react-router"; import { Menu, MenuItem, PredefinedMenuItem } from "@tauri-apps/api/menu"; import { getCurrent } from "@tauri-apps/api/window"; import { message } from "@tauri-apps/plugin-dialog"; import { memo, useCallback, useState } from "react"; export const Route = createFileRoute("/$account")({ beforeLoad: async ({ params }) => { const accounts = await NostrAccount.getAccounts(); const otherAccounts = accounts.filter( (account) => account !== params.account, ); return { otherAccounts }; }, component: Screen, }); function Screen() { const { platform } = Route.useRouteContext(); const openLumeStore = async () => { await getCurrent().emit("columns", { type: "add", column: { label: "store", name: "Store", content: "/store/official", }, }); }; return (
); } const Accounts = memo(function Accounts() { const { otherAccounts } = Route.useRouteContext(); const { account } = Route.useParams(); const navigate = Route.useNavigate(); const showContextMenu = useCallback( async (e: React.MouseEvent) => { e.preventDefault(); const menuItems = await Promise.all([ MenuItem.new({ text: "New Post", action: () => LumeWindow.openEditor(), }), PredefinedMenuItem.new({ item: "Separator" }), MenuItem.new({ text: "View Profile", action: () => LumeWindow.openProfile(account), }), MenuItem.new({ text: "Open Settings", action: () => LumeWindow.openSettings(), }), ]); const menu = await Menu.new({ items: menuItems, }); await menu.popup().catch((e) => console.error(e)); }, [account], ); const changeAccount = useCallback( async (npub: string) => { // Change current account and update signer const select = await NostrAccount.loadAccount(npub); if (select) { // Reset current columns await getCurrent().emit("columns", { type: "reset" }); // Redirect to new account return navigate({ to: "/$account/home", params: { account: npub }, resetScroll: true, replace: true, }); } else { await message("Something wrong.", { title: "Accounts", kind: "error" }); } }, [otherAccounts], ); return (
{otherAccounts.map((npub) => ( ))}
); }); const Search = memo(function Search() { const [searchType, setSearchType] = useState<"notes" | "users">("notes"); const [query, setQuery] = useState(""); const showContextMenu = useCallback(async (e: React.MouseEvent) => { e.preventDefault(); const menuItems = await Promise.all([ MenuItem.new({ text: "Notes", action: () => setSearchType("notes"), }), MenuItem.new({ text: "Users", action: () => setSearchType("users"), }), ]); const menu = await Menu.new({ items: menuItems, }); await menu.popup().catch((e) => console.error(e)); }, []); return (
setQuery(e.target.value)} onKeyDown={(event) => { if (event.key === "Enter") { LumeWindow.openSearch(searchType, query); } }} className="h-full w-full px-3 text-sm rounded-full border-none ring-0 focus:ring-0 focus:outline-none bg-transparent placeholder:text-black/50 dark:placeholder:text-white/50" />
); });