import React, { useState, useCallback } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '../ui/dialog'; import { Button } from '../ui/Button'; import Typography from '../ui/Typography'; import { Input } from '../ui/input'; import { FiUser, FiMessageCircle, FiX, FiLoader, FiAlertCircle, } from 'react-icons/fi'; import { cn } from '../../lib/utils'; import { useAgentStore } from '../../stores/agentStore'; import type { ChatSession } from '../../../main/db/schema'; type ChatMode = 'personal'; interface SessionCreationModalProps { isOpen: boolean; onClose: () => void; onSessionCreated: (session: ChatSession) => void; } interface FormData { sessionName: string; mode: ChatMode; } interface ValidationErrors { sessionName?: string; } /** * Validates session name - allows empty names for auto-generation */ const validateSessionName = (name: string): boolean => { return name.trim().length === 0 || (name.trim().length >= 1 && name.trim().length <= 50); }; /** * Modal component for creating new chat sessions */ export const SessionCreationModal: React.FC = ({ isOpen, onClose, onSessionCreated, }) => { const { createSession } = useAgentStore(); const [formData, setFormData] = useState({ sessionName: '', mode: 'personal', }); const [errors, setErrors] = useState({}); const [isCreating, setIsCreating] = useState(false); const [submitError, setSubmitError] = useState(null); const handleInputChange = useCallback((field: keyof FormData, value: string) => { setFormData(prev => ({ ...prev, [field]: value, })); if (errors[field as keyof ValidationErrors]) { setErrors(prev => ({ ...prev, [field]: undefined, })); } if (submitError) { setSubmitError(null); } }, [errors, submitError]); const validateForm = useCallback((): boolean => { const newErrors: ValidationErrors = {}; if (formData.sessionName.trim() && !validateSessionName(formData.sessionName)) { newErrors.sessionName = 'Session name must be 1-50 characters if provided'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }, [formData.sessionName]); const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } setIsCreating(true); setSubmitError(null); try { const session = await createSession( formData.sessionName.trim() || '', 'personal' ); onSessionCreated(session); onClose(); setFormData({ sessionName: '', mode: 'personal', }); setErrors({}); } catch (error) { setSubmitError( error instanceof Error ? error.message : 'Failed to create session' ); } finally { setIsCreating(false); } }, [validateForm, createSession, formData, onSessionCreated, onClose]); const handleClose = useCallback(() => { if (isCreating) return; onClose(); setFormData({ sessionName: '', mode: 'personal', }); setErrors({}); setSubmitError(null); }, [isCreating, onClose]); return ( !isCreating && handleClose()}> Create New Session
{/* Session Name */}
{/* Session Type */}
Session Type
Personal Assistant
Private session with AI assistant
{/* Submit Error */} {submitError && (
{submitError}
)} {/* Actions */}
); }; export default SessionCreationModal;