'use client'; import { type Configurations, ServerTab } from '@/lib/schemas/config'; import { ConfigurationEditor } from '@/components/configuration/ConfigurationEditor'; import { AssistRulesEditor } from '@/components/configuration/AssistRulesEditor'; import { EventConfigEditor } from '@/components/configuration/EventConfigEditor'; import { EventRulesEditor } from '@/components/configuration/EventRulesEditor'; import { ServerSettingsEditor } from '@/components/configuration/ServerSettingsEditor'; import { StatisticsDashboard } from '@/components/statistics/StatisticsDashboard'; import { LeaderboardManager } from '@/components/leaderboard/LeaderboardManager'; import { ActivityLogTable } from '@/components/activityLog/ActivityLogTable'; import { ServerLogViewer } from '@/components/server/ServerLogViewer'; import { PresetPickerModal } from '@/components/server/PresetPickerModal'; import { SavePresetModal } from '@/components/server/SavePresetModal'; import { useState } from 'react'; import { StateHistoryStats, hasPermission, type User } from '@/lib/schemas'; import { Leaderboard } from '@/lib/schemas/leaderboard'; import { bulkUpdateConfigurationsAction, getConfigurationsAction } from '@/lib/actions/configuration'; interface ServerConfigurationTabsProps { serverId: string; configurations: Configurations; statistics: StateHistoryStats; leaderboard: Leaderboard; user: User; } const tabs = [ { id: ServerTab.statistics, name: 'Statistics', icon: 'πŸ“Š' }, { id: ServerTab.configuration, name: 'Configuration', icon: 'βš™οΈ' }, { id: ServerTab.assistRules, name: 'Assist Rules', icon: 'πŸš—' }, { id: ServerTab.event, name: 'Event Config', icon: '🏁' }, { id: ServerTab.eventRules, name: 'Event Rules', icon: 'πŸ“‹' }, { id: ServerTab.settings, name: 'Server Settings', icon: 'πŸ”§' }, { id: ServerTab.leaderboard, name: 'Leaderboard', icon: 'πŸ†' }, { id: ServerTab.activityLog, name: 'History', icon: 'πŸ“‹' }, { id: ServerTab.logs, name: 'Logs', icon: 'πŸ“„' } ]; const configTabs = new Set([ ServerTab.configuration, ServerTab.assistRules, ServerTab.event, ServerTab.eventRules, ServerTab.settings ]); export function ServerConfigurationTabs({ serverId, configurations, statistics, leaderboard, user }: ServerConfigurationTabsProps) { const canViewPresets = hasPermission(user, 'preset.view'); const canCreatePresets = hasPermission(user, 'preset.create'); const [currentTab, setCurrentTab] = useState(ServerTab.statistics); const [configData, setConfigData] = useState(configurations.configuration); const [assistData, setAssistData] = useState(configurations.assistRules); const [eventData, setEventData] = useState(configurations.event); const [eventRulesData, setEventRulesData] = useState(configurations.eventRules); const [settingsData, setSettingsData] = useState(configurations.settings); const [dirtyConfigs, setDirtyConfigs] = useState>(new Set()); const [restart, setRestart] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [saveError, setSaveError] = useState(null); const [saveSuccess, setSaveSuccess] = useState(false); const [isPresetModalOpen, setIsPresetModalOpen] = useState(false); const [isSavePresetModalOpen, setIsSavePresetModalOpen] = useState(false); const reloadConfigs = async () => { const result = await getConfigurationsAction(serverId); if (!result.success) return; setConfigData(result.data.configuration); setAssistData(result.data.assistRules); setEventData(result.data.event); setEventRulesData(result.data.eventRules); setSettingsData(result.data.settings); setDirtyConfigs(new Set()); }; const markDirty = (key: keyof Configurations) => setDirtyConfigs((prev) => new Set(prev).add(key)); const handleSaveAll = async () => { if (dirtyConfigs.size === 0) return; setIsSubmitting(true); setSaveError(null); setSaveSuccess(false); const payload: Partial = {}; if (dirtyConfigs.has('configuration')) payload.configuration = configData; if (dirtyConfigs.has('assistRules')) payload.assistRules = assistData; if (dirtyConfigs.has('event')) payload.event = eventData; if (dirtyConfigs.has('eventRules')) payload.eventRules = eventRulesData; if (dirtyConfigs.has('settings')) payload.settings = settingsData; const result = await bulkUpdateConfigurationsAction(serverId, payload, restart); if (result.success) { setDirtyConfigs(new Set()); setSaveSuccess(true); setTimeout(() => setSaveSuccess(false), 3000); } else { setSaveError(result.message); } setIsSubmitting(false); }; const isConfigTab = configTabs.has(currentTab); const renderTabContent = () => { switch (currentTab) { case ServerTab.statistics: return ; case ServerTab.configuration: return ( { setConfigData(data); markDirty('configuration'); }} /> ); case ServerTab.assistRules: return ( { setAssistData(data); markDirty('assistRules'); }} /> ); case ServerTab.event: return ( { setEventData(data); markDirty('event'); }} /> ); case ServerTab.eventRules: return ( { setEventRulesData(data); markDirty('eventRules'); }} /> ); case ServerTab.settings: return ( { setSettingsData(data); markDirty('settings'); }} /> ); case ServerTab.leaderboard: return ; case ServerTab.activityLog: return ; case ServerTab.logs: return ; default: return (
🚧

Tab Not Found

The requested tab could not be found.

); } }; return (
{isConfigTab && (
{saveError && (
    {saveError.split('\n').map((line, i) => (
  • β€’ {line}
  • ))}
)} {saveSuccess &&

All configurations saved.

}
{canCreatePresets && ( )} {canViewPresets && ( )}
)}
{renderTabContent()}
setIsSavePresetModalOpen(false)} configurations={{ configuration: configData, assistRules: assistData, event: eventData, eventRules: eventRulesData, settings: settingsData }} /> setIsPresetModalOpen(false)} serverId={serverId} onApplied={async () => { await reloadConfigs(); setSaveSuccess(true); setTimeout(() => setSaveSuccess(false), 3000); }} />
); }