import { articlesStore } from "@shared"; import { observer } from "mobx-react-lite"; import { useEffect, useState } from "react"; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField, List, ListItemButton, ListItemText, Paper, Box, Typography, InputAdornment, } from "@mui/material"; import { ImagePlus, Search } from "lucide-react"; import { ReactMarkdownComponent } from "@widgets"; interface SelectArticleModalProps { open: boolean; onClose: () => void; onSelectArticle: (articleId: string) => void; linkedArticleIds?: string[]; // Add optional prop for linked articles } export const SelectArticleModal = observer( ({ open, onClose, onSelectArticle, linkedArticleIds = [], }: SelectArticleModalProps) => { const { articles, getArticle, getArticleMedia } = articlesStore; const [searchQuery, setSearchQuery] = useState(""); const [selectedArticleId, setSelectedArticleId] = useState( null ); const [isLoading, setIsLoading] = useState(false); // Reset selection when modal opens/closes useEffect(() => { if (open) { setSelectedArticleId(null); articlesStore.articleData = null; articlesStore.articleMedia = null; } }, [open]); useEffect(() => { const handleKeyPress = (event: KeyboardEvent) => { if (event.key.toLowerCase() === "enter") { event.preventDefault(); if (selectedArticleId) { onSelectArticle(selectedArticleId); onClose(); } } }; window.addEventListener("keydown", handleKeyPress); return () => { window.removeEventListener("keydown", handleKeyPress); }; }, [selectedArticleId, onSelectArticle, onClose]); const handleArticleClick = async (articleId: string) => { if (selectedArticleId === articleId) return; setSelectedArticleId(articleId); setIsLoading(true); try { await Promise.all([ getArticle(Number(articleId)), getArticleMedia(Number(articleId)), ]); } catch (error) { console.error("Failed to fetch article data:", error); // Reset article data on error articlesStore.articleData = null; articlesStore.articleMedia = null; } finally { setIsLoading(false); } }; // @ts-ignore const filteredArticles = articles // @ts-ignore .filter((article) => !linkedArticleIds.includes(article.id)) // @ts-ignore .filter((article) => article.service_name.toLowerCase().includes(searchQuery.toLowerCase()) ); const token = localStorage.getItem("token"); return ( Выберите существующую статью setSearchQuery(e.target.value)} sx={{ mb: 2, mt: 1, px: 2 }} InputProps={{ startAdornment: ( ), }} /> {filteredArticles.length === 0 ? ( {searchQuery ? "Статьи не найдены" : "Нет доступных статей"} ) : ( // @ts-ignore filteredArticles.map((article) => ( handleArticleClick(article.id)} onDoubleClick={() => onSelectArticle(article.id)} selected={selectedArticleId === article.id} disabled={isLoading} sx={{ borderRadius: 1, mb: 0.5, "&:hover": { backgroundColor: "action.hover", }, "&.Mui-selected": { backgroundColor: "primary.main", color: "primary.contrastText", "&:hover": { backgroundColor: "primary.dark", }, }, }} > )) )} {isLoading ? ( Загрузка... ) : ( <> {articlesStore.articleMedia && ( {articlesStore.articleMedia.filename} )} {!articlesStore.articleMedia && ( )} {articlesStore.articleData?.heading || "Выберите статью"} {articlesStore.articleData?.body ? ( ) : ( Предпросмотр статьи появится здесь )} )} ); } );