@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 21.2 kB
Source Map (JSON)
{"version":3,"file":"use-user.cjs","sources":["../../../src/hooks/use-user.ts"],"sourcesContent":["/**\n * @frank-auth/react - useUser Hook\n *\n * User-specific operations hook that provides access to user profile management,\n * MFA operations, email/phone verification, and other user-related functionality.\n */\n\nimport {useCallback, useMemo, useState} from 'react';\n\nimport type {ChangePasswordRequest, User, UserProfileUpdateRequest, VerificationRequest,} from '@frank-auth/client';\n\nimport {useAuth} from './use-auth';\n\nimport type {AuthError} from '../provider/types';\n\n// ============================================================================\n// User Hook Interface\n// ============================================================================\n\nexport interface UseUserReturn {\n // User state\n user: User | null;\n isLoaded: boolean;\n isLoading: boolean;\n error: AuthError | null;\n\n // Profile management\n updateProfile: (data: UserProfileUpdateRequest) => Promise<User>;\n changePassword: (data: ChangePasswordRequest) => Promise<void>;\n deleteAccount: () => Promise<void>;\n\n // Email management\n updateEmail: (email: string) => Promise<void>;\n verifyEmail: (code: string) => Promise<void>;\n resendEmailVerification: () => Promise<void>;\n\n // Phone management\n updatePhone: (phone: string) => Promise<void>;\n verifyPhone: (code: string) => Promise<void>;\n resendPhoneVerification: () => Promise<void>;\n\n // Profile image\n updateProfileImage: (imageUrl: string) => Promise<User>;\n removeProfileImage: () => Promise<User>;\n\n // Metadata management\n updateMetadata: (metadata: Record<string, any>) => Promise<User>;\n\n // Convenience properties\n firstName: string | null;\n lastName: string | null;\n fullName: string | null;\n email: string | null;\n phone: string | null;\n profileImageUrl: string | null;\n username: string | null;\n\n // Verification status\n isEmailVerified: boolean;\n isPhoneVerified: boolean;\n needsEmailVerification: boolean;\n needsPhoneVerification: boolean;\n\n // Account status\n isActive: boolean;\n isBlocked: boolean;\n createdAt: Date | null;\n lastSignInAt: Date | null;\n}\n\n// ============================================================================\n// Main useUser Hook\n// ============================================================================\n\n/**\n * User management hook providing access to user profile and account operations\n *\n * @example Basic profile management\n * ```tsx\n * import { useUser } from '@frank-auth/react';\n *\n * function UserProfile() {\n * const { user, updateProfile, isLoading } = useUser();\n *\n * const handleUpdate = async (data) => {\n * try {\n * await updateProfile(data);\n * toast.success('Profile updated!');\n * } catch (error) {\n * toast.error('Failed to update profile');\n * }\n * };\n *\n * if (!user) return <div>Please sign in</div>;\n *\n * return (\n * <form onSubmit={(e) => {\n * e.preventDefault();\n * const formData = new FormData(e.target);\n * handleUpdate({\n * firstName: formData.get('firstName'),\n * lastName: formData.get('lastName'),\n * });\n * }}>\n * <input name=\"firstName\" defaultValue={user.firstName} />\n * <input name=\"lastName\" defaultValue={user.lastName} />\n * <button type=\"submit\" disabled={isLoading}>\n * Update Profile\n * </button>\n * </form>\n * );\n * }\n * ```\n *\n * @example Email verification\n * ```tsx\n * function EmailVerification() {\n * const { needsEmailVerification, verifyEmail, resendEmailVerification } = useUser();\n * const [code, setCode] = useState('');\n *\n * if (!needsEmailVerification) return null;\n *\n * return (\n * <div>\n * <p>Please verify your email address</p>\n * <input\n * value={code}\n * onChange={(e) => setCode(e.target.value)}\n * placeholder=\"Enter verification code\"\n * />\n * <button onClick={() => verifyEmail(code)}>\n * Verify\n * </button>\n * <button onClick={resendEmailVerification}>\n * Resend Code\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useUser(): UseUserReturn {\n const {user, updateUser, deleteUser, reload, sdk} = useAuth();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n // Error handler\n const handleError = useCallback((err: any) => {\n const authError: AuthError = {\n code: err.code || 'UNKNOWN_ERROR',\n message: err.message || 'An unknown error occurred',\n details: err.details,\n field: err.field,\n };\n setError(authError);\n throw authError;\n }, []);\n\n // Profile management\n const updateProfile = useCallback(async (data: UserProfileUpdateRequest): Promise<User> => {\n if (!sdk.user) throw new Error('User not authenticated');\n\n try {\n setIsLoading(true);\n setError(null);\n\n const updatedUser = await sdk.user.updateProfile(data);\n await reload(); // Refresh auth state\n\n return updatedUser;\n } catch (err) {\n return handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.user, reload, handleError]);\n\n const changePassword = useCallback(async (data: ChangePasswordRequest): Promise<void> => {\n if (!sdk.user) throw new Error('User not authenticated');\n\n try {\n setIsLoading(true);\n setError(null);\n\n await sdk.user.changePassword(data);\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.user, handleError]);\n\n const deleteAccount = useCallback(async (): Promise<void> => {\n try {\n setIsLoading(true);\n setError(null);\n\n await deleteUser();\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [deleteUser, handleError]);\n\n // Email management\n const updateEmail = useCallback(async (email: string): Promise<void> => {\n try {\n setIsLoading(true);\n setError(null);\n\n await updateProfile({primaryEmailAddress: email});\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [updateProfile, handleError]);\n\n const verifyEmail = useCallback(async (code: string): Promise<void> => {\n if (!sdk.user) throw new Error('User not authenticated');\n\n try {\n setIsLoading(true);\n setError(null);\n\n const verificationRequest: VerificationRequest = {\n code,\n type: 'email',\n };\n\n await sdk.auth.verifyEmail(verificationRequest);\n await reload(); // Refresh auth state\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.user, reload, handleError]);\n\n const resendEmailVerification = useCallback(async (): Promise<void> => {\n if (!sdk.user || !user?.primaryEmailAddress) throw new Error('User not authenticated');\n\n try {\n setIsLoading(true);\n setError(null);\n\n await sdk.user.resendEmailVerification(user.primaryEmailAddress);\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.user, user?.primaryEmailAddress, handleError]);\n\n // Phone management\n const updatePhone = useCallback(async (phone: string): Promise<void> => {\n try {\n setIsLoading(true);\n setError(null);\n\n await updateProfile({primaryPhoneNumber: phone});\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [updateProfile, handleError]);\n\n const verifyPhone = useCallback(async (code: string): Promise<void> => {\n if (!sdk.user) throw new Error('User not authenticated');\n\n try {\n setIsLoading(true);\n setError(null);\n\n const verificationRequest: VerificationRequest = {\n code,\n type: 'phone',\n };\n\n await sdk.auth.verifyPhone(verificationRequest);\n await reload(); // Refresh auth state\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.user, reload, handleError]);\n\n const resendPhoneVerification = useCallback(async (): Promise<void> => {\n if (!sdk.user || !user?.primaryPhoneNumber) throw new Error('User not authenticated');\n\n try {\n setIsLoading(true);\n setError(null);\n\n await sdk.user.resendPhoneVerification(user.primaryPhoneNumber);\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.user, user?.primaryPhoneNumber, handleError]);\n\n // Profile image management\n const updateProfileImage = useCallback(async (imageUrl: string): Promise<User> => {\n return updateProfile({profileImageUrl: imageUrl});\n }, [updateProfile]);\n\n const removeProfileImage = useCallback(async (): Promise<User> => {\n return updateProfile({profileImageUrl: undefined()});\n }, [updateProfile]);\n\n // Metadata management\n const updateMetadata = useCallback(async (metadata: Record<string, any>): Promise<User> => {\n return updateProfile({unsafeMetadata: metadata});\n }, [updateProfile]);\n\n // Convenience properties\n const firstName = useMemo(() => user?.firstName || null, [user]);\n const lastName = useMemo(() => user?.lastName || null, [user]);\n const fullName = useMemo(() => {\n if (!user) return null;\n const parts = [user.firstName, user.lastName].filter(Boolean);\n return parts.length > 0 ? parts.join(' ') : null;\n }, [user]);\n\n const email = useMemo(() => user?.primaryEmailAddress || null, [user]);\n const phone = useMemo(() => user?.primaryPhoneNumber || null, [user]);\n const profileImageUrl = useMemo(() => user?.profileImageUrl || null, [user]);\n const username = useMemo(() => user?.username || null, [user]);\n\n // Verification status\n const isEmailVerified = useMemo(() => user?.emailVerified || false, [user]);\n const isPhoneVerified = useMemo(() => user?.phoneVerified || false, [user]);\n const needsEmailVerification = useMemo(() => !!user && !user.emailVerified, [user]);\n const needsPhoneVerification = useMemo(() => !!user && !!user.primaryPhoneNumber && !user.phoneVerified, [user]);\n\n // Account status\n const isActive = useMemo(() => user?.active || false, [user]);\n const isBlocked = useMemo(() => user?.blocked || false, [user]);\n const createdAt = useMemo(() => user?.createdAt ? new Date(user.createdAt) : null, [user]);\n const lastSignInAt = useMemo(() => user?.lastSignInAt ? new Date(user.lastSignInAt) : null, [user]);\n\n return {\n // User state\n user,\n isLoaded: !!user,\n isLoading,\n error,\n\n // Profile management\n updateProfile,\n changePassword,\n deleteAccount,\n\n // Email management\n updateEmail,\n verifyEmail,\n resendEmailVerification,\n\n // Phone management\n updatePhone,\n verifyPhone,\n resendPhoneVerification,\n\n // Profile image\n updateProfileImage,\n removeProfileImage,\n\n // Metadata management\n updateMetadata,\n\n // Convenience properties\n firstName,\n lastName,\n fullName,\n email,\n phone,\n profileImageUrl,\n username,\n\n // Verification status\n isEmailVerified,\n isPhoneVerified,\n needsEmailVerification,\n needsPhoneVerification,\n\n // Account status\n isActive,\n isBlocked,\n createdAt,\n lastSignInAt,\n };\n}\n\n// ============================================================================\n// Specialized User Hooks\n// ============================================================================\n\n/**\n * Hook for user profile data only (no methods)\n */\nexport function useUserProfile() {\n const {\n user,\n firstName,\n lastName,\n fullName,\n email,\n phone,\n profileImageUrl,\n username,\n isEmailVerified,\n isPhoneVerified,\n isActive,\n isBlocked,\n createdAt,\n lastSignInAt,\n } = useUser();\n\n return {\n user,\n firstName,\n lastName,\n fullName,\n email,\n phone,\n profileImageUrl,\n username,\n isEmailVerified,\n isPhoneVerified,\n isActive,\n isBlocked,\n createdAt,\n lastSignInAt,\n };\n}\n\n/**\n * Hook for user verification operations\n */\nexport function useUserVerification() {\n const {\n isEmailVerified,\n isPhoneVerified,\n needsEmailVerification,\n needsPhoneVerification,\n verifyEmail,\n verifyPhone,\n resendEmailVerification,\n resendPhoneVerification,\n isLoading,\n error,\n } = useUser();\n\n return {\n isEmailVerified,\n isPhoneVerified,\n needsEmailVerification,\n needsPhoneVerification,\n verifyEmail,\n verifyPhone,\n resendEmailVerification,\n resendPhoneVerification,\n isLoading,\n error,\n needsVerification: needsEmailVerification || needsPhoneVerification,\n };\n}\n\n/**\n * Hook for user profile management operations\n */\nexport function useUserActions() {\n const {\n updateProfile,\n changePassword,\n deleteAccount,\n updateEmail,\n updatePhone,\n updateProfileImage,\n removeProfileImage,\n updateMetadata,\n isLoading,\n error,\n } = useUser();\n\n return {\n updateProfile,\n changePassword,\n deleteAccount,\n updateEmail,\n updatePhone,\n updateProfileImage,\n removeProfileImage,\n updateMetadata,\n isLoading,\n error,\n };\n}"],"names":["useUser","user","updateUser","deleteUser","reload","sdk","useAuth","isLoading","setIsLoading","useState","error","setError","handleError","useCallback","err","authError","updateProfile","data","updatedUser","changePassword","deleteAccount","updateEmail","email","verifyEmail","code","verificationRequest","resendEmailVerification","updatePhone","phone","verifyPhone","resendPhoneVerification","updateProfileImage","imageUrl","removeProfileImage","updateMetadata","metadata","firstName","useMemo","lastName","fullName","parts","profileImageUrl","username","isEmailVerified","isPhoneVerified","needsEmailVerification","needsPhoneVerification","isActive","isBlocked","createdAt","lastSignInAt","useUserProfile","useUserVerification","useUserActions"],"mappings":"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"}