UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

456 lines (392 loc) 10.4 kB
import type {JSONObject, Status, Timestamp, XID} from './index'; import type {UserSummary} from './user'; // Organization types export type OrganizationType = 'platform' | 'customer'; // Main organization interface export interface Organization { // Core identification id: XID; name: string; slug: string; displayName?: string; // Organization type and status orgType: OrganizationType; isPlatformOrganization: boolean; status: Status; // Branding and appearance logoUrl?: string; brandColor?: string; faviconUrl?: string; customCSS?: string; // Contact and location domain?: string; domains?: string[]; website?: string; description?: string; address?: OrganizationAddress; // Ownership and management owner?: UserSummary; ownerId?: XID; // Members and roles members?: MemberSummary[]; memberCount?: number; // Billing and subscription plan: string; subscriptionId?: string; subscriptionStatus: string; billingEmail?: string; trialEndsAt?: Timestamp; // Limits and quotas externalUserLimit: number; endUserLimit: number; currentExternalUsers?: number; currentEndUsers?: number; // Features and capabilities features?: FeatureSummary[]; enabledFeatures?: string[]; // SSO configuration ssoEnabled: boolean; ssoDomain?: string; ssoProvider?: string; ssoConfiguration?: JSONObject; // Security settings mfaRequired: boolean; allowPublicSignup: boolean; emailDomainRestrictions?: string[]; ipWhitelist?: string[]; // Timestamps createdAt: Timestamp; updatedAt: Timestamp; // Metadata metadata?: JSONObject; customAttributes?: JSONObject; // Statistics (when included) stats?: OrganizationStats; } // Organization summary for lists and references export interface OrganizationSummary { id: XID; name: string; slug: string; logoUrl?: string; orgType: OrganizationType; status: Status; memberCount?: number; userRole?: string; userPermissions?: string[]; } // Organization creation request export interface CreateOrganizationRequest { name: string; slug?: string; displayName?: string; domain?: string; logoUrl?: string; description?: string; plan?: string; metadata?: JSONObject; customAttributes?: JSONObject; } // Organization update request export interface UpdateOrganizationRequest { name?: string; displayName?: string; domain?: string; logoUrl?: string; brandColor?: string; faviconUrl?: string; customCSS?: string; website?: string; description?: string; address?: OrganizationAddress; billingEmail?: string; metadata?: JSONObject; customAttributes?: JSONObject; } // Organization address export interface OrganizationAddress { street?: string; city?: string; state?: string; postalCode?: string; country?: string; } // Member management export interface MemberSummary { id: XID; userId: XID; user?: UserSummary; role: string; roleId: XID; status: 'active' | 'inactive' | 'pending' | 'suspended'; joinedAt: Timestamp; invitedBy?: XID; lastActiveAt?: Timestamp; permissions?: string[]; } // Full membership details export interface Membership { id: XID; organizationId: XID; organization?: OrganizationSummary; userId: XID; user?: UserSummary; // Role and permissions roleId: XID; roleName: string; permissions: string[]; // Status and lifecycle status: 'active' | 'inactive' | 'pending' | 'suspended'; joinedAt: Timestamp; invitedAt?: Timestamp; invitedBy?: XID; acceptedAt?: Timestamp; suspendedAt?: Timestamp; suspendedBy?: XID; suspensionReason?: string; // Activity tracking lastActiveAt?: Timestamp; loginCount?: number; // Billing isBillableSeat: boolean; seatType?: 'full' | 'guest' | 'service'; // Metadata metadata?: JSONObject; } // Member invitation export interface MemberInvitation { id: XID; organizationId: XID; inviterUserId: XID; inviterName?: string; emailAddress: string; roleId: XID; roleName: string; // Status and lifecycle status: 'pending' | 'accepted' | 'expired' | 'revoked'; token: string; expiresAt: Timestamp; createdAt: Timestamp; acceptedAt?: Timestamp; revokedAt?: Timestamp; revokedBy?: XID; // Customization customMessage?: string; redirectUrl?: string; metadata?: JSONObject; } // Invitation request export interface CreateInvitationRequest { emailAddress: string; roleId: XID; customMessage?: string; redirectUrl?: string; expiresAt?: Timestamp; metadata?: JSONObject; } // Organization roles export interface OrganizationRole { id: XID; name: string; description?: string; organizationId: XID; isDefault: boolean; isSystemRole: boolean; permissions: string[]; memberCount?: number; createdAt: Timestamp; updatedAt: Timestamp; } // Feature management export interface FeatureSummary { id: XID; name: string; displayName: string; description?: string; enabled: boolean; required: boolean; planRestricted: boolean; configuration?: JSONObject; } // Organization settings export interface OrganizationSettings { // Authentication settings allowPublicSignup: boolean; requireEmailVerification: boolean; allowUsernameSignup: boolean; allowPhoneSignup: boolean; // Password policy passwordMinLength: number; passwordRequireUppercase: boolean; passwordRequireLowercase: boolean; passwordRequireNumbers: boolean; passwordRequireSymbols: boolean; // Session settings sessionDuration: number; inactivityTimeout: number; maxConcurrentSessions: number; // MFA settings mfaRequired: boolean; allowedMfaMethods: string[]; mfaGracePeriod?: number; // Domain restrictions emailDomainRestrictions?: string[]; emailDomainRestrictionsEnabled: boolean; // Security settings ipWhitelist?: string[]; ipWhitelistEnabled: boolean; allowedCountries?: string[]; blockedCountries?: string[]; // Notification settings securityNotifications: boolean; billingNotifications: boolean; featureAnnouncements: boolean; // Branding settings customBranding: boolean; hideFromDirectory: boolean; // Advanced settings auditLogRetentionDays: number; dataResidency?: string; encryptionAtRest: boolean; // API settings apiRateLimit?: number; webhookSecret?: string; allowedCallbackUrls?: string[]; } // Organization statistics export interface OrganizationStats { // Member statistics totalMembers: number; activeMembers: number; pendingInvitations: number; suspendedMembers: number; // User type breakdown internalUsers: number; externalUsers: number; endUsers: number; // Activity statistics dailyActiveUsers: number; weeklyActiveUsers: number; monthlyActiveUsers: number; // Authentication statistics totalLogins: number; successfulLogins: number; failedLogins: number; mfaLogins: number; ssoLogins: number; // Security statistics blockedAttempts: number; passwordResets: number; accountLockouts: number; // Billing statistics billableSeats: number; seatUtilization: number; // Time series data (optional) timeSeriesData?: Array<{ date: string; activeUsers: number; newMembers: number; logins: number; }>; } // Organization search and filtering export interface OrganizationSearchParams { query?: string; orgType?: OrganizationType; status?: Status; plan?: string; subscriptionStatus?: string; hasSSO?: boolean; createdBefore?: Timestamp; createdAfter?: Timestamp; sortBy?: 'name' | 'createdAt' | 'memberCount' | 'lastActiveAt'; sortOrder?: 'asc' | 'desc'; } // Domain management export interface OrganizationDomain { id: XID; organizationId: XID; domain: string; isPrimary: boolean; verified: boolean; verificationToken?: string; verificationMethod: 'dns' | 'http'; verifiedAt?: Timestamp; createdAt: Timestamp; } // Domain verification export interface DomainVerificationRequest { domain: string; method: 'dns' | 'http'; } export interface DomainVerificationResponse { domain: string; token: string; method: 'dns' | 'http'; instructions: string; dnsRecord?: { type: string; name: string; value: string; }; httpFile?: { path: string; content: string; }; } // Organization transfer export interface TransferOrganizationRequest { newOwnerId: XID; reason?: string; notifyMembers: boolean; } // Organization usage and billing export interface OrganizationUsage { organizationId: XID; billingPeriodStart: Timestamp; billingPeriodEnd: Timestamp; // Seat usage billableSeats: number; maxSeats: number; seatOverage: number; // Feature usage apiCallsUsed: number; apiCallsLimit: number; storageUsed: number; storageLimit: number; // Monthly statistics activeUsers: number; newUsers: number; totalLogins: number; dataTransfer: number; } // Organization billing export interface OrganizationBilling { organizationId: XID; subscriptionId?: string; customerId?: string; // Plan information plan: string; planName: string; planPrice: number; billingCycle: 'monthly' | 'yearly'; // Subscription status status: 'active' | 'trialing' | 'past_due' | 'canceled' | 'unpaid'; trialStart?: Timestamp; trialEnd?: Timestamp; currentPeriodStart: Timestamp; currentPeriodEnd: Timestamp; // Payment information paymentMethod?: string; lastPaymentAmount?: number; lastPaymentDate?: Timestamp; nextPaymentDate?: Timestamp; // Usage and overages baseSeats: number; additionalSeats: number; overage: number; // Billing contact billingEmail: string; billingAddress?: OrganizationAddress; taxId?: string; }