upd
This commit is contained in:
+6
-5
@@ -23,13 +23,14 @@ function HistoryPage() {
|
|||||||
{history.map((item: any) => (
|
{history.map((item: any) => (
|
||||||
<div key={item.id} className="p-4 rounded-lg bg-[#22222A]">
|
<div key={item.id} className="p-4 rounded-lg bg-[#22222A]">
|
||||||
<p>
|
<p>
|
||||||
Дата и время запуска: {new Date(item.createdAt).toLocaleString()}
|
Дата и время: {new Date(item.createdAt).toLocaleString()}
|
||||||
</p>
|
</p>
|
||||||
<p>Сборка: "{item.title}"</p>
|
<p>Сборка: "{item.build}"</p>
|
||||||
|
<p>Локация: "{item.location}"</p>
|
||||||
<p>Сервер: "{item.server}"</p>
|
<p>Сервер: "{item.server}"</p>
|
||||||
<p>IP клиента: {item.headers["x-forwarded-for"]}</p>
|
<p>IP клиента: {item.ownerIp}</p>
|
||||||
<p>Город: {item.city}</p>
|
{/* <p>Город: {item.city}</p> */}
|
||||||
<p>Устройство: {item.headers["user-agent"]}</p>
|
{/* <p>Устройство: {item.headers["user-agent"]}</p> */}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+7
-17
@@ -34,19 +34,16 @@ function MonitoringPage() {
|
|||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function endActiveSession(
|
async function endSession(activeSessionId: string) {
|
||||||
location: string,
|
const result = await ky
|
||||||
server: string,
|
.post(
|
||||||
uePort: number,
|
|
||||||
cirrusPort: number
|
|
||||||
) {
|
|
||||||
await ky
|
|
||||||
.get(
|
|
||||||
`${
|
`${
|
||||||
import.meta.env.VITE_COORD_URL
|
import.meta.env.VITE_COORD_URL
|
||||||
}/end?location=${location}&server=${server}&uePort=${uePort}&cirrusPort=${cirrusPort}`
|
}/active_sessions/${activeSessionId}/end`
|
||||||
)
|
)
|
||||||
.json();
|
.json();
|
||||||
|
|
||||||
|
console.log(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -181,14 +178,7 @@ function MonitoringPage() {
|
|||||||
Открыть в новом окне
|
Открыть в новом окне
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
onClick={() =>
|
onClick={() => endSession(session.id)}
|
||||||
endActiveSession(
|
|
||||||
session.location,
|
|
||||||
session.server,
|
|
||||||
session.uePort,
|
|
||||||
session.cirrusPort
|
|
||||||
)
|
|
||||||
}
|
|
||||||
className="px-4 py-2 bg-red-600 hover:bg-red-500 transition-colors rounded"
|
className="px-4 py-2 bg-red-600 hover:bg-red-500 transition-colors rounded"
|
||||||
>
|
>
|
||||||
Завершить сессию
|
Завершить сессию
|
||||||
|
|||||||
+5
-16
@@ -30,19 +30,8 @@ import useSocketStore from "./stores/useSocketStore";
|
|||||||
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
|
||||||
import ToggleMic from "./components/ToggleMic";
|
import ToggleMic from "./components/ToggleMic";
|
||||||
import Chat from "./components/Chat";
|
import Chat from "./components/Chat";
|
||||||
import ChatIcon from "./components/icons/ChatIcon";
|
|
||||||
import AFKTimerModal from "./components/modals/AFKTimerModal";
|
import AFKTimerModal from "./components/modals/AFKTimerModal";
|
||||||
import {
|
import { differenceInMilliseconds, format, parseISO } from "date-fns";
|
||||||
differenceInMilliseconds,
|
|
||||||
differenceInSeconds,
|
|
||||||
format,
|
|
||||||
formatDuration,
|
|
||||||
getMinutes,
|
|
||||||
getSeconds,
|
|
||||||
intervalToDuration,
|
|
||||||
parseISO,
|
|
||||||
} from "date-fns";
|
|
||||||
import { ru } from "date-fns/locale";
|
|
||||||
import HandOnIcon from "./components/icons/HandOnIcon";
|
import HandOnIcon from "./components/icons/HandOnIcon";
|
||||||
|
|
||||||
function StreamPage() {
|
function StreamPage() {
|
||||||
@@ -60,7 +49,7 @@ function StreamPage() {
|
|||||||
]);
|
]);
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const roomId = params.id;
|
const roomId = params.id;
|
||||||
const serverUrl = "wss://livekit.stream.graff.tech";
|
const livekitServerUrl = "wss://livekit.stream.graff.tech";
|
||||||
const [token, setToken] = useState<string>();
|
const [token, setToken] = useState<string>();
|
||||||
const [socket, setSocket] = useSocketStore((state) => [
|
const [socket, setSocket] = useSocketStore((state) => [
|
||||||
state.socket,
|
state.socket,
|
||||||
@@ -373,7 +362,7 @@ function StreamPage() {
|
|||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
{/* <button
|
||||||
onClick={() => setIsShowChat(true)}
|
onClick={() => setIsShowChat(true)}
|
||||||
className="relative group outline-none bg-[#131313] rounded-full shadow-lg shadow-[#131313] p-2 opacity-90 flex justify-center items-center"
|
className="relative group outline-none bg-[#131313] rounded-full shadow-lg shadow-[#131313] p-2 opacity-90 flex justify-center items-center"
|
||||||
>
|
>
|
||||||
@@ -381,13 +370,13 @@ function StreamPage() {
|
|||||||
<span className="absolute left-12 top-[50%] -translate-y-[50%] invisible group-hover:visible opacity-0 group-hover:opacity-100 text-xs transition-all px-2 py-1 bg-[#131313] rounded">
|
<span className="absolute left-12 top-[50%] -translate-y-[50%] invisible group-hover:visible opacity-0 group-hover:opacity-100 text-xs transition-all px-2 py-1 bg-[#131313] rounded">
|
||||||
<Trans i18nKey={"chat"}>Чат</Trans>
|
<Trans i18nKey={"chat"}>Чат</Trans>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button> */}
|
||||||
|
|
||||||
<LiveKitRoom
|
<LiveKitRoom
|
||||||
video={false}
|
video={false}
|
||||||
audio={true}
|
audio={true}
|
||||||
token={token}
|
token={token}
|
||||||
serverUrl={serverUrl}
|
serverUrl={livekitServerUrl}
|
||||||
>
|
>
|
||||||
<RoomAudioRenderer />
|
<RoomAudioRenderer />
|
||||||
<ToggleMic socket={socket} handleUpdate={update} />
|
<ToggleMic socket={socket} handleUpdate={update} />
|
||||||
|
|||||||
@@ -1,13 +1,38 @@
|
|||||||
import { useEffect, useState } from "react";
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
import { useEffect, useRef, useState } from "react";
|
||||||
import useModalStore from "../../stores/useModalStore";
|
import useModalStore from "../../stores/useModalStore";
|
||||||
|
import ky from "ky";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
|
||||||
function AFKTimerModal() {
|
function AFKTimerModal() {
|
||||||
const setModal = useModalStore((state) => state.setModal);
|
const setModal = useModalStore((state) => state.setModal);
|
||||||
const [afkTimer, setAfkTimer] = useState<number>(60);
|
const [afkTimer, setAfkTimer] = useState<number>(60);
|
||||||
|
const afkTimerRef = useRef<number>();
|
||||||
|
afkTimerRef.current = afkTimer;
|
||||||
|
const params = useParams();
|
||||||
|
|
||||||
|
async function endSession() {
|
||||||
|
await ky.post(
|
||||||
|
`${import.meta.env.VITE_COORD_URL}/active_sessions/${params.id}/end`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function checkAFK(interval: number) {
|
||||||
|
console.log(afkTimerRef.current);
|
||||||
|
|
||||||
|
if (afkTimerRef.current && afkTimerRef.current <= 1) {
|
||||||
|
clearInterval(interval);
|
||||||
|
await endSession();
|
||||||
|
window.location.reload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setAfkTimer((prev) => prev - 1);
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const interval = setInterval(() => {
|
const interval = setInterval(() => {
|
||||||
setAfkTimer((prev) => prev - 1);
|
checkAFK(interval);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user