@@ -154,7 +145,7 @@ export default function Header({ event }: { event: NDKEvent }) {
{!!currentUser && currentUser.pubkey === pubkey && (
)}
- {!isMember &&
}
+ {!isMember &&
}
{/* {!isMember &&
(hasValidPayment ? (
diff --git a/app/(app)/event/[naddr]/_components/RSVPButton.tsx b/app/(app)/event/[naddr]/_components/RSVPButton.tsx
index f44e9c5..d68697e 100644
--- a/app/(app)/event/[naddr]/_components/RSVPButton.tsx
+++ b/app/(app)/event/[naddr]/_components/RSVPButton.tsx
@@ -1,19 +1,146 @@
+import { useState } from "react";
+
import { Button } from "@/components/ui/button";
-import { useModal } from "@/app/_providers/modal/provider";
+import { HiOutlineLightningBolt } from "react-icons/hi";
+
import RSVPModal from "@/components/Modals/RSVP";
+import ConfirmModal from "@/components/Modals/Confirm";
+
+import { type NDKEvent } from "@nostr-dev-kit/ndk";
+import { getTagAllValues, getTagValues } from "@/lib/nostr/utils";
+import { formatDate } from "@/lib/utils/dates";
+
+import { useModal } from "@/app/_providers/modal/provider";
+import { btcToSats, formatNumber } from "@/lib/utils";
+import useCurrentUser from "@/lib/hooks/useCurrentUser";
+import { useNDK } from "@/app/_providers/ndk";
+import { toast } from "sonner";
+
+import { sendZap, checkPayment } from "@/lib/actions/zap";
type RSVPButtonProps = {
- eventReference: string;
+ event: NDKEvent;
};
-export default function RSVPButton({ eventReference }: RSVPButtonProps) {
+export default function RSVPButton({ event }: RSVPButtonProps) {
const modal = useModal();
+ const { currentUser } = useCurrentUser();
+ const { ndk } = useNDK();
+ const eventReference = event.encode();
+ const name = getTagValues("name", event.tags);
+ const tickets = getTagValues("tickets", event.tags);
+ const price = getTagAllValues("price", event.tags);
+ const priceInBTC = parseFloat(getTagValues("price", event.tags) ?? "0");
+ const [ticketPending, setTicketPending] = useState(false);
+ const [checkingPayment, setCheckingPayment] = useState(false);
+ const [hasValidPayment, setHasValidPayment] = useState(false);
+ async function handleBuyTicket() {
+ setTicketPending(true);
+ try {
+ if (!currentUser || !ndk?.signer) return;
+
+ const result = await sendZap(
+ ndk!,
+ btcToSats(priceInBTC),
+ event.rawEvent(),
+ `Ticket payment: ${name}`,
+ );
+ toast.success("Payment Sent!");
+ void handleCheckPayment();
+ } catch (err) {
+ console.log("error sending zap", err);
+ } finally {
+ setTicketPending(false);
+ }
+ }
+
+ async function handleCheckPayment() {
+ if (!event || !currentUser || !ndk) return;
+ setCheckingPayment(true);
+ try {
+ const result = await checkPayment(
+ ndk,
+ event.tagId(),
+ currentUser.pubkey,
+ event.rawEvent(),
+ );
+ console.log("Payment result", result);
+ if (result) {
+ setHasValidPayment(true);
+ }
+ } catch (err) {
+ console.log("error sending zap", err);
+ } finally {
+ setCheckingPayment(false);
+ }
+ }
+ if (!tickets) {
+ return (
+
+ );
+ }
+ if (price) {
+ return (
+
+ );
+ }
return (
);
}
diff --git a/app/globals.css b/app/globals.css
index b2d3d42..4b169d1 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -130,3 +130,14 @@ input[type="time"]::-webkit-calendar-picker-indicator {
background: none;
display: none;
}
+/* Chrome, Safari, Edge, Opera */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+/* Firefox */
+input[type="number"] {
+ -moz-appearance: textfield;
+}