import { Box, TextField, Typography, Paper } from "@mui/material"; import { Edit } from "@refinedev/mui"; import { useForm } from "@refinedev/react-hook-form"; import { Controller, FieldValues } from "react-hook-form"; import { useParams } from "react-router"; import React, { useState, useEffect, useMemo } from "react"; import ReactMarkdown from "react-markdown"; import { useList } from "@refinedev/core"; import { MarkdownEditor, LinkedItems } from "@components"; import { MediaItem, mediaFields } from "./types"; import "easymde/dist/easymde.min.css"; import { EVERY_LANGUAGE, Languages, languageStore, META_LANGUAGE } from "@stores"; import { observer } from "mobx-react-lite"; import { LanguageSelector, MediaView } from "@ui"; import rehypeRaw from "rehype-raw"; const MemoizedSimpleMDE = React.memo(MarkdownEditor); export const ArticleEdit = observer(() => { const { language, setLanguageAction } = languageStore; const [articleData, setArticleData] = useState({ heading: EVERY_LANGUAGE(""), body: EVERY_LANGUAGE("") }); const { id: articleId } = useParams<{ id: string }>(); const simpleMDEOptions = useMemo( () => ({ placeholder: "Введите контент в формате Markdown...", spellChecker: false, }), [] ); const { saveButtonProps, refineCore: { onFinish }, register, control, handleSubmit, watch, formState: { errors }, setValue, getValues, } = useForm<{ heading: string; body: string }>({ refineCoreProps: META_LANGUAGE(language) }); const bodyContent = watch("body"); const headingContent = watch("heading"); useEffect(() => { console.log(bodyContent) }, [bodyContent]) useEffect(() => { console.log(articleData) }, [articleData]) useEffect(() => { console.log("Trying to udpate") //setHeadingPreview(articleData.heading[language] ?? ""); //setPreview(articleData.body[language] ?? ""); if(articleData.heading[language]) setValue("heading", articleData.heading[language]); if(articleData.body[language]) setValue("body", articleData.body[language]); }, [language]); function updateTranslations(update: boolean = true) { const newArticleData = { heading: { ...articleData.heading, [language]: watch("heading") ?? "", }, body: { ...articleData.body, [language]: watch("body") ?? "", } } if(update) setArticleData(newArticleData); return newArticleData; } const handleLanguageChange = (lang: Languages) => { updateTranslations(); setLanguageAction(lang); console.log("Setting preview to", articleData.body[lang] ?? "") }; const handleFormSubmit = handleSubmit((values: FieldValues) => { return onFinish({ translations: updateTranslations(false) }); }); const { data: mediaData, refetch } = useList({ resource: `article/${articleId}/media`, }); useEffect(() => { return () => { setLanguageAction("ru"); }; }, [setLanguageAction]); return ( {/* Форма редактирования */} ( )} /> {articleId && ( type="edit" parentId={articleId} parentResource="article" childResource="media" fields={mediaFields} title="медиа" onUpdate={refetch} /> )} {/* Блок предпросмотра */} theme.palette.mode === "dark" ? "background.paper" : "#fff", }} > Предпросмотр {/* Заголовок статьи */} theme.palette.mode === "dark" ? "grey.300" : "grey.800", mb: 3, }} > {headingContent} {/* 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", }, }} > {bodyContent} {/* Привязанные медиа */} {mediaData?.data && mediaData.data.length > 0 && ( Привязанные медиа: {mediaData.data.map((media) => ( {/* {media.media_name} */} ))} )} ); });