From a98b2b7ad69cf140f182a599ed48431a12d5435c Mon Sep 17 00:00:00 2001 From: Egor Date: Fri, 16 Jan 2026 02:22:53 +0300 Subject: [PATCH] Update AdminTickets.tsx --- src/pages/AdminTickets.tsx | 211 ++++++++++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 3 deletions(-) diff --git a/src/pages/AdminTickets.tsx b/src/pages/AdminTickets.tsx index 85a6aef..34742ce 100644 --- a/src/pages/AdminTickets.tsx +++ b/src/pages/AdminTickets.tsx @@ -1,7 +1,7 @@ -import { useState } from 'react' +import { useState, useEffect } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' -import { adminApi, AdminTicket, AdminTicketDetail, AdminTicketMessage } from '../api/admin' +import { adminApi, AdminTicket, AdminTicketDetail, AdminTicketMessage, TicketSettings } from '../api/admin' import { ticketsApi } from '../api/tickets' function AdminMessageMedia({ message, t }: { message: AdminTicketMessage; t: (key: string) => string }) { @@ -86,6 +86,7 @@ export default function AdminTickets() { const [statusFilter, setStatusFilter] = useState('') const [replyText, setReplyText] = useState('') const [page, setPage] = useState(1) + const [showSettings, setShowSettings] = useState(false) const { data: stats } = useQuery({ queryKey: ['admin-ticket-stats'], @@ -162,7 +163,19 @@ export default function AdminTickets() { return (
-

{t('admin.tickets.title')}

+
+

{t('admin.tickets.title')}

+ +
{/* Stats */} {stats && ( @@ -380,6 +393,198 @@ export default function AdminTickets() { ) : null}
+ + {/* Settings Modal */} + {showSettings && setShowSettings(false)} />} + + ) +} + +function TicketSettingsModal({ onClose }: { onClose: () => void }) { + const { t } = useTranslation() + const queryClient = useQueryClient() + + const { data: settings, isLoading } = useQuery({ + queryKey: ['ticket-settings'], + queryFn: adminApi.getTicketSettings, + }) + + const [formData, setFormData] = useState({ + sla_enabled: settings?.sla_enabled ?? true, + sla_minutes: settings?.sla_minutes ?? 5, + sla_check_interval_seconds: settings?.sla_check_interval_seconds ?? 60, + sla_reminder_cooldown_minutes: settings?.sla_reminder_cooldown_minutes ?? 15, + support_system_mode: settings?.support_system_mode ?? 'both', + }) + + // Update form when settings load + useEffect(() => { + if (settings) { + setFormData({ + sla_enabled: settings.sla_enabled, + sla_minutes: settings.sla_minutes, + sla_check_interval_seconds: settings.sla_check_interval_seconds, + sla_reminder_cooldown_minutes: settings.sla_reminder_cooldown_minutes, + support_system_mode: settings.support_system_mode, + }) + } + }, [settings]) + + const updateMutation = useMutation({ + mutationFn: adminApi.updateTicketSettings, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['ticket-settings'] }) + onClose() + }, + }) + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault() + updateMutation.mutate(formData) + } + + return ( +
+
e.stopPropagation()}> +
+

{t('admin.tickets.settings')}

+ +
+ + {isLoading ? ( +
+
+
+ ) : ( +
+ {/* Support System Mode */} +
+ + +

{t('admin.tickets.supportModeDesc')}

+
+ +
+

{t('admin.tickets.slaSettings')}

+ + {/* SLA Enabled */} +
+ +
+
+ + {/* SLA Minutes */} +
+ + setFormData({ ...formData, sla_minutes: parseInt(e.target.value) })} + className="input" + disabled={!formData.sla_enabled} + /> +

{t('admin.tickets.slaMinutesDesc')}

+
+ + {/* Check Interval */} +
+ + setFormData({ ...formData, sla_check_interval_seconds: parseInt(e.target.value) })} + className="input" + disabled={!formData.sla_enabled} + /> +

{t('admin.tickets.checkIntervalDesc')}

+
+ + {/* Reminder Cooldown */} +
+ + setFormData({ ...formData, sla_reminder_cooldown_minutes: parseInt(e.target.value) })} + className="input" + disabled={!formData.sla_enabled} + /> +

{t('admin.tickets.reminderCooldownDesc')}

+
+ + {/* Buttons */} +
+ + +
+ + {updateMutation.isError && ( +
+ {t('admin.tickets.settingsUpdateError')} +
+ )} +
+ )} +
) }