flockstr/components/Modals/ShortTextNoteOnList.tsx
2023-10-20 15:26:55 -04:00

162 lines
4.5 KiB
TypeScript

import { useEffect, useState } from "react";
import FormModal from "./FormModal";
import { z } from "zod";
import useEvents from "@/lib/hooks/useEvents";
import { createEventHandler } from "@/lib/actions/create";
import { unixTimeNowInSeconds } from "@/lib/nostr/dates";
import { useModal } from "@/app/_providers/modal/provider";
import { toast } from "sonner";
import { useNDK } from "@/app/_providers/ndk";
import { useSigner, type SignerStoreItem } from "@/app/_providers/signer";
import { getTagValues } from "@/lib/nostr/utils";
import useCurrentUser from "@/lib/hooks/useCurrentUser";
import { saveEphemeralSigner } from "@/lib/actions/ephemeral";
import useLists from "@/lib/hooks/useLists";
import { getUrls } from "@/components/TextRendering";
const ShortTextNoteSchema = z.object({
content: z.string(),
list: z.string().optional(),
isPrivate: z.boolean().optional(),
});
type ShortTextNoteType = z.infer<typeof ShortTextNoteSchema>;
export default function ShortTextNoteModal() {
const modal = useModal();
const { lists, init } = useLists();
const [isLoading, setIsLoading] = useState(false);
const { currentUser } = useCurrentUser();
const [sent, setSent] = useState(false);
const { ndk } = useNDK();
const { getSigner } = useSigner()!;
useEffect(() => {
if (currentUser) {
void init(currentUser.pubkey);
}
}, [currentUser]);
// useEffect(() => {
// if (events.length) {
// console.log("Done!");
// setIsLoading(false);
// toast.success("List Updated!");
// modal?.hide();
// }
// }, [events]);
async function handleSubmit(data: ShortTextNoteType) {
setIsLoading(true);
if (!ndk) {
toast.error("Error connecting");
return;
}
const urls = getUrls(data.content);
const urlTags = urls.map((u) => ["r", u]);
if (data.list) {
const list = lists.find((l) => getTagValues("d", l.tags) === data.list);
if (!list) {
toast.error("No list found");
return;
}
let listSigner: SignerStoreItem | undefined = undefined;
if (data.isPrivate) {
listSigner = await getSigner(list);
if (!listSigner?.signer) {
toast.error("Error creating signer");
return;
}
if (!listSigner?.saved) {
console.log("Saving delegate...");
await saveEphemeralSigner(ndk!, listSigner.signer, {
associatedEvent: list,
keyProfile: {
name: listSigner.title,
picture: currentUser?.profile?.image,
lud06: currentUser?.profile?.lud06,
lud16: currentUser?.profile?.lud16,
},
});
}
}
console.log("about to create private event with ", listSigner);
const result = await createEventHandler(
ndk,
{
content: data.content,
kind: 1,
tags: [...urlTags],
},
data.isPrivate,
list,
listSigner?.signer,
);
if (result) {
toast.success("Note added!");
modal?.hide();
}
} else {
const result = await createEventHandler(
ndk,
{
content: data.content,
kind: 1,
tags: [...urlTags],
},
data.isPrivate,
);
if (result) {
toast.success("Note added!");
modal?.hide();
}
}
}
return (
<FormModal
title="Short Text Note"
fields={[
{
label: "Content",
type: "text-area",
slug: "content",
},
{
label: "Add to list",
type: "select-search",
placeholder: "Search your lists",
slug: "list",
options: lists
.map((l) => {
const title =
getTagValues("title", l.tags) ??
getTagValues("name", l.tags) ??
"Untitled";
const description = getTagValues("description", l.tags);
const value = getTagValues("d", l.tags);
if (!value) return;
return {
label: title,
description,
value: value,
};
})
.filter(Boolean),
},
{
label: "Private",
type: "toggle",
slug: "isPrivate",
},
]}
formSchema={ShortTextNoteSchema}
onSubmit={handleSubmit}
isSubmitting={isLoading}
cta={{
text: "Publish",
}}
/>
);
}