import { useState } from "react"; import { useIntl } from "react-intl"; import { Input } from "@/components/input"; import { Label } from "@/components/label"; import { Collapse } from "@/components/collapse"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faGripVertical } from "@fortawesome/free-solid-svg-icons"; import { ChevronDownIcon } from "@heroicons/react/solid"; import { ChevronRightIcon } from "@heroicons/react/solid"; import classNames from "classnames"; import { TrashIcon } from "@heroicons/react/solid"; import { useUpdateEffect } from "react-use"; import { PlusIcon } from "@heroicons/react/solid"; import { ColorPicker } from "@/components/color-picker"; import { Switch } from "@/components/switch"; import { PaperAirplaneIcon } from "@heroicons/react/solid"; import { rgbaToHex } from "@/utils"; import { useMessage } from "@/components/message-editor/useMessage"; export default function EmbedsEditor() { const intl = useIntl(); const [message, setMessage] = useState({ content: "", embeds: [], buttons: [], }); const [webhookUrl, setWebhookUrl] = useState(""); const { post } = useMessage(); return (
setWebhookUrl(url as string)} />

preview will be here

); } const Form = ({ message, setMessage, }: { message: any; setMessage: (e: any) => void; }) => { return ( <>
setMessage({ ...message, username })} />
setMessage({ ...message, avatar_url })} />
setMessage({ ...message, content })} />
Embeds{" "} {message?.embeds?.length ?? 0} / 10

} parentClassName="col-span-2" onOpenClassName="rounded-b-none" className="bg-blue rounded-lg p-4 text-white font-sans text-base uppercase tracking-wider font-semibold" >
setMessage({ ...message, embeds })} />
Link Buttons {message?.buttons?.length ?? 0} / 25

} parentClassName="col-span-2" onOpenClassName="rounded-b-none" className="bg-blue rounded-lg p-4 text-white font-sans text-base uppercase tracking-wider font-semibold" >
setMessage({ ...message, buttons })} />
); }; const Embeds = ({ embeds, setEmbeds, }: { embeds: any[]; setEmbeds: (e: any) => void; }) => { const [open, setOpen] = useState(0); const onDelete = (i: number) => { const newEmbeds = embeds ?? []; newEmbeds.splice(i, 1); setEmbeds(newEmbeds); }; const setEmbed = (embed: any, index: number) => { const newEmbeds = embeds ?? []; newEmbeds[index] = embed; setEmbeds(newEmbeds); }; useUpdateEffect(() => setOpen(embeds?.length - 1), [embeds]); return ( <> {embeds?.map((embed: any, i: number) => (
setOpen(open === i ? -1 : i)} >

Embed {i + 1}

{ e.preventDefault(); e.stopPropagation(); }} > onDelete(i)} />
{open === i && (
setEmbed({ ...embed, author }, i)} /> setEmbed({ ...embed }, i)} /> setEmbed({ ...embed, fields }, i)} /> setEmbed({ ...newEmbed }, i)} />
setEmbed({ ...newEmbed }, i)} />
)}
{embeds?.length > 1 && (
)}
))}
); }; const Buttons = ({ buttons, setButtons, }: { buttons: any[]; setButtons: (e: any) => void; }) => { const [open, setOpen] = useState(0); const onDelete = (i: number) => { const newButtons = buttons ?? []; newButtons.splice(i, 1); setButtons(newButtons); }; const setButton = (button: any, index: number) => { const newButtons = buttons ?? []; newButtons[index] = button; setButtons(newButtons); }; useUpdateEffect(() => setOpen(buttons?.length - 1), [buttons]); return ( <> {buttons?.map((button: any, i: number) => (
setOpen(open === i ? -1 : i)} >

Button {i + 1}

{ e.preventDefault(); e.stopPropagation(); }} > onDelete(i)} />
{open === i && (
setButton({ ...button, label }, i)} />
setButton({ ...button, url }, i)} />
setButton( { ...button, emoji: { ...button?.emoji?.button, name }, }, i ) } />
setButton( { ...button, emoji: { ...button?.emoji?.button, id }, }, i ) } />
)}
{buttons?.length > 1 && (
)}
))}
); }; const Author = ({ author, setAuthor, }: { author: any; setAuthor: (a: any) => void; }) => { const [open, setOpen] = useState(true); return (
setOpen(!open)} > Author
{open && (
setAuthor({ ...author, name })} />
setAuthor({ ...author, url })} />
setAuthor({ ...author, icon_url })} />
)}
); }; const Body = ({ embed, setEmbed, }: { embed: any; setEmbed: (a: any) => void; }) => { const [open, setOpen] = useState(true); return (
setOpen(!open)} > Body
{open && (
setEmbed({ ...embed, title })} />
setEmbed({ ...embed, description })} />
setEmbed({ ...embed, url })} />
setEmbed({ ...embed, color })} /> { setEmbed({ ...embed, color: rgbaToHex(c) }); }} />
)}
); }; const Images = ({ embed, setEmbed, }: { embed: any; setEmbed: (a: any) => void; }) => { const [open, setOpen] = useState(true); return (
setOpen(!open)} > Images
{open && (
setEmbed({ ...embed, image: { url } })} />
setEmbed({ ...embed, thumbnail: { url } })} />
)}
); }; const Fields = ({ fields, setFields, }: { fields: any; setFields: (a: any) => void; }) => { const [open, setOpen] = useState(true); return (
setOpen(!open)} > Fields {fields?.length ?? 0}/25
{open && (
{fields?.map((field: any, i: number) => ( { const newFields = fields ?? []; newFields[i] = newField; setFields(newFields); }} onDelete={() => { const newFields = fields ?? []; newFields.splice(i, 1); setFields(newFields); }} /> ))}
)}
); }; const Field = ({ field, index, setField, onDelete, }: { field: any; index: number; setField: (e: any) => void; onDelete: () => void; }) => { const [open, setOpen] = useState(true); return (
setOpen(!open)} >

Field #{index + 1}

{ e.preventDefault(); e.stopPropagation(); }} >
{open && ( <>
setField({ ...field, name })} />
setField({ ...field, inline: !field?.inline })} />
setField({ ...field, value })} />
)}
); }; const Footer = ({ embed, setEmbed, }: { embed: any; setEmbed: (a: any) => void; }) => { const [open, setOpen] = useState(true); return (
setOpen(!open)} > Body
{open && (
setEmbed({ ...embed, footer: { ...embed?.footer, text } }) } />
setEmbed({ ...embed, footer: { ...embed?.footer, icon_url } }) } />
setEmbed({ ...embed, footer: { ...embed?.footer, timestamp } }) } />
)}
); };