import { FC, useState, useEffect, useMemo, useRef } from 'react'; import { Button } from '@imphnen-frontend-service/ui/atoms'; import { CityFilterSelect } from '../../../../components/city-filter-select'; import TeamBannerPlaceholder from './team-banner-placeholder'; import { cn } from '@imphnen-frontend-service/utils'; import { TAdminTeamItem } from '@imphnen-frontend-service/service'; import { TeamOutlined, CloseOutlined, DeleteOutlined, SaveOutlined, CalendarOutlined, CrownOutlined, ExclamationOutlined, UploadOutlined, CameraOutlined, EyeOutlined, EyeInvisibleOutlined, } from '@ant-design/icons'; type TeamType = TAdminTeamItem; interface ModalProps { isOpen: boolean; onClose: () => void; team: TeamType | null; } const ModalTeamDetail: FC = ({ isOpen, onClose, team }) => { const [formData, setFormData] = useState(null); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [showLogoMenu, setShowLogoMenu] = useState(false); const logoInputRef = useRef(null); const bannerInputRef = useRef(null); // Initialize form data when modal opens useEffect(() => { if (isOpen) { if (team) { setFormData({ ...team }); } else { setFormData({ id: '', name: '', description: '', city: '', banner: null, logo: null, visibility: 'public', created_at: new Date().toISOString(), updated_at: new Date().toISOString(), leader_id: '', }); } } }, [isOpen, team]); // Check if form has changes const hasChanges = useMemo(() => { if (!formData || !team) return !!formData; return ( formData.name !== team.name || formData.description !== team.description || formData.city !== team.city || formData.visibility !== team.visibility || formData.logo !== team.logo || formData.banner !== team.banner ); }, [formData, team]); // Check if required fields are filled const isFormValid = useMemo(() => { if (!formData) return false; return ( formData.name.trim() !== '' && formData.city.trim() !== '' && formData.description.trim() !== '' ); }, [formData]); const canSave = hasChanges && isFormValid; if (!isOpen || !formData) return null; const handleInputChange = (field: keyof TeamType, value: string | null) => { setFormData((prev) => (prev ? { ...prev, [field]: value } : null)); }; const handleSave = () => { console.log('Saving team:', formData); onClose(); }; const handleDelete = () => { if (!team) return; console.log('Deleting team:', team.id); setShowDeleteConfirm(false); onClose(); }; const handleLogoUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; if (!file.type.startsWith('image/')) { alert('Please select an image file'); return; } if (file.size > 5 * 1024 * 1024) { alert('Image size must be less than 5MB'); return; } const reader = new FileReader(); reader.onload = (e) => { const logoUrl = e.target?.result as string; handleInputChange('logo', logoUrl); setShowLogoMenu(false); }; reader.readAsDataURL(file); }; const handleBannerUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; if (!file.type.startsWith('image/')) { alert('Please select an image file'); return; } if (file.size > 5 * 1024 * 1024) { alert('Image size must be less than 5MB'); return; } const reader = new FileReader(); reader.onload = (e) => { const bannerUrl = e.target?.result as string; handleInputChange('banner', bannerUrl); }; reader.readAsDataURL(file); }; return (
{/* Header */}

{team ? 'Team Details' : 'Create New Team'}

{team ? 'View and manage team information' : 'Add a new team to the hackathon'}

{/* Content */}
setShowLogoMenu(false)}> {/* Banner Section */}
{formData.banner && ( )}
{/* Logo & Name */}
{formData.logo ? ( {formData.name ) : ( )}
{showLogoMenu && (
{formData.logo && ( )}
)}
handleInputChange('name', e.target.value)} />
{/* Description */}