import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { useAuth, useProject } from '@/hooks' import { projectService, relationshipService, userService, RelationshipType, ProjectMember, Role, } from '@/services' type TabType = 'project' | 'members' | 'relationships' export default function AdminPage() { const { user } = useAuth() const { currentProject, setCurrentProject } = useProject() const navigate = useNavigate() // Tab state const [activeTab, setActiveTab] = useState('project') // Project settings state const [projectName, setProjectName] = useState('') const [projectDesc, setProjectDesc] = useState('') const [projectLoading, setProjectLoading] = useState(false) const [projectError, setProjectError] = useState(null) const [projectSuccess, setProjectSuccess] = useState(null) // Members state const [members, setMembers] = useState([]) const [roles, setRoles] = useState([]) const [membersLoading, setMembersLoading] = useState(true) const [membersError, setMembersError] = useState(null) const [updatingMember, setUpdatingMember] = useState(null) // Relationship types state const [relationshipTypes, setRelationshipTypes] = useState([]) const [relTypesLoading, setRelTypesLoading] = useState(true) const [relTypesError, setRelTypesError] = useState(null) // Modal states const [showCreateRelTypeModal, setShowCreateRelTypeModal] = useState(false) const [showEditRelTypeModal, setShowEditRelTypeModal] = useState(false) const [showDeleteConfirmModal, setShowDeleteConfirmModal] = useState(false) const [selectedRelType, setSelectedRelType] = useState(null) // Relationship type form state const [relTypeName, setRelTypeName] = useState('') const [relTypeDesc, setRelTypeDesc] = useState('') const [relTypeInverse, setRelTypeInverse] = useState('') const [relTypeFormLoading, setRelTypeFormLoading] = useState(false) const [relTypeFormError, setRelTypeFormError] = useState(null) // Check if user is admin const isAdmin = user?.role_id === 3 // Redirect if not admin useEffect(() => { if (!isAdmin) { navigate('/dashboard') } }, [isAdmin, navigate]) // Initialize project form useEffect(() => { if (currentProject) { setProjectName(currentProject.project_name) setProjectDesc(currentProject.project_desc || '') } }, [currentProject]) // Fetch members and roles useEffect(() => { const fetchMembersAndRoles = async () => { if (!currentProject) return try { setMembersLoading(true) setMembersError(null) const [fetchedMembers, fetchedRoles] = await Promise.all([ userService.getProjectMembers(currentProject.id), userService.getRoles(), ]) setMembers(fetchedMembers) setRoles(fetchedRoles) } catch (err) { console.error('Failed to fetch members:', err) setMembersError('Failed to load project members') } finally { setMembersLoading(false) } } fetchMembersAndRoles() }, [currentProject]) // Fetch relationship types useEffect(() => { const fetchRelTypes = async () => { if (!currentProject) return try { setRelTypesLoading(true) setRelTypesError(null) const fetchedTypes = await relationshipService.getRelationshipTypes(currentProject.id) setRelationshipTypes(fetchedTypes) } catch (err) { console.error('Failed to fetch relationship types:', err) setRelTypesError('Failed to load relationship types') } finally { setRelTypesLoading(false) } } fetchRelTypes() }, [currentProject]) // Handle project update const handleProjectUpdate = async (e: React.FormEvent) => { e.preventDefault() if (!currentProject) return try { setProjectLoading(true) setProjectError(null) setProjectSuccess(null) const updatedProject = await projectService.updateProject(currentProject.id, { project_name: projectName.trim(), project_desc: projectDesc.trim() || undefined, }) setCurrentProject(updatedProject) setProjectSuccess('Project updated successfully!') setTimeout(() => setProjectSuccess(null), 3000) } catch (err) { console.error('Failed to update project:', err) setProjectError('Failed to update project') } finally { setProjectLoading(false) } } // Handle member role update const handleRoleUpdate = async (memberId: number, newRoleId: number) => { if (!currentProject) return // Prevent self-demotion if (memberId === user?.db_user_id && newRoleId !== 3) { setMembersError('You cannot demote yourself. Ask another admin to change your role.') setTimeout(() => setMembersError(null), 5000) return } try { setUpdatingMember(memberId) setMembersError(null) const updatedMember = await userService.updateMemberRole( currentProject.id, memberId, newRoleId ) setMembers((prev) => prev.map((m) => (m.id === memberId ? updatedMember : m)) ) } catch (err: any) { console.error('Failed to update member role:', err) setMembersError(err.message || 'Failed to update member role') setTimeout(() => setMembersError(null), 5000) } finally { setUpdatingMember(null) } } // Handle create relationship type const handleCreateRelType = async (e: React.FormEvent) => { e.preventDefault() if (!currentProject) return try { setRelTypeFormLoading(true) setRelTypeFormError(null) const newType = await relationshipService.createRelationshipType(currentProject.id, { type_name: relTypeName.trim(), type_description: relTypeDesc.trim() || null, inverse_type_name: relTypeInverse.trim() || null, }) setRelationshipTypes((prev) => [...prev, newType]) setShowCreateRelTypeModal(false) resetRelTypeForm() } catch (err: any) { console.error('Failed to create relationship type:', err) setRelTypeFormError(err.message || 'Failed to create relationship type') } finally { setRelTypeFormLoading(false) } } // Handle update relationship type const handleUpdateRelType = async (e: React.FormEvent) => { e.preventDefault() if (!currentProject || !selectedRelType) return try { setRelTypeFormLoading(true) setRelTypeFormError(null) const updatedType = await relationshipService.updateRelationshipType( currentProject.id, selectedRelType.id, { type_name: relTypeName.trim() || null, type_description: relTypeDesc.trim() || null, inverse_type_name: relTypeInverse.trim() || null, } ) setRelationshipTypes((prev) => prev.map((t) => (t.id === selectedRelType.id ? updatedType : t)) ) setShowEditRelTypeModal(false) setSelectedRelType(null) resetRelTypeForm() } catch (err: any) { console.error('Failed to update relationship type:', err) setRelTypeFormError(err.message || 'Failed to update relationship type') } finally { setRelTypeFormLoading(false) } } // Handle delete relationship type const handleDeleteRelType = async () => { if (!currentProject || !selectedRelType) return try { setRelTypeFormLoading(true) setRelTypeFormError(null) await relationshipService.deleteRelationshipType(currentProject.id, selectedRelType.id) setRelationshipTypes((prev) => prev.filter((t) => t.id !== selectedRelType.id)) setShowDeleteConfirmModal(false) setSelectedRelType(null) } catch (err: any) { console.error('Failed to delete relationship type:', err) setRelTypeFormError(err.message || 'Failed to delete relationship type') } finally { setRelTypeFormLoading(false) } } // Reset relationship type form const resetRelTypeForm = () => { setRelTypeName('') setRelTypeDesc('') setRelTypeInverse('') setRelTypeFormError(null) } // Open edit modal const openEditModal = (relType: RelationshipType) => { setSelectedRelType(relType) setRelTypeName(relType.type_name) setRelTypeDesc(relType.type_description || '') setRelTypeInverse(relType.inverse_type_name || '') setRelTypeFormError(null) setShowEditRelTypeModal(true) } // Open delete modal const openDeleteModal = (relType: RelationshipType) => { setSelectedRelType(relType) setRelTypeFormError(null) setShowDeleteConfirmModal(true) } if (!isAdmin) { return null } if (!currentProject) { return (

No Project Selected

Please select a project from the dashboard first.

) } return (
{/* Header */}

Admin Panel

Managing: {currentProject.project_name}

{/* Navigation */}
{/* Back Button */}
{/* Content */}
{/* Project Settings Tab */} {activeTab === 'project' && (

Project Settings

{projectError && (
{projectError}
)} {projectSuccess && (
{projectSuccess}
)}
setProjectName(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded text-sm focus:outline-none focus:ring-2 focus:ring-teal-500" required />