import { articlesStore, authInstance, languageStore } 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 { MediaViewer, ReactMarkdownComponent } from "@widgets"; interface SelectArticleModalProps { open: boolean; onClose: () => void; onSelectArticle: ( articleId: number, heading: string, body: string, media: { id: string; media_type: number; filename: string }[] ) => void; linkedArticleIds?: number[]; // 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 = async (event: KeyboardEvent) => { if (event.key.toLowerCase() === "enter") { event.preventDefault(); if (selectedArticleId) { const media = await authInstance.get( `/article/${selectedArticleId}/media` ); onSelectArticle( selectedArticleId, articlesStore.articleData?.heading || "", articlesStore.articleData?.body || "", media.data || [] ); onClose(); setSelectedArticleId(null); } } }; window.addEventListener("keydown", handleKeyPress); return () => { window.removeEventListener("keydown", handleKeyPress); }; }, [selectedArticleId, onSelectArticle, onClose]); const handleArticleClick = async (articleId: number) => { 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); } }; const filteredArticles = articles[languageStore.language].filter( (article) => !linkedArticleIds.includes(article.id) ); // .filter((article) => // article.service_name.toLowerCase().includes(searchQuery.toLowerCase()) // ); 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={async () => { const media = await authInstance.get( `/article/${article.id}/media` ); onSelectArticle( article.id, article.heading, article.body, media.data ); }} 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", }, }, }} > )) )} {articlesStore.articleMedia ? ( ) : ( )} {articlesStore.articleData?.heading || "Название cтатьи"} {articlesStore.articleData?.body && ( )} ); } );