import { Box, Button, FormControl, IconButton, MenuItem, TextField as MuiTextField, Paper, Select, SelectChangeEvent, TextFieldProps, Typography, useMediaQuery, useTheme } from "@mui/material"; import Tooltip from "@mui/material/Tooltip"; import { useCurrentQuiz } from "@root/quizes/hooks"; import { FC, useEffect, useMemo, useState } from "react"; import ArrowDown from "@/assets/icons/ArrowDownIcon"; import CopyIcon from "@/assets/icons/CopyIcon"; import LinkIcon from "@/assets/icons/LinkIcon"; import { InfoPopover } from "@/ui_kit/InfoPopover"; import { utmApi, type UtmRecord } from "@/api/utm"; import { UtmList } from "./UtmList"; const TextField = MuiTextField as unknown as FC; export default function QuizMarkCreate() { const theme = useTheme(); const quiz = useCurrentQuiz(); const [category, setCategory] = useState("google"); const [name, setName] = useState(""); const [utm, setUtm] = useState(""); const isMobile = useMediaQuery(theme.breakpoints.down(600)); const isTablet = useMediaQuery(theme.breakpoints.down(1000)); const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; async function load() { if (!quiz?.backendId) return; setLoading(true); setError(null); const [data, err] = await utmApi.getAll(quiz.backendId); if (cancelled) return; if (err) { setError(err); setItems([]); } else { setItems((data ?? []).filter((i) => !i.deleted)); } setLoading(false); } load(); return () => { cancelled = true; }; }, [quiz?.backendId]); const CopyLink = () => { let one = (document.getElementById("inputMarkLinkone") as HTMLInputElement) ?.value; let text = (document.getElementById("inputMarkLink") as HTMLInputElement) ?.value; navigator.clipboard.writeText(one + text); }; const handleChange = (event: SelectChangeEvent) => { setCategory(event.target.value as string); }; const filteredItems = useMemo(() => { return items.filter((i) => (i.category ? i.category === category : true)); }, [items, category]); const utmHasSpaces = /\s/.test(utm); const canSave = Boolean(name.trim() && category && utm.trim() && !utmHasSpaces && quiz?.backendId); const handleSave = async () => { if (!canSave || !quiz?.backendId) return; const body = { quiz_id: quiz.backendId, utm, name, category }; const [created, err] = await utmApi.create(body); if (err || !created) return; setItems((prev) => [created, ...prev]); // Очистим только utm, оставим категорию; имя можно тоже очистить setUtm(""); setName(""); }; if (!quiz) return null; return ( Создание/выбор utm меток setName(e.target.value)} sx={{ width: isTablet ? "100%" : "182px", maxWidth: "182px", "& .MuiInputBase-root": { height: "48px", color: "#525253", borderRadius: "8px 0 0 8px", backgroundColor: "#F2F3F7", }, }} /> setUtm(e.target.value)} sx={{ "& .MuiInputBase-root": { color: "#525253", width: isTablet ? "100%" : "317px", maxWidth: "317px", height: "48px", borderRadius: "0 8px 8px 0", backgroundColor: "#F2F3F7" }, }} inputProps={{ sx: { borderRadius: "0 10px 10px 0", fontSize: "18px", lineHeight: "21px", py: 0, }, }} /> {quiz?.qid && ( { const prev = items; setItems(prev.filter((it) => it.id !== id)); const [, err] = await utmApi.softDelete(id); if (err) setItems(prev); }} />)} ); }