import { Media, 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 onSelectForSightMedia?: (mediaId: string) => void; linkedMediaIds?: string[]; // Renamed from linkedArticleIds, assuming it refers to media already in use mediaType?: number; } export const SelectMediaDialog = observer( ({ open, // Corrected prop name onClose, onSelectMedia, // Renamed prop onSelectForSightMedia, linkedMediaIds = [], // Default to empty array if not provided, renamed mediaType, }: SelectMediaDialogProps) => { const { media, getMedia } = mediaStore; const [searchQuery, setSearchQuery] = useState(""); const [hoveredMediaId, setHoveredMediaId] = useState(null); const [currentHoveredMedia, setCurrentHoveredMedia] = useState(null); useEffect(() => { if (hoveredMediaId) { setCurrentHoveredMedia( media.find((m) => m.id === hoveredMediaId) ?? null ); } }, [hoveredMediaId]); const handleClose = () => { setHoveredMediaId(null); setCurrentHoveredMedia(null); onClose(); setSearchQuery(""); }; 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) { if (onSelectForSightMedia) { onSelectForSightMedia(mediaItem.id); } else if (onSelectMedia) { onSelectMedia(mediaItem); } } handleClose(); } } }; window.addEventListener("keydown", handleKeyPress); return () => { window.removeEventListener("keydown", handleKeyPress); }; }, [hoveredMediaId, onSelectMedia, onClose]); // Dependencies for keyboard listener let filteredMedia = media .filter((mediaItem) => !linkedMediaIds.includes(mediaItem.id)) // Use mediaItem to avoid name collision .filter((mediaItem) => mediaItem.media_name.toLowerCase().includes(searchQuery.toLowerCase()) ); if (mediaType) { filteredMedia = filteredMedia.filter( (mediaItem) => mediaItem.media_type === mediaType ); } 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={() => { if (onSelectForSightMedia) { onSelectForSightMedia(mediaItem.id); } else if (onSelectMedia) { onSelectMedia(mediaItem); } handleClose(); }} selected={hoveredMediaId === mediaItem.id} sx={{ borderRadius: 1, mb: 0.5, "&:hover": { backgroundColor: "action.hover", }, "&.Mui-selected": { backgroundColor: "primary.main", color: "primary.contrastText", "&:hover": { backgroundColor: "primary.dark", }, }, }} > ) ) ) : ( Медиа не найдено или все медиа уже прикреплены. )} {currentHoveredMedia !== null && hoveredMediaId !== null ? ( // Only render MediaViewer if currentHoveredMedia is found ) : ( Наведите на медиа в списке для предпросмотра. )} ); } );