sup
Some checks failed
Deploy / CreateImage (push) Failing after 28m57s
Deploy / DeployService (push) Has been cancelled

This commit is contained in:
skeris 2025-08-13 12:55:58 +03:00
parent 997d30d269
commit 4067a3e4c2
12 changed files with 2896 additions and 2856 deletions

@ -6,7 +6,7 @@
"@date-io/dayjs": "^2.15.0", "@date-io/dayjs": "^2.15.0",
"@emotion/react": "^11.10.4", "@emotion/react": "^11.10.4",
"@emotion/styled": "^11.10.4", "@emotion/styled": "^11.10.4",
"@frontend/kitui": "^1.0.108", "@frontend/kitui": "1.0.110",
"@material-ui/pickers": "^3.3.10", "@material-ui/pickers": "^3.3.10",
"@mui/icons-material": "^5.10.3", "@mui/icons-material": "^5.10.3",
"@mui/material": "^5.10.5", "@mui/material": "^5.10.5",

@ -2,7 +2,7 @@ import makeRequest from "@root/api/makeRequest";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";
import type { SendTicketMessageRequest } from "@root/model/ticket"; import type { SendTicketMessageRequest } from "@frontend/kitui";
const API_URL = `${process.env.REACT_APP_DOMAIN}/heruvym/v1.0.0`; const API_URL = `${process.env.REACT_APP_DOMAIN}/heruvym/v1.0.0`;

@ -1,43 +0,0 @@
export interface CreateTicketRequest {
Title: string;
Message: string;
}
export interface CreateTicketResponse {
Ticket: string;
}
export interface SendTicketMessageRequest {
message: string;
ticket: string;
lang: string;
files: string[];
}
export type TicketStatus = "open";
export interface Ticket {
id: string;
user: string;
sess: string;
ans: string;
state: string;
top_message: TicketMessage;
title: string;
created_at: string;
updated_at: string;
system?: boolean;
rate: number;
}
export interface TicketMessage {
id: string;
ticket_id: string;
user_id: string;
session_id: string;
message: string;
files: string[];
shown: { [key: string]: number };
request_screenshot: string;
created_at: string;
}

@ -12,7 +12,7 @@ import SendIcon from "@mui/icons-material/Send";
import AttachFileIcon from "@mui/icons-material/AttachFile"; import AttachFileIcon from "@mui/icons-material/AttachFile";
import { KeyboardEvent, useEffect, useMemo, useRef, useState } from "react"; import { KeyboardEvent, useEffect, useMemo, useRef, useState } from "react";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { TicketMessage } from "@root/model/ticket"; import { TicketMessage } from "@frontend/kitui";
import { sendTicketMessage } from "@root/api/tickets"; import { sendTicketMessage } from "@root/api/tickets";
import { enqueueSnackbar } from "notistack"; import { enqueueSnackbar } from "notistack";
import { useTicketStore } from "@root/stores/tickets"; import { useTicketStore } from "@root/stores/tickets";
@ -76,6 +76,7 @@ export default function Chat() {
const [disableFileButton, setDisableFileButton] = useState(false); const [disableFileButton, setDisableFileButton] = useState(false);
const ticket = tickets.find((ticket) => ticket.id === ticketId); const ticket = tickets.find((ticket) => ticket.id === ticketId);
const isSystem = ticket?.top_message?.system === true;
useTicketMessages({ useTicketMessages({
url: process.env.REACT_APP_DOMAIN + "/heruvym/v1.0.0/getMessages", url: process.env.REACT_APP_DOMAIN + "/heruvym/v1.0.0/getMessages",
@ -301,10 +302,11 @@ export default function Chat() {
onChange={(e) => setMessageField(e.target.value)} onChange={(e) => setMessageField(e.target.value)}
onKeyPress={handleTextfieldKeyPress} onKeyPress={handleTextfieldKeyPress}
id="message-input" id="message-input"
placeholder="Написать сообщение" placeholder={isSystem ? "Системный тикет. Отправка сообщений запрещена" : "Написать сообщение"}
fullWidth fullWidth
multiline multiline
maxRows={8} maxRows={8}
disabled={isSystem}
InputProps={{ InputProps={{
style: { style: {
backgroundColor: theme.palette.content.main, backgroundColor: theme.palette.content.main,
@ -314,6 +316,7 @@ export default function Chat() {
<InputAdornment position="end"> <InputAdornment position="end">
<IconButton <IconButton
onClick={handleSendMessage} onClick={handleSendMessage}
disabled={isSystem}
sx={{ sx={{
height: "45px", height: "45px",
width: "45px", width: "45px",
@ -326,6 +329,7 @@ export default function Chat() {
onClick={() => { onClick={() => {
if (!disableFileButton) fileInputRef.current?.click(); if (!disableFileButton) fileInputRef.current?.click();
}} }}
disabled={isSystem}
sx={{ sx={{
height: "45px", height: "45px",
width: "45px", width: "45px",
@ -340,6 +344,7 @@ export default function Chat() {
}} }}
style={{ display: "none" }} style={{ display: "none" }}
type="file" type="file"
disabled={isSystem}
/> />
<AttachFileIcon sx={{ color: theme.palette.golden.main }} /> <AttachFileIcon sx={{ color: theme.palette.golden.main }} />
</IconButton> </IconButton>

@ -1,5 +1,5 @@
import { Box, Typography, useTheme } from "@mui/material"; import { Box, Typography, useTheme } from "@mui/material";
import { TicketMessage } from "@root/model/ticket"; import { TicketMessage } from "@frontend/kitui";
interface Props { interface Props {
message: TicketMessage; message: TicketMessage;

@ -3,7 +3,7 @@ import { Box, useMediaQuery, useTheme } from "@mui/material";
import Chat from "./Chat/Chat"; import Chat from "./Chat/Chat";
import Collapse from "./Collapse"; import Collapse from "./Collapse";
import TicketList from "./TicketList/TicketList"; import TicketList from "./TicketList/TicketList";
import { Ticket } from "@root/model/ticket"; import { Ticket } from "@frontend/kitui";
import { clearTickets, setTicketsFetchState, updateTickets, useTicketStore } from "@root/stores/tickets"; import { clearTickets, setTicketsFetchState, updateTickets, useTicketStore } from "@root/stores/tickets";
import { enqueueSnackbar } from "notistack"; import { enqueueSnackbar } from "notistack";
import { clearMessageState } from "@root/stores/messages"; import { clearMessageState } from "@root/stores/messages";

@ -1,7 +1,7 @@
import CircleIcon from "@mui/icons-material/Circle"; import CircleIcon from "@mui/icons-material/Circle";
import { Box, Card, CardActionArea, CardContent, CardHeader, Divider, Typography, useTheme } from "@mui/material"; import { Box, Card, CardActionArea, CardContent, CardHeader, Divider, Typography, useTheme } from "@mui/material";
import { green } from "@mui/material/colors"; import { green } from "@mui/material/colors";
import { Ticket } from "@root/model/ticket"; import { Ticket } from "@frontend/kitui";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
const flexCenterSx = { const flexCenterSx = {
@ -25,10 +25,11 @@ export default function TicketItem({ ticket, setActiveUserId }: Props) {
console.log(ticket) console.log(ticket)
const isUnread = ticket.user === ticket?.top_message?.user_id; const isUnread = ticket.user === ticket?.top_message?.user_id;
const isSelected = ticket.id === ticketId; const isSelected = ticket.id === ticketId;
const isSystem = ticket.top_message?.system === true;
const unreadSx = { const unreadSx = {
border: "1px solid", border: "1px solid",
borderColor: ticket.system ? "red" : theme.palette.golden.main, borderColor: ticket.top_message?.system ? "red" : theme.palette.golden.main,
backgroundColor: theme.palette.goldenMedium.main, backgroundColor: theme.palette.goldenMedium.main,
}; };
@ -44,7 +45,7 @@ export default function TicketItem({ ticket, setActiveUserId }: Props) {
<Card <Card
sx={{ sx={{
minHeight: "70px", minHeight: "70px",
backgroundColor: "transparent", backgroundColor: isSystem ? "#111" : "transparent",
color: "white", color: "white",
...(isUnread && unreadSx), ...(isUnread && unreadSx),
...(isSelected && selectedSx), ...(isSelected && selectedSx),

@ -1,7 +1,7 @@
import HighlightOffOutlinedIcon from "@mui/icons-material/HighlightOffOutlined"; import HighlightOffOutlinedIcon from "@mui/icons-material/HighlightOffOutlined";
import SearchOutlinedIcon from "@mui/icons-material/SearchOutlined"; import SearchOutlinedIcon from "@mui/icons-material/SearchOutlined";
import { Box, Button, useMediaQuery, useTheme } from "@mui/material"; import { Box, Button, useMediaQuery, useTheme } from "@mui/material";
import { Ticket } from "@root/model/ticket"; import { Ticket } from "@frontend/kitui";
import { incrementTicketsApiPage, useTicketStore } from "@root/stores/tickets"; import { incrementTicketsApiPage, useTicketStore } from "@root/stores/tickets";
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import TicketItem from "./TicketItem"; import TicketItem from "./TicketItem";

@ -1,5 +1,5 @@
import { FetchState } from "@frontend/kitui"; import { FetchState } from "@frontend/kitui";
import { TicketMessage } from "@root/model/ticket"; import { TicketMessage } from "@frontend/kitui";
import { create } from "zustand"; import { create } from "zustand";
import { devtools } from "zustand/middleware"; import { devtools } from "zustand/middleware";

@ -1,4 +1,4 @@
import { Ticket } from "@root/model/ticket"; import { Ticket } from "@frontend/kitui";
export const testTickets: Ticket[] = [ export const testTickets: Ticket[] = [
{ {
@ -17,11 +17,13 @@ export const testTickets: Ticket[] = [
shown: {}, shown: {},
request_screenshot: "", request_screenshot: "",
created_at: "2023-03-10T13:16:52.73Z", created_at: "2023-03-10T13:16:52.73Z",
system: false,
}, },
title: "textual ticket", title: "textual ticket",
created_at: "2023-03-10T13:16:52.73Z", created_at: "2023-03-10T13:16:52.73Z",
updated_at: "2023-03-10T13:16:52.73Z", updated_at: "2023-03-10T13:16:52.73Z",
rate: -1, rate: -1,
origin: "user",
}, },
{ {
id: "cg55nssvc9g7gddpnsug", id: "cg55nssvc9g7gddpnsug",
@ -39,10 +41,12 @@ export const testTickets: Ticket[] = [
shown: {}, shown: {},
request_screenshot: "", request_screenshot: "",
created_at: "2023-03-09T22:21:39.822Z", created_at: "2023-03-09T22:21:39.822Z",
system: false,
}, },
title: "textual ticket", title: "textual ticket",
created_at: "2023-03-09T22:21:39.822Z", created_at: "2023-03-09T22:21:39.822Z",
updated_at: "2023-03-09T22:21:39.822Z", updated_at: "2023-03-09T22:21:39.822Z",
rate: -1, rate: -1,
origin: "user",
}, },
]; ];

@ -1,5 +1,5 @@
import { FetchState } from "@frontend/kitui"; import { FetchState } from "@frontend/kitui";
import { Ticket } from "@root/model/ticket"; import { Ticket } from "@frontend/kitui";
import { create } from "zustand"; import { create } from "zustand";
import { devtools } from "zustand/middleware"; import { devtools } from "zustand/middleware";

5673
yarn.lock

File diff suppressed because it is too large Load Diff