import { useState, useEffect } from 'react'; import { api } from '../lib/api.ts'; import { useChannelStore } from '../stores/channel.ts'; interface CreateChannelModalProps { serverId: string; onClose: () => void; } interface ServerGroup { id: string; server_id: string; name: string; position: number; created_at: string; } interface ChannelApiResponse { id: string; server_id: string; name: string; type: 'text' | 'voice' | 'forum' | 'calendar' | 'docs' | 'list'; category: string; position: number; slowmode_seconds: number; group_id: string | null; } const SLOWMODE_OPTIONS = [ { label: 'Off', value: 0 }, { label: '5 seconds', value: 5 }, { label: '10 seconds', value: 10 }, { label: '30 seconds', value: 30 }, { label: '1 minute', value: 60 }, { label: '2 minutes', value: 120 }, { label: '5 minutes', value: 300 }, ]; export function CreateChannelModal({ serverId, onClose }: CreateChannelModalProps) { const [name, setName] = useState(''); const [type, setType] = useState<'text' | 'voice' | 'forum' | 'calendar' | 'docs' | 'list'>('text'); const [category, setCategory] = useState('general'); const [slowmodeSeconds, setSlowmodeSeconds] = useState(0); const [groups, setGroups] = useState([]); const [selectedGroupId, setSelectedGroupId] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { api.get('/servers/' + serverId + '/groups') .then(setGroups) .catch(() => {}); }, [serverId]); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { e.preventDefault(); onClose(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [onClose]); const createChannel = async (e: React.FormEvent) => { e.preventDefault(); if (!name.trim()) return; setLoading(true); setError(null); try { const body: Record = { name: name.trim(), type, category: category.trim() || 'general', slowmode_seconds: slowmodeSeconds, }; if (selectedGroupId) { body.group_id = selectedGroupId; } const result = await api.post('/servers/' + serverId + '/channels', body); const newChannel = { id: result.id, server_id: result.server_id, name: result.name, type: result.type, category: result.category || null, position: result.position, slowmode_seconds: result.slowmode_seconds, group_id: result.group_id, }; useChannelStore.getState().addChannel(newChannel); onClose(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to create channel'); } finally { setLoading(false); } }; return (
e.stopPropagation()} >
CREATE CHANNEL
setName(e.target.value)} placeholder="channel name" required className="terminal-input w-full" />
setCategory(e.target.value)} placeholder="general" className="terminal-input w-full" />
{error &&
{error}
}
); }