bigblocks
Version:
Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React
48 lines (47 loc) • 2.1 kB
JavaScript
"use client";
import { jsx as _jsx } from "react/jsx-runtime";
import { createContext, useContext, useEffect, useMemo, useState } from "react";
import { AuthManager } from "../../lib/AuthManager";
import { AuthMessagesContext, defaultMessages, mergeMessages, } from "../../lib/auth-messages";
export const BitcoinAuthContext = createContext(null);
export function BitcoinAuthProvider({ config, children, messages, }) {
const [authManager] = useState(() => new AuthManager(config));
const [state, setState] = useState(authManager.getState());
useEffect(() => {
// Subscribe to auth manager events
const unsubscribe = authManager.subscribe((event) => {
// Update local state based on events
setState(authManager.getState());
// Handle specific events if needed
switch (event.type) {
case "AUTH_SUCCESS":
console.log("Auth success:", event.user);
break;
case "AUTH_FAILED":
console.error("Auth failed:", event.error);
break;
case "OAUTH_LINKED":
console.log("OAuth linked:", event.provider);
break;
}
});
return unsubscribe;
}, [authManager]);
// Get actions from auth manager
const actions = useMemo(() => authManager.getActions(), [authManager]);
// Create context value
const contextValue = useMemo(() => ({
...state,
...actions,
config,
}), [state, actions, config]);
const mergedMessages = useMemo(() => (messages ? mergeMessages(messages) : defaultMessages), [messages]);
return (_jsx(AuthMessagesContext.Provider, { value: mergedMessages, children: _jsx(BitcoinAuthContext.Provider, { value: contextValue, children: children }) }));
}
export function useBitcoinAuthContext() {
const context = useContext(BitcoinAuthContext);
if (!context) {
throw new Error("useBitcoinAuthContext must be used within a BitcoinAuthProvider");
}
return context;
}