import { NodeViewProps, NodeViewWrapper } from "@tiptap/react"; import { useMemo } from "react"; import clsx from "clsx"; import { ActionIcon, AspectRatio, Button, Card, FocusTrap, Group, Popover, Text, TextInput, } from "@mantine/core"; import { IconEdit } from "@tabler/icons-react"; import { z } from "zod"; import { useForm, zodResolver } from "@mantine/form"; import { getEmbedProviderById, getEmbedUrlAndProvider, } from "@/features/editor/components/embed/providers.ts"; import { notifications } from "@mantine/notifications"; import { useTranslation } from "react-i18next"; import i18n from "i18next"; const schema = z.object({ url: z .string() .trim() .url({ message: i18n.t("Please enter a valid url") }), }); export default function EmbedView(props: NodeViewProps) { const { t } = useTranslation(); const { node, selected, updateAttributes } = props; const { src, provider } = node.attrs; const embedUrl = useMemo(() => { if (src) { return getEmbedUrlAndProvider(src).embedUrl; } return null; }, [src]); const embedForm = useForm<{ url: string }>({ initialValues: { url: "", }, validate: zodResolver(schema), }); async function onSubmit(data: { url: string }) { if (provider) { const embedProvider = getEmbedProviderById(provider); if (embedProvider.regex.test(data.url)) { updateAttributes({ src: data.url }); } else { notifications.show({ message: t("Invalid {{provider}} embed link", { provider: embedProvider.name, }), position: "top-right", color: "red", }); } } } return ( {embedUrl ? ( <> ) : (
{t("Embed {{provider}}", { provider: getEmbedProviderById(provider).name, })}
)}
); }