"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import Container from "./components/Container"; import { CardTitle, CardDescription } from "@/components/ui/card"; import { type Event } from "nostr-tools"; import { cn } from "@/lib/utils"; import { useNDK } from "@/app/_providers/ndk"; import { RiArrowRightLine, RiLockLine } from "react-icons/ri"; import { HiOutlineLockOpen } from "react-icons/hi"; import { decryptMessage } from "@/lib/nostr"; import { NDKUser } from "@nostr-dev-kit/ndk"; import { log } from "@/lib/utils"; import { EventSchema } from "@/types"; import KindCard from "@/components/KindCard"; import Spinner from "../spinner"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import useCurrentUser from "@/lib/hooks/useCurrentUser"; import { unlockEvent } from "@/lib/actions/create"; import { type KindCardProps } from "./"; export default function Kind3745(props: KindCardProps) { const { pubkey, content, id } = props; const { currentUser } = useCurrentUser(); const [error, setError] = useState(""); const [passphrase, setPassphrase] = useState(""); const [fetchingEvent, setFetchingEvent] = useState(false); const [decryptedEvent, setDecryptedEvent] = useState(); const { ndk, fetchEvents } = useNDK(); useEffect(() => { if (ndk && !fetchingEvent && !decryptedEvent) { void handleFetchEvent(); } }, [ndk]); async function handleFetchEvent() { if (!ndk) return; log("func", `handleFetchEvent(${pubkey})`); setFetchingEvent(true); try { const directMessageEvent = await ndk!.fetchEvent({ kinds: [4], authors: [pubkey], ["#e"]: [id], }); if (directMessageEvent) { log("info", "direct msg decryption"); console.log(directMessageEvent); await directMessageEvent.decrypt( new NDKUser({ hexpubkey: pubkey }), ndk!.signer, ); const passphrase_ = directMessageEvent.content; if (!passphrase_) { setError("Unable to parse event"); return; } setPassphrase(passphrase_); const decrypedData = await decryptMessage(content, passphrase_); console.log("Decrypted", decrypedData); const hiddenEvent = EventSchema.safeParse( JSON.parse(decrypedData ?? ""), ); if (hiddenEvent.success) { setDecryptedEvent(hiddenEvent.data); } else { setError("Unable to parse event"); } } } catch (err) { setError("Unable to parse event"); console.log("ERROR", err); } finally { setFetchingEvent(false); } } async function handleUnlockEvent() { await unlockEvent(ndk!, props, passphrase); window.location.reload(); } if (decryptedEvent) { return (
{currentUser?.pubkey === decryptedEvent.pubkey && (

Unlock Content

)}
); } return (
The start of the Nostr revolution Here is some secret text. If you are reading this, that means you've tried some sneaky css tricks to reveal what was hidden 🫣. Unfourtunatly, CSS won't be able to help you here. In fact, I can't even reveal this if I wanted to. Only the correct private key can reveal it.
{fetchingEvent ? (
) : (
Content locked

Subscribe to reveal

)}
); }