import { useEffect, useState, useRef } from "react"; import { observer } from "mobx-react-lite"; import { useNavigate, useParams } from "react-router-dom"; import { Box, Button, CircularProgress, FormControl, InputLabel, MenuItem, Paper, Select, TextField, Typography, Alert, Snackbar, } from "@mui/material"; import { Save, ArrowLeft } from "lucide-react"; import { authInstance, mediaStore, MEDIA_TYPE_LABELS, languageStore, LoadingSpinner, } from "@shared"; import { MediaViewer } from "@widgets"; export const MediaEditPage = observer(() => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const fileInputRef = useRef(null); const [newFile, setNewFile] = useState(null); const [uploadDialogOpen, setUploadDialogOpen] = useState(false); const media = id ? mediaStore.media.find((m) => m.id === id) : null; const [mediaName, setMediaName] = useState(media?.media_name ?? ""); const [mediaFilename, setMediaFilename] = useState(media?.filename ?? ""); const [mediaType, setMediaType] = useState(media?.media_type ?? 1); const [availableMediaTypes, setAvailableMediaTypes] = useState([]); useEffect(() => { if (id) { mediaStore.getOneMedia(id); } }, [id]); useEffect(() => {}, [newFile, uploadDialogOpen]); useEffect(() => { if (media) { setMediaName(media.media_name); setMediaFilename(media.filename); setMediaType(media.media_type); const extension = media.filename.split(".").pop()?.toLowerCase(); if (extension) { if (["glb", "gltf"].includes(extension)) { setAvailableMediaTypes([6]); } else if ( ["jpg", "jpeg", "png", "gif", "svg", "webp", "bmp"].includes( extension ) ) { setAvailableMediaTypes([1, 3, 4, 5]); } else if (["mp4", "webm", "mov"].includes(extension)) { setAvailableMediaTypes([2]); } } } }, [media]); useEffect(() => { languageStore.setLanguage("ru"); }, []); const handleFileSelect = (e: React.ChangeEvent) => { const files = e.target.files; if (files && files.length > 0) { const file = files[0]; setNewFile(file); setMediaFilename(file.name); const extension = file.name.split(".").pop()?.toLowerCase(); if (extension) { if (["glb", "gltf"].includes(extension)) { setAvailableMediaTypes([6]); setMediaType(6); } else if ( ["jpg", "jpeg", "png", "gif", "svg", "webp", "bmp"].includes( extension ) ) { setAvailableMediaTypes([1, 3, 4, 5]); setMediaType(1); } else if (["mp4", "webm", "mov"].includes(extension)) { setAvailableMediaTypes([2]); setMediaType(2); } } setUploadDialogOpen(true); } }; const handleSave = async () => { if (!id) return; setIsLoading(true); setError(null); try { await authInstance.patch(`/media/${id}`, { media_name: mediaName, filename: mediaFilename, type: mediaType, }); setSuccess(true); handleUploadSuccess(); } catch (err) { setError(err instanceof Error ? err.message : "Failed to save media"); } finally { setIsLoading(false); } }; const handleUploadSuccess = () => { if (id) { mediaStore.getOneMedia(id); } setNewFile(null); setUploadDialogOpen(false); setSuccess(true); }; if (!media && id) { return ( ); } return ( Редактирование медиа setMediaName(e.target.value)} label="Название медиа" disabled={isLoading} /> setMediaFilename(e.target.value)} label="Название файла" disabled={isLoading} /> Тип медиа {/* Only show "Replace file" button if no new file is currently selected */} {error && ( {error} )} {success && ( Медиа успешно сохранено )} setError(null)} > setError(null)}> {error} setSuccess(false)} > setSuccess(false)}> Медиа успешно сохранено ); });