From d96e213125a725a5678163daff0e6d6a84fb3238 Mon Sep 17 00:00:00 2001 From: mroxso <24775431+mroxso@users.noreply.github.com> Date: Sun, 25 Aug 2024 21:24:32 +0200 Subject: [PATCH] display if note is liked by logged in user and submit reaction --- lumina/components/ReactionButton.tsx | 121 +++++++++++------- .../ReactionButtonReactionListItem.tsx | 2 +- 2 files changed, 78 insertions(+), 45 deletions(-) diff --git a/lumina/components/ReactionButton.tsx b/lumina/components/ReactionButton.tsx index 16565e8..cfc88e3 100644 --- a/lumina/components/ReactionButton.tsx +++ b/lumina/components/ReactionButton.tsx @@ -5,6 +5,7 @@ import { getEventHash, getPublicKey, finalizeEvent, + nip19, } from "nostr-tools"; import { Button } from "@/components/ui/button"; import { @@ -19,74 +20,108 @@ import { } from "@/components/ui/drawer" import { ReloadIcon } from "@radix-ui/react-icons"; import ReactionButtonReactionList from "./ReactionButtonReactionList"; +import { FormEvent } from "react"; +import { createHash } from "crypto"; +import { bytesToHex, hexToBytes } from '@noble/hashes/utils' export default function ReactionButton({ event }: { event: any }) { + const { publish } = useNostr(); + + const loginType = typeof window !== 'undefined' ? window.localStorage.getItem('loginType') : null; + const pubkey = typeof window !== 'undefined' ? window.localStorage.getItem('pubkey') : null; + const { events, isLoading } = useNostrEvents({ filter: { - // since: dateToUnix(now.current), // all new events from now - // since: 0, - // limit: 100, '#e': [event.id], kinds: [7], }, }); - // filter out all events that also have another e tag with another id - // this will filter out likes that are made on comments and not on the note itself + let eventLiked = false; + let eventLikedEvent = null; + for(event of events) { + console.log(event.pubkey) + if(event.pubkey == pubkey ) { + eventLiked = true; + eventLikedEvent = event; + break; + } + } + if(eventLiked) { + console.log("EVENT LIKED!") + // if(eventLikedEvent.content === '💜' || eventLikedEvent.content === '+') { + document.getElementById("heartReactionButton")?.classList.add("bg-purple-400"); + document.getElementById("upReactionButton")?.classList.remove("bg-purple-400"); + document.getElementById("downReactionButton")?.classList.remove("bg-purple-400"); + // } + document.getElementById("reactionButton")?.classList.add("bg-blue-500"); + } + const filteredEvents = events.filter((event) => { return event.tags.filter((tag) => { return tag[0] === '#e' && tag[1] !== event.id }).length === 0 }); - // const { publish } = useNostr(); + async function onSubmit(content: string) { + const createdAt = Math.floor(Date.now() / 1000); - // const onPost = async () => { - // const privKey = prompt("Paste your private key:"); + var tags: [[String, any]] = event.tags.filter((tag: [string]) => tag.length >= 2 && (tag[0] == "e" || tag[0] == "p")); + tags.push(["e", event.id]); + tags.push(["p", event.pubkey]); + tags.push(["k", event.kind]); - // if (!privKey) { - // alert("no private key provided"); - // return; - // } - - // const message = prompt("Enter the message you want to send:"); - - // if (!message) { - // alert("no message provided"); - // return; - // } - - // const event: NostrEvent = { - // content: message, - // kind: 1, - // tags: [], - // created_at: dateToUnix(), - // pubkey: getPublicKey(privKey), - // id: "", - // sig: "" - // }; - - // event.id = getEventHash(event); - // event.sig = getSignature(event, privKey); - - // publish(event); - // }; + let noteEvent = { + kind: 7, + content: content, + tags: tags, + created_at: createdAt, + }; + + let signedEvent: NostrEvent | null = null; + + if (loginType === 'extension') { + signedEvent = await window.nostr.signEvent(noteEvent); + } else if (loginType === 'amber') { + alert('Signing with Amber is not implemented yet, sorry!'); + } else if (loginType === 'raw_nsec') { + if (typeof window !== 'undefined') { + let nsecStr = null; + nsecStr = window.localStorage.getItem('nsec'); + if (nsecStr != null) { + signedEvent = finalizeEvent(noteEvent, hexToBytes(nsecStr)); + } + } + } + + if (signedEvent) { + console.log("final Event: ") + console.log(signedEvent) + publish(signedEvent); + } + + if (signedEvent != null) { + if(content === "💜") { + document.getElementById("heartReactionButton")?.classList.add("bg-purple-100"); + document.getElementById("upReactionButton")?.classList.remove("bg-purple-100"); + document.getElementById("downReactionButton")?.classList.remove("bg-purple-100"); + } + } + } return ( - {/* {events.length} Reactions */} {isLoading ? ( - 💜 + 💜 ) : ( - {filteredEvents.length} 💜 + {filteredEvents.length} 💜 )} Reactions - {/* TODO: Create Reaction Event on Click */} - 💜 - 👍 - 👎 + onSubmit("💜")}>💜 + onSubmit("👍")}>👍 + onSubmit("👎")}>👎 @@ -97,7 +132,5 @@ export default function ReactionButton({ event }: { event: any }) { - - // {events.length} Reactions ); } \ No newline at end of file diff --git a/lumina/components/ReactionButtonReactionListItem.tsx b/lumina/components/ReactionButtonReactionListItem.tsx index 6dff4cc..315b6c6 100644 --- a/lumina/components/ReactionButtonReactionListItem.tsx +++ b/lumina/components/ReactionButtonReactionListItem.tsx @@ -24,7 +24,7 @@ export default function ReactionButtonReactionListItem({ event }: { event: Nostr const profileImageSrc = userData?.picture || "https://robohash.org/" + pubkey; const content = event.content; - console.log("event", event.content); + // console.log("event", event.content); return (