import { Dialog, Transition } from "@headlessui/react"; import { createChannel } from "@libs/storage"; import { NDKEvent, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk"; import { AvatarUploader } from "@shared/avatarUploader"; import { Button } from "@shared/button"; import { CancelIcon, LoaderIcon, PlusIcon } from "@shared/icons"; import { Image } from "@shared/image"; import { RelayContext } from "@shared/relayProvider"; import { useActiveAccount } from "@stores/accounts"; import { DEFAULT_AVATAR } from "@stores/constants"; import { dateToUnix } from "@utils/date"; import { Fragment, useContext, useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { navigate } from "vite-plugin-ssr/client/router"; export function ChannelCreateModal() { const ndk = useContext(RelayContext); const account = useActiveAccount((state: any) => state.account); const [isOpen, setIsOpen] = useState(false); const [image, setImage] = useState(DEFAULT_AVATAR); const [loading, setLoading] = useState(false); const closeModal = () => { setIsOpen(false); }; const openModal = () => { setIsOpen(true); }; const { register, handleSubmit, reset, setValue, formState: { isDirty, isValid }, } = useForm(); const onSubmit = (data: any) => { setLoading(true); try { const signer = new NDKPrivateKeySigner(account.privkey); ndk.signer = signer; const event = new NDKEvent(ndk); // build event event.content = JSON.stringify(data); event.kind = 40; event.created_at = dateToUnix(); event.pubkey = account.pubkey; event.tags = []; // publish event event.publish(); // insert to database createChannel(event.id, event.pubkey, event.content, event.created_at); // reset form reset(); setTimeout(() => { // close modal setIsOpen(false); // redirect to channel page navigate(`/app/channel?id=${event.id}`); }, 1000); } catch (e) { console.log("error: ", e); } }; useEffect(() => { setValue("picture", image); }, [setValue, image]); return ( <> openModal()} className="inline-flex h-9 items-center gap-2.5 rounded-md px-2.5" > Add a new channel Create channel Channels are freedom square, everyone can speech freely, no one can stop you or deceive what to speech Picture Channel name * Description Encrypted All messages are encrypted and only invited members can view and send message {loading ? ( ) : ( "Create channel" )} > ); }
All messages are encrypted and only invited members can view and send message