import { Server } from "../../types/IServer.ts"; import { useEffect, useRef, useState } from "react"; import { IApp } from "../../types/IApp.ts"; import api from "../../utils/api.ts"; import { Session } from "../../types/ISession.ts"; import { Client } from "../../types/IClient.ts"; import useModalStore from "../../stores/useModalStore.ts"; import TableSelector from "../TableSelector.tsx"; import NewInput from "../NewInput.tsx"; import StartSessionIcon from "../icons/StartSessionIcon.tsx"; import NewButton from "../NewButton.tsx"; import ProjectSelector from "../ProjectSelector.tsx"; import { useQueryClient, useMutation, useQuery } from "@tanstack/react-query"; interface Props { targetServerId: string | null; } export default function CreateSessionModal({ targetServerId }: Props) { const { setModal } = useModalStore(); const [name, setName] = useState(null); const [phone, setPhone] = useState(null); const [email, setEmail] = useState(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] || null ); }, [selectedServer]); const { mutate: createClient } = useMutation({ mutationFn: () => { return 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: ["sessions", 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 /> setName(e.target.value)} placeholder="Имя" required /> setEmail(e.target.value)} placeholder="Электронная почта" />

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

{selectedServer && selectedServer?.apps && selectedServer?.apps?.length > 0 && ( )}
{isSessionExists && (
ghost error

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

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

)} server.id === selectedServer?.id) ?.sessions?.[0]?.status === "ending" } variant="cta" size="large" className="sticky bottom-0" >

Запустить сеанс

); }