@authon/react-native 0.3.7 → 0.3.9

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.
@@ -0,0 +1,314 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { AuthonUser as AuthonUser$1, OAuthProviderType, BrandingConfig, Web3Chain, Web3WalletType, Web3NonceResponse, Web3Wallet, PasskeyCredential } from '@authon/shared';
4
+ export { BrandingConfig, OAuthProviderType } from '@authon/shared';
5
+ import { ViewStyle, TextStyle } from 'react-native';
6
+
7
+ type AuthonUser = AuthonUser$1;
8
+ interface AuthonReactNativeConfig {
9
+ publishableKey: string;
10
+ apiUrl?: string;
11
+ }
12
+ interface AuthState {
13
+ isLoaded: boolean;
14
+ isSignedIn: boolean;
15
+ userId: string | null;
16
+ sessionId: string | null;
17
+ accessToken: string | null;
18
+ }
19
+ interface SignInParams {
20
+ strategy: 'email_password' | 'oauth';
21
+ email?: string;
22
+ password?: string;
23
+ provider?: string;
24
+ }
25
+ interface SignUpParams {
26
+ email: string;
27
+ password: string;
28
+ displayName?: string;
29
+ }
30
+ type OAuthFlowMode = 'popup' | 'redirect' | 'auto';
31
+ interface StartOAuthOptions {
32
+ redirectUri?: string;
33
+ returnTo?: string;
34
+ flow?: OAuthFlowMode;
35
+ }
36
+ type AuthonEventType = 'signedIn' | 'signedOut' | 'error' | 'tokenRefreshed';
37
+ interface AuthonEvents {
38
+ signedIn: (user: AuthonUser) => void;
39
+ signedOut: () => void;
40
+ error: (error: Error) => void;
41
+ tokenRefreshed: () => void;
42
+ }
43
+ interface TokenPair {
44
+ accessToken: string;
45
+ refreshToken: string;
46
+ expiresAt: number;
47
+ }
48
+ interface ApiAuthResponse {
49
+ accessToken: string;
50
+ refreshToken: string;
51
+ expiresIn: number;
52
+ user: AuthonUser;
53
+ }
54
+ interface OAuthCompletedResponse extends ApiAuthResponse {
55
+ status: 'completed';
56
+ }
57
+ interface OAuthErrorResponse {
58
+ status: 'error';
59
+ message: string;
60
+ }
61
+
62
+ type TokenStorage = {
63
+ getItem(key: string): Promise<string | null>;
64
+ setItem(key: string, value: string): Promise<void>;
65
+ removeItem(key: string): Promise<void>;
66
+ };
67
+ type OAuthPollResponse = OAuthCompletedResponse | OAuthErrorResponse;
68
+ declare class AuthonMobileClient {
69
+ private apiUrl;
70
+ private publishableKey;
71
+ private storageKey;
72
+ private tokens;
73
+ private user;
74
+ private storage;
75
+ private refreshInFlight;
76
+ private refreshTimer;
77
+ private listeners;
78
+ private _providers;
79
+ private _branding;
80
+ private _initialized;
81
+ constructor(config: AuthonReactNativeConfig);
82
+ setStorage(storage: TokenStorage): void;
83
+ initialize(): Promise<TokenPair | null>;
84
+ /** Fetch providers + branding from API (lazy, cached) */
85
+ ensureInitialized(): Promise<void>;
86
+ signIn(params: SignInParams): Promise<{
87
+ tokens: TokenPair;
88
+ user: AuthonUser;
89
+ } | {
90
+ needsVerification: true;
91
+ email: string;
92
+ } | {
93
+ mfaRequired: true;
94
+ mfaToken: string;
95
+ }>;
96
+ signUp(params: SignUpParams): Promise<{
97
+ tokens: TokenPair;
98
+ user: AuthonUser;
99
+ } | {
100
+ needsVerification: true;
101
+ email: string;
102
+ }>;
103
+ verifyEmail(email: string, code: string): Promise<{
104
+ tokens: TokenPair;
105
+ user: AuthonUser;
106
+ }>;
107
+ resendVerificationCode(email: string): Promise<void>;
108
+ signOut(): Promise<void>;
109
+ getUser(): Promise<AuthonUser | null>;
110
+ getCachedUser(): AuthonUser | null;
111
+ refreshToken(refreshToken?: string): Promise<TokenPair | null>;
112
+ private _doRefresh;
113
+ getAccessToken(): string | null;
114
+ isAuthenticated(): boolean;
115
+ getProviders(): Promise<OAuthProviderType[]>;
116
+ getBranding(): Promise<BrandingConfig | null>;
117
+ getOAuthUrl(provider: string, options?: string | StartOAuthOptions): Promise<{
118
+ url: string;
119
+ state: string;
120
+ }>;
121
+ pollOAuth(state: string): Promise<OAuthPollResponse | null>;
122
+ /** Poll for OAuth completion (3 minute timeout, matching JS SDK) */
123
+ completeOAuth(state: string): Promise<{
124
+ tokens: TokenPair;
125
+ user: AuthonUser;
126
+ }>;
127
+ getApiUrl(): string;
128
+ web3GetNonce(address: string, chain: Web3Chain, walletType: Web3WalletType, chainId?: number): Promise<Web3NonceResponse>;
129
+ web3Verify(message: string, signature: string, address: string, chain: Web3Chain, walletType: Web3WalletType): Promise<{
130
+ tokens: TokenPair;
131
+ user: AuthonUser;
132
+ }>;
133
+ web3GetWallets(): Promise<Web3Wallet[]>;
134
+ web3LinkWallet(params: {
135
+ address: string;
136
+ chain: Web3Chain;
137
+ walletType: Web3WalletType;
138
+ chainId?: number;
139
+ message: string;
140
+ signature: string;
141
+ }): Promise<Web3Wallet>;
142
+ web3UnlinkWallet(walletId: string): Promise<void>;
143
+ passwordlessSendCode(identifier: string, type?: 'email' | 'sms'): Promise<void>;
144
+ passwordlessVerifyCode(identifier: string, code: string): Promise<{
145
+ tokens: TokenPair;
146
+ user: AuthonUser;
147
+ }>;
148
+ passkeyStartRegister(name?: string): Promise<{
149
+ options: Record<string, unknown>;
150
+ }>;
151
+ passkeyCompleteRegister(credential: Record<string, unknown>): Promise<PasskeyCredential>;
152
+ passkeyStartAuth(email?: string): Promise<{
153
+ options: Record<string, unknown>;
154
+ }>;
155
+ passkeyCompleteAuth(credential: Record<string, unknown>): Promise<{
156
+ tokens: TokenPair;
157
+ user: AuthonUser;
158
+ }>;
159
+ passkeyList(): Promise<PasskeyCredential[]>;
160
+ passkeyDelete(credentialId: string): Promise<void>;
161
+ on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void;
162
+ private emit;
163
+ destroy(): void;
164
+ private clearSession;
165
+ private clearRefreshTimer;
166
+ /** Schedule auto-refresh 60 seconds before token expiry (like JS SDK) */
167
+ private scheduleRefresh;
168
+ private persistTokens;
169
+ private toTokenPair;
170
+ private requestAuth;
171
+ private request;
172
+ }
173
+
174
+ interface AuthonContextValue extends AuthState {
175
+ user: AuthonUser | null;
176
+ signIn: (params: SignInParams) => Promise<any>;
177
+ signUp: (params: SignUpParams) => Promise<any>;
178
+ signOut: () => Promise<void>;
179
+ getToken: () => string | null;
180
+ /** Available OAuth providers (fetched from API) */
181
+ providers: OAuthProviderType[];
182
+ /** Branding config (fetched from API) */
183
+ branding: BrandingConfig | null;
184
+ /** Start OAuth flow — returns { url, state }. Open url in browser, then call completeOAuth(state) */
185
+ startOAuth: (provider: OAuthProviderType, options?: string | StartOAuthOptions) => Promise<{
186
+ url: string;
187
+ state: string;
188
+ }>;
189
+ /** Poll for OAuth result after user completes browser flow */
190
+ completeOAuth: (state: string) => Promise<void>;
191
+ /** Subscribe to auth events */
192
+ on: <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => () => void;
193
+ /** Get the underlying client instance */
194
+ client: AuthonMobileClient;
195
+ }
196
+ declare const AuthonContext: React.Context<AuthonContextValue | null>;
197
+ interface AuthonProviderProps extends AuthonReactNativeConfig {
198
+ children: React.ReactNode;
199
+ storage?: {
200
+ getItem(key: string): Promise<string | null>;
201
+ setItem(key: string, value: string): Promise<void>;
202
+ removeItem(key: string): Promise<void>;
203
+ };
204
+ }
205
+ declare function AuthonProvider({ children, storage, ...config }: AuthonProviderProps): react_jsx_runtime.JSX.Element;
206
+
207
+ declare function useAuthon(): AuthonContextValue;
208
+
209
+ declare function useUser(): {
210
+ isLoaded: boolean;
211
+ isSignedIn: boolean;
212
+ user: AuthonUser | null;
213
+ };
214
+
215
+ interface Web3LinkWalletParams {
216
+ address: string;
217
+ chain: Web3Chain;
218
+ walletType: Web3WalletType;
219
+ chainId?: number;
220
+ message: string;
221
+ signature: string;
222
+ }
223
+ interface UseAuthonWeb3Return {
224
+ getNonce: (address: string, chain: Web3Chain, walletType: Web3WalletType, chainId?: number) => Promise<Web3NonceResponse | null>;
225
+ verify: (message: string, signature: string, address: string, chain: Web3Chain, walletType: Web3WalletType) => Promise<boolean>;
226
+ getWallets: () => Promise<Web3Wallet[] | null>;
227
+ linkWallet: (params: Web3LinkWalletParams) => Promise<Web3Wallet | null>;
228
+ unlinkWallet: (walletId: string) => Promise<boolean>;
229
+ isLoading: boolean;
230
+ error: Error | null;
231
+ }
232
+ declare function useAuthonWeb3(): UseAuthonWeb3Return;
233
+
234
+ interface UseAuthonPasswordlessReturn {
235
+ sendCode: (identifier: string, type?: 'email' | 'sms') => Promise<boolean>;
236
+ verifyCode: (identifier: string, code: string) => Promise<{
237
+ tokens: TokenPair;
238
+ user: AuthonUser;
239
+ } | null>;
240
+ isLoading: boolean;
241
+ error: Error | null;
242
+ }
243
+ declare function useAuthonPasswordless(): UseAuthonPasswordlessReturn;
244
+
245
+ interface UseAuthonPasskeysReturn {
246
+ startRegister: (name?: string) => Promise<{
247
+ options: Record<string, unknown>;
248
+ } | null>;
249
+ completeRegister: (credential: Record<string, unknown>) => Promise<PasskeyCredential | null>;
250
+ startAuth: (email?: string) => Promise<{
251
+ options: Record<string, unknown>;
252
+ } | null>;
253
+ completeAuth: (credential: Record<string, unknown>) => Promise<{
254
+ tokens: TokenPair;
255
+ user: AuthonUser;
256
+ } | null>;
257
+ listPasskeys: () => Promise<PasskeyCredential[] | null>;
258
+ deletePasskey: (credentialId: string) => Promise<boolean>;
259
+ isLoading: boolean;
260
+ error: Error | null;
261
+ }
262
+ declare function useAuthonPasskeys(): UseAuthonPasskeysReturn;
263
+
264
+ interface IconProps {
265
+ size?: number;
266
+ color?: string;
267
+ }
268
+ declare function ProviderIcon({ provider, size, color }: IconProps & {
269
+ provider: OAuthProviderType;
270
+ }): react_jsx_runtime.JSX.Element | null;
271
+
272
+ interface SocialButtonProps {
273
+ provider: OAuthProviderType;
274
+ onPress: (provider: OAuthProviderType) => void;
275
+ loading?: boolean;
276
+ disabled?: boolean;
277
+ /** Override button label. Default: "Continue with {Provider}" */
278
+ label?: string;
279
+ /** Compact mode — icon-only square button (default: false) */
280
+ compact?: boolean;
281
+ /** Override button style */
282
+ style?: ViewStyle;
283
+ /** Override label text style */
284
+ labelStyle?: TextStyle;
285
+ /** Icon size (default: 20, compact default: 24) */
286
+ iconSize?: number;
287
+ /** Border radius (default: 10) */
288
+ borderRadius?: number;
289
+ /** Button height (default: 48) */
290
+ height?: number;
291
+ /** Button size for compact mode (default: 48) */
292
+ size?: number;
293
+ }
294
+ declare function SocialButton({ provider, onPress, loading, disabled, label, compact, style, labelStyle, iconSize, borderRadius, height, size, }: SocialButtonProps): react_jsx_runtime.JSX.Element;
295
+
296
+ interface SocialButtonsProps {
297
+ /** Called after successful OAuth sign-in */
298
+ onSuccess?: () => void;
299
+ /** Called on OAuth error */
300
+ onError?: (error: Error) => void;
301
+ /** Container style */
302
+ style?: ViewStyle;
303
+ /** Gap between buttons (default: 10, compact default: 12) */
304
+ gap?: number;
305
+ /** Compact mode — icon-only square buttons in a row (default: false) */
306
+ compact?: boolean;
307
+ /** Custom labels per provider. e.g. { google: 'Google로 로그인' } */
308
+ labels?: Partial<Record<OAuthProviderType, string>>;
309
+ /** Props to pass through to each SocialButton */
310
+ buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled' | 'compact' | 'label'>>;
311
+ }
312
+ declare function SocialButtons({ onSuccess, onError, style, gap, compact, labels, buttonProps, }: SocialButtonsProps): react_jsx_runtime.JSX.Element | null;
313
+
314
+ export { type AuthState, AuthonContext, type AuthonContextValue, type AuthonEventType, type AuthonEvents, AuthonMobileClient, AuthonProvider, type AuthonReactNativeConfig, type AuthonUser, type OAuthCompletedResponse, type OAuthErrorResponse, type OAuthFlowMode, ProviderIcon, type SignInParams, type SignUpParams, SocialButton, type SocialButtonProps, SocialButtons, type SocialButtonsProps, type StartOAuthOptions, type TokenPair, type UseAuthonPasskeysReturn, type UseAuthonPasswordlessReturn, type UseAuthonWeb3Return, type Web3LinkWalletParams, useAuthon, useAuthonPasskeys, useAuthonPasswordless, useAuthonWeb3, useUser };
@@ -0,0 +1,314 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { AuthonUser as AuthonUser$1, OAuthProviderType, BrandingConfig, Web3Chain, Web3WalletType, Web3NonceResponse, Web3Wallet, PasskeyCredential } from '@authon/shared';
4
+ export { BrandingConfig, OAuthProviderType } from '@authon/shared';
5
+ import { ViewStyle, TextStyle } from 'react-native';
6
+
7
+ type AuthonUser = AuthonUser$1;
8
+ interface AuthonReactNativeConfig {
9
+ publishableKey: string;
10
+ apiUrl?: string;
11
+ }
12
+ interface AuthState {
13
+ isLoaded: boolean;
14
+ isSignedIn: boolean;
15
+ userId: string | null;
16
+ sessionId: string | null;
17
+ accessToken: string | null;
18
+ }
19
+ interface SignInParams {
20
+ strategy: 'email_password' | 'oauth';
21
+ email?: string;
22
+ password?: string;
23
+ provider?: string;
24
+ }
25
+ interface SignUpParams {
26
+ email: string;
27
+ password: string;
28
+ displayName?: string;
29
+ }
30
+ type OAuthFlowMode = 'popup' | 'redirect' | 'auto';
31
+ interface StartOAuthOptions {
32
+ redirectUri?: string;
33
+ returnTo?: string;
34
+ flow?: OAuthFlowMode;
35
+ }
36
+ type AuthonEventType = 'signedIn' | 'signedOut' | 'error' | 'tokenRefreshed';
37
+ interface AuthonEvents {
38
+ signedIn: (user: AuthonUser) => void;
39
+ signedOut: () => void;
40
+ error: (error: Error) => void;
41
+ tokenRefreshed: () => void;
42
+ }
43
+ interface TokenPair {
44
+ accessToken: string;
45
+ refreshToken: string;
46
+ expiresAt: number;
47
+ }
48
+ interface ApiAuthResponse {
49
+ accessToken: string;
50
+ refreshToken: string;
51
+ expiresIn: number;
52
+ user: AuthonUser;
53
+ }
54
+ interface OAuthCompletedResponse extends ApiAuthResponse {
55
+ status: 'completed';
56
+ }
57
+ interface OAuthErrorResponse {
58
+ status: 'error';
59
+ message: string;
60
+ }
61
+
62
+ type TokenStorage = {
63
+ getItem(key: string): Promise<string | null>;
64
+ setItem(key: string, value: string): Promise<void>;
65
+ removeItem(key: string): Promise<void>;
66
+ };
67
+ type OAuthPollResponse = OAuthCompletedResponse | OAuthErrorResponse;
68
+ declare class AuthonMobileClient {
69
+ private apiUrl;
70
+ private publishableKey;
71
+ private storageKey;
72
+ private tokens;
73
+ private user;
74
+ private storage;
75
+ private refreshInFlight;
76
+ private refreshTimer;
77
+ private listeners;
78
+ private _providers;
79
+ private _branding;
80
+ private _initialized;
81
+ constructor(config: AuthonReactNativeConfig);
82
+ setStorage(storage: TokenStorage): void;
83
+ initialize(): Promise<TokenPair | null>;
84
+ /** Fetch providers + branding from API (lazy, cached) */
85
+ ensureInitialized(): Promise<void>;
86
+ signIn(params: SignInParams): Promise<{
87
+ tokens: TokenPair;
88
+ user: AuthonUser;
89
+ } | {
90
+ needsVerification: true;
91
+ email: string;
92
+ } | {
93
+ mfaRequired: true;
94
+ mfaToken: string;
95
+ }>;
96
+ signUp(params: SignUpParams): Promise<{
97
+ tokens: TokenPair;
98
+ user: AuthonUser;
99
+ } | {
100
+ needsVerification: true;
101
+ email: string;
102
+ }>;
103
+ verifyEmail(email: string, code: string): Promise<{
104
+ tokens: TokenPair;
105
+ user: AuthonUser;
106
+ }>;
107
+ resendVerificationCode(email: string): Promise<void>;
108
+ signOut(): Promise<void>;
109
+ getUser(): Promise<AuthonUser | null>;
110
+ getCachedUser(): AuthonUser | null;
111
+ refreshToken(refreshToken?: string): Promise<TokenPair | null>;
112
+ private _doRefresh;
113
+ getAccessToken(): string | null;
114
+ isAuthenticated(): boolean;
115
+ getProviders(): Promise<OAuthProviderType[]>;
116
+ getBranding(): Promise<BrandingConfig | null>;
117
+ getOAuthUrl(provider: string, options?: string | StartOAuthOptions): Promise<{
118
+ url: string;
119
+ state: string;
120
+ }>;
121
+ pollOAuth(state: string): Promise<OAuthPollResponse | null>;
122
+ /** Poll for OAuth completion (3 minute timeout, matching JS SDK) */
123
+ completeOAuth(state: string): Promise<{
124
+ tokens: TokenPair;
125
+ user: AuthonUser;
126
+ }>;
127
+ getApiUrl(): string;
128
+ web3GetNonce(address: string, chain: Web3Chain, walletType: Web3WalletType, chainId?: number): Promise<Web3NonceResponse>;
129
+ web3Verify(message: string, signature: string, address: string, chain: Web3Chain, walletType: Web3WalletType): Promise<{
130
+ tokens: TokenPair;
131
+ user: AuthonUser;
132
+ }>;
133
+ web3GetWallets(): Promise<Web3Wallet[]>;
134
+ web3LinkWallet(params: {
135
+ address: string;
136
+ chain: Web3Chain;
137
+ walletType: Web3WalletType;
138
+ chainId?: number;
139
+ message: string;
140
+ signature: string;
141
+ }): Promise<Web3Wallet>;
142
+ web3UnlinkWallet(walletId: string): Promise<void>;
143
+ passwordlessSendCode(identifier: string, type?: 'email' | 'sms'): Promise<void>;
144
+ passwordlessVerifyCode(identifier: string, code: string): Promise<{
145
+ tokens: TokenPair;
146
+ user: AuthonUser;
147
+ }>;
148
+ passkeyStartRegister(name?: string): Promise<{
149
+ options: Record<string, unknown>;
150
+ }>;
151
+ passkeyCompleteRegister(credential: Record<string, unknown>): Promise<PasskeyCredential>;
152
+ passkeyStartAuth(email?: string): Promise<{
153
+ options: Record<string, unknown>;
154
+ }>;
155
+ passkeyCompleteAuth(credential: Record<string, unknown>): Promise<{
156
+ tokens: TokenPair;
157
+ user: AuthonUser;
158
+ }>;
159
+ passkeyList(): Promise<PasskeyCredential[]>;
160
+ passkeyDelete(credentialId: string): Promise<void>;
161
+ on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void;
162
+ private emit;
163
+ destroy(): void;
164
+ private clearSession;
165
+ private clearRefreshTimer;
166
+ /** Schedule auto-refresh 60 seconds before token expiry (like JS SDK) */
167
+ private scheduleRefresh;
168
+ private persistTokens;
169
+ private toTokenPair;
170
+ private requestAuth;
171
+ private request;
172
+ }
173
+
174
+ interface AuthonContextValue extends AuthState {
175
+ user: AuthonUser | null;
176
+ signIn: (params: SignInParams) => Promise<any>;
177
+ signUp: (params: SignUpParams) => Promise<any>;
178
+ signOut: () => Promise<void>;
179
+ getToken: () => string | null;
180
+ /** Available OAuth providers (fetched from API) */
181
+ providers: OAuthProviderType[];
182
+ /** Branding config (fetched from API) */
183
+ branding: BrandingConfig | null;
184
+ /** Start OAuth flow — returns { url, state }. Open url in browser, then call completeOAuth(state) */
185
+ startOAuth: (provider: OAuthProviderType, options?: string | StartOAuthOptions) => Promise<{
186
+ url: string;
187
+ state: string;
188
+ }>;
189
+ /** Poll for OAuth result after user completes browser flow */
190
+ completeOAuth: (state: string) => Promise<void>;
191
+ /** Subscribe to auth events */
192
+ on: <K extends AuthonEventType>(event: K, listener: AuthonEvents[K]) => () => void;
193
+ /** Get the underlying client instance */
194
+ client: AuthonMobileClient;
195
+ }
196
+ declare const AuthonContext: React.Context<AuthonContextValue | null>;
197
+ interface AuthonProviderProps extends AuthonReactNativeConfig {
198
+ children: React.ReactNode;
199
+ storage?: {
200
+ getItem(key: string): Promise<string | null>;
201
+ setItem(key: string, value: string): Promise<void>;
202
+ removeItem(key: string): Promise<void>;
203
+ };
204
+ }
205
+ declare function AuthonProvider({ children, storage, ...config }: AuthonProviderProps): react_jsx_runtime.JSX.Element;
206
+
207
+ declare function useAuthon(): AuthonContextValue;
208
+
209
+ declare function useUser(): {
210
+ isLoaded: boolean;
211
+ isSignedIn: boolean;
212
+ user: AuthonUser | null;
213
+ };
214
+
215
+ interface Web3LinkWalletParams {
216
+ address: string;
217
+ chain: Web3Chain;
218
+ walletType: Web3WalletType;
219
+ chainId?: number;
220
+ message: string;
221
+ signature: string;
222
+ }
223
+ interface UseAuthonWeb3Return {
224
+ getNonce: (address: string, chain: Web3Chain, walletType: Web3WalletType, chainId?: number) => Promise<Web3NonceResponse | null>;
225
+ verify: (message: string, signature: string, address: string, chain: Web3Chain, walletType: Web3WalletType) => Promise<boolean>;
226
+ getWallets: () => Promise<Web3Wallet[] | null>;
227
+ linkWallet: (params: Web3LinkWalletParams) => Promise<Web3Wallet | null>;
228
+ unlinkWallet: (walletId: string) => Promise<boolean>;
229
+ isLoading: boolean;
230
+ error: Error | null;
231
+ }
232
+ declare function useAuthonWeb3(): UseAuthonWeb3Return;
233
+
234
+ interface UseAuthonPasswordlessReturn {
235
+ sendCode: (identifier: string, type?: 'email' | 'sms') => Promise<boolean>;
236
+ verifyCode: (identifier: string, code: string) => Promise<{
237
+ tokens: TokenPair;
238
+ user: AuthonUser;
239
+ } | null>;
240
+ isLoading: boolean;
241
+ error: Error | null;
242
+ }
243
+ declare function useAuthonPasswordless(): UseAuthonPasswordlessReturn;
244
+
245
+ interface UseAuthonPasskeysReturn {
246
+ startRegister: (name?: string) => Promise<{
247
+ options: Record<string, unknown>;
248
+ } | null>;
249
+ completeRegister: (credential: Record<string, unknown>) => Promise<PasskeyCredential | null>;
250
+ startAuth: (email?: string) => Promise<{
251
+ options: Record<string, unknown>;
252
+ } | null>;
253
+ completeAuth: (credential: Record<string, unknown>) => Promise<{
254
+ tokens: TokenPair;
255
+ user: AuthonUser;
256
+ } | null>;
257
+ listPasskeys: () => Promise<PasskeyCredential[] | null>;
258
+ deletePasskey: (credentialId: string) => Promise<boolean>;
259
+ isLoading: boolean;
260
+ error: Error | null;
261
+ }
262
+ declare function useAuthonPasskeys(): UseAuthonPasskeysReturn;
263
+
264
+ interface IconProps {
265
+ size?: number;
266
+ color?: string;
267
+ }
268
+ declare function ProviderIcon({ provider, size, color }: IconProps & {
269
+ provider: OAuthProviderType;
270
+ }): react_jsx_runtime.JSX.Element | null;
271
+
272
+ interface SocialButtonProps {
273
+ provider: OAuthProviderType;
274
+ onPress: (provider: OAuthProviderType) => void;
275
+ loading?: boolean;
276
+ disabled?: boolean;
277
+ /** Override button label. Default: "Continue with {Provider}" */
278
+ label?: string;
279
+ /** Compact mode — icon-only square button (default: false) */
280
+ compact?: boolean;
281
+ /** Override button style */
282
+ style?: ViewStyle;
283
+ /** Override label text style */
284
+ labelStyle?: TextStyle;
285
+ /** Icon size (default: 20, compact default: 24) */
286
+ iconSize?: number;
287
+ /** Border radius (default: 10) */
288
+ borderRadius?: number;
289
+ /** Button height (default: 48) */
290
+ height?: number;
291
+ /** Button size for compact mode (default: 48) */
292
+ size?: number;
293
+ }
294
+ declare function SocialButton({ provider, onPress, loading, disabled, label, compact, style, labelStyle, iconSize, borderRadius, height, size, }: SocialButtonProps): react_jsx_runtime.JSX.Element;
295
+
296
+ interface SocialButtonsProps {
297
+ /** Called after successful OAuth sign-in */
298
+ onSuccess?: () => void;
299
+ /** Called on OAuth error */
300
+ onError?: (error: Error) => void;
301
+ /** Container style */
302
+ style?: ViewStyle;
303
+ /** Gap between buttons (default: 10, compact default: 12) */
304
+ gap?: number;
305
+ /** Compact mode — icon-only square buttons in a row (default: false) */
306
+ compact?: boolean;
307
+ /** Custom labels per provider. e.g. { google: 'Google로 로그인' } */
308
+ labels?: Partial<Record<OAuthProviderType, string>>;
309
+ /** Props to pass through to each SocialButton */
310
+ buttonProps?: Partial<Omit<SocialButtonProps, 'provider' | 'onPress' | 'loading' | 'disabled' | 'compact' | 'label'>>;
311
+ }
312
+ declare function SocialButtons({ onSuccess, onError, style, gap, compact, labels, buttonProps, }: SocialButtonsProps): react_jsx_runtime.JSX.Element | null;
313
+
314
+ export { type AuthState, AuthonContext, type AuthonContextValue, type AuthonEventType, type AuthonEvents, AuthonMobileClient, AuthonProvider, type AuthonReactNativeConfig, type AuthonUser, type OAuthCompletedResponse, type OAuthErrorResponse, type OAuthFlowMode, ProviderIcon, type SignInParams, type SignUpParams, SocialButton, type SocialButtonProps, SocialButtons, type SocialButtonsProps, type StartOAuthOptions, type TokenPair, type UseAuthonPasskeysReturn, type UseAuthonPasswordlessReturn, type UseAuthonWeb3Return, type Web3LinkWalletParams, useAuthon, useAuthonPasskeys, useAuthonPasswordless, useAuthonWeb3, useUser };
package/dist/index.js CHANGED
@@ -13,6 +13,7 @@ var AuthonMobileClient = class {
13
13
  tokens = null;
14
14
  user = null;
15
15
  storage = null;
16
+ refreshInFlight = null;
16
17
  refreshTimer = null;
17
18
  listeners = /* @__PURE__ */ new Map();
18
19
  // Cached provider/branding data
@@ -129,8 +130,15 @@ var AuthonMobileClient = class {
129
130
  }
130
131
  // ── Token management ──
131
132
  async refreshToken(refreshToken) {
133
+ if (this.refreshInFlight) return this.refreshInFlight;
132
134
  const token = refreshToken || this.tokens?.refreshToken;
133
135
  if (!token) return null;
136
+ this.refreshInFlight = this._doRefresh(token);
137
+ const result = await this.refreshInFlight;
138
+ this.refreshInFlight = null;
139
+ return result;
140
+ }
141
+ async _doRefresh(token) {
134
142
  try {
135
143
  const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {
136
144
  method: "POST",
@@ -472,26 +480,30 @@ function AuthonProvider({ children, storage, ...config }) {
472
480
  };
473
481
  }, []);
474
482
  const signIn = useCallback(async (params) => {
475
- const { tokens, user: u } = await client.signIn(params);
476
- setUser(u);
483
+ const result = await client.signIn(params);
484
+ if ("needsVerification" in result || "mfaRequired" in result) return result;
485
+ setUser(result.user);
477
486
  setAuthState({
478
487
  isLoaded: true,
479
488
  isSignedIn: true,
480
- userId: u?.id || null,
489
+ userId: result.user?.id || null,
481
490
  sessionId: null,
482
- accessToken: tokens.accessToken
491
+ accessToken: result.tokens.accessToken
483
492
  });
493
+ return result;
484
494
  }, [client]);
485
495
  const signUp = useCallback(async (params) => {
486
- const { tokens, user: u } = await client.signUp(params);
487
- setUser(u);
496
+ const result = await client.signUp(params);
497
+ if ("needsVerification" in result) return result;
498
+ setUser(result.user);
488
499
  setAuthState({
489
500
  isLoaded: true,
490
501
  isSignedIn: true,
491
- userId: u?.id || null,
502
+ userId: result.user?.id || null,
492
503
  sessionId: null,
493
- accessToken: tokens.accessToken
504
+ accessToken: result.tokens.accessToken
494
505
  });
506
+ return result;
495
507
  }, [client]);
496
508
  const signOut = useCallback(async () => {
497
509
  await client.signOut();