@authon/react-native 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +64 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -5
- package/dist/index.d.ts +13 -5
- package/dist/index.js +64 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -534,16 +534,41 @@ function SocialButton({
|
|
|
534
534
|
loading = false,
|
|
535
535
|
disabled = false,
|
|
536
536
|
label,
|
|
537
|
+
compact = false,
|
|
537
538
|
style,
|
|
538
539
|
labelStyle,
|
|
539
|
-
iconSize
|
|
540
|
+
iconSize,
|
|
540
541
|
borderRadius = 10,
|
|
541
|
-
height = 48
|
|
542
|
+
height = 48,
|
|
543
|
+
size = 48
|
|
542
544
|
}) {
|
|
543
545
|
const colors = import_shared.PROVIDER_COLORS[provider] || { bg: "#333", text: "#fff" };
|
|
544
546
|
const displayName = import_shared.PROVIDER_DISPLAY_NAMES[provider] || provider;
|
|
545
547
|
const buttonLabel = label ?? `Continue with ${displayName}`;
|
|
546
548
|
const needsBorder = colors.bg.toLowerCase() === "#ffffff";
|
|
549
|
+
const resolvedIconSize = iconSize ?? (compact ? 24 : 20);
|
|
550
|
+
if (compact) {
|
|
551
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
552
|
+
import_react_native.TouchableOpacity,
|
|
553
|
+
{
|
|
554
|
+
style: [
|
|
555
|
+
styles.compactButton,
|
|
556
|
+
{
|
|
557
|
+
backgroundColor: colors.bg,
|
|
558
|
+
borderRadius,
|
|
559
|
+
width: size,
|
|
560
|
+
height: size
|
|
561
|
+
},
|
|
562
|
+
needsBorder && styles.bordered,
|
|
563
|
+
style
|
|
564
|
+
],
|
|
565
|
+
onPress: () => onPress(provider),
|
|
566
|
+
disabled: disabled || loading,
|
|
567
|
+
activeOpacity: 0.8,
|
|
568
|
+
children: loading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native.ActivityIndicator, { color: colors.text, size: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ProviderIcon, { provider, size: resolvedIconSize, color: colors.text })
|
|
569
|
+
}
|
|
570
|
+
);
|
|
571
|
+
}
|
|
547
572
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
548
573
|
import_react_native.TouchableOpacity,
|
|
549
574
|
{
|
|
@@ -561,7 +586,7 @@ function SocialButton({
|
|
|
561
586
|
disabled: disabled || loading,
|
|
562
587
|
activeOpacity: 0.8,
|
|
563
588
|
children: loading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native.ActivityIndicator, { color: colors.text, size: "small" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
|
|
564
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ProviderIcon, { provider, size:
|
|
589
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ProviderIcon, { provider, size: resolvedIconSize, color: colors.text }),
|
|
565
590
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
566
591
|
import_react_native.Text,
|
|
567
592
|
{
|
|
@@ -586,6 +611,10 @@ var styles = import_react_native.StyleSheet.create({
|
|
|
586
611
|
gap: 10,
|
|
587
612
|
paddingHorizontal: 16
|
|
588
613
|
},
|
|
614
|
+
compactButton: {
|
|
615
|
+
alignItems: "center",
|
|
616
|
+
justifyContent: "center"
|
|
617
|
+
},
|
|
589
618
|
bordered: {
|
|
590
619
|
borderWidth: 1,
|
|
591
620
|
borderColor: "#dadce0"
|
|
@@ -604,12 +633,15 @@ function SocialButtons({
|
|
|
604
633
|
onSuccess,
|
|
605
634
|
onError,
|
|
606
635
|
style,
|
|
607
|
-
gap
|
|
636
|
+
gap,
|
|
637
|
+
compact = false,
|
|
638
|
+
labels,
|
|
608
639
|
buttonProps
|
|
609
640
|
}) {
|
|
610
641
|
const { providers, startOAuth, completeOAuth } = useAuthon();
|
|
611
642
|
const [loadingProvider, setLoadingProvider] = (0, import_react5.useState)(null);
|
|
612
643
|
if (providers.length === 0) return null;
|
|
644
|
+
const resolvedGap = gap ?? (compact ? 12 : 10);
|
|
613
645
|
const handlePress = async (provider) => {
|
|
614
646
|
setLoadingProvider(provider);
|
|
615
647
|
try {
|
|
@@ -626,20 +658,37 @@ function SocialButtons({
|
|
|
626
658
|
setLoadingProvider(null);
|
|
627
659
|
}
|
|
628
660
|
};
|
|
629
|
-
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
630
|
-
|
|
661
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
662
|
+
import_react_native2.View,
|
|
631
663
|
{
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
664
|
+
style: [
|
|
665
|
+
compact ? styles2.compactContainer : styles2.container,
|
|
666
|
+
{ gap: resolvedGap },
|
|
667
|
+
style
|
|
668
|
+
],
|
|
669
|
+
children: providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
670
|
+
SocialButton,
|
|
671
|
+
{
|
|
672
|
+
provider,
|
|
673
|
+
onPress: handlePress,
|
|
674
|
+
loading: loadingProvider === provider,
|
|
675
|
+
disabled: !!loadingProvider,
|
|
676
|
+
compact,
|
|
677
|
+
label: labels?.[provider],
|
|
678
|
+
...buttonProps
|
|
679
|
+
},
|
|
680
|
+
provider
|
|
681
|
+
))
|
|
682
|
+
}
|
|
683
|
+
);
|
|
640
684
|
}
|
|
641
685
|
var styles2 = import_react_native2.StyleSheet.create({
|
|
642
|
-
container: {}
|
|
686
|
+
container: {},
|
|
687
|
+
compactContainer: {
|
|
688
|
+
flexDirection: "row",
|
|
689
|
+
flexWrap: "wrap",
|
|
690
|
+
justifyContent: "center"
|
|
691
|
+
}
|
|
643
692
|
});
|
|
644
693
|
// Annotate the CommonJS export names for ESM import in node:
|
|
645
694
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/AuthonProvider.tsx","../src/client.ts","../src/useAuthon.ts","../src/useUser.ts","../src/icons.tsx","../src/SocialButton.tsx","../src/SocialButtons.tsx"],"sourcesContent":["export { AuthonProvider, AuthonContext } from './AuthonProvider';\nexport type { AuthonContextValue } from './AuthonProvider';\nexport { useAuthon } from './useAuthon';\nexport { useUser } from './useUser';\nexport { AuthonMobileClient } from './client';\nexport { ProviderIcon } from './icons';\nexport { SocialButton } from './SocialButton';\nexport type { SocialButtonProps } from './SocialButton';\nexport { SocialButtons } from './SocialButtons';\nexport type { SocialButtonsProps } from './SocialButtons';\nexport type {\n AuthonReactNativeConfig,\n AuthState,\n AuthonUser,\n SignInParams,\n SignUpParams,\n AuthonEventType,\n AuthonEvents,\n BrandingConfig,\n OAuthProviderType,\n TokenPair,\n} from './types';\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { AuthonMobileClient } from './client';\nimport type {\n AuthState,\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nexport interface AuthonContextValue extends AuthState {\n user: AuthonUser | null;\n signIn: (params: SignInParams) => Promise<void>;\n signUp: (params: SignUpParams) => Promise<void>;\n signOut: () => Promise<void>;\n getToken: () => string | null;\n /** Available OAuth providers (fetched from API) */\n providers: OAuthProviderType[];\n /** Branding config (fetched from API) */\n branding: BrandingConfig | null;\n /** Start OAuth flow — returns { url, state }. Open url in browser, then call completeOAuth(state) */\n startOAuth: (provider: OAuthProviderType, redirectUri?: string) => Promise<{ url: string; state: string }>;\n /** Poll for OAuth result after user completes browser flow */\n completeOAuth: (state: string) => Promise<void>;\n /** Subscribe to auth events */\n on: <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => () => void;\n /** Get the underlying client instance */\n client: AuthonMobileClient;\n}\n\nexport const AuthonContext = createContext<AuthonContextValue | null>(null);\n\ninterface AuthonProviderProps extends AuthonReactNativeConfig {\n children: React.ReactNode;\n storage?: {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n };\n}\n\nexport function AuthonProvider({ children, storage, ...config }: AuthonProviderProps) {\n const clientRef = useRef<AuthonMobileClient | null>(null);\n const [authState, setAuthState] = useState<AuthState>({\n isLoaded: false,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n const [user, setUser] = useState<AuthonUser | null>(null);\n const [providers, setProviders] = useState<OAuthProviderType[]>([]);\n const [branding, setBranding] = useState<BrandingConfig | null>(null);\n\n if (!clientRef.current) {\n clientRef.current = new AuthonMobileClient(config);\n }\n\n const client = clientRef.current;\n\n useEffect(() => {\n if (storage) {\n client.setStorage(storage);\n }\n\n const init = async () => {\n // Initialize tokens from storage\n const tokens = await client.initialize();\n\n // Fetch providers + branding in parallel\n await client.ensureInitialized();\n const p = await client.getProviders();\n const b = await client.getBranding();\n setProviders(p);\n setBranding(b);\n\n if (tokens) {\n const u = await client.getUser();\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n } else {\n setAuthState((prev) => ({ ...prev, isLoaded: true }));\n }\n };\n\n init();\n\n // Listen for auth events to keep state in sync\n const unsubs = [\n client.on('signedOut', () => {\n setUser(null);\n setAuthState({\n isLoaded: true,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n }),\n client.on('tokenRefreshed', () => {\n const token = client.getAccessToken();\n if (token) {\n setAuthState((prev) => ({ ...prev, accessToken: token }));\n }\n }),\n ];\n\n return () => {\n unsubs.forEach((fn) => fn());\n client.destroy();\n };\n }, []);\n\n const signIn = useCallback(async (params: SignInParams) => {\n const { tokens, user: u } = await client.signIn(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signUp = useCallback(async (params: SignUpParams) => {\n const { tokens, user: u } = await client.signUp(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signOut = useCallback(async () => {\n await client.signOut();\n // State is updated via the 'signedOut' event listener\n }, [client]);\n\n const getToken = useCallback(() => {\n return client.getAccessToken();\n }, [client]);\n\n const startOAuth = useCallback(\n async (provider: OAuthProviderType, redirectUri?: string) => {\n const uri = redirectUri || `${client.getApiUrl()}/v1/auth/oauth/redirect`;\n return client.getOAuthUrl(provider, uri);\n },\n [client],\n );\n\n const completeOAuthCb = useCallback(\n async (state: string) => {\n const { tokens, user: u } = await client.completeOAuth(state);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n },\n [client],\n );\n\n const on = useCallback(\n <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => {\n return client.on(event, listener);\n },\n [client],\n );\n\n const value = useMemo<AuthonContextValue>(\n () => ({\n ...authState,\n user,\n signIn,\n signUp,\n signOut,\n getToken,\n providers,\n branding,\n startOAuth,\n completeOAuth: completeOAuthCb,\n on,\n client,\n }),\n [authState, user, signIn, signUp, signOut, getToken, providers, branding, startOAuth, completeOAuthCb, on, client],\n );\n\n return <AuthonContext.Provider value={value}>{children}</AuthonContext.Provider>;\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport type {\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n TokenPair,\n ApiAuthResponse,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.authon.dev';\n\ntype TokenStorage = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ntype OAuthFlowMode = 'popup' | 'redirect' | 'auto';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nconst STORAGE_KEY = 'authon-tokens';\n\nexport class AuthonMobileClient {\n private apiUrl: string;\n private publishableKey: string;\n private tokens: TokenPair | null = null;\n private user: AuthonUser | null = null;\n private storage: TokenStorage | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n\n // Cached provider/branding data\n private _providers: OAuthProviderType[] = [];\n private _branding: BrandingConfig | null = null;\n private _initialized = false;\n\n constructor(config: AuthonReactNativeConfig) {\n this.publishableKey = config.publishableKey;\n this.apiUrl = (config.apiUrl || DEFAULT_API_URL).replace(/\\/$/, '');\n }\n\n setStorage(storage: TokenStorage) {\n this.storage = storage;\n }\n\n // ── Initialization ──\n\n async initialize(): Promise<TokenPair | null> {\n if (!this.storage) return null;\n\n const stored = await this.storage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n try {\n const tokens: TokenPair = JSON.parse(stored);\n if (tokens.expiresAt > Date.now()) {\n this.tokens = tokens;\n this.scheduleRefresh(tokens.expiresAt);\n return tokens;\n }\n // Try refreshing\n return await this.refreshToken(tokens.refreshToken);\n } catch {\n await this.storage.removeItem(STORAGE_KEY);\n return null;\n }\n }\n\n /** Fetch providers + branding from API (lazy, cached) */\n async ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n try {\n const [branding, providersRes] = await Promise.all([\n this.request('GET', '/v1/auth/branding') as Promise<BrandingConfig>,\n this.request('GET', '/v1/auth/providers') as Promise<ProvidersResponse>,\n ]);\n this._branding = branding;\n this._providers = providersRes.providers;\n this._initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n // ── Auth ──\n\n async signIn(params: SignInParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signin', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signUp(params: SignUpParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signup', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signOut(): Promise<void> {\n if (this.tokens) {\n try {\n await this.request('POST', '/v1/auth/signout', undefined);\n } catch {\n // Ignore sign-out errors\n }\n }\n this.clearSession();\n this.emit('signedOut');\n }\n\n async getUser(): Promise<AuthonUser | null> {\n if (!this.tokens) return null;\n try {\n const user = (await this.request('GET', '/v1/auth/me')) as AuthonUser;\n this.user = user;\n return user;\n } catch {\n return null;\n }\n }\n\n getCachedUser(): AuthonUser | null {\n return this.user;\n }\n\n // ── Token management ──\n\n async refreshToken(refreshToken?: string): Promise<TokenPair | null> {\n const token = refreshToken || this.tokens?.refreshToken;\n if (!token) return null;\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n body: JSON.stringify({ refreshToken: token }),\n });\n\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n\n const data = (await res.json()) as ApiAuthResponse;\n this.tokens = this.toTokenPair(data);\n this.user = data.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('tokenRefreshed');\n return this.tokens;\n } catch {\n return null;\n }\n }\n\n getAccessToken(): string | null {\n return this.tokens?.accessToken || null;\n }\n\n isAuthenticated(): boolean {\n return this.tokens !== null && this.tokens.expiresAt > Date.now();\n }\n\n // ── OAuth ──\n\n async getProviders(): Promise<OAuthProviderType[]> {\n await this.ensureInitialized();\n return this._providers;\n }\n\n async getBranding(): Promise<BrandingConfig | null> {\n await this.ensureInitialized();\n return this._branding;\n }\n\n async getOAuthUrl(\n provider: string,\n redirectUri: string,\n ): Promise<{ url: string; state: string }> {\n const params = new URLSearchParams({ redirectUri, flow: 'redirect' });\n return (await this.request(\n 'GET',\n `/v1/auth/oauth/${provider}/url?${params.toString()}`,\n )) as { url: string; state: string };\n }\n\n async pollOAuth(state: string): Promise<ApiAuthResponse | null> {\n try {\n const res = await fetch(\n `${this.apiUrl}/v1/auth/oauth/poll?state=${encodeURIComponent(state)}`,\n { headers: { 'x-api-key': this.publishableKey } },\n );\n if (!res.ok) return null;\n const data = (await res.json()) as Record<string, unknown>;\n if (data.status === 'completed' && data.accessToken) {\n return data as unknown as ApiAuthResponse;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n /** Poll for OAuth completion (3 minute timeout, matching JS SDK) */\n async completeOAuth(state: string): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const maxAttempts = 360; // 3 minutes at 500ms intervals\n for (let i = 0; i < maxAttempts; i++) {\n const result = await this.pollOAuth(state);\n if (result) {\n this.tokens = this.toTokenPair(result);\n this.user = result.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', result.user);\n return { tokens: this.tokens, user: result.user };\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error('OAuth timeout');\n }\n\n getApiUrl(): string {\n return this.apiUrl;\n }\n\n // ── Event system ──\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n private emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => fn(...args));\n }\n\n // ── Cleanup ──\n\n destroy(): void {\n this.clearRefreshTimer();\n this.listeners.clear();\n }\n\n // ── Private ──\n\n private clearSession(): void {\n this.tokens = null;\n this.user = null;\n this.clearRefreshTimer();\n if (this.storage) {\n this.storage.removeItem(STORAGE_KEY).catch(() => {});\n }\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /** Schedule auto-refresh 60 seconds before token expiry (like JS SDK) */\n private scheduleRefresh(expiresAt: number): void {\n this.clearRefreshTimer();\n const refreshIn = Math.max(expiresAt - Date.now() - 60_000, 30_000);\n this.refreshTimer = setTimeout(() => {\n this.refreshToken().catch(() => {});\n }, refreshIn);\n }\n\n private async persistTokens(): Promise<void> {\n if (this.storage && this.tokens) {\n await this.storage.setItem(STORAGE_KEY, JSON.stringify(this.tokens));\n }\n }\n\n private toTokenPair(res: ApiAuthResponse): TokenPair {\n return {\n accessToken: res.accessToken,\n refreshToken: res.refreshToken,\n expiresAt: Date.now() + res.expiresIn * 1000,\n };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n };\n\n if (this.tokens?.accessToken) {\n headers['Authorization'] = `Bearer ${this.tokens.accessToken}`;\n }\n\n const res = await fetch(`${this.apiUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ message: res.statusText }));\n const msg = Array.isArray(error.message)\n ? error.message[0]\n : error.message || `Request failed with status ${res.status}`;\n throw new Error(msg);\n }\n\n const text = await res.text();\n return text ? JSON.parse(text) : undefined;\n }\n}\n","import { useContext } from 'react';\nimport { AuthonContext, type AuthonContextValue } from './AuthonProvider';\n\nexport function useAuthon(): AuthonContextValue {\n const context = useContext(AuthonContext);\n if (!context) {\n throw new Error('useAuthon must be used within an <AuthonProvider>');\n }\n return context;\n}\n","import { useAuthon } from './useAuthon';\nimport type { AuthonUser } from './types';\n\nexport function useUser(): {\n isLoaded: boolean;\n isSignedIn: boolean;\n user: AuthonUser | null;\n} {\n const { isLoaded, isSignedIn, user } = useAuthon();\n return { isLoaded, isSignedIn, user };\n}\n","import React from 'react';\nimport Svg, { Path, Rect } from 'react-native-svg';\nimport type { OAuthProviderType } from '@authon/shared';\n\ninterface IconProps {\n size?: number;\n color?: string;\n}\n\nfunction GoogleIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" />\n <Path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <Path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <Path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </Svg>\n );\n}\n\nfunction AppleIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </Svg>\n );\n}\n\nfunction KakaoIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\" />\n </Svg>\n );\n}\n\nfunction NaverIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\" />\n </Svg>\n );\n}\n\nfunction FacebookIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\" />\n </Svg>\n );\n}\n\nfunction GithubIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\" />\n </Svg>\n );\n}\n\nfunction DiscordIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\" />\n </Svg>\n );\n}\n\nfunction XIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </Svg>\n );\n}\n\nfunction LineIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\" />\n </Svg>\n );\n}\n\nfunction MicrosoftIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Rect fill=\"#F25022\" x={1} y={1} width={10} height={10} />\n <Rect fill=\"#7FBA00\" x={13} y={1} width={10} height={10} />\n <Rect fill=\"#00A4EF\" x={1} y={13} width={10} height={10} />\n <Rect fill=\"#FFB900\" x={13} y={13} width={10} height={10} />\n </Svg>\n );\n}\n\nconst ICON_MAP: Record<OAuthProviderType, React.FC<IconProps>> = {\n google: GoogleIcon,\n apple: AppleIcon,\n kakao: KakaoIcon,\n naver: NaverIcon,\n facebook: FacebookIcon,\n github: GithubIcon,\n discord: DiscordIcon,\n x: XIcon,\n line: LineIcon,\n microsoft: MicrosoftIcon,\n};\n\nexport function ProviderIcon({ provider, size = 20, color }: IconProps & { provider: OAuthProviderType }) {\n const Icon = ICON_MAP[provider];\n if (!Icon) return null;\n return <Icon size={size} color={color} />;\n}\n","import React from 'react';\nimport {\n TouchableOpacity,\n Text,\n ActivityIndicator,\n StyleSheet,\n type ViewStyle,\n type TextStyle,\n} from 'react-native';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { ProviderIcon } from './icons';\n\nexport interface SocialButtonProps {\n provider: OAuthProviderType;\n onPress: (provider: OAuthProviderType) => void;\n loading?: boolean;\n disabled?: boolean;\n /** Override button label. Default: \"Continue with {Provider}\" */\n label?: string;\n /** Override button style */\n style?: ViewStyle;\n /** Override label text style */\n labelStyle?: TextStyle;\n /** Icon size (default: 20) */\n iconSize?: number;\n /** Border radius (default: 10) */\n borderRadius?: number;\n /** Button height (default: 48) */\n height?: number;\n}\n\nexport function SocialButton({\n provider,\n onPress,\n loading = false,\n disabled = false,\n label,\n style,\n labelStyle,\n iconSize = 20,\n borderRadius = 10,\n height = 48,\n}: SocialButtonProps) {\n const colors = PROVIDER_COLORS[provider] || { bg: '#333', text: '#fff' };\n const displayName = PROVIDER_DISPLAY_NAMES[provider] || provider;\n const buttonLabel = label ?? `Continue with ${displayName}`;\n const needsBorder = colors.bg.toLowerCase() === '#ffffff';\n\n return (\n <TouchableOpacity\n style={[\n styles.button,\n {\n backgroundColor: colors.bg,\n borderRadius,\n height,\n },\n needsBorder && styles.bordered,\n style,\n ]}\n onPress={() => onPress(provider)}\n disabled={disabled || loading}\n activeOpacity={0.8}\n >\n {loading ? (\n <ActivityIndicator color={colors.text} size=\"small\" />\n ) : (\n <>\n <ProviderIcon provider={provider} size={iconSize} color={colors.text} />\n <Text\n style={[\n styles.label,\n { color: colors.text },\n labelStyle,\n ]}\n numberOfLines={1}\n >\n {buttonLabel}\n </Text>\n </>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n button: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n paddingHorizontal: 16,\n },\n bordered: {\n borderWidth: 1,\n borderColor: '#dadce0',\n },\n label: {\n fontSize: 15,\n fontWeight: '600',\n },\n});\n","import React, { useState } from 'react';\nimport { View, StyleSheet, Linking, type ViewStyle } from 'react-native';\nimport type { OAuthProviderType } from '@authon/shared';\nimport { useAuthon } from './useAuthon';\nimport { SocialButton, type SocialButtonProps } from './SocialButton';\n\nexport interface SocialButtonsProps {\n /** Called after successful OAuth sign-in */\n onSuccess?: () => void;\n /** Called on OAuth error */\n onError?: (error: Error) => void;\n /** Container style */\n style?: ViewStyle;\n /** Gap between buttons (default: 10) */\n gap?: number;\n /** Props to pass through to each SocialButton */\n buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled'>>;\n}\n\nexport function SocialButtons({\n onSuccess,\n onError,\n style,\n gap = 10,\n buttonProps,\n}: SocialButtonsProps) {\n const { providers, startOAuth, completeOAuth } = useAuthon();\n const [loadingProvider, setLoadingProvider] = useState<string | null>(null);\n\n if (providers.length === 0) return null;\n\n const handlePress = async (provider: OAuthProviderType) => {\n setLoadingProvider(provider);\n try {\n const { url, state } = await startOAuth(provider);\n await Linking.openURL(url);\n await completeOAuth(state);\n onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n if (error.message !== 'OAuth timeout') {\n onError?.(error);\n }\n } finally {\n setLoadingProvider(null);\n }\n };\n\n return (\n <View style={[styles.container, { gap }, style]}>\n {providers.map((provider) => (\n <SocialButton\n key={provider}\n provider={provider}\n onPress={handlePress}\n loading={loadingProvider === provider}\n disabled={!!loadingProvider}\n {...buttonProps}\n />\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {},\n});\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","Svg","import_react","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","styles"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/AuthonProvider.tsx","../src/client.ts","../src/useAuthon.ts","../src/useUser.ts","../src/icons.tsx","../src/SocialButton.tsx","../src/SocialButtons.tsx"],"sourcesContent":["export { AuthonProvider, AuthonContext } from './AuthonProvider';\nexport type { AuthonContextValue } from './AuthonProvider';\nexport { useAuthon } from './useAuthon';\nexport { useUser } from './useUser';\nexport { AuthonMobileClient } from './client';\nexport { ProviderIcon } from './icons';\nexport { SocialButton } from './SocialButton';\nexport type { SocialButtonProps } from './SocialButton';\nexport { SocialButtons } from './SocialButtons';\nexport type { SocialButtonsProps } from './SocialButtons';\nexport type {\n AuthonReactNativeConfig,\n AuthState,\n AuthonUser,\n SignInParams,\n SignUpParams,\n AuthonEventType,\n AuthonEvents,\n BrandingConfig,\n OAuthProviderType,\n TokenPair,\n} from './types';\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { AuthonMobileClient } from './client';\nimport type {\n AuthState,\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nexport interface AuthonContextValue extends AuthState {\n user: AuthonUser | null;\n signIn: (params: SignInParams) => Promise<void>;\n signUp: (params: SignUpParams) => Promise<void>;\n signOut: () => Promise<void>;\n getToken: () => string | null;\n /** Available OAuth providers (fetched from API) */\n providers: OAuthProviderType[];\n /** Branding config (fetched from API) */\n branding: BrandingConfig | null;\n /** Start OAuth flow — returns { url, state }. Open url in browser, then call completeOAuth(state) */\n startOAuth: (provider: OAuthProviderType, redirectUri?: string) => Promise<{ url: string; state: string }>;\n /** Poll for OAuth result after user completes browser flow */\n completeOAuth: (state: string) => Promise<void>;\n /** Subscribe to auth events */\n on: <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => () => void;\n /** Get the underlying client instance */\n client: AuthonMobileClient;\n}\n\nexport const AuthonContext = createContext<AuthonContextValue | null>(null);\n\ninterface AuthonProviderProps extends AuthonReactNativeConfig {\n children: React.ReactNode;\n storage?: {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n };\n}\n\nexport function AuthonProvider({ children, storage, ...config }: AuthonProviderProps) {\n const clientRef = useRef<AuthonMobileClient | null>(null);\n const [authState, setAuthState] = useState<AuthState>({\n isLoaded: false,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n const [user, setUser] = useState<AuthonUser | null>(null);\n const [providers, setProviders] = useState<OAuthProviderType[]>([]);\n const [branding, setBranding] = useState<BrandingConfig | null>(null);\n\n if (!clientRef.current) {\n clientRef.current = new AuthonMobileClient(config);\n }\n\n const client = clientRef.current;\n\n useEffect(() => {\n if (storage) {\n client.setStorage(storage);\n }\n\n const init = async () => {\n // Initialize tokens from storage\n const tokens = await client.initialize();\n\n // Fetch providers + branding in parallel\n await client.ensureInitialized();\n const p = await client.getProviders();\n const b = await client.getBranding();\n setProviders(p);\n setBranding(b);\n\n if (tokens) {\n const u = await client.getUser();\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n } else {\n setAuthState((prev) => ({ ...prev, isLoaded: true }));\n }\n };\n\n init();\n\n // Listen for auth events to keep state in sync\n const unsubs = [\n client.on('signedOut', () => {\n setUser(null);\n setAuthState({\n isLoaded: true,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n }),\n client.on('tokenRefreshed', () => {\n const token = client.getAccessToken();\n if (token) {\n setAuthState((prev) => ({ ...prev, accessToken: token }));\n }\n }),\n ];\n\n return () => {\n unsubs.forEach((fn) => fn());\n client.destroy();\n };\n }, []);\n\n const signIn = useCallback(async (params: SignInParams) => {\n const { tokens, user: u } = await client.signIn(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signUp = useCallback(async (params: SignUpParams) => {\n const { tokens, user: u } = await client.signUp(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signOut = useCallback(async () => {\n await client.signOut();\n // State is updated via the 'signedOut' event listener\n }, [client]);\n\n const getToken = useCallback(() => {\n return client.getAccessToken();\n }, [client]);\n\n const startOAuth = useCallback(\n async (provider: OAuthProviderType, redirectUri?: string) => {\n const uri = redirectUri || `${client.getApiUrl()}/v1/auth/oauth/redirect`;\n return client.getOAuthUrl(provider, uri);\n },\n [client],\n );\n\n const completeOAuthCb = useCallback(\n async (state: string) => {\n const { tokens, user: u } = await client.completeOAuth(state);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n },\n [client],\n );\n\n const on = useCallback(\n <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => {\n return client.on(event, listener);\n },\n [client],\n );\n\n const value = useMemo<AuthonContextValue>(\n () => ({\n ...authState,\n user,\n signIn,\n signUp,\n signOut,\n getToken,\n providers,\n branding,\n startOAuth,\n completeOAuth: completeOAuthCb,\n on,\n client,\n }),\n [authState, user, signIn, signUp, signOut, getToken, providers, branding, startOAuth, completeOAuthCb, on, client],\n );\n\n return <AuthonContext.Provider value={value}>{children}</AuthonContext.Provider>;\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport type {\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n TokenPair,\n ApiAuthResponse,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.authon.dev';\n\ntype TokenStorage = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ntype OAuthFlowMode = 'popup' | 'redirect' | 'auto';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nconst STORAGE_KEY = 'authon-tokens';\n\nexport class AuthonMobileClient {\n private apiUrl: string;\n private publishableKey: string;\n private tokens: TokenPair | null = null;\n private user: AuthonUser | null = null;\n private storage: TokenStorage | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n\n // Cached provider/branding data\n private _providers: OAuthProviderType[] = [];\n private _branding: BrandingConfig | null = null;\n private _initialized = false;\n\n constructor(config: AuthonReactNativeConfig) {\n this.publishableKey = config.publishableKey;\n this.apiUrl = (config.apiUrl || DEFAULT_API_URL).replace(/\\/$/, '');\n }\n\n setStorage(storage: TokenStorage) {\n this.storage = storage;\n }\n\n // ── Initialization ──\n\n async initialize(): Promise<TokenPair | null> {\n if (!this.storage) return null;\n\n const stored = await this.storage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n try {\n const tokens: TokenPair = JSON.parse(stored);\n if (tokens.expiresAt > Date.now()) {\n this.tokens = tokens;\n this.scheduleRefresh(tokens.expiresAt);\n return tokens;\n }\n // Try refreshing\n return await this.refreshToken(tokens.refreshToken);\n } catch {\n await this.storage.removeItem(STORAGE_KEY);\n return null;\n }\n }\n\n /** Fetch providers + branding from API (lazy, cached) */\n async ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n try {\n const [branding, providersRes] = await Promise.all([\n this.request('GET', '/v1/auth/branding') as Promise<BrandingConfig>,\n this.request('GET', '/v1/auth/providers') as Promise<ProvidersResponse>,\n ]);\n this._branding = branding;\n this._providers = providersRes.providers;\n this._initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n // ── Auth ──\n\n async signIn(params: SignInParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signin', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signUp(params: SignUpParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signup', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signOut(): Promise<void> {\n if (this.tokens) {\n try {\n await this.request('POST', '/v1/auth/signout', undefined);\n } catch {\n // Ignore sign-out errors\n }\n }\n this.clearSession();\n this.emit('signedOut');\n }\n\n async getUser(): Promise<AuthonUser | null> {\n if (!this.tokens) return null;\n try {\n const user = (await this.request('GET', '/v1/auth/me')) as AuthonUser;\n this.user = user;\n return user;\n } catch {\n return null;\n }\n }\n\n getCachedUser(): AuthonUser | null {\n return this.user;\n }\n\n // ── Token management ──\n\n async refreshToken(refreshToken?: string): Promise<TokenPair | null> {\n const token = refreshToken || this.tokens?.refreshToken;\n if (!token) return null;\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n body: JSON.stringify({ refreshToken: token }),\n });\n\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n\n const data = (await res.json()) as ApiAuthResponse;\n this.tokens = this.toTokenPair(data);\n this.user = data.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('tokenRefreshed');\n return this.tokens;\n } catch {\n return null;\n }\n }\n\n getAccessToken(): string | null {\n return this.tokens?.accessToken || null;\n }\n\n isAuthenticated(): boolean {\n return this.tokens !== null && this.tokens.expiresAt > Date.now();\n }\n\n // ── OAuth ──\n\n async getProviders(): Promise<OAuthProviderType[]> {\n await this.ensureInitialized();\n return this._providers;\n }\n\n async getBranding(): Promise<BrandingConfig | null> {\n await this.ensureInitialized();\n return this._branding;\n }\n\n async getOAuthUrl(\n provider: string,\n redirectUri: string,\n ): Promise<{ url: string; state: string }> {\n const params = new URLSearchParams({ redirectUri, flow: 'redirect' });\n return (await this.request(\n 'GET',\n `/v1/auth/oauth/${provider}/url?${params.toString()}`,\n )) as { url: string; state: string };\n }\n\n async pollOAuth(state: string): Promise<ApiAuthResponse | null> {\n try {\n const res = await fetch(\n `${this.apiUrl}/v1/auth/oauth/poll?state=${encodeURIComponent(state)}`,\n { headers: { 'x-api-key': this.publishableKey } },\n );\n if (!res.ok) return null;\n const data = (await res.json()) as Record<string, unknown>;\n if (data.status === 'completed' && data.accessToken) {\n return data as unknown as ApiAuthResponse;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n /** Poll for OAuth completion (3 minute timeout, matching JS SDK) */\n async completeOAuth(state: string): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const maxAttempts = 360; // 3 minutes at 500ms intervals\n for (let i = 0; i < maxAttempts; i++) {\n const result = await this.pollOAuth(state);\n if (result) {\n this.tokens = this.toTokenPair(result);\n this.user = result.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', result.user);\n return { tokens: this.tokens, user: result.user };\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error('OAuth timeout');\n }\n\n getApiUrl(): string {\n return this.apiUrl;\n }\n\n // ── Event system ──\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n private emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => fn(...args));\n }\n\n // ── Cleanup ──\n\n destroy(): void {\n this.clearRefreshTimer();\n this.listeners.clear();\n }\n\n // ── Private ──\n\n private clearSession(): void {\n this.tokens = null;\n this.user = null;\n this.clearRefreshTimer();\n if (this.storage) {\n this.storage.removeItem(STORAGE_KEY).catch(() => {});\n }\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /** Schedule auto-refresh 60 seconds before token expiry (like JS SDK) */\n private scheduleRefresh(expiresAt: number): void {\n this.clearRefreshTimer();\n const refreshIn = Math.max(expiresAt - Date.now() - 60_000, 30_000);\n this.refreshTimer = setTimeout(() => {\n this.refreshToken().catch(() => {});\n }, refreshIn);\n }\n\n private async persistTokens(): Promise<void> {\n if (this.storage && this.tokens) {\n await this.storage.setItem(STORAGE_KEY, JSON.stringify(this.tokens));\n }\n }\n\n private toTokenPair(res: ApiAuthResponse): TokenPair {\n return {\n accessToken: res.accessToken,\n refreshToken: res.refreshToken,\n expiresAt: Date.now() + res.expiresIn * 1000,\n };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n };\n\n if (this.tokens?.accessToken) {\n headers['Authorization'] = `Bearer ${this.tokens.accessToken}`;\n }\n\n const res = await fetch(`${this.apiUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ message: res.statusText }));\n const msg = Array.isArray(error.message)\n ? error.message[0]\n : error.message || `Request failed with status ${res.status}`;\n throw new Error(msg);\n }\n\n const text = await res.text();\n return text ? JSON.parse(text) : undefined;\n }\n}\n","import { useContext } from 'react';\nimport { AuthonContext, type AuthonContextValue } from './AuthonProvider';\n\nexport function useAuthon(): AuthonContextValue {\n const context = useContext(AuthonContext);\n if (!context) {\n throw new Error('useAuthon must be used within an <AuthonProvider>');\n }\n return context;\n}\n","import { useAuthon } from './useAuthon';\nimport type { AuthonUser } from './types';\n\nexport function useUser(): {\n isLoaded: boolean;\n isSignedIn: boolean;\n user: AuthonUser | null;\n} {\n const { isLoaded, isSignedIn, user } = useAuthon();\n return { isLoaded, isSignedIn, user };\n}\n","import React from 'react';\nimport Svg, { Path, Rect } from 'react-native-svg';\nimport type { OAuthProviderType } from '@authon/shared';\n\ninterface IconProps {\n size?: number;\n color?: string;\n}\n\nfunction GoogleIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" />\n <Path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <Path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <Path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </Svg>\n );\n}\n\nfunction AppleIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </Svg>\n );\n}\n\nfunction KakaoIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\" />\n </Svg>\n );\n}\n\nfunction NaverIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\" />\n </Svg>\n );\n}\n\nfunction FacebookIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\" />\n </Svg>\n );\n}\n\nfunction GithubIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\" />\n </Svg>\n );\n}\n\nfunction DiscordIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\" />\n </Svg>\n );\n}\n\nfunction XIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </Svg>\n );\n}\n\nfunction LineIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\" />\n </Svg>\n );\n}\n\nfunction MicrosoftIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Rect fill=\"#F25022\" x={1} y={1} width={10} height={10} />\n <Rect fill=\"#7FBA00\" x={13} y={1} width={10} height={10} />\n <Rect fill=\"#00A4EF\" x={1} y={13} width={10} height={10} />\n <Rect fill=\"#FFB900\" x={13} y={13} width={10} height={10} />\n </Svg>\n );\n}\n\nconst ICON_MAP: Record<OAuthProviderType, React.FC<IconProps>> = {\n google: GoogleIcon,\n apple: AppleIcon,\n kakao: KakaoIcon,\n naver: NaverIcon,\n facebook: FacebookIcon,\n github: GithubIcon,\n discord: DiscordIcon,\n x: XIcon,\n line: LineIcon,\n microsoft: MicrosoftIcon,\n};\n\nexport function ProviderIcon({ provider, size = 20, color }: IconProps & { provider: OAuthProviderType }) {\n const Icon = ICON_MAP[provider];\n if (!Icon) return null;\n return <Icon size={size} color={color} />;\n}\n","import React from 'react';\nimport {\n TouchableOpacity,\n Text,\n ActivityIndicator,\n StyleSheet,\n type ViewStyle,\n type TextStyle,\n} from 'react-native';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { ProviderIcon } from './icons';\n\nexport interface SocialButtonProps {\n provider: OAuthProviderType;\n onPress: (provider: OAuthProviderType) => void;\n loading?: boolean;\n disabled?: boolean;\n /** Override button label. Default: \"Continue with {Provider}\" */\n label?: string;\n /** Compact mode — icon-only square button (default: false) */\n compact?: boolean;\n /** Override button style */\n style?: ViewStyle;\n /** Override label text style */\n labelStyle?: TextStyle;\n /** Icon size (default: 20, compact default: 24) */\n iconSize?: number;\n /** Border radius (default: 10) */\n borderRadius?: number;\n /** Button height (default: 48) */\n height?: number;\n /** Button size for compact mode (default: 48) */\n size?: number;\n}\n\nexport function SocialButton({\n provider,\n onPress,\n loading = false,\n disabled = false,\n label,\n compact = false,\n style,\n labelStyle,\n iconSize,\n borderRadius = 10,\n height = 48,\n size = 48,\n}: SocialButtonProps) {\n const colors = PROVIDER_COLORS[provider] || { bg: '#333', text: '#fff' };\n const displayName = PROVIDER_DISPLAY_NAMES[provider] || provider;\n const buttonLabel = label ?? `Continue with ${displayName}`;\n const needsBorder = colors.bg.toLowerCase() === '#ffffff';\n const resolvedIconSize = iconSize ?? (compact ? 24 : 20);\n\n if (compact) {\n return (\n <TouchableOpacity\n style={[\n styles.compactButton,\n {\n backgroundColor: colors.bg,\n borderRadius,\n width: size,\n height: size,\n },\n needsBorder && styles.bordered,\n style,\n ]}\n onPress={() => onPress(provider)}\n disabled={disabled || loading}\n activeOpacity={0.8}\n >\n {loading ? (\n <ActivityIndicator color={colors.text} size=\"small\" />\n ) : (\n <ProviderIcon provider={provider} size={resolvedIconSize} color={colors.text} />\n )}\n </TouchableOpacity>\n );\n }\n\n return (\n <TouchableOpacity\n style={[\n styles.button,\n {\n backgroundColor: colors.bg,\n borderRadius,\n height,\n },\n needsBorder && styles.bordered,\n style,\n ]}\n onPress={() => onPress(provider)}\n disabled={disabled || loading}\n activeOpacity={0.8}\n >\n {loading ? (\n <ActivityIndicator color={colors.text} size=\"small\" />\n ) : (\n <>\n <ProviderIcon provider={provider} size={resolvedIconSize} color={colors.text} />\n <Text\n style={[\n styles.label,\n { color: colors.text },\n labelStyle,\n ]}\n numberOfLines={1}\n >\n {buttonLabel}\n </Text>\n </>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n button: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n paddingHorizontal: 16,\n },\n compactButton: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n bordered: {\n borderWidth: 1,\n borderColor: '#dadce0',\n },\n label: {\n fontSize: 15,\n fontWeight: '600',\n },\n});\n","import React, { useState } from 'react';\nimport { View, StyleSheet, Linking, type ViewStyle } from 'react-native';\nimport type { OAuthProviderType } from '@authon/shared';\nimport { useAuthon } from './useAuthon';\nimport { SocialButton, type SocialButtonProps } from './SocialButton';\n\nexport interface SocialButtonsProps {\n /** Called after successful OAuth sign-in */\n onSuccess?: () => void;\n /** Called on OAuth error */\n onError?: (error: Error) => void;\n /** Container style */\n style?: ViewStyle;\n /** Gap between buttons (default: 10, compact default: 12) */\n gap?: number;\n /** Compact mode — icon-only square buttons in a row (default: false) */\n compact?: boolean;\n /** Custom labels per provider. e.g. { google: 'Google로 로그인' } */\n labels?: Partial<Record<OAuthProviderType, string>>;\n /** Props to pass through to each SocialButton */\n buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled' | 'compact' | 'label'>>;\n}\n\nexport function SocialButtons({\n onSuccess,\n onError,\n style,\n gap,\n compact = false,\n labels,\n buttonProps,\n}: SocialButtonsProps) {\n const { providers, startOAuth, completeOAuth } = useAuthon();\n const [loadingProvider, setLoadingProvider] = useState<string | null>(null);\n\n if (providers.length === 0) return null;\n\n const resolvedGap = gap ?? (compact ? 12 : 10);\n\n const handlePress = async (provider: OAuthProviderType) => {\n setLoadingProvider(provider);\n try {\n const { url, state } = await startOAuth(provider);\n await Linking.openURL(url);\n await completeOAuth(state);\n onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n if (error.message !== 'OAuth timeout') {\n onError?.(error);\n }\n } finally {\n setLoadingProvider(null);\n }\n };\n\n return (\n <View\n style={[\n compact ? styles.compactContainer : styles.container,\n { gap: resolvedGap },\n style,\n ]}\n >\n {providers.map((provider) => (\n <SocialButton\n key={provider}\n provider={provider}\n onPress={handlePress}\n loading={loadingProvider === provider}\n disabled={!!loadingProvider}\n compact={compact}\n label={labels?.[provider]}\n {...buttonProps}\n />\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {},\n compactContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'center',\n },\n});\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","Svg","import_react","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","styles"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -162,18 +162,22 @@ interface SocialButtonProps {
|
|
|
162
162
|
disabled?: boolean;
|
|
163
163
|
/** Override button label. Default: "Continue with {Provider}" */
|
|
164
164
|
label?: string;
|
|
165
|
+
/** Compact mode — icon-only square button (default: false) */
|
|
166
|
+
compact?: boolean;
|
|
165
167
|
/** Override button style */
|
|
166
168
|
style?: ViewStyle;
|
|
167
169
|
/** Override label text style */
|
|
168
170
|
labelStyle?: TextStyle;
|
|
169
|
-
/** Icon size (default: 20) */
|
|
171
|
+
/** Icon size (default: 20, compact default: 24) */
|
|
170
172
|
iconSize?: number;
|
|
171
173
|
/** Border radius (default: 10) */
|
|
172
174
|
borderRadius?: number;
|
|
173
175
|
/** Button height (default: 48) */
|
|
174
176
|
height?: number;
|
|
177
|
+
/** Button size for compact mode (default: 48) */
|
|
178
|
+
size?: number;
|
|
175
179
|
}
|
|
176
|
-
declare function SocialButton({ provider, onPress, loading, disabled, label, style, labelStyle, iconSize, borderRadius, height, }: SocialButtonProps): react_jsx_runtime.JSX.Element;
|
|
180
|
+
declare function SocialButton({ provider, onPress, loading, disabled, label, compact, style, labelStyle, iconSize, borderRadius, height, size, }: SocialButtonProps): react_jsx_runtime.JSX.Element;
|
|
177
181
|
|
|
178
182
|
interface SocialButtonsProps {
|
|
179
183
|
/** Called after successful OAuth sign-in */
|
|
@@ -182,11 +186,15 @@ interface SocialButtonsProps {
|
|
|
182
186
|
onError?: (error: Error) => void;
|
|
183
187
|
/** Container style */
|
|
184
188
|
style?: ViewStyle;
|
|
185
|
-
/** Gap between buttons (default: 10) */
|
|
189
|
+
/** Gap between buttons (default: 10, compact default: 12) */
|
|
186
190
|
gap?: number;
|
|
191
|
+
/** Compact mode — icon-only square buttons in a row (default: false) */
|
|
192
|
+
compact?: boolean;
|
|
193
|
+
/** Custom labels per provider. e.g. { google: 'Google로 로그인' } */
|
|
194
|
+
labels?: Partial<Record<OAuthProviderType, string>>;
|
|
187
195
|
/** Props to pass through to each SocialButton */
|
|
188
|
-
buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled'>>;
|
|
196
|
+
buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled' | 'compact' | 'label'>>;
|
|
189
197
|
}
|
|
190
|
-
declare function SocialButtons({ onSuccess, onError, style, gap, buttonProps, }: SocialButtonsProps): react_jsx_runtime.JSX.Element | null;
|
|
198
|
+
declare function SocialButtons({ onSuccess, onError, style, gap, compact, labels, buttonProps, }: SocialButtonsProps): react_jsx_runtime.JSX.Element | null;
|
|
191
199
|
|
|
192
200
|
export { type AuthState, AuthonContext, type AuthonContextValue, type AuthonEventType, type AuthonEvents, AuthonMobileClient, AuthonProvider, type AuthonReactNativeConfig, type AuthonUser, ProviderIcon, type SignInParams, type SignUpParams, SocialButton, type SocialButtonProps, SocialButtons, type SocialButtonsProps, type TokenPair, useAuthon, useUser };
|
package/dist/index.d.ts
CHANGED
|
@@ -162,18 +162,22 @@ interface SocialButtonProps {
|
|
|
162
162
|
disabled?: boolean;
|
|
163
163
|
/** Override button label. Default: "Continue with {Provider}" */
|
|
164
164
|
label?: string;
|
|
165
|
+
/** Compact mode — icon-only square button (default: false) */
|
|
166
|
+
compact?: boolean;
|
|
165
167
|
/** Override button style */
|
|
166
168
|
style?: ViewStyle;
|
|
167
169
|
/** Override label text style */
|
|
168
170
|
labelStyle?: TextStyle;
|
|
169
|
-
/** Icon size (default: 20) */
|
|
171
|
+
/** Icon size (default: 20, compact default: 24) */
|
|
170
172
|
iconSize?: number;
|
|
171
173
|
/** Border radius (default: 10) */
|
|
172
174
|
borderRadius?: number;
|
|
173
175
|
/** Button height (default: 48) */
|
|
174
176
|
height?: number;
|
|
177
|
+
/** Button size for compact mode (default: 48) */
|
|
178
|
+
size?: number;
|
|
175
179
|
}
|
|
176
|
-
declare function SocialButton({ provider, onPress, loading, disabled, label, style, labelStyle, iconSize, borderRadius, height, }: SocialButtonProps): react_jsx_runtime.JSX.Element;
|
|
180
|
+
declare function SocialButton({ provider, onPress, loading, disabled, label, compact, style, labelStyle, iconSize, borderRadius, height, size, }: SocialButtonProps): react_jsx_runtime.JSX.Element;
|
|
177
181
|
|
|
178
182
|
interface SocialButtonsProps {
|
|
179
183
|
/** Called after successful OAuth sign-in */
|
|
@@ -182,11 +186,15 @@ interface SocialButtonsProps {
|
|
|
182
186
|
onError?: (error: Error) => void;
|
|
183
187
|
/** Container style */
|
|
184
188
|
style?: ViewStyle;
|
|
185
|
-
/** Gap between buttons (default: 10) */
|
|
189
|
+
/** Gap between buttons (default: 10, compact default: 12) */
|
|
186
190
|
gap?: number;
|
|
191
|
+
/** Compact mode — icon-only square buttons in a row (default: false) */
|
|
192
|
+
compact?: boolean;
|
|
193
|
+
/** Custom labels per provider. e.g. { google: 'Google로 로그인' } */
|
|
194
|
+
labels?: Partial<Record<OAuthProviderType, string>>;
|
|
187
195
|
/** Props to pass through to each SocialButton */
|
|
188
|
-
buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled'>>;
|
|
196
|
+
buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled' | 'compact' | 'label'>>;
|
|
189
197
|
}
|
|
190
|
-
declare function SocialButtons({ onSuccess, onError, style, gap, buttonProps, }: SocialButtonsProps): react_jsx_runtime.JSX.Element | null;
|
|
198
|
+
declare function SocialButtons({ onSuccess, onError, style, gap, compact, labels, buttonProps, }: SocialButtonsProps): react_jsx_runtime.JSX.Element | null;
|
|
191
199
|
|
|
192
200
|
export { type AuthState, AuthonContext, type AuthonContextValue, type AuthonEventType, type AuthonEvents, AuthonMobileClient, AuthonProvider, type AuthonReactNativeConfig, type AuthonUser, ProviderIcon, type SignInParams, type SignUpParams, SocialButton, type SocialButtonProps, SocialButtons, type SocialButtonsProps, type TokenPair, useAuthon, useUser };
|
package/dist/index.js
CHANGED
|
@@ -496,16 +496,41 @@ function SocialButton({
|
|
|
496
496
|
loading = false,
|
|
497
497
|
disabled = false,
|
|
498
498
|
label,
|
|
499
|
+
compact = false,
|
|
499
500
|
style,
|
|
500
501
|
labelStyle,
|
|
501
|
-
iconSize
|
|
502
|
+
iconSize,
|
|
502
503
|
borderRadius = 10,
|
|
503
|
-
height = 48
|
|
504
|
+
height = 48,
|
|
505
|
+
size = 48
|
|
504
506
|
}) {
|
|
505
507
|
const colors = PROVIDER_COLORS[provider] || { bg: "#333", text: "#fff" };
|
|
506
508
|
const displayName = PROVIDER_DISPLAY_NAMES[provider] || provider;
|
|
507
509
|
const buttonLabel = label ?? `Continue with ${displayName}`;
|
|
508
510
|
const needsBorder = colors.bg.toLowerCase() === "#ffffff";
|
|
511
|
+
const resolvedIconSize = iconSize ?? (compact ? 24 : 20);
|
|
512
|
+
if (compact) {
|
|
513
|
+
return /* @__PURE__ */ jsx3(
|
|
514
|
+
TouchableOpacity,
|
|
515
|
+
{
|
|
516
|
+
style: [
|
|
517
|
+
styles.compactButton,
|
|
518
|
+
{
|
|
519
|
+
backgroundColor: colors.bg,
|
|
520
|
+
borderRadius,
|
|
521
|
+
width: size,
|
|
522
|
+
height: size
|
|
523
|
+
},
|
|
524
|
+
needsBorder && styles.bordered,
|
|
525
|
+
style
|
|
526
|
+
],
|
|
527
|
+
onPress: () => onPress(provider),
|
|
528
|
+
disabled: disabled || loading,
|
|
529
|
+
activeOpacity: 0.8,
|
|
530
|
+
children: loading ? /* @__PURE__ */ jsx3(ActivityIndicator, { color: colors.text, size: "small" }) : /* @__PURE__ */ jsx3(ProviderIcon, { provider, size: resolvedIconSize, color: colors.text })
|
|
531
|
+
}
|
|
532
|
+
);
|
|
533
|
+
}
|
|
509
534
|
return /* @__PURE__ */ jsx3(
|
|
510
535
|
TouchableOpacity,
|
|
511
536
|
{
|
|
@@ -523,7 +548,7 @@ function SocialButton({
|
|
|
523
548
|
disabled: disabled || loading,
|
|
524
549
|
activeOpacity: 0.8,
|
|
525
550
|
children: loading ? /* @__PURE__ */ jsx3(ActivityIndicator, { color: colors.text, size: "small" }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
526
|
-
/* @__PURE__ */ jsx3(ProviderIcon, { provider, size:
|
|
551
|
+
/* @__PURE__ */ jsx3(ProviderIcon, { provider, size: resolvedIconSize, color: colors.text }),
|
|
527
552
|
/* @__PURE__ */ jsx3(
|
|
528
553
|
Text,
|
|
529
554
|
{
|
|
@@ -548,6 +573,10 @@ var styles = StyleSheet.create({
|
|
|
548
573
|
gap: 10,
|
|
549
574
|
paddingHorizontal: 16
|
|
550
575
|
},
|
|
576
|
+
compactButton: {
|
|
577
|
+
alignItems: "center",
|
|
578
|
+
justifyContent: "center"
|
|
579
|
+
},
|
|
551
580
|
bordered: {
|
|
552
581
|
borderWidth: 1,
|
|
553
582
|
borderColor: "#dadce0"
|
|
@@ -566,12 +595,15 @@ function SocialButtons({
|
|
|
566
595
|
onSuccess,
|
|
567
596
|
onError,
|
|
568
597
|
style,
|
|
569
|
-
gap
|
|
598
|
+
gap,
|
|
599
|
+
compact = false,
|
|
600
|
+
labels,
|
|
570
601
|
buttonProps
|
|
571
602
|
}) {
|
|
572
603
|
const { providers, startOAuth, completeOAuth } = useAuthon();
|
|
573
604
|
const [loadingProvider, setLoadingProvider] = useState2(null);
|
|
574
605
|
if (providers.length === 0) return null;
|
|
606
|
+
const resolvedGap = gap ?? (compact ? 12 : 10);
|
|
575
607
|
const handlePress = async (provider) => {
|
|
576
608
|
setLoadingProvider(provider);
|
|
577
609
|
try {
|
|
@@ -588,20 +620,37 @@ function SocialButtons({
|
|
|
588
620
|
setLoadingProvider(null);
|
|
589
621
|
}
|
|
590
622
|
};
|
|
591
|
-
return /* @__PURE__ */ jsx4(
|
|
592
|
-
|
|
623
|
+
return /* @__PURE__ */ jsx4(
|
|
624
|
+
View,
|
|
593
625
|
{
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
626
|
+
style: [
|
|
627
|
+
compact ? styles2.compactContainer : styles2.container,
|
|
628
|
+
{ gap: resolvedGap },
|
|
629
|
+
style
|
|
630
|
+
],
|
|
631
|
+
children: providers.map((provider) => /* @__PURE__ */ jsx4(
|
|
632
|
+
SocialButton,
|
|
633
|
+
{
|
|
634
|
+
provider,
|
|
635
|
+
onPress: handlePress,
|
|
636
|
+
loading: loadingProvider === provider,
|
|
637
|
+
disabled: !!loadingProvider,
|
|
638
|
+
compact,
|
|
639
|
+
label: labels?.[provider],
|
|
640
|
+
...buttonProps
|
|
641
|
+
},
|
|
642
|
+
provider
|
|
643
|
+
))
|
|
644
|
+
}
|
|
645
|
+
);
|
|
602
646
|
}
|
|
603
647
|
var styles2 = StyleSheet2.create({
|
|
604
|
-
container: {}
|
|
648
|
+
container: {},
|
|
649
|
+
compactContainer: {
|
|
650
|
+
flexDirection: "row",
|
|
651
|
+
flexWrap: "wrap",
|
|
652
|
+
justifyContent: "center"
|
|
653
|
+
}
|
|
605
654
|
});
|
|
606
655
|
export {
|
|
607
656
|
AuthonContext,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AuthonProvider.tsx","../src/client.ts","../src/useAuthon.ts","../src/useUser.ts","../src/icons.tsx","../src/SocialButton.tsx","../src/SocialButtons.tsx"],"sourcesContent":["import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { AuthonMobileClient } from './client';\nimport type {\n AuthState,\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nexport interface AuthonContextValue extends AuthState {\n user: AuthonUser | null;\n signIn: (params: SignInParams) => Promise<void>;\n signUp: (params: SignUpParams) => Promise<void>;\n signOut: () => Promise<void>;\n getToken: () => string | null;\n /** Available OAuth providers (fetched from API) */\n providers: OAuthProviderType[];\n /** Branding config (fetched from API) */\n branding: BrandingConfig | null;\n /** Start OAuth flow — returns { url, state }. Open url in browser, then call completeOAuth(state) */\n startOAuth: (provider: OAuthProviderType, redirectUri?: string) => Promise<{ url: string; state: string }>;\n /** Poll for OAuth result after user completes browser flow */\n completeOAuth: (state: string) => Promise<void>;\n /** Subscribe to auth events */\n on: <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => () => void;\n /** Get the underlying client instance */\n client: AuthonMobileClient;\n}\n\nexport const AuthonContext = createContext<AuthonContextValue | null>(null);\n\ninterface AuthonProviderProps extends AuthonReactNativeConfig {\n children: React.ReactNode;\n storage?: {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n };\n}\n\nexport function AuthonProvider({ children, storage, ...config }: AuthonProviderProps) {\n const clientRef = useRef<AuthonMobileClient | null>(null);\n const [authState, setAuthState] = useState<AuthState>({\n isLoaded: false,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n const [user, setUser] = useState<AuthonUser | null>(null);\n const [providers, setProviders] = useState<OAuthProviderType[]>([]);\n const [branding, setBranding] = useState<BrandingConfig | null>(null);\n\n if (!clientRef.current) {\n clientRef.current = new AuthonMobileClient(config);\n }\n\n const client = clientRef.current;\n\n useEffect(() => {\n if (storage) {\n client.setStorage(storage);\n }\n\n const init = async () => {\n // Initialize tokens from storage\n const tokens = await client.initialize();\n\n // Fetch providers + branding in parallel\n await client.ensureInitialized();\n const p = await client.getProviders();\n const b = await client.getBranding();\n setProviders(p);\n setBranding(b);\n\n if (tokens) {\n const u = await client.getUser();\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n } else {\n setAuthState((prev) => ({ ...prev, isLoaded: true }));\n }\n };\n\n init();\n\n // Listen for auth events to keep state in sync\n const unsubs = [\n client.on('signedOut', () => {\n setUser(null);\n setAuthState({\n isLoaded: true,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n }),\n client.on('tokenRefreshed', () => {\n const token = client.getAccessToken();\n if (token) {\n setAuthState((prev) => ({ ...prev, accessToken: token }));\n }\n }),\n ];\n\n return () => {\n unsubs.forEach((fn) => fn());\n client.destroy();\n };\n }, []);\n\n const signIn = useCallback(async (params: SignInParams) => {\n const { tokens, user: u } = await client.signIn(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signUp = useCallback(async (params: SignUpParams) => {\n const { tokens, user: u } = await client.signUp(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signOut = useCallback(async () => {\n await client.signOut();\n // State is updated via the 'signedOut' event listener\n }, [client]);\n\n const getToken = useCallback(() => {\n return client.getAccessToken();\n }, [client]);\n\n const startOAuth = useCallback(\n async (provider: OAuthProviderType, redirectUri?: string) => {\n const uri = redirectUri || `${client.getApiUrl()}/v1/auth/oauth/redirect`;\n return client.getOAuthUrl(provider, uri);\n },\n [client],\n );\n\n const completeOAuthCb = useCallback(\n async (state: string) => {\n const { tokens, user: u } = await client.completeOAuth(state);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n },\n [client],\n );\n\n const on = useCallback(\n <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => {\n return client.on(event, listener);\n },\n [client],\n );\n\n const value = useMemo<AuthonContextValue>(\n () => ({\n ...authState,\n user,\n signIn,\n signUp,\n signOut,\n getToken,\n providers,\n branding,\n startOAuth,\n completeOAuth: completeOAuthCb,\n on,\n client,\n }),\n [authState, user, signIn, signUp, signOut, getToken, providers, branding, startOAuth, completeOAuthCb, on, client],\n );\n\n return <AuthonContext.Provider value={value}>{children}</AuthonContext.Provider>;\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport type {\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n TokenPair,\n ApiAuthResponse,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.authon.dev';\n\ntype TokenStorage = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ntype OAuthFlowMode = 'popup' | 'redirect' | 'auto';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nconst STORAGE_KEY = 'authon-tokens';\n\nexport class AuthonMobileClient {\n private apiUrl: string;\n private publishableKey: string;\n private tokens: TokenPair | null = null;\n private user: AuthonUser | null = null;\n private storage: TokenStorage | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n\n // Cached provider/branding data\n private _providers: OAuthProviderType[] = [];\n private _branding: BrandingConfig | null = null;\n private _initialized = false;\n\n constructor(config: AuthonReactNativeConfig) {\n this.publishableKey = config.publishableKey;\n this.apiUrl = (config.apiUrl || DEFAULT_API_URL).replace(/\\/$/, '');\n }\n\n setStorage(storage: TokenStorage) {\n this.storage = storage;\n }\n\n // ── Initialization ──\n\n async initialize(): Promise<TokenPair | null> {\n if (!this.storage) return null;\n\n const stored = await this.storage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n try {\n const tokens: TokenPair = JSON.parse(stored);\n if (tokens.expiresAt > Date.now()) {\n this.tokens = tokens;\n this.scheduleRefresh(tokens.expiresAt);\n return tokens;\n }\n // Try refreshing\n return await this.refreshToken(tokens.refreshToken);\n } catch {\n await this.storage.removeItem(STORAGE_KEY);\n return null;\n }\n }\n\n /** Fetch providers + branding from API (lazy, cached) */\n async ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n try {\n const [branding, providersRes] = await Promise.all([\n this.request('GET', '/v1/auth/branding') as Promise<BrandingConfig>,\n this.request('GET', '/v1/auth/providers') as Promise<ProvidersResponse>,\n ]);\n this._branding = branding;\n this._providers = providersRes.providers;\n this._initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n // ── Auth ──\n\n async signIn(params: SignInParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signin', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signUp(params: SignUpParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signup', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signOut(): Promise<void> {\n if (this.tokens) {\n try {\n await this.request('POST', '/v1/auth/signout', undefined);\n } catch {\n // Ignore sign-out errors\n }\n }\n this.clearSession();\n this.emit('signedOut');\n }\n\n async getUser(): Promise<AuthonUser | null> {\n if (!this.tokens) return null;\n try {\n const user = (await this.request('GET', '/v1/auth/me')) as AuthonUser;\n this.user = user;\n return user;\n } catch {\n return null;\n }\n }\n\n getCachedUser(): AuthonUser | null {\n return this.user;\n }\n\n // ── Token management ──\n\n async refreshToken(refreshToken?: string): Promise<TokenPair | null> {\n const token = refreshToken || this.tokens?.refreshToken;\n if (!token) return null;\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n body: JSON.stringify({ refreshToken: token }),\n });\n\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n\n const data = (await res.json()) as ApiAuthResponse;\n this.tokens = this.toTokenPair(data);\n this.user = data.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('tokenRefreshed');\n return this.tokens;\n } catch {\n return null;\n }\n }\n\n getAccessToken(): string | null {\n return this.tokens?.accessToken || null;\n }\n\n isAuthenticated(): boolean {\n return this.tokens !== null && this.tokens.expiresAt > Date.now();\n }\n\n // ── OAuth ──\n\n async getProviders(): Promise<OAuthProviderType[]> {\n await this.ensureInitialized();\n return this._providers;\n }\n\n async getBranding(): Promise<BrandingConfig | null> {\n await this.ensureInitialized();\n return this._branding;\n }\n\n async getOAuthUrl(\n provider: string,\n redirectUri: string,\n ): Promise<{ url: string; state: string }> {\n const params = new URLSearchParams({ redirectUri, flow: 'redirect' });\n return (await this.request(\n 'GET',\n `/v1/auth/oauth/${provider}/url?${params.toString()}`,\n )) as { url: string; state: string };\n }\n\n async pollOAuth(state: string): Promise<ApiAuthResponse | null> {\n try {\n const res = await fetch(\n `${this.apiUrl}/v1/auth/oauth/poll?state=${encodeURIComponent(state)}`,\n { headers: { 'x-api-key': this.publishableKey } },\n );\n if (!res.ok) return null;\n const data = (await res.json()) as Record<string, unknown>;\n if (data.status === 'completed' && data.accessToken) {\n return data as unknown as ApiAuthResponse;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n /** Poll for OAuth completion (3 minute timeout, matching JS SDK) */\n async completeOAuth(state: string): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const maxAttempts = 360; // 3 minutes at 500ms intervals\n for (let i = 0; i < maxAttempts; i++) {\n const result = await this.pollOAuth(state);\n if (result) {\n this.tokens = this.toTokenPair(result);\n this.user = result.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', result.user);\n return { tokens: this.tokens, user: result.user };\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error('OAuth timeout');\n }\n\n getApiUrl(): string {\n return this.apiUrl;\n }\n\n // ── Event system ──\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n private emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => fn(...args));\n }\n\n // ── Cleanup ──\n\n destroy(): void {\n this.clearRefreshTimer();\n this.listeners.clear();\n }\n\n // ── Private ──\n\n private clearSession(): void {\n this.tokens = null;\n this.user = null;\n this.clearRefreshTimer();\n if (this.storage) {\n this.storage.removeItem(STORAGE_KEY).catch(() => {});\n }\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /** Schedule auto-refresh 60 seconds before token expiry (like JS SDK) */\n private scheduleRefresh(expiresAt: number): void {\n this.clearRefreshTimer();\n const refreshIn = Math.max(expiresAt - Date.now() - 60_000, 30_000);\n this.refreshTimer = setTimeout(() => {\n this.refreshToken().catch(() => {});\n }, refreshIn);\n }\n\n private async persistTokens(): Promise<void> {\n if (this.storage && this.tokens) {\n await this.storage.setItem(STORAGE_KEY, JSON.stringify(this.tokens));\n }\n }\n\n private toTokenPair(res: ApiAuthResponse): TokenPair {\n return {\n accessToken: res.accessToken,\n refreshToken: res.refreshToken,\n expiresAt: Date.now() + res.expiresIn * 1000,\n };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n };\n\n if (this.tokens?.accessToken) {\n headers['Authorization'] = `Bearer ${this.tokens.accessToken}`;\n }\n\n const res = await fetch(`${this.apiUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ message: res.statusText }));\n const msg = Array.isArray(error.message)\n ? error.message[0]\n : error.message || `Request failed with status ${res.status}`;\n throw new Error(msg);\n }\n\n const text = await res.text();\n return text ? JSON.parse(text) : undefined;\n }\n}\n","import { useContext } from 'react';\nimport { AuthonContext, type AuthonContextValue } from './AuthonProvider';\n\nexport function useAuthon(): AuthonContextValue {\n const context = useContext(AuthonContext);\n if (!context) {\n throw new Error('useAuthon must be used within an <AuthonProvider>');\n }\n return context;\n}\n","import { useAuthon } from './useAuthon';\nimport type { AuthonUser } from './types';\n\nexport function useUser(): {\n isLoaded: boolean;\n isSignedIn: boolean;\n user: AuthonUser | null;\n} {\n const { isLoaded, isSignedIn, user } = useAuthon();\n return { isLoaded, isSignedIn, user };\n}\n","import React from 'react';\nimport Svg, { Path, Rect } from 'react-native-svg';\nimport type { OAuthProviderType } from '@authon/shared';\n\ninterface IconProps {\n size?: number;\n color?: string;\n}\n\nfunction GoogleIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" />\n <Path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <Path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <Path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </Svg>\n );\n}\n\nfunction AppleIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </Svg>\n );\n}\n\nfunction KakaoIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\" />\n </Svg>\n );\n}\n\nfunction NaverIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\" />\n </Svg>\n );\n}\n\nfunction FacebookIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\" />\n </Svg>\n );\n}\n\nfunction GithubIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\" />\n </Svg>\n );\n}\n\nfunction DiscordIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\" />\n </Svg>\n );\n}\n\nfunction XIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </Svg>\n );\n}\n\nfunction LineIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\" />\n </Svg>\n );\n}\n\nfunction MicrosoftIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Rect fill=\"#F25022\" x={1} y={1} width={10} height={10} />\n <Rect fill=\"#7FBA00\" x={13} y={1} width={10} height={10} />\n <Rect fill=\"#00A4EF\" x={1} y={13} width={10} height={10} />\n <Rect fill=\"#FFB900\" x={13} y={13} width={10} height={10} />\n </Svg>\n );\n}\n\nconst ICON_MAP: Record<OAuthProviderType, React.FC<IconProps>> = {\n google: GoogleIcon,\n apple: AppleIcon,\n kakao: KakaoIcon,\n naver: NaverIcon,\n facebook: FacebookIcon,\n github: GithubIcon,\n discord: DiscordIcon,\n x: XIcon,\n line: LineIcon,\n microsoft: MicrosoftIcon,\n};\n\nexport function ProviderIcon({ provider, size = 20, color }: IconProps & { provider: OAuthProviderType }) {\n const Icon = ICON_MAP[provider];\n if (!Icon) return null;\n return <Icon size={size} color={color} />;\n}\n","import React from 'react';\nimport {\n TouchableOpacity,\n Text,\n ActivityIndicator,\n StyleSheet,\n type ViewStyle,\n type TextStyle,\n} from 'react-native';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { ProviderIcon } from './icons';\n\nexport interface SocialButtonProps {\n provider: OAuthProviderType;\n onPress: (provider: OAuthProviderType) => void;\n loading?: boolean;\n disabled?: boolean;\n /** Override button label. Default: \"Continue with {Provider}\" */\n label?: string;\n /** Override button style */\n style?: ViewStyle;\n /** Override label text style */\n labelStyle?: TextStyle;\n /** Icon size (default: 20) */\n iconSize?: number;\n /** Border radius (default: 10) */\n borderRadius?: number;\n /** Button height (default: 48) */\n height?: number;\n}\n\nexport function SocialButton({\n provider,\n onPress,\n loading = false,\n disabled = false,\n label,\n style,\n labelStyle,\n iconSize = 20,\n borderRadius = 10,\n height = 48,\n}: SocialButtonProps) {\n const colors = PROVIDER_COLORS[provider] || { bg: '#333', text: '#fff' };\n const displayName = PROVIDER_DISPLAY_NAMES[provider] || provider;\n const buttonLabel = label ?? `Continue with ${displayName}`;\n const needsBorder = colors.bg.toLowerCase() === '#ffffff';\n\n return (\n <TouchableOpacity\n style={[\n styles.button,\n {\n backgroundColor: colors.bg,\n borderRadius,\n height,\n },\n needsBorder && styles.bordered,\n style,\n ]}\n onPress={() => onPress(provider)}\n disabled={disabled || loading}\n activeOpacity={0.8}\n >\n {loading ? (\n <ActivityIndicator color={colors.text} size=\"small\" />\n ) : (\n <>\n <ProviderIcon provider={provider} size={iconSize} color={colors.text} />\n <Text\n style={[\n styles.label,\n { color: colors.text },\n labelStyle,\n ]}\n numberOfLines={1}\n >\n {buttonLabel}\n </Text>\n </>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n button: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n paddingHorizontal: 16,\n },\n bordered: {\n borderWidth: 1,\n borderColor: '#dadce0',\n },\n label: {\n fontSize: 15,\n fontWeight: '600',\n },\n});\n","import React, { useState } from 'react';\nimport { View, StyleSheet, Linking, type ViewStyle } from 'react-native';\nimport type { OAuthProviderType } from '@authon/shared';\nimport { useAuthon } from './useAuthon';\nimport { SocialButton, type SocialButtonProps } from './SocialButton';\n\nexport interface SocialButtonsProps {\n /** Called after successful OAuth sign-in */\n onSuccess?: () => void;\n /** Called on OAuth error */\n onError?: (error: Error) => void;\n /** Container style */\n style?: ViewStyle;\n /** Gap between buttons (default: 10) */\n gap?: number;\n /** Props to pass through to each SocialButton */\n buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled'>>;\n}\n\nexport function SocialButtons({\n onSuccess,\n onError,\n style,\n gap = 10,\n buttonProps,\n}: SocialButtonsProps) {\n const { providers, startOAuth, completeOAuth } = useAuthon();\n const [loadingProvider, setLoadingProvider] = useState<string | null>(null);\n\n if (providers.length === 0) return null;\n\n const handlePress = async (provider: OAuthProviderType) => {\n setLoadingProvider(provider);\n try {\n const { url, state } = await startOAuth(provider);\n await Linking.openURL(url);\n await completeOAuth(state);\n onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n if (error.message !== 'OAuth timeout') {\n onError?.(error);\n }\n } finally {\n setLoadingProvider(null);\n }\n };\n\n return (\n <View style={[styles.container, { gap }, style]}>\n {providers.map((provider) => (\n <SocialButton\n key={provider}\n provider={provider}\n onPress={handlePress}\n loading={loadingProvider === provider}\n disabled={!!loadingProvider}\n {...buttonProps}\n />\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {},\n});\n"],"mappings":"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","names":["jsx","jsx","jsxs","useState","StyleSheet","jsx","useState","styles","StyleSheet"]}
|
|
1
|
+
{"version":3,"sources":["../src/AuthonProvider.tsx","../src/client.ts","../src/useAuthon.ts","../src/useUser.ts","../src/icons.tsx","../src/SocialButton.tsx","../src/SocialButtons.tsx"],"sourcesContent":["import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { AuthonMobileClient } from './client';\nimport type {\n AuthState,\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nexport interface AuthonContextValue extends AuthState {\n user: AuthonUser | null;\n signIn: (params: SignInParams) => Promise<void>;\n signUp: (params: SignUpParams) => Promise<void>;\n signOut: () => Promise<void>;\n getToken: () => string | null;\n /** Available OAuth providers (fetched from API) */\n providers: OAuthProviderType[];\n /** Branding config (fetched from API) */\n branding: BrandingConfig | null;\n /** Start OAuth flow — returns { url, state }. Open url in browser, then call completeOAuth(state) */\n startOAuth: (provider: OAuthProviderType, redirectUri?: string) => Promise<{ url: string; state: string }>;\n /** Poll for OAuth result after user completes browser flow */\n completeOAuth: (state: string) => Promise<void>;\n /** Subscribe to auth events */\n on: <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => () => void;\n /** Get the underlying client instance */\n client: AuthonMobileClient;\n}\n\nexport const AuthonContext = createContext<AuthonContextValue | null>(null);\n\ninterface AuthonProviderProps extends AuthonReactNativeConfig {\n children: React.ReactNode;\n storage?: {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n };\n}\n\nexport function AuthonProvider({ children, storage, ...config }: AuthonProviderProps) {\n const clientRef = useRef<AuthonMobileClient | null>(null);\n const [authState, setAuthState] = useState<AuthState>({\n isLoaded: false,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n const [user, setUser] = useState<AuthonUser | null>(null);\n const [providers, setProviders] = useState<OAuthProviderType[]>([]);\n const [branding, setBranding] = useState<BrandingConfig | null>(null);\n\n if (!clientRef.current) {\n clientRef.current = new AuthonMobileClient(config);\n }\n\n const client = clientRef.current;\n\n useEffect(() => {\n if (storage) {\n client.setStorage(storage);\n }\n\n const init = async () => {\n // Initialize tokens from storage\n const tokens = await client.initialize();\n\n // Fetch providers + branding in parallel\n await client.ensureInitialized();\n const p = await client.getProviders();\n const b = await client.getBranding();\n setProviders(p);\n setBranding(b);\n\n if (tokens) {\n const u = await client.getUser();\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n } else {\n setAuthState((prev) => ({ ...prev, isLoaded: true }));\n }\n };\n\n init();\n\n // Listen for auth events to keep state in sync\n const unsubs = [\n client.on('signedOut', () => {\n setUser(null);\n setAuthState({\n isLoaded: true,\n isSignedIn: false,\n userId: null,\n sessionId: null,\n accessToken: null,\n });\n }),\n client.on('tokenRefreshed', () => {\n const token = client.getAccessToken();\n if (token) {\n setAuthState((prev) => ({ ...prev, accessToken: token }));\n }\n }),\n ];\n\n return () => {\n unsubs.forEach((fn) => fn());\n client.destroy();\n };\n }, []);\n\n const signIn = useCallback(async (params: SignInParams) => {\n const { tokens, user: u } = await client.signIn(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signUp = useCallback(async (params: SignUpParams) => {\n const { tokens, user: u } = await client.signUp(params);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n }, [client]);\n\n const signOut = useCallback(async () => {\n await client.signOut();\n // State is updated via the 'signedOut' event listener\n }, [client]);\n\n const getToken = useCallback(() => {\n return client.getAccessToken();\n }, [client]);\n\n const startOAuth = useCallback(\n async (provider: OAuthProviderType, redirectUri?: string) => {\n const uri = redirectUri || `${client.getApiUrl()}/v1/auth/oauth/redirect`;\n return client.getOAuthUrl(provider, uri);\n },\n [client],\n );\n\n const completeOAuthCb = useCallback(\n async (state: string) => {\n const { tokens, user: u } = await client.completeOAuth(state);\n setUser(u);\n setAuthState({\n isLoaded: true,\n isSignedIn: true,\n userId: u?.id || null,\n sessionId: null,\n accessToken: tokens.accessToken,\n });\n },\n [client],\n );\n\n const on = useCallback(\n <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => {\n return client.on(event, listener);\n },\n [client],\n );\n\n const value = useMemo<AuthonContextValue>(\n () => ({\n ...authState,\n user,\n signIn,\n signUp,\n signOut,\n getToken,\n providers,\n branding,\n startOAuth,\n completeOAuth: completeOAuthCb,\n on,\n client,\n }),\n [authState, user, signIn, signUp, signOut, getToken, providers, branding, startOAuth, completeOAuthCb, on, client],\n );\n\n return <AuthonContext.Provider value={value}>{children}</AuthonContext.Provider>;\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport type {\n AuthonReactNativeConfig,\n AuthonUser,\n SignInParams,\n SignUpParams,\n TokenPair,\n ApiAuthResponse,\n AuthonEventType,\n AuthonEvents,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.authon.dev';\n\ntype TokenStorage = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ntype OAuthFlowMode = 'popup' | 'redirect' | 'auto';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nconst STORAGE_KEY = 'authon-tokens';\n\nexport class AuthonMobileClient {\n private apiUrl: string;\n private publishableKey: string;\n private tokens: TokenPair | null = null;\n private user: AuthonUser | null = null;\n private storage: TokenStorage | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n\n // Cached provider/branding data\n private _providers: OAuthProviderType[] = [];\n private _branding: BrandingConfig | null = null;\n private _initialized = false;\n\n constructor(config: AuthonReactNativeConfig) {\n this.publishableKey = config.publishableKey;\n this.apiUrl = (config.apiUrl || DEFAULT_API_URL).replace(/\\/$/, '');\n }\n\n setStorage(storage: TokenStorage) {\n this.storage = storage;\n }\n\n // ── Initialization ──\n\n async initialize(): Promise<TokenPair | null> {\n if (!this.storage) return null;\n\n const stored = await this.storage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n try {\n const tokens: TokenPair = JSON.parse(stored);\n if (tokens.expiresAt > Date.now()) {\n this.tokens = tokens;\n this.scheduleRefresh(tokens.expiresAt);\n return tokens;\n }\n // Try refreshing\n return await this.refreshToken(tokens.refreshToken);\n } catch {\n await this.storage.removeItem(STORAGE_KEY);\n return null;\n }\n }\n\n /** Fetch providers + branding from API (lazy, cached) */\n async ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n try {\n const [branding, providersRes] = await Promise.all([\n this.request('GET', '/v1/auth/branding') as Promise<BrandingConfig>,\n this.request('GET', '/v1/auth/providers') as Promise<ProvidersResponse>,\n ]);\n this._branding = branding;\n this._providers = providersRes.providers;\n this._initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n // ── Auth ──\n\n async signIn(params: SignInParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signin', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signUp(params: SignUpParams): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const res = (await this.request('POST', '/v1/auth/signup', params)) as ApiAuthResponse;\n this.tokens = this.toTokenPair(res);\n this.user = res.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', res.user);\n return { tokens: this.tokens, user: res.user };\n }\n\n async signOut(): Promise<void> {\n if (this.tokens) {\n try {\n await this.request('POST', '/v1/auth/signout', undefined);\n } catch {\n // Ignore sign-out errors\n }\n }\n this.clearSession();\n this.emit('signedOut');\n }\n\n async getUser(): Promise<AuthonUser | null> {\n if (!this.tokens) return null;\n try {\n const user = (await this.request('GET', '/v1/auth/me')) as AuthonUser;\n this.user = user;\n return user;\n } catch {\n return null;\n }\n }\n\n getCachedUser(): AuthonUser | null {\n return this.user;\n }\n\n // ── Token management ──\n\n async refreshToken(refreshToken?: string): Promise<TokenPair | null> {\n const token = refreshToken || this.tokens?.refreshToken;\n if (!token) return null;\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n body: JSON.stringify({ refreshToken: token }),\n });\n\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n\n const data = (await res.json()) as ApiAuthResponse;\n this.tokens = this.toTokenPair(data);\n this.user = data.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('tokenRefreshed');\n return this.tokens;\n } catch {\n return null;\n }\n }\n\n getAccessToken(): string | null {\n return this.tokens?.accessToken || null;\n }\n\n isAuthenticated(): boolean {\n return this.tokens !== null && this.tokens.expiresAt > Date.now();\n }\n\n // ── OAuth ──\n\n async getProviders(): Promise<OAuthProviderType[]> {\n await this.ensureInitialized();\n return this._providers;\n }\n\n async getBranding(): Promise<BrandingConfig | null> {\n await this.ensureInitialized();\n return this._branding;\n }\n\n async getOAuthUrl(\n provider: string,\n redirectUri: string,\n ): Promise<{ url: string; state: string }> {\n const params = new URLSearchParams({ redirectUri, flow: 'redirect' });\n return (await this.request(\n 'GET',\n `/v1/auth/oauth/${provider}/url?${params.toString()}`,\n )) as { url: string; state: string };\n }\n\n async pollOAuth(state: string): Promise<ApiAuthResponse | null> {\n try {\n const res = await fetch(\n `${this.apiUrl}/v1/auth/oauth/poll?state=${encodeURIComponent(state)}`,\n { headers: { 'x-api-key': this.publishableKey } },\n );\n if (!res.ok) return null;\n const data = (await res.json()) as Record<string, unknown>;\n if (data.status === 'completed' && data.accessToken) {\n return data as unknown as ApiAuthResponse;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n /** Poll for OAuth completion (3 minute timeout, matching JS SDK) */\n async completeOAuth(state: string): Promise<{ tokens: TokenPair; user: AuthonUser }> {\n const maxAttempts = 360; // 3 minutes at 500ms intervals\n for (let i = 0; i < maxAttempts; i++) {\n const result = await this.pollOAuth(state);\n if (result) {\n this.tokens = this.toTokenPair(result);\n this.user = result.user;\n await this.persistTokens();\n this.scheduleRefresh(this.tokens.expiresAt);\n this.emit('signedIn', result.user);\n return { tokens: this.tokens, user: result.user };\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error('OAuth timeout');\n }\n\n getApiUrl(): string {\n return this.apiUrl;\n }\n\n // ── Event system ──\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n private emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => fn(...args));\n }\n\n // ── Cleanup ──\n\n destroy(): void {\n this.clearRefreshTimer();\n this.listeners.clear();\n }\n\n // ── Private ──\n\n private clearSession(): void {\n this.tokens = null;\n this.user = null;\n this.clearRefreshTimer();\n if (this.storage) {\n this.storage.removeItem(STORAGE_KEY).catch(() => {});\n }\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /** Schedule auto-refresh 60 seconds before token expiry (like JS SDK) */\n private scheduleRefresh(expiresAt: number): void {\n this.clearRefreshTimer();\n const refreshIn = Math.max(expiresAt - Date.now() - 60_000, 30_000);\n this.refreshTimer = setTimeout(() => {\n this.refreshToken().catch(() => {});\n }, refreshIn);\n }\n\n private async persistTokens(): Promise<void> {\n if (this.storage && this.tokens) {\n await this.storage.setItem(STORAGE_KEY, JSON.stringify(this.tokens));\n }\n }\n\n private toTokenPair(res: ApiAuthResponse): TokenPair {\n return {\n accessToken: res.accessToken,\n refreshToken: res.refreshToken,\n expiresAt: Date.now() + res.expiresIn * 1000,\n };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n };\n\n if (this.tokens?.accessToken) {\n headers['Authorization'] = `Bearer ${this.tokens.accessToken}`;\n }\n\n const res = await fetch(`${this.apiUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ message: res.statusText }));\n const msg = Array.isArray(error.message)\n ? error.message[0]\n : error.message || `Request failed with status ${res.status}`;\n throw new Error(msg);\n }\n\n const text = await res.text();\n return text ? JSON.parse(text) : undefined;\n }\n}\n","import { useContext } from 'react';\nimport { AuthonContext, type AuthonContextValue } from './AuthonProvider';\n\nexport function useAuthon(): AuthonContextValue {\n const context = useContext(AuthonContext);\n if (!context) {\n throw new Error('useAuthon must be used within an <AuthonProvider>');\n }\n return context;\n}\n","import { useAuthon } from './useAuthon';\nimport type { AuthonUser } from './types';\n\nexport function useUser(): {\n isLoaded: boolean;\n isSignedIn: boolean;\n user: AuthonUser | null;\n} {\n const { isLoaded, isSignedIn, user } = useAuthon();\n return { isLoaded, isSignedIn, user };\n}\n","import React from 'react';\nimport Svg, { Path, Rect } from 'react-native-svg';\nimport type { OAuthProviderType } from '@authon/shared';\n\ninterface IconProps {\n size?: number;\n color?: string;\n}\n\nfunction GoogleIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" />\n <Path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <Path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <Path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </Svg>\n );\n}\n\nfunction AppleIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </Svg>\n );\n}\n\nfunction KakaoIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\" />\n </Svg>\n );\n}\n\nfunction NaverIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\" />\n </Svg>\n );\n}\n\nfunction FacebookIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Path fill={color} d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\" />\n </Svg>\n );\n}\n\nfunction GithubIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\" />\n </Svg>\n );\n}\n\nfunction DiscordIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\" />\n </Svg>\n );\n}\n\nfunction XIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </Svg>\n );\n}\n\nfunction LineIcon({ size = 20, color = '#fff' }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size} fill={color}>\n <Path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\" />\n </Svg>\n );\n}\n\nfunction MicrosoftIcon({ size = 20 }: IconProps) {\n return (\n <Svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <Rect fill=\"#F25022\" x={1} y={1} width={10} height={10} />\n <Rect fill=\"#7FBA00\" x={13} y={1} width={10} height={10} />\n <Rect fill=\"#00A4EF\" x={1} y={13} width={10} height={10} />\n <Rect fill=\"#FFB900\" x={13} y={13} width={10} height={10} />\n </Svg>\n );\n}\n\nconst ICON_MAP: Record<OAuthProviderType, React.FC<IconProps>> = {\n google: GoogleIcon,\n apple: AppleIcon,\n kakao: KakaoIcon,\n naver: NaverIcon,\n facebook: FacebookIcon,\n github: GithubIcon,\n discord: DiscordIcon,\n x: XIcon,\n line: LineIcon,\n microsoft: MicrosoftIcon,\n};\n\nexport function ProviderIcon({ provider, size = 20, color }: IconProps & { provider: OAuthProviderType }) {\n const Icon = ICON_MAP[provider];\n if (!Icon) return null;\n return <Icon size={size} color={color} />;\n}\n","import React from 'react';\nimport {\n TouchableOpacity,\n Text,\n ActivityIndicator,\n StyleSheet,\n type ViewStyle,\n type TextStyle,\n} from 'react-native';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { ProviderIcon } from './icons';\n\nexport interface SocialButtonProps {\n provider: OAuthProviderType;\n onPress: (provider: OAuthProviderType) => void;\n loading?: boolean;\n disabled?: boolean;\n /** Override button label. Default: \"Continue with {Provider}\" */\n label?: string;\n /** Compact mode — icon-only square button (default: false) */\n compact?: boolean;\n /** Override button style */\n style?: ViewStyle;\n /** Override label text style */\n labelStyle?: TextStyle;\n /** Icon size (default: 20, compact default: 24) */\n iconSize?: number;\n /** Border radius (default: 10) */\n borderRadius?: number;\n /** Button height (default: 48) */\n height?: number;\n /** Button size for compact mode (default: 48) */\n size?: number;\n}\n\nexport function SocialButton({\n provider,\n onPress,\n loading = false,\n disabled = false,\n label,\n compact = false,\n style,\n labelStyle,\n iconSize,\n borderRadius = 10,\n height = 48,\n size = 48,\n}: SocialButtonProps) {\n const colors = PROVIDER_COLORS[provider] || { bg: '#333', text: '#fff' };\n const displayName = PROVIDER_DISPLAY_NAMES[provider] || provider;\n const buttonLabel = label ?? `Continue with ${displayName}`;\n const needsBorder = colors.bg.toLowerCase() === '#ffffff';\n const resolvedIconSize = iconSize ?? (compact ? 24 : 20);\n\n if (compact) {\n return (\n <TouchableOpacity\n style={[\n styles.compactButton,\n {\n backgroundColor: colors.bg,\n borderRadius,\n width: size,\n height: size,\n },\n needsBorder && styles.bordered,\n style,\n ]}\n onPress={() => onPress(provider)}\n disabled={disabled || loading}\n activeOpacity={0.8}\n >\n {loading ? (\n <ActivityIndicator color={colors.text} size=\"small\" />\n ) : (\n <ProviderIcon provider={provider} size={resolvedIconSize} color={colors.text} />\n )}\n </TouchableOpacity>\n );\n }\n\n return (\n <TouchableOpacity\n style={[\n styles.button,\n {\n backgroundColor: colors.bg,\n borderRadius,\n height,\n },\n needsBorder && styles.bordered,\n style,\n ]}\n onPress={() => onPress(provider)}\n disabled={disabled || loading}\n activeOpacity={0.8}\n >\n {loading ? (\n <ActivityIndicator color={colors.text} size=\"small\" />\n ) : (\n <>\n <ProviderIcon provider={provider} size={resolvedIconSize} color={colors.text} />\n <Text\n style={[\n styles.label,\n { color: colors.text },\n labelStyle,\n ]}\n numberOfLines={1}\n >\n {buttonLabel}\n </Text>\n </>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n button: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n paddingHorizontal: 16,\n },\n compactButton: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n bordered: {\n borderWidth: 1,\n borderColor: '#dadce0',\n },\n label: {\n fontSize: 15,\n fontWeight: '600',\n },\n});\n","import React, { useState } from 'react';\nimport { View, StyleSheet, Linking, type ViewStyle } from 'react-native';\nimport type { OAuthProviderType } from '@authon/shared';\nimport { useAuthon } from './useAuthon';\nimport { SocialButton, type SocialButtonProps } from './SocialButton';\n\nexport interface SocialButtonsProps {\n /** Called after successful OAuth sign-in */\n onSuccess?: () => void;\n /** Called on OAuth error */\n onError?: (error: Error) => void;\n /** Container style */\n style?: ViewStyle;\n /** Gap between buttons (default: 10, compact default: 12) */\n gap?: number;\n /** Compact mode — icon-only square buttons in a row (default: false) */\n compact?: boolean;\n /** Custom labels per provider. e.g. { google: 'Google로 로그인' } */\n labels?: Partial<Record<OAuthProviderType, string>>;\n /** Props to pass through to each SocialButton */\n buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled' | 'compact' | 'label'>>;\n}\n\nexport function SocialButtons({\n onSuccess,\n onError,\n style,\n gap,\n compact = false,\n labels,\n buttonProps,\n}: SocialButtonsProps) {\n const { providers, startOAuth, completeOAuth } = useAuthon();\n const [loadingProvider, setLoadingProvider] = useState<string | null>(null);\n\n if (providers.length === 0) return null;\n\n const resolvedGap = gap ?? (compact ? 12 : 10);\n\n const handlePress = async (provider: OAuthProviderType) => {\n setLoadingProvider(provider);\n try {\n const { url, state } = await startOAuth(provider);\n await Linking.openURL(url);\n await completeOAuth(state);\n onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n if (error.message !== 'OAuth timeout') {\n onError?.(error);\n }\n } finally {\n setLoadingProvider(null);\n }\n };\n\n return (\n <View\n style={[\n compact ? styles.compactContainer : styles.container,\n { gap: resolvedGap },\n style,\n ]}\n >\n {providers.map((provider) => (\n <SocialButton\n key={provider}\n provider={provider}\n onPress={handlePress}\n loading={loadingProvider === provider}\n disabled={!!loadingProvider}\n compact={compact}\n label={labels?.[provider]}\n {...buttonProps}\n />\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {},\n compactContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'center',\n },\n});\n"],"mappings":"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","names":["jsx","jsx","jsxs","useState","StyleSheet","jsx","useState","styles","StyleSheet"]}
|