From 62257d093b40990d6912a0bc68275b911a1e8609 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 25 Feb 2026 10:58:14 +0330 Subject: [PATCH] ticket --- .env | 2 +- src/config/Paths.tsx | 1 + src/locale/fa.ts | 33 +++ src/pages/ticket/CreateTicket.tsx | 134 ++++++++++ src/pages/ticket/Detail.tsx | 174 +++++++++++++ src/pages/ticket/MessageBubble.tsx | 50 ++++ src/pages/ticket/ReplyForm.tsx | 54 ++++ src/pages/ticket/TicketDetailActions.tsx | 36 +++ src/pages/ticket/TicketInfoSidebar.tsx | 83 +++++++ src/pages/ticket/TicketList.tsx | 112 +++++++++ src/pages/ticket/data/staticData.ts | 289 ++++++++++++++++++++++ src/pages/ticket/detailUtils.ts | 51 ++++ src/pages/ticket/hooks/useTicketData.ts | 106 ++++++++ src/pages/ticket/service/TicketService.ts | 99 ++++++++ src/pages/ticket/types/TicketTypes.ts | 109 ++++++++ src/router/MainRouter.tsx | 5 + src/shared/Sidebar.tsx | 27 +- 17 files changed, 1355 insertions(+), 10 deletions(-) create mode 100644 src/pages/ticket/CreateTicket.tsx create mode 100644 src/pages/ticket/Detail.tsx create mode 100644 src/pages/ticket/MessageBubble.tsx create mode 100644 src/pages/ticket/ReplyForm.tsx create mode 100644 src/pages/ticket/TicketDetailActions.tsx create mode 100644 src/pages/ticket/TicketInfoSidebar.tsx create mode 100644 src/pages/ticket/TicketList.tsx create mode 100644 src/pages/ticket/data/staticData.ts create mode 100644 src/pages/ticket/detailUtils.ts create mode 100644 src/pages/ticket/hooks/useTicketData.ts create mode 100644 src/pages/ticket/service/TicketService.ts create mode 100644 src/pages/ticket/types/TicketTypes.ts diff --git a/.env b/.env index d884c74..f945938 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ # VITE_API_BASE_URL = 'https://negareh-api.dev.danakcorp.com' -VITE_API_BASE_URL = 'http://10.29.35.88:4000' +VITE_API_BASE_URL = 'http://10.39.173.88:4000' VITE_TOKEN_NAME = 'negareh_at' VITE_REFRESH_TOKEN_NAME = 'negareh_art' diff --git a/src/config/Paths.tsx b/src/config/Paths.tsx index b691bcc..9cc6c6c 100644 --- a/src/config/Paths.tsx +++ b/src/config/Paths.tsx @@ -60,6 +60,7 @@ export const Paths = { orderDetails: '/order/', tickets: { list: '/tickets', + detail: '/tickets/', }, auth: { login: '/auth/login', diff --git a/src/locale/fa.ts b/src/locale/fa.ts index b798cf7..1f1e786 100644 --- a/src/locale/fa.ts +++ b/src/locale/fa.ts @@ -69,4 +69,37 @@ export const fa = { errors: { required: "این فیلد الزامی است", }, + ticket: { + ticket_number: "شماره تیکت", + info_ticket: "اطلاعات تیکت", + subject: "موضوع", + select_your_service: "سرویس", + user_name: "نام کاربر", + customer: "کاربر", + expert: "پشتیبانی", + your_description: "متن پاسخ به کاربر", + attachment: "پیوست", + send: "ارسال", + send_answer: "ارسال پاسخ", + close_ticket: "بستن تیکت", + date: "تاریخ", + asignto: "واگذار شده به", + category: "دسته‌بندی", + priority: "اولویت", + low: "کم", + medium: "متوسط", + high: "بالا", + update_sms: "در صورت به‌روزرسانی، از طریق پیامک مطلع می‌شوید.", + PENDING: "در حال بررسی", + pending: "در حال بررسی", + ANSWERED: "پاسخ داده شده", + answered: "پاسخ داده شده", + CLOSED: "بسته شده", + closed: "بسته شده", + status_unknown: "نامشخص", + new_ticket: "تیکت جدید", + submit_your_message: "پیام خود را ثبت کنید", + enter_your_subject: "موضوع را وارد کنید", + title_hint: "راهنما", + }, }; diff --git a/src/pages/ticket/CreateTicket.tsx b/src/pages/ticket/CreateTicket.tsx new file mode 100644 index 0000000..370f43b --- /dev/null +++ b/src/pages/ticket/CreateTicket.tsx @@ -0,0 +1,134 @@ +import { type FC, useState } from 'react' +import Input from '../../components/Input' +import UploadBox from '../../components/UploadBox' +import Button from '../../components/Button' +import { TickCircle, TickSquare } from 'iconsax-react' +import { useCreateOrReplyTicket } from './hooks/useTicketData' +import { useNavigate } from 'react-router-dom' +import { fa } from '@/locale/fa' +import Textarea from '@/components/Textarea' +import { Paths } from '@/config/Paths' + +const CreateTicket: FC = () => { + const t = (key: string): string => { + const keys = key.split('.'); + let value: unknown = fa; + for (const k of keys) { + value = (value as Record)?.[k]; + } + return (value as string) || key; + } + const navigate = useNavigate() + const [subject, setSubject] = useState('') + const [content, setContent] = useState('') + const [files, setFiles] = useState([]) + + const createTicket = useCreateOrReplyTicket() + + const handleSubmit = () => { + if (!subject.trim() || !content.trim()) return + createTicket.mutate( + { + subject: subject.trim(), + content: content.trim(), + attachments: files.length ? files.map(() => ({})) : [], + }, + { + onSuccess: () => navigate(Paths.tickets.list), + onError: (err: unknown) => console.error(err), + } + ) + } + + + return ( +
+
+ {t('ticket.new_ticket')} +
+ +
+
+
+ {t('ticket.submit_your_message')} +
+ +
+ setSubject(e.target.value)} + /> +
+ +
+