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<string | null>(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 ( <Dialog open={open} onClose={onClose} maxWidth="lg" fullWidth> <DialogTitle>Выберите существующее медиа</DialogTitle> <DialogContent className="flex gap-4" dividers // Adds a divider below the title and above the actions sx={{ height: "600px", display: "flex", flexDirection: "row" }} // Fixed height for DialogContent > <Paper className="w-[66%] flex flex-col" sx={{ p: 2 }}> {" "} {/* Added padding for consistency */} <TextField fullWidth placeholder="Поиск медиа..." // Changed placeholder for clarity value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} sx={{ mb: 2, mt: 1 }} InputProps={{ startAdornment: ( <InputAdornment position="start"> <Search size={20} /> </InputAdornment> ), }} /> <List sx={{ flexGrow: 1, overflowY: "auto" }}> {filteredMedia.length > 0 ? ( filteredMedia.map( ( mediaItem // Use mediaItem to avoid confusion ) => ( <ListItemButton key={mediaItem.id} onClick={() => setHoveredMediaId(mediaItem.id)} // Call onSelectMedia onDoubleClick={() => { onSelectMedia(mediaItem); onClose(); }} sx={{ borderRadius: 1, mb: 0.5, "&:hover": { backgroundColor: "action.hover", }, }} > <ListItemText primary={mediaItem.media_name} /> </ListItemButton> ) ) ) : ( <Typography sx={{ mt: 2, textAlign: "center" }} color="text.secondary" > Медиа не найдено или все медиа уже прикреплены. </Typography> )} </List> </Paper> {currentHoveredMedia ? ( // Only render MediaViewer if currentHoveredMedia is found <Paper className="w-[33%] h-[100%] flex justify-center items-center"> <MediaViewer media={{ id: currentHoveredMedia.id, media_type: currentHoveredMedia.media_type ?? 1, // Provide a default if media_type can be undefined filename: currentHoveredMedia.filename, }} /> </Paper> ) : ( <Paper className="w-[33%] h-[100%] flex justify-center items-center"> <Typography variant="body2" color="text.secondary"> Наведите на медиа в списке для предпросмотра. </Typography> </Paper> )} </DialogContent> <DialogActions> <Button onClick={onClose}>Отмена</Button> </DialogActions> </Dialog> ); } );