UNPKG

nuxt-supabase-team-auth

Version:

Drop-in Nuxt 3 module for team-based authentication with Supabase

130 lines (113 loc) 4.06 kB
// Types - we'll use types from @nuxtjs/supabase composables import type { DbProfile, DbTeam, DbTeamMember, DbImpersonationSession } from './database.types' // Removed unused SupabaseClient type // Re-export password policy types export type { PasswordPolicy, PasswordValidationResult } from './password-policy' // Social Provider Configuration Types export interface SocialProviderConfig { enabled: boolean // Future fields for OAuth configuration clientId?: string redirectUrl?: string scopes?: string[] } export interface SocialProvidersConfig { google?: SocialProviderConfig github?: SocialProviderConfig // Future providers can be added here apple?: SocialProviderConfig microsoft?: SocialProviderConfig facebook?: SocialProviderConfig twitter?: SocialProviderConfig } export interface User { id: string email: string user_metadata?: { // Standard Supabase auth field for user's display name name?: string avatar_url?: string } } // Use Supabase-generated types export type Profile = DbProfile export type Team = DbTeam export type TeamMember = DbTeamMember export type ImpersonationSession = DbImpersonationSession export interface TeamAuthState { currentUser: Ref<User | null> currentTeam: Ref<Team | null> currentRole: Ref<string | null> isLoading: Ref<boolean> isImpersonating: Ref<boolean> impersonationExpiresAt: Ref<Date | null> } export interface SessionHealthResult { isHealthy: boolean issues: string[] } export interface ActiveTab { tabId: string timestamp: number url: string } export interface TeamAuthMethods { signUpWithTeam: (email: string, password: string, teamName: string) => Promise<void> signIn: (email: string, password: string) => Promise<void> signOut: () => Promise<void> inviteMember: (email: string, role?: string) => Promise<void> revokeInvite: (inviteId: string) => Promise<void> resendInvite: (inviteId: string) => Promise<void> promote: (userId: string) => Promise<void> demote: (userId: string) => Promise<void> transferOwnership: (userId: string) => Promise<void> getProfile: () => Promise<Profile | null> updateProfile: (updates: Partial<Profile>) => Promise<void> renameTeam: (name: string) => Promise<void> updateTeam: (updates: Partial<Team>) => Promise<void> deleteTeam: () => Promise<void> startImpersonation: (targetUserId: string, reason: string) => Promise<void> stopImpersonation: () => Promise<void> getAvatarFallback: (overrides?: { fullName?: string | null, email?: string | null }) => string getTeamMembers: () => Promise<void> updateMemberRole: (userId: string, role: string) => Promise<void> removeMember: (userId: string) => Promise<void> getTeamMemberProfile: (userId: string) => Promise<Profile | null> updateTeamMemberProfile: (userId: string, updates: Partial<Profile>) => Promise<void> // Session management utilities sessionHealth: () => SessionHealthResult triggerSessionRecovery: () => void getActiveTabs: () => ActiveTab[] isTabPrimary: boolean } export type TeamAuth = TeamAuthState & TeamAuthMethods // UserButton Custom Menu Item Types export interface CustomMenuItem { /** Display text for the menu item */ label: string /** Icon name (e.g., 'i-lucide-settings') */ icon?: string /** Internal route to navigate to */ to?: string /** External URL to navigate to */ href?: string /** Link target (e.g., '_blank') */ target?: string /** Custom click handler (overrides navigation) */ onSelect?: (event: Event) => void /** Disable the menu item */ disabled?: boolean /** Required role to show this item */ requiredRole?: 'member' | 'admin' | 'owner' | 'super_admin' /** Add a separator after this item */ addSeparator?: boolean } // Module Configuration Types export interface TeamAuthModuleConfig { supabaseUrl?: string supabaseKey?: string debug?: boolean redirectTo?: string socialProviders?: SocialProvidersConfig } // Note: $teamAuthClient plugin types removed - now using @nuxtjs/supabase's useSupabaseClient()