import { Avatar, Box, Button, FormControl, FormLabel, Input, Stack, Textarea, Typography, } from '@mui/joy' import { useEffect, useState } from 'react' import ModalActions from '../../../components/common/ModalActions' import { useResponsiveModal } from '../../../hooks/useResponsiveModal' import PROJECT_COLORS, { getTextColorFromBackgroundColor, } from '../../../utils/Colors' import PROJECT_ICONS, { getIconComponent } from '../../../utils/ProjectIcons' import { useCreateProject, useUpdateProject, } from '../../Projects/ProjectQueries' import IconPickerModal from './IconPickerModal' import { useTranslation } from 'react-i18next' const ProjectModal = ({ isOpen, onClose, onSave, project }) => { const { t } = useTranslation('projects') const { ResponsiveModal } = useResponsiveModal() const [projectName, setProjectName] = useState('') const [projectDescription, setProjectDescription] = useState('') const [projectColor, setProjectColor] = useState(PROJECT_COLORS[0].value) const [projectIcon, setProjectIcon] = useState(PROJECT_ICONS[0].value) const [error, setError] = useState('') const [isIconPickerOpen, setIsIconPickerOpen] = useState(false) const createProjectMutation = useCreateProject() const updateProjectMutation = useUpdateProject() // Initialize form when modal opens or project changes useEffect(() => { if (isOpen) { if (project) { // Editing existing project setProjectName(project.name || '') setProjectDescription(project.description || '') setProjectColor(project.color || PROJECT_COLORS[0].value) setProjectIcon(project.icon || PROJECT_ICONS[0].value) } else { // Creating new project setProjectName('') setProjectDescription('') setProjectColor(PROJECT_COLORS[0].value) setProjectIcon(PROJECT_ICONS[0].value) } setError('') } }, [isOpen, project]) const handleSubmit = e => { e.preventDefault() if (!projectName.trim()) { setError(t('modal.errorNameRequired')) return } setError('') const projectData = { name: projectName.trim(), description: projectDescription.trim(), color: projectColor, icon: projectIcon, } if (project) { // Update existing project updateProjectMutation.mutate( { projectId: project.id, projectData }, { onSuccess: updatedProject => { onSave(updatedProject) onClose() }, onError: error => { console.error('Error updating project:', error) setError(t('modal.errorUpdate')) }, }, ) } else { // Create new project createProjectMutation.mutate(projectData, { onSuccess: newProject => { onSave(newProject) onClose() }, onError: error => { console.error('Error creating project:', error) setError(t('modal.errorCreate')) }, }) } } const handleClose = () => { const isLoading = createProjectMutation.isPending || updateProjectMutation.isPending if (!isLoading) { onClose() } } const isSubmitting = createProjectMutation.isPending || updateProjectMutation.isPending const handleIconSelect = iconValue => { setProjectIcon(iconValue) setIsIconPickerOpen(false) } return ( } >
{/* Project Name */} Project Name setProjectName(e.target.value)} placeholder={t('modal.namePlaceholder')} autoFocus disabled={isSubmitting} /> {/* Project Description */} Description