bigblocks
Version:
Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React
21 lines • 13.2 kB
JSON
{
"name": "lib-types",
"type": "registry:component",
"dependencies": [
"bitcoin-backup",
"react"
],
"devDependencies": [],
"registryDependencies": [
"button",
"wallet-types-extended-user"
],
"files": [
{
"path": "lib/types.ts",
"type": "registry:component",
"target": "<%- config.aliases.lib %>/types.ts",
"content": "import type {\n\tBapMasterBackup,\n\tBapMasterBackupLegacy,\n\tBapMemberBackup,\n\tDecryptedBackup,\n\tMasterBackupType42,\n\tOneSatBackup,\n\tWifBackup,\n} from \"bitcoin-backup\";\nimport type React from \"react\";\nimport type { ButtonProps } from \"../components/ui/button\";\nimport type { WalletUserExtension } from \"../components/wallet/types/extended-user\";\n\nexport type {\n\tBapMasterBackup,\n\tBapMasterBackupLegacy,\n\tMasterBackupType42,\n\tBapMemberBackup,\n\tWifBackup,\n\tOneSatBackup,\n\tDecryptedBackup,\n\tWalletUserExtension,\n};\n\n// Type guard functions for backup format detection\nexport function isBapMasterBackupLegacy(\n\tbackup: BapMasterBackup,\n): backup is BapMasterBackupLegacy {\n\treturn \"xprv\" in backup && \"mnemonic\" in backup;\n}\n\nexport function isMasterBackupType42(\n\tbackup: BapMasterBackup,\n): backup is MasterBackupType42 {\n\treturn \"rootPk\" in backup && !(\"xprv\" in backup);\n}\n\n// Re-export backup type names for configuration\nexport type BackupTypeName =\n\t| \"BapMasterBackup\"\n\t| \"BapMemberBackup\"\n\t| \"OneSatBackup\"\n\t| \"WifBackup\";\n\nexport interface BackupTypeConfig {\n\tenabled: BackupTypeName[];\n\terrorMessages?: {\n\t\tunsupported?: string;\n\t\tinvalid?: string;\n\t};\n}\n\n// Configuration types\nexport interface BitcoinAuthConfig {\n\t// API Configuration\n\tapiUrl?: string;\n\n\t// Blockchain Service Configuration\n\tblockchainService?: BlockchainServiceConfig;\n\n\t// OAuth Providers\n\toauthProviders?: OAuthProvider[];\n\tcustomOAuthProviders?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\ticon: React.ReactNode;\n\t\tauthUrl?: string;\n\t\tcolor?: string;\n\t\tcustomAuth?: {\n\t\t\ttype: \"popup\" | \"redirect\" | \"challenge\";\n\t\t\thandler: (config: Record<string, string | number | boolean>) => Promise<{\n\t\t\t\tencryptedBackup?: string;\n\t\t\t\tidKey?: string;\n\t\t\t\terror?: string;\n\t\t\t}>;\n\t\t};\n\t}>;\n\n\t// Backup Configuration\n\tbackupTypes?: BackupTypeConfig;\n\n\t// Storage Configuration\n\tpersistentStorage?: StorageAdapter; // For persistent data (encrypted backups)\n\tsessionStorage?: StorageAdapter; // For temporary data (decrypted backups, payment keys)\n\tstorageNamespace?: string; // Prefix for all storage keys (e.g., 'storybook', 'dev', 'prod')\n\n\t// Theme Configuration\n\ttheme?: ThemeConfig;\n\n\t// Redirect Configuration\n\tredirects?: RedirectConfig;\n\n\t// Callbacks\n\tonSuccess?: (user: AuthUser) => void;\n\tonError?: (error: AuthError) => void;\n}\n\n// Blockchain Service Configuration\nexport interface BlockchainServiceConfig {\n\t// Use either client-side API keys OR backend proxy\n\tmode: \"client\" | \"proxy\";\n\n\t// Client-side configuration (for 'client' mode)\n\tclient?: {\n\t\t// API keys for different services\n\t\tapiKeys?: {\n\t\t\twhatsonchain?: string;\n\t\t\ttaal?: string;\n\t\t\tgorillapool?: string;\n\t\t\tmattercloud?: string;\n\t\t\tcustom?: Record<string, string>;\n\t\t};\n\n\t\t// Service endpoints (with defaults)\n\t\tendpoints?: {\n\t\t\tbroadcast?: string;\n\t\t\tutxos?: string;\n\t\t\tbalance?: string;\n\t\t\ttransactions?: string;\n\t\t};\n\n\t\t// Preferred service for operations\n\t\tpreferredService?:\n\t\t\t| \"whatsonchain\"\n\t\t\t| \"taal\"\n\t\t\t| \"gorillapool\"\n\t\t\t| \"mattercloud\"\n\t\t\t| \"custom\";\n\t};\n\n\t// Proxy configuration (for 'proxy' mode)\n\tproxy?: {\n\t\t// Backend proxy endpoint that handles all blockchain requests\n\t\tendpoint: string;\n\n\t\t// Optional authentication for the proxy\n\t\theaders?: Record<string, string>;\n\n\t\t// Optional timeout configuration\n\t\ttimeout?: number;\n\t};\n\n\t// Common configuration\n\tnetwork?: \"main\" | \"test\" | \"stn\";\n\tretries?: number;\n\ttimeout?: number;\n}\n\nexport type OAuthProvider =\n\t| \"google\"\n\t| \"github\"\n\t| \"twitter\"\n\t| \"handcash\"\n\t| \"yours\"\n\t| string;\n\nexport interface StorageAdapter {\n\tget: (key: string) => Promise<string | null>;\n\tset: (key: string, value: string) => Promise<void>;\n\tdelete: (key: string) => Promise<void>;\n\tclear?: () => Promise<void>;\n}\n\nexport interface ThemeConfig {\n\tmode?: \"light\" | \"dark\";\n\tcolors?: ColorPalette;\n\ttypography?: Typography;\n\tspacing?: SpacingScale;\n\tcomponents?: ComponentStyles;\n}\n\nexport interface RedirectConfig {\n\tsuccess?: string;\n\tsignup?: string;\n\tsignin?: string;\n\terror?: string;\n}\n\n// Auth State Types\nexport interface AuthState {\n\t// User State\n\tuser: AuthUser | null;\n\tisAuthenticated: boolean;\n\tisLoading: boolean;\n\terror: AuthError | null;\n\n\t// Flow State\n\tcurrentStep: AuthStep;\n\tmode: AuthMode;\n\n\t// Backup State\n\thasLocalBackup: boolean;\n\tbackupStatus: BackupStatus;\n\n\t// Wallet State\n\thasWalletCapabilities: boolean; // True when user has payment keys available\n\n\t// OAuth State\n\tlinkedProviders: OAuthProvider[];\n\tpendingOAuthProvider: OAuthProvider | null;\n}\n\nexport type AuthStep =\n\t| \"initial\"\n\t| \"signin\"\n\t| \"signup\"\n\t| \"password\"\n\t| \"confirm-password\"\n\t| \"backup-display\"\n\t| \"backup-download\"\n\t| \"oauth-link\"\n\t| \"oauth-restore\"\n\t| \"import-backup\"\n\t| \"success\";\n\nexport type AuthMode = \"signin\" | \"signup\" | \"link\" | \"restore\";\n\nexport interface AuthUser {\n\tid: string;\n\taddress: string; // Payment address\n\tidKey: string;\n\tprofiles: ProfileInfo[];\n\tactiveProfileId: string;\n\tordinalsAddress?: string; // Optional ordinals address if different from payment\n\tidentityAddress?: string; // Optional identity address (BAP identity)\n}\n\nexport interface ProfileInfo {\n\t// Core identity\n\tid: string;\n\taddress: string;\n\tisPublished: boolean;\n\n\t// Schema.org core fields\n\t\"@context\"?: string; // \"https://schema.org\"\n\t\"@type\"?: \"Person\" | \"Organization\";\n\n\t// Names (Person and Organization)\n\tname?: string; // Legacy field, use alternateName\n\talternateName?: string; // Display name/username\n\tdescription?: string; // Bio/description\n\turl?: string; // Website URL\n\temail?: string; // Email address\n\n\t// Images\n\timage?: string; // Person avatar (Base64 or URL)\n\tlogo?: string; // Organization logo (Base64 or URL)\n\tbanner?: string; // Custom banner image (Base64 or URL)\n\n\t// Person-specific fields\n\tgivenName?: string; // First name\n\tfamilyName?: string; // Last name\n\n\t// Organization-specific fields\n\tlegalName?: string; // Official legal name\n\n\t// Location fields\n\tlocation?: string; // Organization location\n\thomeLocation?: string; // Person home location\n\n\t// Address (simple string or structured)\n\tstreetAddress?: string; // Street address\n\taddressLocality?: string; // City\n\taddressRegion?: string; // State/Province\n\tpostalCode?: string; // ZIP/Postal code\n\taddressCountry?: string; // Country\n\n\t// Bitcoin/Blockchain custom fields\n\tpaymail?: string; // Bitcoin paymail address\n\tbitcoinAddress?: string; // Alternative Bitcoin address field\n}\n\nexport interface BackupStatus {\n\thasLocal: boolean;\n\thasCloud: boolean;\n\tcloudProviders: OAuthProvider[];\n\tlastUpdated?: Date;\n}\n\n// Action Types\nexport interface AuthActions {\n\t// Auth Actions\n\tsignIn: (password: string) => Promise<void>;\n\tsignUp: (password: string) => Promise<void>;\n\tsignOut: () => Promise<void>;\n\n\t// Backup Actions\n\tgenerateBackup: () => BapMasterBackup;\n\timportBackup: (file: File) => Promise<void>;\n\texportBackup: (password?: string) => Promise<void>;\n\tvalidatePassword: (password: string) => Promise<boolean>;\n\tgetCurrentBackup: () => Promise<BapMasterBackup | null>; // Safe access to session backup\n\n\t// OAuth Actions\n\tlinkOAuth: (provider: OAuthProvider) => Promise<void>;\n\tunlinkOAuth: (provider: OAuthProvider) => Promise<void>;\n\trestoreFromOAuth: (provider: OAuthProvider) => Promise<void>;\n\n\t// Profile Actions\n\tcreateProfile: () => Promise<ProfileInfo>;\n\tswitchProfile: (profileId: string) => void;\n\n\t// Device Link Actions\n\tgenerateDeviceLink: () => Promise<string>;\n\timportFromDeviceLink: (token: string) => Promise<void>;\n\n\t// Wallet Actions\n\tgetWalletExtension: () => Promise<WalletUserExtension | null>;\n\n\t// Storage Status Check Methods\n\thasUnencryptedBackupInSession: () => Promise<boolean>;\n\thasEncryptedBackupStored: () => Promise<boolean>;\n\tisSessionBackupImported: () => Promise<boolean>;\n\tstoreGeneratedBackupForSignup: (backup: BapMasterBackup) => Promise<void>;\n\n\t// Flow Control\n\tsetStep: (step: AuthStep) => void;\n\tsetMode: (mode: AuthMode) => void;\n\treset: () => void;\n}\n\n// Error Types\nexport interface AuthError {\n\tcode: AuthErrorCode;\n\tmessage: string;\n\tdetails?: Error | Record<string, unknown>;\n}\n\nexport type AuthErrorCode =\n\t| \"INVALID_PASSWORD\"\n\t| \"BACKUP_NOT_FOUND\"\n\t| \"OAUTH_CONFLICT\"\n\t| \"NETWORK_ERROR\"\n\t| \"INVALID_BACKUP\"\n\t| \"UNSUPPORTED_BACKUP\"\n\t| \"ENCRYPTION_ERROR\"\n\t| \"STORAGE_ERROR\"\n\t| \"API_ERROR\"\n\t| \"AUTH_REQUIRED\"\n\t| \"PROFILE_NOT_FOUND\"\n\t| \"INVALID_TOKEN\"\n\t| \"UNKNOWN_ERROR\";\n\n// Event Types\nexport type AuthEvent =\n\t| { type: \"AUTH_STARTED\" }\n\t| { type: \"AUTH_SUCCESS\"; user: AuthUser }\n\t| { type: \"AUTH_FAILED\"; error: AuthError }\n\t| { type: \"BACKUP_GENERATED\"; backup: BapMasterBackup }\n\t| { type: \"BACKUP_IMPORTED\" }\n\t| { type: \"OAUTH_LINKED\"; provider: OAuthProvider }\n\t| { type: \"OAUTH_UNLINKED\"; provider: OAuthProvider }\n\t| { type: \"PROFILE_CREATED\"; profile: ProfileInfo }\n\t| { type: \"PROFILE_SWITCHED\"; profileId: string }\n\t| { type: \"STEP_CHANGED\"; step: AuthStep }\n\t| { type: \"MODE_CHANGED\"; mode: AuthMode };\n\n// Component Props Types\nexport interface AuthButtonProps {\n\tmode?: \"signin\" | \"signup\" | \"signout\";\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\tchildren?: React.ReactNode;\n\t// Button props\n\tsize?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n\tvariant?:\n\t\t| \"default\"\n\t\t| \"destructive\"\n\t\t| \"outline\"\n\t\t| \"secondary\"\n\t\t| \"ghost\"\n\t\t| \"link\";\n\tcolor?: string; // deprecated - use variant instead\n\t// SignOut props (only used when mode is 'signout' or user is authenticated)\n\tconfirmSignOut?: boolean;\n\tconfirmMessage?: string;\n\tredirectTo?: string;\n\tonSignOut?: () => void;\n\tshowClearInfo?: boolean;\n}\n\nexport interface LoginFormProps {\n\tmode?: \"signin\" | \"signup\" | \"restore\";\n\tonSuccess?: (user: AuthUser) => void;\n\tonError?: (error: AuthError) => void;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\t// Sub-component styling\n\tcardProps?: {\n\t\tsize?: \"1\" | \"2\" | \"3\" | \"4\";\n\t\tvariant?: \"classic\" | \"surface\";\n\t};\n\tbuttonProps?: {\n\t\tsize?: ButtonProps[\"size\"];\n\t\tvariant?: ButtonProps[\"variant\"];\n\t};\n\t// Profile sync options\n\tenableProfileSync?: boolean;\n\tmaxDiscoveryAttempts?: number;\n}\n\n// Color Palette Types\nexport interface ColorPalette {\n\tprimary: string;\n\tsecondary: string;\n\tbackground: string;\n\tsurface: string;\n\terror: string;\n\twarning: string;\n\tsuccess: string;\n\ttext: {\n\t\tprimary: string;\n\t\tsecondary: string;\n\t\tdisabled: string;\n\t};\n\tborder: string;\n}\n\n// Typography Types\nexport interface Typography {\n\tfontFamily: string;\n\tfontSize: {\n\t\txs: string;\n\t\tsm: string;\n\t\tbase: string;\n\t\tlg: string;\n\t\txl: string;\n\t\t\"2xl\": string;\n\t};\n\tfontWeight: {\n\t\tnormal: number;\n\t\tmedium: number;\n\t\tsemibold: number;\n\t\tbold: number;\n\t};\n}\n\n// Spacing Scale Types\nexport interface SpacingScale {\n\txs: string;\n\tsm: string;\n\tmd: string;\n\tlg: string;\n\txl: string;\n\t\"2xl\": string;\n}\n\n// Component Styles Types\nexport interface ComponentStyles {\n\tbutton?: {\n\t\tborderRadius?: string;\n\t\tpadding?: string;\n\t\tfontSize?: string;\n\t\tfontWeight?: number;\n\t};\n\tinput?: {\n\t\tborderRadius?: string;\n\t\tpadding?: string;\n\t\tfontSize?: string;\n\t};\n\tcard?: {\n\t\tborderRadius?: string;\n\t\tpadding?: string;\n\t\tborder?: string;\n\t};\n}\n\n// Error Types and Constants\nexport enum ErrorType {\n\tBACKEND_SETUP = \"BACKEND_SETUP\",\n\tVALIDATION = \"VALIDATION\",\n\tNETWORK = \"NETWORK\",\n\tAUTHENTICATION = \"AUTHENTICATION\",\n\tGENERAL = \"GENERAL\",\n}\n\nexport interface BigBlocksError {\n\tmessage: string;\n\ttype?: ErrorType;\n\tcode?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\n// Backend setup error constants\nexport const BACKEND_ERRORS = {\n\tCONNECTION_FAILED:\n\t\t\"Cannot connect to backend. Make sure your server is running and /api/auth/signin endpoint exists. See examples/backend-setup-guide.md for setup help.\",\n\tENDPOINT_NOT_FOUND:\n\t\t\"Backend endpoint not found. You need to implement POST /api/auth/signin in your backend. See examples/backend-setup-guide.md for help.\",\n} as const;\n"
}
]
}