import React from 'react'; import { Link } from 'react-router-dom'; import { EllipsisVerticalIcon } from '@heroicons/react/24/solid'; import { PencilSquareIcon, TrashIcon, LightBulbIcon, DocumentTextIcon, PlayIcon, StopIcon, CheckCircleIcon, ShareIcon, } from '@heroicons/react/24/outline'; import { Project, ProjectState } from '../../entities/Project'; import { useTranslation } from 'react-i18next'; import { useToast } from '../Shared/ToastContext'; import { getCurrentUser } from '../../utils/userUtils'; interface ProjectItemProps { project: Project; viewMode: 'cards' | 'list'; getCompletionPercentage: () => number; activeDropdown: number | null; setActiveDropdown: React.Dispatch>; handleEditProject: (project: Project) => void; setProjectToDelete: React.Dispatch>; setIsConfirmDialogOpen: React.Dispatch>; onOpenShare: (project: Project) => void; } const getProjectInitials = (name: string, maxLetters?: number) => { const words = name .trim() .split(' ') .filter((word) => word.length > 0); if (words.length === 1) { const singleWord = name.toUpperCase(); return maxLetters ? singleWord.substring(0, maxLetters) : singleWord; } const initials = words.map((word) => word[0].toUpperCase()).join(''); return maxLetters ? initials.substring(0, maxLetters) : initials; }; const getStateIcon = (state: ProjectState | undefined) => { switch (state) { case 'idea': return { icon: LightBulbIcon }; case 'planned': return { icon: DocumentTextIcon }; case 'in_progress': return { icon: PlayIcon }; case 'blocked': return { icon: StopIcon }; case 'completed': return { icon: CheckCircleIcon }; default: return { icon: LightBulbIcon }; } }; const getStateLabel = (state: ProjectState | undefined, t: any): string => { switch (state) { case 'idea': return t('projects.states.idea', 'Idea'); case 'planned': return t('projects.states.planned', 'Planned'); case 'in_progress': case 'active': return t('projects.states.in_progress', 'In Progress'); case 'blocked': return t('projects.states.blocked', 'Blocked'); case 'completed': return t('projects.states.completed', 'Completed'); default: return t('projects.states.idea', 'Idea'); } }; const ProjectItem: React.FC = ({ project, viewMode, getCompletionPercentage, activeDropdown, setActiveDropdown, handleEditProject, setProjectToDelete, setIsConfirmDialogOpen, onOpenShare, }) => { const { t } = useTranslation(); const { showErrorToast } = useToast(); const currentUser = getCurrentUser(); const isOwner = currentUser && (project as any).user_uid === currentUser.uid; return (
{viewMode === 'cards' && (
{project.image_url ? ( {project.name} ) : ( {getProjectInitials(project.name)} )} {/* Icons in top right corner of image area */}
{/* Shared project icon */} {project.is_shared && ( )} {/* State icon */} {(() => { const { icon: StateIcon } = getStateIcon( project.state ); return ( ); })()}
)} {viewMode === 'list' && ( {project.image_url ? ( {project.name} ) : (
{getProjectInitials(project.name, 2)}
)} )}
{project.name} {viewMode === 'cards' && project.description && (

{project.description}

)}
{viewMode === 'cards' ? ( <> {project.id !== undefined && activeDropdown === project.id && (
{isOwner && ( )}
)} ) : (
{isOwner && ( )}
)}
{viewMode === 'cards' && (
{(project as any).task_status ? `${(project as any).task_status.done}/${(project as any).task_status.total}` : '0/0'}
)}
); }; export default ProjectItem;