import type { UserData, Ticket } from './types'; import React, { useEffect, useState } from 'react'; import useAuth from '../../context/useAuth'; import axios from 'axios'; // Глобальный логгер ошибок для axios axios.interceptors.response.use( response => response, error => { if (error.response) { console.error('Ошибка ответа:', error.response.data); } else if (error.request) { console.error('Нет ответа от сервера:', error.request); } else { console.error('Ошибка запроса:', error.message); } return Promise.reject(error); } ); type TicketsPageProps = { setUserData: (data: UserData) => void; }; const TicketsPage: React.FC = ({ setUserData }) => { const { user } = useAuth() as { user?: { username: string; operator?: number } }; const [tickets, setTickets] = useState([]); const [title, setTitle] = useState(''); const [message, setMessage] = useState(''); const [formError, setFormError] = useState(''); const [formSuccess, setFormSuccess] = useState(''); const [loading, setLoading] = useState(false); const [responseMsg, setResponseMsg] = useState(''); useEffect(() => { fetchTickets(); }, []); const fetchTickets = async () => { try { const token = localStorage.getItem('token'); const res = await axios.get('http://localhost:5000/api/ticket', { withCredentials: true, headers: token ? { Authorization: `Bearer ${token}` } : {} }); if (Array.isArray(res.data)) { setTickets(res.data); } else { setTickets([]); } } catch { setTickets([]); } }; const updateUserData = async () => { try { const token = localStorage.getItem('access_token') || localStorage.getItem('token'); if (!token) return; const headers = { Authorization: `Bearer ${token}` }; const userRes = await axios.get('http://localhost:5000/api/auth/me', { headers }); setUserData({ user: userRes.data.user, balance: userRes.data.user.balance ?? 0, servers: userRes.data.user.servers ?? [], tickets: userRes.data.user.tickets ?? [], }); } catch (err) { console.error('Ошибка обновления userData после тикета:', err); } }; const createTicket = async (e: React.FormEvent) => { e.preventDefault(); setFormError(''); setFormSuccess(''); if (!title.trim() || !message.trim()) { setFormError('Заполните тему и сообщение'); return; } setLoading(true); try { const token = localStorage.getItem('token'); await axios.post('http://localhost:5000/api/ticket/create', { title, message }, { withCredentials: true, headers: token ? { Authorization: `Bearer ${token}` } : {} }); setTitle(''); setMessage(''); setFormSuccess('Тикет успешно создан!'); fetchTickets(); await updateUserData(); } catch { setFormError('Ошибка создания тикета'); } finally { setLoading(false); } }; const respondTicket = async (ticketId: number) => { const token = localStorage.getItem('token'); await axios.post('http://localhost:5000/api/ticket/respond', { ticketId, message: responseMsg }, { withCredentials: true, headers: token ? { Authorization: `Bearer ${token}` } : {} }); setResponseMsg(''); fetchTickets(); await updateUserData(); }; const closeTicket = async (ticketId: number) => { const token = localStorage.getItem('token'); await axios.post('http://localhost:5000/api/ticket/close', { ticketId }, { withCredentials: true, headers: token ? { Authorization: `Bearer ${token}` } : {} }); fetchTickets(); await updateUserData(); }; return (

Мои тикеты

setTitle(e.target.value)} placeholder="Введите тему..." className="border rounded-xl p-3 focus:outline-blue-400 text-base" />