import { Server } from "../../types/Server.ts"; import { useEffect, useRef, useState } from "react"; import { App } from "../../types/App.ts"; import api from "../../utils/api.ts"; import { Session } from "../../types/Session.ts"; import { Client } from "../../types/Client.ts"; import useModalStore from "../../stores/useModalStore.ts"; import TableSelector from "../TableSelector.tsx"; import Input from "../Input.tsx"; import StartSessionIcon from "../icons/StartSessionIcon.tsx"; import Button from "../Button.tsx"; import ProjectSelector from "../ProjectSelector.tsx"; import { useQueryClient, useMutation, useQuery } from "@tanstack/react-query"; import { useDebounce } from "@uidotdev/usehooks"; import { AnimatePresence, motion } from "motion/react"; interface Props { targetServerId: string | null; client?: Client | null; } export default function CreateSessionModal({ targetServerId, client }: Props) { const { setModal } = useModalStore(); const [name, setName] = useState(client?.name || null); const [phone, setPhone] = useState(client?.phone || null); const [email, setEmail] = useState(client?.email || null); // const [isSessionExists, setIsSessionExists] = useState(false); const queryClient = useQueryClient(); const { data: servers } = useQuery({ queryKey: ["servers"], queryFn: () => api.get("servers?withLastSession=true").json(), refetchInterval: 1000, }); const targetServer = targetServerId ? servers?.find((server) => server.id === targetServerId) || null : null; const [selectedServer, setSelectedServer] = useState( targetServer ); const [selectedApp, setSelectedApp] = useState(null); useEffect(() => { setSelectedApp( selectedServer?.sessions?.[0]?.app || selectedServer?.apps?.[0].app || null ); }, [selectedServer]); const debouncedPhone = useDebounce(phone, 500); const { data, isLoading, error } = useQuery({ queryKey: ["get-user-by-phone", debouncedPhone], queryFn: () => api .get("clients/by-phone", { searchParams: debouncedPhone ? { phone: debouncedPhone } : {}, }) .json(), enabled: !!debouncedPhone, }); useEffect(() => { if (!error && data) { setName(data.name); setEmail(data.email); } else { setName(null); setEmail(null); } }, [data, error]); const { mutate: createClient } = useMutation({ mutationFn: () => api .post("clients", { json: { name, phone, email, }, }) .json(), }); const { mutate: createSession } = useMutation({ mutationKey: ["create-session", selectedServer?.id], mutationFn: ({ clientId, serverId, appId, }: { clientId: string; serverId: string; appId: string; }) => api .post("sessions", { json: { clientId, serverId, appId, }, }) .json(), onMutate: () => { queryClient.invalidateQueries({ queryKey: ["sessions"] }); queryClient.invalidateQueries({ queryKey: ["servers"] }); setModal(null); }, }); // const { mutate: endSession } = useMutation({ // mutationKey: ["end-session", selectedServer?.sessions?.[0]?.id], // mutationFn: () => // api.put(`sessions/${selectedServer?.sessions?.[0]?.id}`, { // json: { status: "ending" }, // }), // onMutate: () => queryClient.invalidateQueries({ queryKey: ["sessions"] }), // }); async function handleClickCreateSession(e: React.FormEvent) { e.preventDefault(); if (!name || !phone || !selectedServer || !selectedApp) return; // if (selectedServer?.sessions?.[0]?.status !== "started") { createClient(undefined, { onSuccess: (client) => { createSession({ clientId: client.id, serverId: selectedServer.id, appId: selectedApp.id, }); }, }); // return; // } // if (!isSessionExists) { // setIsSessionExists(true); // return; // } // endSession(undefined, { // onError: (error) => { // console.log("Ошибка при завершении сессии:", error); // }, // }); } // useEffect(() => { // if ( // selectedServer && // servers?.find((server) => server.id === selectedServer?.id)?.sessions?.[0] // ?.status === "ended" && // selectedApp // // && isSessionExists // ) // createClient(undefined, { // onSuccess: (client) => { // createSession({ // clientId: client.id, // serverId: selectedServer?.id, // appId: selectedApp.id, // }); // }, // }); // }, [ // selectedApp, // servers, // createClient, // createSession, // // isSessionExists, // selectedServer, // ]); const ref = useRef(null); return (

Новый сеанс

Укажите данные клиента

setPhone(e.target.value)} placeholder="Номер телефона" required isLoading={isLoading} /> {phone && ( <> setName(e.target.value)} placeholder="Имя" required /> setEmail(e.target.value)} placeholder="Электронная почта" /> )}

Выберите параметры сеанса

{selectedServer && selectedServer?.apps && selectedServer?.apps?.length > 0 && ( app)} selectedProject={selectedApp} setSelectedProject={setSelectedApp} /> )}
{/* {isSessionExists && ( */} {/*
ghost error

Есть текущий сеанс

{`На выбранном столе есть текущий сеанс. При запуске нового текущий будет завершен.`}

*/} {/* )} */}
); }