import React, { useState, useEffect } from 'react'; import type { ProjectDetails, Subset } from '../types'; import { getSortedKeys, sortEntriesByKey } from '../utils/sort-utils'; import ConfirmModal from './ConfirmModal'; // Language code to TMS locale mapping (same as backend) const LANG_TO_LOCALE: Record = { US: 'en_US', FR: 'fr_FR', ES: 'es_ES', DE: 'de_DE', TW: 'zh_TW', JP: 'ja_JP', TH: 'th_TH', KR: 'ko_KR', KO: 'ko_KR', }; function getTmsUrl(projectId: number, lang?: string): string { const locale = lang ? LANG_TO_LOCALE[lang.toUpperCase()] : null; const baseUrl = `https://tms.kiledel.com/project/${projectId}`; return locale ? `${baseUrl}?l=${locale}` : baseUrl; } interface ProjectInfoModalProps { isOpen: boolean; onClose: () => void; projectDetails: ProjectDetails | null; isLoading: boolean; onDeleteMember?: (projectId: number, email: string, lang?: string) => Promise; } const ProjectInfoModal: React.FC = ({ isOpen, onClose, projectDetails, isLoading, onDeleteMember, }) => { const [activeSubsetIndex, setActiveSubsetIndex] = useState(0); const [deletingEmail, setDeletingEmail] = useState(null); const [confirmDeleteEmail, setConfirmDeleteEmail] = useState(null); const [emailToUsername, setEmailToUsername] = useState>({}); const [isLoadingUsernames, setIsLoadingUsernames] = useState(false); // Fetch usernames when project details change useEffect(() => { if (!projectDetails || !isOpen) return; const emails = Object.keys(projectDetails.members); if (emails.length === 0) return; const fetchUsernames = async () => { setIsLoadingUsernames(true); try { console.log('Fetching usernames for emails:', emails); const response = await fetch('/api/user/resolve-emails', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ emails }), }); const data = await response.json(); console.log('Resolve emails response:', data); if (data.success && data.data) { setEmailToUsername(data.data); } } catch (error) { console.error('Failed to fetch usernames:', error); } finally { setIsLoadingUsernames(false); } }; fetchUsernames(); }, [projectDetails?.projectId, isOpen]); // Only re-fetch when project changes const handleDeleteMember = async (email: string) => { if (!projectDetails || !onDeleteMember) return; setDeletingEmail(email); setConfirmDeleteEmail(null); try { await onDeleteMember(projectDetails.projectId, email, projectDetails.lang); } finally { setDeletingEmail(null); } }; if (!isOpen) return null; return (
{/* Header */}

Thông tin Project TMS {projectDetails && ( <> {' '} ( {getTmsUrl(projectDetails.projectId, projectDetails.lang)} ) )}

{/* Content */}
{isLoading ? (

Đang tải thông tin...

) : projectDetails ? ( <> {/* Project Members Section - Only show users with both username and email */}

Project Members {isLoadingUsernames && ( (đang tải usernames...) )}

{(() => { // Filter to only show users with valid TMS username, then sort by username const membersWithUsername = Object.keys(projectDetails.members) .filter(email => { const username = emailToUsername[email]; return username && username !== email; }) .sort((a, b) => { const usernameA = emailToUsername[a] || ''; const usernameB = emailToUsername[b] || ''; return usernameA.localeCompare(usernameB); }); if (membersWithUsername.length === 0) { return

Không có member TMS nào.

; } return (
{membersWithUsername.map((email) => { const username = emailToUsername[email]; return (
{username}
{email}
{onDeleteMember && ( )}
); })}
); })()}
{/* Subsets Section */}

Subsets

{projectDetails.subsets.length === 0 ? (

Không có subset nào.

) : ( <> {/* Subset Tabs */}
{projectDetails.subsets.map((subset, index) => ( ))}
{/* Active Subset Content */} {projectDetails.subsets[activeSubsetIndex] && (
{(() => { // Filter subset members to only those with valid TMS username, then sort by username const subsetMembers = Object.entries(projectDetails.subsets[activeSubsetIndex].members) .filter(([email]) => { const username = emailToUsername[email]; return username && username !== email; }) .sort((a, b) => { const usernameA = emailToUsername[a[0]] || ''; const usernameB = emailToUsername[b[0]] || ''; return usernameA.localeCompare(usernameB); }); if (subsetMembers.length === 0) { return ( ); } return subsetMembers.map( ([email, role]) => { const username = emailToUsername[email]; return ( ); } ); })()}
Member Access
Không có member TMS nào trong subset này.
{username} {role}
)} )}
) : (

Không có dữ liệu.

)}
{/* Footer */}
{/* Confirm Delete Modal */} confirmDeleteEmail && handleDeleteMember(confirmDeleteEmail)} onCancel={() => setConfirmDeleteEmail(null)} isLoading={!!deletingEmail} />
); }; export default ProjectInfoModal;