import { Button, TextField, Box, Autocomplete, MenuItem, Menu as MuiMenu, } from "@mui/material"; import { BackButton, TabPanel, languageStore, Language, cityStore, editSightStore, SelectMediaDialog, PreviewMediaDialog, SightLanguageInfo, SightCommonInfo, UploadMediaDialog, MEDIA_TYPE_VALUES, } from "@shared"; import { ImageUploadCard, LanguageSwitcher } from "@widgets"; import { Save } from "lucide-react"; import { observer } from "mobx-react-lite"; import { useEffect, useState } from "react"; import { toast } from "react-toastify"; // Мокап для всплывающей подсказки export const InformationTab = observer( ({ value, index }: { value: number; index: number }) => { const { ruCities } = cityStore; const [mediaId, setMediaId] = useState(""); const [isPreviewMediaOpen, setIsPreviewMediaOpen] = useState(false); const [isUploadMediaOpen, setIsUploadMediaOpen] = useState(false); const { language } = languageStore; const { sight, updateSightInfo, updateSight } = editSightStore; const [, setCity] = useState(sight.common.city_id ?? 0); const [coordinates, setCoordinates] = useState(`0, 0`); // Menu state for each media button const [menuAnchorEl, setMenuAnchorEl] = useState(null); const [activeMenuType, setActiveMenuType] = useState< "thumbnail" | "watermark_lu" | "watermark_rd" | null >(null); const [isAddMediaOpen, setIsAddMediaOpen] = useState(false); const [hardcodeType, setHardcodeType] = useState< "thumbnail" | "watermark_lu" | "watermark_rd" | null >(null); useEffect(() => { // Показывать только при инициализации (не менять при ошибках пользователя) if (sight.common.latitude !== 0 || sight.common.longitude !== 0) { setCoordinates(`${sight.common.latitude}, ${sight.common.longitude}`); } // если координаты обнулились — оставить поле как есть }, [sight.common.latitude, sight.common.longitude]); const handleMenuClose = () => { setMenuAnchorEl(null); setActiveMenuType(null); }; const handleCreateNew = () => { handleMenuClose(); }; const handleAddMedia = () => { setIsAddMediaOpen(true); handleMenuClose(); }; const handleMediaSelect = (media: { id: string; filename: string; media_name?: string; media_type: number; }) => { if (!activeMenuType) return; handleChange( language as Language, { [activeMenuType ?? "thumbnail"]: media.id, }, true ); setActiveMenuType(null); setIsUploadMediaOpen(false); }; const handleChange = ( language: Language, content: Partial, common: boolean = false ) => { updateSightInfo(language, content, common); }; return ( <>

{sight[language].name}

{/* Left column with main fields */} { handleChange(language as Language, { name: e.target.value, }); }} fullWidth variant="outlined" /> { handleChange(language as Language, { address: e.target.value, }); }} fullWidth variant="outlined" /> city.id === sight.common.city_id ) ?? null } getOptionLabel={(option) => option.name} onChange={(_, value) => { setCity(value?.id ?? 0); handleChange( language as Language, { city_id: value?.id ?? 0, }, true ); }} renderInput={(params) => ( )} /> { const newValue = e.target.value; setCoordinates(newValue); // сохраняем ввод пользователя как есть // Обрабатываем значение для сохранения const input = newValue.replace(/,/g, " ").trim(); const [latStr, lonStr] = input.split(/\s+/); const lat = parseFloat(latStr); const lon = parseFloat(lonStr); // Проверка, что обе координаты валидные числа const isValidLat = !isNaN(lat); const isValidLon = !isNaN(lon); if (isValidLat && isValidLon) { handleChange( language as Language, { latitude: lat, longitude: lon, }, true ); } else { handleChange( language as Language, { latitude: 0, longitude: 0, }, true ); } }} fullWidth variant="outlined" placeholder="Введите координаты в формате: широта долгота (можно использовать запятые или пробелы)" /> { setIsPreviewMediaOpen(true); setMediaId(sight.common.thumbnail ?? ""); }} onDeleteImageClick={() => { handleChange( language as Language, { thumbnail: null, }, true ); setActiveMenuType(null); }} onSelectFileClick={() => { setActiveMenuType("thumbnail"); setIsAddMediaOpen(true); }} setUploadMediaOpen={() => { setIsUploadMediaOpen(true); setActiveMenuType("thumbnail"); }} setHardcodeType={(type) => { setHardcodeType( type as "thumbnail" | "watermark_lu" | "watermark_rd" ); }} /> { setIsPreviewMediaOpen(true); setMediaId(sight.common.watermark_lu ?? ""); }} onDeleteImageClick={() => { handleChange( language as Language, { watermark_lu: null, }, true ); setActiveMenuType(null); }} onSelectFileClick={() => { setActiveMenuType("watermark_lu"); setIsAddMediaOpen(true); }} setUploadMediaOpen={() => { setIsUploadMediaOpen(true); setActiveMenuType("watermark_lu"); }} setHardcodeType={(type) => { setHardcodeType( type as "thumbnail" | "watermark_lu" | "watermark_rd" ); }} /> { setIsPreviewMediaOpen(true); setMediaId(sight.common.watermark_rd ?? ""); }} onDeleteImageClick={() => { handleChange( language as Language, { watermark_rd: null, }, true ); setActiveMenuType(null); }} onSelectFileClick={() => { setActiveMenuType("watermark_rd"); setIsAddMediaOpen(true); }} setUploadMediaOpen={() => { setIsUploadMediaOpen(true); setActiveMenuType("watermark_rd"); }} setHardcodeType={(type) => { setHardcodeType( type as "thumbnail" | "watermark_lu" | "watermark_rd" ); }} /> {/* LanguageSwitcher positioned at the top right */} {/* Save Button fixed at the bottom right */}
{/* Media Menu */} Создать новую Выбрать существующую { setIsAddMediaOpen(false); setActiveMenuType(null); }} onSelectMedia={handleMediaSelect} mediaType={ activeMenuType ? MEDIA_TYPE_VALUES[ activeMenuType as keyof typeof MEDIA_TYPE_VALUES ] : undefined } /> setIsUploadMediaOpen(false)} afterUpload={(media) => { handleChange( language as Language, { [activeMenuType ?? "thumbnail"]: media.id, }, true ); setActiveMenuType(null); setIsUploadMediaOpen(false); }} hardcodeType={hardcodeType} /> setIsPreviewMediaOpen(false)} mediaId={mediaId} /> ); } );