"use client"; import { useEffect, useState } from "react"; import Image from "next/image"; import dynamic from "next/dynamic"; import { Button } from "@/components/ui/button"; import useProfile from "@/lib/hooks/useProfile"; import { nip19 } from "nostr-tools"; import useEvents from "@/lib/hooks/useEvents"; import Spinner from "@/components/spinner"; import { getTagValues, getTagsValues } from "@/lib/nostr/utils"; import ProfileInfo from "./ProfileInfo"; import useCurrentUser from "@/lib/hooks/useCurrentUser"; import { useNDK } from "@/app/_providers/ndk"; import { toast } from "sonner"; import { sendZap, checkPayment, updateListUsersFromZaps, } from "@/lib/actions/zap"; import { useModal } from "@/app/_providers/modal/provider"; const EditListModal = dynamic(() => import("@/components/Modals/EditList"), { ssr: false, }); const CreateEventModal = dynamic(() => import("@/components/Modals/NewEvent"), { ssr: false, }); export default function Header({ naddr }: { naddr: string }) { const { currentUser } = useCurrentUser(); const modal = useModal(); const { ndk } = useNDK(); const [sendingZap, setSendingZap] = useState(false); const [checkingPayment, setCheckingPayment] = useState(false); const [hasValidPayment, setHasValidPayment] = useState(false); const [syncingUsers, setSyncingUsers] = useState(false); const { type, data } = nip19.decode(naddr); console.log("PASSED", naddr, data); if (type !== "naddr") { throw new Error("Invalid list"); } const { identifier, kind, pubkey } = data; const { profile } = useProfile(pubkey); const { events } = useEvents({ filter: { authors: [pubkey], kinds: [kind], ["#d"]: [identifier], limit: 1, }, }); const event = events[0]; if (!event) { return (
); } const noteIds = getTagsValues("e", event.tags).filter(Boolean); console.log("notes", event.tags); const title = getTagValues("title", event.tags) ?? getTagValues("name", event.tags) ?? "Untitled"; const image = getTagValues("image", event.tags) ?? getTagValues("picture", event.tags) ?? getTagValues("banner", event.tags) ?? profile?.banner; const description = getTagValues("description", event.tags); const rawEvent = event.rawEvent(); const subscriptionsEnabled = !!getTagValues("subscriptions", rawEvent.tags); const priceInBTC = getTagValues("price", rawEvent.tags); const isMember = currentUser && getTagsValues("p", rawEvent.tags).includes(currentUser.pubkey); useEffect(() => { if (!currentUser || !subscriptionsEnabled) return; if (!isMember && !checkingPayment && !hasValidPayment) { void handleCheckPayment(); } }, [isMember, currentUser]); async function handleCheckPayment() { if (!event) return; setCheckingPayment(true); console.log("Checking payment"); try { const result = await checkPayment( ndk!, event.tagId(), currentUser!.hexpubkey, rawEvent, ); console.log("Payment result", result); if (result) { setHasValidPayment(true); } } catch (err) { console.log("error sending zap", err); } finally { setCheckingPayment(false); } } async function handleSyncUsers() { if (!event) return; setSyncingUsers(true); try { console.log("handleSyncUsers"); await updateListUsersFromZaps(ndk!, event.tagId(), rawEvent); toast.success("Users Synced!"); } catch (err) { console.log("error syncing users", err); } finally { setSyncingUsers(false); } } return (
{!!image && ( banner )}

{title}

{!!currentUser && currentUser.pubkey === pubkey && ( <> )} {subscriptionsEnabled && !isMember && }
{!!description && (

{description}

)}
); }