caplib
Version:
Credentialless Authentication Protocol Library for Web Applications
1 lines • 15 kB
Source Map (JSON)
{"version":3,"sources":["../src/react/theme.ts","../src/react/components/AuthProvider.tsx"],"sourcesContent":["import { extendTheme, type ThemeConfig } from '@chakra-ui/react';\n\nconst config: ThemeConfig = {\n initialColorMode: 'dark',\n useSystemColorMode: false,\n};\n\nconst colors = {\n brand: {\n 50: '#f0f9ff',\n 100: '#e0f2fe',\n 200: '#bae6fd',\n 300: '#7dd3fc',\n 400: '#38bdf8',\n 500: '#0ea5e9',\n 600: '#0284c7',\n 700: '#0369a1',\n 800: '#075985',\n 900: '#0c4a6e',\n },\n accent: {\n 50: '#f0fdfa',\n 100: '#ccfbf1',\n 200: '#99f6e4',\n 300: '#5eead4',\n 400: '#2dd4bf',\n 500: '#14b8a6',\n 600: '#0d9488',\n 700: '#0f766e',\n 800: '#115e59',\n 900: '#134e4a',\n },\n dark: {\n 100: '#1a202c',\n 200: '#171923',\n 300: '#0e1118',\n 400: '#0a0c11',\n 500: '#050609',\n gradient: 'linear-gradient(180deg, #1a202c 0%, #0a0c11 100%)',\n },\n};\n\nconst components = {\n Button: {\n baseStyle: {\n fontWeight: 'medium',\n borderRadius: 'md',\n },\n variants: {\n solid: {\n bg: 'brand.500',\n color: 'white',\n _hover: {\n bg: 'brand.600',\n _disabled: {\n bg: 'brand.500',\n },\n },\n },\n outline: {\n borderColor: 'whiteAlpha.300',\n color: 'white',\n _hover: {\n bg: 'whiteAlpha.100',\n },\n },\n ghost: {\n color: 'white',\n _hover: {\n bg: 'whiteAlpha.100',\n },\n },\n link: {\n color: 'brand.500',\n _hover: {\n textDecoration: 'none',\n color: 'brand.600',\n },\n },\n gradient: {\n bgGradient: 'linear(to-r, brand.500, accent.500)',\n color: 'white',\n _hover: {\n bgGradient: 'linear(to-r, brand.600, accent.600)',\n },\n },\n },\n },\n Modal: {\n baseStyle: {\n dialog: {\n bg: 'dark.200',\n boxShadow: 'xl',\n borderRadius: 'xl',\n border: '1px solid',\n borderColor: 'whiteAlpha.200',\n },\n header: {\n borderBottom: '1px solid',\n borderColor: 'whiteAlpha.100',\n pb: 4,\n },\n body: {\n py: 6,\n },\n footer: {\n borderTop: '1px solid',\n borderColor: 'whiteAlpha.100',\n pt: 4,\n },\n },\n },\n Card: {\n baseStyle: {\n container: {\n bg: 'dark.200',\n boxShadow: 'xl',\n borderRadius: 'xl',\n border: '1px solid',\n borderColor: 'whiteAlpha.200',\n overflow: 'hidden',\n },\n header: {\n py: 4,\n px: 6,\n },\n body: {\n py: 4,\n px: 6,\n },\n footer: {\n py: 4,\n px: 6,\n },\n },\n },\n Input: {\n baseStyle: {\n field: {\n bg: 'whiteAlpha.50',\n borderColor: 'whiteAlpha.200',\n _hover: {\n borderColor: 'whiteAlpha.300',\n },\n _focus: {\n borderColor: 'brand.500',\n boxShadow: '0 0 0 1px var(--chakra-colors-brand-500)',\n },\n },\n },\n },\n Radio: {\n baseStyle: {\n control: {\n borderColor: 'whiteAlpha.300',\n _checked: {\n bg: 'brand.500',\n borderColor: 'brand.500',\n },\n },\n },\n },\n Tabs: {\n variants: {\n enclosed: {\n tab: {\n color: 'whiteAlpha.700',\n _selected: {\n color: 'white',\n bg: 'whiteAlpha.100',\n },\n },\n },\n 'soft-rounded': {\n tab: {\n color: 'whiteAlpha.700',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n },\n },\n};\n\nconst styles = {\n global: {\n 'html, body': {\n color: 'white',\n bg: '#0a0c11',\n },\n },\n};\n\nconst capAuthTheme = extendTheme({\n config,\n colors,\n components,\n styles,\n});\n\nexport default capAuthTheme;","import React, { createContext, useContext, useState, useEffect } from 'react';\nimport {\n ChakraProvider,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalBody,\n ModalCloseButton,\n useDisclosure\n} from '@chakra-ui/react';\nimport { CapAuth } from './CapAuth';\nimport type { User, CapAuthConfig, AuthProviderProps } from '../../types';\nimport capAuthTheme from '../theme';\n\ninterface AuthContextType {\n user: User | null;\n isAuthenticated: boolean;\n showAuthModal: () => void;\n hideAuthModal: () => void;\n logout: () => void;\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nexport function AuthProvider({\n children,\n config = {},\n onAuthSuccess,\n onAuthError,\n}: AuthProviderProps) {\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [user, setUser] = useState<User | null>(null);\n\n const defaultConfig: CapAuthConfig = {\n appName: \"Secure Authentication\",\n appDescription: \"Login securely with your wallet\",\n theme: {\n primary: \"blue\",\n secondary: \"teal\"\n },\n refreshPageOnAuth: false,\n timeouts: {\n authentication: 300000,\n polling: 3000\n },\n enableMobileWallet: true,\n mobileWalletScheme: \"zerowallet://\",\n ...config\n };\n\n useEffect(() => {\n const checkAuth = async () => {\n const walletAddress = localStorage.getItem('wallet_address');\n if (walletAddress) {\n try {\n const response = await fetch('/api/users/active', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ wallet_address: walletAddress })\n });\n\n if (response.ok) {\n const data = await response.json();\n setUser(data.user);\n } else {\n localStorage.removeItem('wallet_address');\n }\n } catch (error) {\n console.error('Auth check failed:', error);\n }\n }\n };\n\n checkAuth();\n }, []);\n\n const handleAuthenticated = async (authenticatedUser: User) => {\n setUser(authenticatedUser);\n localStorage.setItem('wallet_address', authenticatedUser.wallet_address);\n onClose();\n\n if (onAuthSuccess) {\n onAuthSuccess(authenticatedUser);\n }\n\n if (defaultConfig.refreshPageOnAuth) {\n window.location.reload();\n } else if (defaultConfig.redirectPath) {\n window.location.href = defaultConfig.redirectPath;\n }\n };\n\n const handleError = (error: Error) => {\n console.error('Authentication error:', error);\n if (onAuthError) {\n onAuthError(error);\n }\n };\n\n const showAuthModal = () => onOpen();\n const hideAuthModal = () => onClose();\n\n const logout = () => {\n localStorage.removeItem('wallet_address');\n setUser(null);\n };\n\n const contextValue: AuthContextType = {\n user,\n isAuthenticated: !!user,\n showAuthModal,\n hideAuthModal,\n logout,\n };\n\n return (\n <AuthContext.Provider value={contextValue}>\n <ChakraProvider theme={capAuthTheme}>\n {children}\n\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n isCentered\n size=\"md\"\n closeOnOverlayClick={false}\n >\n <ModalOverlay backdropFilter=\"blur(10px)\" bg=\"blackAlpha.700\" />\n <ModalContent\n bg=\"transparent\"\n boxShadow=\"none\"\n width=\"auto\"\n maxWidth=\"100%\"\n margin=\"0\"\n >\n <ModalCloseButton\n color=\"white\"\n zIndex=\"popover\"\n position=\"absolute\"\n right=\"4px\"\n top=\"4px\"\n />\n <ModalBody p={0} display=\"flex\" justifyContent=\"center\">\n <CapAuth\n onAuthenticated={handleAuthenticated}\n config={defaultConfig}\n onError={handleError}\n />\n </ModalBody>\n </ModalContent>\n </Modal>\n </ChakraProvider>\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth() {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n}\n\nexport function withAuth<P extends object>(\n WrappedComponent: React.ComponentType<P>\n) {\n return function WithAuthComponent(props: P) {\n const { isAuthenticated, showAuthModal } = useAuth();\n\n useEffect(() => {\n if (!isAuthenticated) {\n showAuthModal();\n }\n }, [isAuthenticated]);\n\n return <WrappedComponent {...props} />;\n };\n}"],"mappings":"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","names":["config"]}