import { CardProps } from '@heroui/react'; import { AthenaAuthOrganization, AthenaAuthOrganizationInvitation } from '@xylex-group/athena'; import { FormEvent } from 'react'; import { AthenaAuthOrganizationMemberWithAuthorization } from '../../../lib/auth/organization/use-organization-queries.js'; import { buildOrganizationSwitcherOptions, extractAdminUserActions, getOrganizationDialogCopy, OrganizationDialogAction, OrganizationRoleOption } from './organization-helpers.js'; import { OrganizationSelectionState, OrganizationSwitcherEntity } from './organization-selection-state.js'; import { OrganizationCapableAuthClient, OrganizationRootLocalization } from './use-organization-auth.js'; /** Local row shapes used by the manager UI (portable; no better-auth type export). */ export type OrganizationManagerOrg = AthenaAuthOrganization; export type OrganizationManagerMember = AthenaAuthOrganizationMemberWithAuthorization; export type OrganizationManagerInvitation = AthenaAuthOrganizationInvitation; export type OrganizationManagerUserInvitation = AthenaAuthOrganizationInvitation; export type ManagerDialogAction = OrganizationDialogAction; export type { OrganizationRootLocalization } from './use-organization-auth.js'; export interface UseOrganizationManagerOptions { /** Explicit client; falls back to `AuthProvider` via internal `useAuth()`. */ authClient?: OrganizationCapableAuthClient | null; /** * When false, refuse `setActive({ organizationId: null })` and hide * personal scope in the settings switcher. Defaults to true. */ personalAccount?: boolean; variant?: CardProps["variant"]; } /** Portable public shape - avoids leaking better-auth declaration internals. */ export interface UseOrganizationManagerResult { acceptInvitationPending: boolean; activeOrganization: OrganizationManagerOrg | null; adminUserActions: ReturnType; cancelInvitationPending: boolean; canUpdateOrganization: boolean; checkSlugPending: boolean; closeDialog: () => void; configuredRoles: Record | undefined; createOrganizationName: string; createOrganizationPending: boolean; currentUserId: string | null; defaultRoleValue: string; dialogAction: ManagerDialogAction | null; dialogCopy: ReturnType | null; foundingOwnerMemberId: string | null; handleAcceptInvitation: (invitationId: string) => Promise; handleCancelInvitation: (invitationId: string) => Promise; handleConfirmDialogAction: () => Promise; handleCreateOrganization: (event: FormEvent) => Promise; handleInviteMember: (event: FormEvent) => Promise; handleRejectInvitation: (invitationId: string) => Promise; handleSwitchOrganization: (organizationId: string | null) => Promise; handleUpdateMemberRole: (member: OrganizationManagerMember, role: string) => Promise; handleUpdateOrganization: (event: FormEvent) => Promise; hasActiveOrganization: boolean; inputVariant: "primary" | "secondary"; invitations: OrganizationManagerInvitation[]; invitationsPending: boolean; inviteEmail: string; inviteEmailInputId: string; inviteEmailIsOwn: boolean; inviteEmailIsValid: boolean; inviteFormKey: string; inviteMemberPending: boolean; inviteRoleValue: string; isAdminActionPending: boolean; isCreateOrganizationOpen: boolean; isOrganizationListEmpty: boolean; /** False when neither prop nor AuthProvider supplied an auth client. */ isReady: boolean; /** * True while a switch is in flight. Selected UI id may differ from * confirmed session identity (optimistic selection, pessimistic identity). */ isSwitching: boolean; membersPending: boolean; organizationById: Map; organizationFormKey: string; organizationLocalization: Record; organizationSelection: OrganizationSelectionState; organizationStrings: Record; organizationSwitcherEntities: OrganizationSwitcherEntity[]; organizationSwitcherOptions: ReturnType; organizations: OrganizationManagerOrg[]; organizationsPending: boolean; ownerRoleValue: string | null; /** False means organization-only settings (no personal scope). */ personalAccount: boolean; refreshOrganizationShell: () => Promise; rejectInvitationPending: boolean; removeMemberPending: boolean; roleOptions: OrganizationRoleOption[]; rootLocalization: OrganizationRootLocalization; setActiveOrganizationPending: boolean; setCreateOrganizationName: (value: string) => void; setDialogAction: (action: ManagerDialogAction | null) => void; setInviteEmail: (value: string) => void; setInviteRoleValue: (value: string) => void; setIsCreateOrganizationOpen: (open: boolean) => void; setUpdateOrganizationName: (value: string) => void; switcherActiveOrganizationId: string | null; updateMemberRolePending: boolean; updateOrganizationName: string; updateOrganizationPending: boolean; userInvitations: OrganizationManagerUserInvitation[]; userInvitationsPending: boolean; visibleMembers: OrganizationManagerMember[]; } export declare function useOrganizationManager({ authClient: authClientOverride, personalAccount: personalAccountProp, variant }?: UseOrganizationManagerOptions): UseOrganizationManagerResult;