import React from 'react'; import { Practitioner } from 'fhir/r4'; import { useAuthServiceContext, usePractitionerServiceContext, useStaffPermissionServiceContext } from '../../../../../services'; import EditPractitionerProfile from '../../../ProfilePage/EditProfilePage/EditPractitionerProfile/EditPractitionerProfile.tsx'; import { DismissibleAlert } from '../../../../../components/ui/dismissible-alert'; import { getOrganizationSetupMissingItems, isOrganizationSetupComplete } from '../../../../../utils/organizationSetup'; import { STAFF_WORKSPACES, getPractitionerRoleWorkspaces } from '../../../../../utils/staffRoleCatalog.ts'; const UserEditPractitionerProfilePage: React.FC = () => { const { currentUser, getCognitoGroup, USER_ROLES, wpOrganization } = useAuthServiceContext(); const { activeWorkspace } = useStaffPermissionServiceContext(); const { practitionerState } = usePractitionerServiceContext(); // Access is governed by the route guard (RequireStaffPermission section="staff" manage) - a delegated // `staff:manage` workspace can edit staff profiles; authority tabs remain admin-only. // Deactivation guardrails: a manager may deactivate staff, but not themselves, and a non-admin manager // may not deactivate an admin (mirrors the Admin-workspace grant guardrail). Deactivation flips this org's // PractitionerRole.active to false; the token pipeline then revokes staff access here only. const targetRoles = practitionerState?.roles ?? []; const isSelf = currentUser?.fhir?.id === practitionerState?.practitioner.id; const isAdminActor = activeWorkspace === USER_ROLES.ADMIN; const targetIsAdmin = targetRoles.some((role) => getPractitionerRoleWorkspaces(role, getCognitoGroup(role)).includes(STAFF_WORKSPACES.ADMIN), ); const allowDeactivation = !isSelf && (isAdminActor || !targetIsAdmin); const organizationSetupMissingItems = getOrganizationSetupMissingItems(wpOrganization.current); const organizationSetupComplete = isOrganizationSetupComplete(wpOrganization.current); if (!organizationSetupComplete) { return ( Complete primary organization information before editing staff profiles. Missing: {organizationSetupMissingItems.join(', ')}. ); } return ( practitionerState && ); }; export default UserEditPractitionerProfilePage;