import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { adminApi } from '../api/admin'; import { AdminBackButton } from '../components/admin'; import { SettingsIcon } from '@/components/icons'; import { toNumber } from '../utils/inputHelpers'; type NumberOrEmpty = number | ''; export default function AdminTicketSettings() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { data: settings, isLoading, error, } = useQuery({ queryKey: ['ticket-settings'], queryFn: adminApi.getTicketSettings, }); const [formData, setFormData] = useState<{ sla_enabled: boolean; sla_minutes: NumberOrEmpty; sla_check_interval_seconds: NumberOrEmpty; sla_reminder_cooldown_minutes: NumberOrEmpty; support_system_mode: string; cabinet_user_notifications_enabled: boolean; cabinet_admin_notifications_enabled: boolean; }>({ sla_enabled: true, sla_minutes: 5, sla_check_interval_seconds: 60, sla_reminder_cooldown_minutes: 15, support_system_mode: 'both', cabinet_user_notifications_enabled: true, cabinet_admin_notifications_enabled: true, }); 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, cabinet_user_notifications_enabled: settings.cabinet_user_notifications_enabled ?? true, cabinet_admin_notifications_enabled: settings.cabinet_admin_notifications_enabled ?? true, }); } }, [settings]); const updateMutation = useMutation({ mutationFn: adminApi.updateTicketSettings, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['ticket-settings'] }); navigate('/admin/tickets'); }, }); // Validation const isSlaMinutesValid = formData.sla_minutes !== '' && formData.sla_minutes >= 1 && formData.sla_minutes <= 1440; const isCheckIntervalValid = formData.sla_check_interval_seconds !== '' && formData.sla_check_interval_seconds >= 30 && formData.sla_check_interval_seconds <= 600; const isReminderCooldownValid = formData.sla_reminder_cooldown_minutes !== '' && formData.sla_reminder_cooldown_minutes >= 1 && formData.sla_reminder_cooldown_minutes <= 120; const isValid = !formData.sla_enabled || (isSlaMinutesValid && isCheckIntervalValid && isReminderCooldownValid); const handleSubmit = (e: React.SyntheticEvent) => { e.preventDefault(); if (!isValid) return; updateMutation.mutate({ ...formData, sla_minutes: toNumber(formData.sla_minutes, 5), sla_check_interval_seconds: toNumber(formData.sla_check_interval_seconds, 60), sla_reminder_cooldown_minutes: toNumber(formData.sla_reminder_cooldown_minutes, 15), }); }; if (isLoading) { return (
); } if (error) { return (

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

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

); } return (
{/* Header */}

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

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

{/* Support System Mode */}

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

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

{/* Cabinet Notifications */}

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

{/* User Notifications */}
{/* Admin Notifications */}
{/* SLA Settings */}

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

{/* SLA Enabled */}
{/* SLA Minutes */}
{ const val = e.target.value; if (val === '') return setFormData({ ...formData, sla_minutes: '' }); const num = parseInt(val); if (!isNaN(num)) setFormData({ ...formData, sla_minutes: num }); }} className={`input ${formData.sla_enabled && !isSlaMinutesValid && formData.sla_minutes !== '' ? 'border-error-500/50' : ''}`} disabled={!formData.sla_enabled} /> {formData.sla_enabled && formData.sla_minutes !== '' && !isSlaMinutesValid && (

{t('admin.tickets.validation.slaMinutesRange')}

)}

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

{/* Check Interval */}
{ const val = e.target.value; if (val === '') return setFormData({ ...formData, sla_check_interval_seconds: '' }); const num = parseInt(val); if (!isNaN(num)) setFormData({ ...formData, sla_check_interval_seconds: num }); }} className={`input ${formData.sla_enabled && !isCheckIntervalValid && formData.sla_check_interval_seconds !== '' ? 'border-error-500/50' : ''}`} disabled={!formData.sla_enabled} /> {formData.sla_enabled && formData.sla_check_interval_seconds !== '' && !isCheckIntervalValid && (

{t('admin.tickets.validation.checkIntervalRange')}

)}

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

{/* Reminder Cooldown */}
{ const val = e.target.value; if (val === '') return setFormData({ ...formData, sla_reminder_cooldown_minutes: '' }); const num = parseInt(val); if (!isNaN(num)) setFormData({ ...formData, sla_reminder_cooldown_minutes: num }); }} className={`input ${formData.sla_enabled && !isReminderCooldownValid && formData.sla_reminder_cooldown_minutes !== '' ? 'border-error-500/50' : ''}`} disabled={!formData.sla_enabled} /> {formData.sla_enabled && formData.sla_reminder_cooldown_minutes !== '' && !isReminderCooldownValid && (

{t('admin.tickets.validation.reminderCooldownRange')}

)}

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

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