// @widgets/LeftWidgetTab.tsx import { Box, Button, TextField, Paper, Typography } from "@mui/material"; import { BackButton, TabPanel, languageStore, SelectMediaDialog, editSightStore, SelectArticleModal, UploadMediaDialog, Language, articlesStore, } from "@shared"; import { LanguageSwitcher, ReactMarkdownComponent, ReactMarkdownEditor, MediaArea, MediaViewer, DeleteModal, } from "@widgets"; import { Trash2, ImagePlus, Unlink, Plus, Save, Search } from "lucide-react"; import { useState, useCallback } from "react"; import { observer } from "mobx-react-lite"; import { toast } from "react-toastify"; export const LeftWidgetTab = observer( ({ value, index }: { value: number; index: number }) => { const { sight, updateSightInfo, unlinkLeftArticle, updateSight, deleteLeftArticle, createLeftArticle, deleteMedia, uploadMediaOpen, setUploadMediaOpen, setFileToUpload, createLinkWithArticle, } = editSightStore; const { language } = languageStore; const data = sight[language]; const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const token = localStorage.getItem("token"); const [isSelectMediaDialogOpen, setIsSelectMediaDialogOpen] = useState(false); const [isSelectArticleDialogOpen, setIsSelectArticleDialogOpen] = useState(false); const handleDeleteLeftArticle = useCallback(() => { deleteLeftArticle(sight.common.left_article); setIsDeleteModalOpen(false); }, [deleteLeftArticle, sight.common.left_article]); const handleMediaSelected = useCallback( async (media: { id: string; filename: string; media_name?: string; media_type: number; }) => { await createLinkWithArticle(media); setIsSelectMediaDialogOpen(false); }, [createLinkWithArticle] ); const handleCloseMediaDialog = useCallback(() => { setIsSelectMediaDialogOpen(false); }, []); const handleCloseArticleDialog = useCallback(() => { setIsSelectArticleDialogOpen(false); }, []); const handleSelectArticle = useCallback( async ( articleId: number // heading: string, // body: string, // media: { id: string; media_type: number; filename: string }[] ) => { setIsSelectArticleDialogOpen(false); const ruArticle = await articlesStore.getArticle(articleId, "ru"); const enArticle = await articlesStore.getArticle(articleId, "en"); const zhArticle = await articlesStore.getArticle(articleId, "zh"); updateSightInfo("ru", { left: { heading: ruArticle.data.heading, body: ruArticle.data.body, media: ruArticle.data.media || [], }, }); updateSightInfo("en", { left: { heading: enArticle.data.heading, body: enArticle.data.body, media: enArticle.data.media || [], }, }); updateSightInfo("zh", { left: { heading: zhArticle.data.heading, body: zhArticle.data.body, media: zhArticle.data.media || [], }, }); updateSightInfo( languageStore.language, { left_article: articleId, }, true ); }, [] ); return ( <>

{sight[language].name}

Левая статья {sight.common.left_article ? ( <> ) : ( <> )} {sight.common.left_article > 0 && ( updateSightInfo(languageStore.language, { left: { heading: e.target.value, body: sight[languageStore.language].left.body, media: data.left.media, }, }) } variant="outlined" fullWidth /> updateSightInfo(languageStore.language, { left: { heading: sight[languageStore.language].left.heading, body: value, media: data.left.media, }, }) } /> { setFileToUpload(files[0]); setUploadMediaOpen(true); }} /> {data.left.media.length > 0 ? ( <> {sight.common.watermark_lu && ( preview )} {sight.common.watermark_rd && ( preview )} ) : ( )} {data?.left?.heading || "Название информации"} {sight[language as Language].address} {data?.left?.body && ( )} )}
setUploadMediaOpen(false)} contextObjectName={sight[languageStore.language].name} contextType="sight" isArticle={true} articleName={ sight[languageStore.language].left.heading || "Левая статья" } afterUpload={async (media) => { setUploadMediaOpen(false); setFileToUpload(null); await createLinkWithArticle(media); }} /> setIsDeleteModalOpen(false)} /> ); } );