import { Box, TextField, Typography, Paper } from "@mui/material"; import { Create } from "@refinedev/mui"; import { useForm } from "@refinedev/react-hook-form"; import { Controller } from "react-hook-form"; import React, { useState, useEffect } from "react"; import ReactMarkdown from "react-markdown"; import Cookies from "js-cookie"; import { MarkdownEditor } from "../../components/MarkdownEditor"; import "easymde/dist/easymde.min.css"; const MemoizedSimpleMDE = React.memo(MarkdownEditor); export const ArticleCreate = () => { const [language, setLanguage] = useState(Cookies.get("lang")!); const [articleData, setArticleData] = useState<{ ru: { heading: string; body: string }; en: { heading: string; body: string }; zh: { heading: string; body: string }; }>({ ru: { heading: "", body: "" }, en: { heading: "", body: "" }, zh: { heading: "", body: "" }, }); const { saveButtonProps, refineCore: { formLoading }, register, control, watch, formState: { errors }, setValue, } = useForm({ refineCoreProps: { resource: "article/", meta: { headers: { "Accept-Language": language, }, }, }, }); useEffect(() => { const lang = Cookies.get("lang")!; Cookies.set("lang", language); return () => { Cookies.set("lang", lang); }; }, [language]); useEffect(() => { setValue( "heading", articleData[language as keyof typeof articleData]?.heading || "" ); setValue( "body", articleData[language as keyof typeof articleData]?.body || "" ); setPreview(articleData[language as keyof typeof articleData]?.body || ""); setHeadingPreview( articleData[language as keyof typeof articleData]?.heading || "" ); }, [language, articleData, setValue]); const handleLanguageChange = (lang: string) => { setArticleData((prevData) => ({ ...prevData, [language]: { heading: watch("heading") || "", body: watch("body") || "", }, })); setLanguage(lang); Cookies.set("lang", lang); }; const [preview, setPreview] = useState(""); const [headingPreview, setHeadingPreview] = useState(""); // Следим за изменениями в полях body и heading const bodyContent = watch("body"); const headingContent = watch("heading"); useEffect(() => { setPreview(bodyContent || ""); }, [bodyContent]); useEffect(() => { setHeadingPreview(headingContent || ""); }, [headingContent]); const simpleMDEOptions = React.useMemo( () => ({ placeholder: "Введите контент в формате Markdown...", spellChecker: false, }), [] ); return ( {/* Форма создания */} handleLanguageChange("ru")} > RU handleLanguageChange("en")} > EN handleLanguageChange("zh")} > ZH ( )} /> {/* Блок предпросмотра */} theme.palette.mode === "dark" ? "background.paper" : "#fff", }} > Предпросмотр {/* Заголовок статьи */} theme.palette.mode === "dark" ? "grey.300" : "grey.800", mb: 3, }} > {headingPreview} {/* Markdown контент */} theme.palette.mode === "dark" ? "grey.300" : "grey.800", }, "& a": { color: "primary.main", textDecoration: "none", "&:hover": { textDecoration: "underline", }, }, "& blockquote": { borderLeft: "4px solid", borderColor: "primary.main", pl: 2, my: 2, color: "text.secondary", }, "& code": { bgcolor: (theme) => theme.palette.mode === "dark" ? "grey.900" : "grey.100", p: 0.5, borderRadius: 0.5, color: "primary.main", }, }} > {preview} ); };