import { mediaStore } from "@shared"; import { observer } from "mobx-react-lite"; import { useEffect, useState } from "react"; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField, List, ListItemButton, ListItemText, Paper, Typography, InputAdornment, } from "@mui/material"; import { Search } from "lucide-react"; import { MediaViewer } from "@widgets"; interface SelectMediaDialogProps { open: boolean; // Corrected prop name onClose: () => void; onSelectMedia: (media: { id: string; filename: string; media_name?: string; media_type: number; }) => void; // Renamed from onSelectArticle linkedMediaIds?: string[]; // Renamed from linkedArticleIds, assuming it refers to media already in use } export const SelectMediaDialog = observer( ({ open, // Corrected prop name onClose, onSelectMedia, // Renamed prop linkedMediaIds = [], // Default to empty array if not provided, renamed }: SelectMediaDialogProps) => { const { media, getMedia } = mediaStore; const [searchQuery, setSearchQuery] = useState(""); const [hoveredMediaId, setHoveredMediaId] = useState(null); // Fetch media on component mount useEffect(() => { getMedia(); }, [getMedia]); // Keyboard event listener for "Enter" key to select hovered media useEffect(() => { const handleKeyPress = (event: KeyboardEvent) => { if (event.key === "Enter") { event.preventDefault(); // Prevent browser default action (e.g., form submission) if (hoveredMediaId) { const mediaItem = media.find((m) => m.id === hoveredMediaId); if (mediaItem) { onSelectMedia(mediaItem); } onClose(); } } }; window.addEventListener("keydown", handleKeyPress); return () => { window.removeEventListener("keydown", handleKeyPress); }; }, [hoveredMediaId, onSelectMedia, onClose]); // Dependencies for keyboard listener const filteredMedia = media .filter((mediaItem) => !linkedMediaIds.includes(mediaItem.id)) // Use mediaItem to avoid name collision .filter((mediaItem) => mediaItem.media_name.toLowerCase().includes(searchQuery.toLowerCase()) ); // Find the currently hovered media object for MediaViewer const currentHoveredMedia = hoveredMediaId ? media.find((m) => m.id === hoveredMediaId) : null; return ( Выберите существующее медиа {" "} {/* Added padding for consistency */} setSearchQuery(e.target.value)} sx={{ mb: 2, mt: 1 }} InputProps={{ startAdornment: ( ), }} /> {filteredMedia.length > 0 ? ( filteredMedia.map( ( mediaItem // Use mediaItem to avoid confusion ) => ( setHoveredMediaId(mediaItem.id)} // Call onSelectMedia onDoubleClick={() => { onSelectMedia(mediaItem); onClose(); }} sx={{ borderRadius: 1, mb: 0.5, "&:hover": { backgroundColor: "action.hover", }, }} > ) ) ) : ( Медиа не найдено или все медиа уже прикреплены. )} {currentHoveredMedia ? ( // Only render MediaViewer if currentHoveredMedia is found ) : ( Наведите на медиа в списке для предпросмотра. )} ); } );