@atzentis/auth-react 0.0.11 → 0.0.13

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.d.ts CHANGED
@@ -1,34 +1,175 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import * as _atzentis_auth_sdk from '@atzentis/auth-sdk';
4
- import { AuthClient, User, AuthConfig, LoginCredentials, SignupData } from '@atzentis/auth-sdk';
4
+ import { AuthClient, User, Session, AuthError, LoginAlert, ITokenStorage, ApiKey, CreateApiKeyRequest, UpdateApiKeyRequest, LoginCredentials, UsernameLoginCredentials, SignupData, GetOAuthUrlRequest, VerifyOAuthCodeRequest, SendMagicLinkRequest, VerifyMagicLinkRequest, Device, LoginEvent, ListLoginEventsRequest, Organization, CreateOrganizationRequest, UpdateOrganizationRequest, ListMembersRequest, UpdateMemberRequest, InviteMemberRequest, ListInvitationsRequest, AcceptInvitationRequest, DeclineInvitationRequest, DeviceSession, RevokeAllSessionsOptions, UserUpdate, ConnectOAuthRequest } from '@atzentis/auth-sdk';
5
5
 
6
+ interface AuthProviderProps {
7
+ apiKey?: string;
8
+ baseUrl: string;
9
+ autoRefreshToken?: boolean;
10
+ refreshThreshold?: number;
11
+ timeout?: number;
12
+ collectDeviceSignals?: boolean;
13
+ onSessionExpired?: () => void;
14
+ onTokenRefreshed?: (token: string) => void;
15
+ onNewDeviceAlert?: (alert: LoginAlert) => void;
16
+ children: React.ReactNode;
17
+ initialToken?: string;
18
+ initialUser?: User;
19
+ storage?: ITokenStorage;
20
+ }
6
21
  interface AuthContextValue {
7
22
  client: AuthClient;
8
23
  user: User | null;
24
+ session: Session | null;
9
25
  isAuthenticated: boolean;
10
26
  isLoading: boolean;
27
+ error: AuthError | null;
11
28
  setUser: (user: User | null) => void;
29
+ setSession: (session: Session | null) => void;
30
+ setError: (error: AuthError | null) => void;
31
+ clearError: () => void;
12
32
  }
33
+
13
34
  declare const AuthContext: react.Context<AuthContextValue | null>;
14
- interface AuthProviderProps {
15
- config: AuthConfig;
16
- children: React.ReactNode;
17
- }
18
- declare function AuthProvider({ config, children }: AuthProviderProps): react_jsx_runtime.JSX.Element;
35
+ declare function AuthProvider({ apiKey, baseUrl, autoRefreshToken, refreshThreshold, timeout, collectDeviceSignals, onSessionExpired, onTokenRefreshed, onNewDeviceAlert, children, initialUser, storage, }: AuthProviderProps): react_jsx_runtime.JSX.Element;
36
+
37
+ declare function useApiKeys(): {
38
+ apiKeys: ApiKey[];
39
+ isLoading: boolean;
40
+ error: AuthError | null;
41
+ refresh: () => Promise<void>;
42
+ create: (data: CreateApiKeyRequest) => Promise<_atzentis_auth_sdk.CreateApiKeyResponse>;
43
+ get: (keyId: string) => Promise<ApiKey>;
44
+ update: (keyId: string, data: UpdateApiKeyRequest) => Promise<ApiKey>;
45
+ rotate: (keyId: string) => Promise<_atzentis_auth_sdk.RotateApiKeyResponse>;
46
+ revoke: (keyId: string) => Promise<void>;
47
+ validate: (keyString: string) => Promise<_atzentis_auth_sdk.ValidateApiKeyResponse>;
48
+ getUsage: (keyId: string) => Promise<_atzentis_auth_sdk.ApiKeyUsage>;
49
+ };
19
50
 
20
51
  declare function useAuth(): {
21
52
  user: _atzentis_auth_sdk.User | null;
22
53
  isAuthenticated: boolean;
23
54
  isLoading: boolean;
55
+ error: _atzentis_auth_sdk.AuthError | null;
24
56
  login: (credentials: LoginCredentials) => Promise<_atzentis_auth_sdk.LoginResponse>;
57
+ loginWithUsername: (credentials: UsernameLoginCredentials) => Promise<_atzentis_auth_sdk.LoginResponse>;
25
58
  signup: (data: SignupData) => Promise<_atzentis_auth_sdk.SignupResponse>;
59
+ logout: () => Promise<void>;
60
+ logoutAllDevices: () => Promise<void>;
61
+ getOAuthUrl: (config: GetOAuthUrlRequest) => string;
62
+ verifyOAuthCode: (request: VerifyOAuthCodeRequest) => Promise<_atzentis_auth_sdk.LoginResponse>;
63
+ sendMagicLink: (request: SendMagicLinkRequest) => Promise<void>;
64
+ verifyMagicLink: (request: VerifyMagicLinkRequest) => Promise<_atzentis_auth_sdk.LoginResponse>;
65
+ isUsernameAvailable: (username: string) => Promise<boolean>;
66
+ getAccessToken: () => Promise<string | null>;
67
+ refreshToken: () => Promise<_atzentis_auth_sdk.RefreshTokenResponse>;
68
+ getAuthHeader: () => Promise<{
69
+ Authorization: string;
70
+ } | {
71
+ Authorization?: undefined;
72
+ }>;
73
+ clearError: () => void;
74
+ };
75
+
76
+ declare function useAuthContext(): AuthContextValue;
77
+
78
+ declare function useDevices(): {
79
+ devices: Device[];
80
+ currentDevice: Device | null;
81
+ isLoading: boolean;
82
+ error: AuthError | null;
83
+ refresh: () => Promise<void>;
84
+ trustDevice: (id: string) => Promise<void>;
85
+ untrustDevice: (id: string) => Promise<void>;
86
+ removeDevice: (id: string) => Promise<void>;
87
+ removeAllOtherDevices: () => Promise<void>;
88
+ };
89
+
90
+ interface UseLoginActivityOptions {
91
+ limit?: number;
92
+ }
93
+ declare function useLoginActivity(options?: UseLoginActivityOptions): {
94
+ events: LoginEvent[];
95
+ total: number;
96
+ hasMore: boolean;
97
+ isLoading: boolean;
98
+ error: AuthError | null;
99
+ refresh: () => Promise<void>;
100
+ loadMore: () => Promise<void>;
101
+ filter: (newOptions: ListLoginEventsRequest) => void;
102
+ markRecognized: (eventId: string) => Promise<void>;
103
+ reportSuspicious: (eventId: string) => Promise<_atzentis_auth_sdk.ReportSuspiciousResponse>;
104
+ };
105
+
106
+ declare function useOrganizations(): {
107
+ organizations: Organization[];
108
+ isLoading: boolean;
109
+ error: AuthError | null;
110
+ refresh: () => Promise<void>;
111
+ create: (data: CreateOrganizationRequest) => Promise<Organization>;
112
+ update: (orgId: string, data: UpdateOrganizationRequest) => Promise<Organization>;
113
+ delete: (orgId: string) => Promise<void>;
114
+ listMembers: (orgId: string, options?: ListMembersRequest) => Promise<_atzentis_auth_sdk.ListMembersResponse>;
115
+ updateMember: (orgId: string, userId: string, data: UpdateMemberRequest) => Promise<_atzentis_auth_sdk.Member>;
116
+ removeMember: (orgId: string, userId: string) => Promise<void>;
117
+ inviteMember: (orgId: string, data: InviteMemberRequest) => Promise<_atzentis_auth_sdk.Invitation>;
118
+ listInvitations: (orgId: string, options?: ListInvitationsRequest) => Promise<_atzentis_auth_sdk.ListInvitationsResponse>;
119
+ resendInvitation: (orgId: string, invitationId: string) => Promise<void>;
120
+ cancelInvitation: (orgId: string, invitationId: string) => Promise<void>;
121
+ acceptInvitation: (data: AcceptInvitationRequest) => Promise<void>;
122
+ declineInvitation: (data: DeclineInvitationRequest) => Promise<void>;
123
+ leave: (orgId: string) => Promise<void>;
124
+ };
125
+
126
+ declare function usePhone(): {
127
+ isSending: boolean;
128
+ isVerifying: boolean;
129
+ codeSent: boolean;
130
+ expiresIn: number | null;
131
+ error: AuthError | null;
132
+ sendOTP: (phoneNumber: string) => Promise<_atzentis_auth_sdk.SendOTPResponse>;
133
+ verify: (phoneNumber: string, code: string) => Promise<_atzentis_auth_sdk.VerifyOTPResponse>;
134
+ signIn: (phoneNumber: string, password: string) => Promise<_atzentis_auth_sdk.LoginResponse>;
26
135
  };
27
136
 
28
137
  declare function useSession(): {
29
138
  user: _atzentis_auth_sdk.User | null;
139
+ session: _atzentis_auth_sdk.Session | null;
30
140
  isAuthenticated: boolean;
31
141
  isLoading: boolean;
32
142
  };
33
143
 
34
- export { AuthContext, type AuthContextValue, AuthProvider, useAuth, useSession };
144
+ declare function useSessions(): {
145
+ session: Session | null;
146
+ sessions: Session[];
147
+ deviceSessions: DeviceSession[];
148
+ isLoading: boolean;
149
+ error: AuthError | null;
150
+ refresh: () => Promise<void>;
151
+ revokeSession: (id: string) => Promise<void>;
152
+ revokeAllSessions: (options?: RevokeAllSessionsOptions) => Promise<void>;
153
+ switchAccount: (sessionToken: string) => Promise<void>;
154
+ revokeDeviceSession: (sessionToken: string) => Promise<void>;
155
+ };
156
+
157
+ declare function useUser(): {
158
+ user: _atzentis_auth_sdk.User | null;
159
+ isLoading: boolean;
160
+ error: AuthError | null;
161
+ updateProfile: (data: UserUpdate) => Promise<_atzentis_auth_sdk.User>;
162
+ changePassword: (currentPassword: string, newPassword: string) => Promise<void>;
163
+ setupTwoFactor: () => Promise<_atzentis_auth_sdk.TwoFactorSetup>;
164
+ verifyTwoFactorSetup: (code: string) => Promise<void>;
165
+ disableTwoFactor: (password: string) => Promise<void>;
166
+ deleteAccount: (password: string, reason?: string) => Promise<void>;
167
+ listConnectedProviders: () => Promise<_atzentis_auth_sdk.ConnectedProvider[]>;
168
+ connectOAuthProvider: (data: ConnectOAuthRequest) => Promise<_atzentis_auth_sdk.ConnectedProvider>;
169
+ disconnectOAuthProvider: (provider: string) => Promise<void>;
170
+ addPhoneNumber: (phoneNumber: string) => Promise<void>;
171
+ verifyPhoneNumber: (code: string) => Promise<void>;
172
+ removePhoneNumber: (password: string) => Promise<void>;
173
+ };
174
+
175
+ export { AuthContext, type AuthContextValue, AuthProvider, type AuthProviderProps, useApiKeys, useAuth, useAuthContext, useDevices, useLoginActivity, useOrganizations, usePhone, useSession, useSessions, useUser };
package/dist/index.js CHANGED
@@ -1,30 +1,156 @@
1
1
  import { AuthClient } from '@atzentis/auth-sdk';
2
- import { createContext, useState, useMemo, useContext, useCallback } from 'react';
2
+ import { createContext, useState, useCallback, useMemo, useContext } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  var AuthContext = createContext(null);
6
- function AuthProvider({ config, children }) {
7
- const [client] = useState(() => new AuthClient(config));
8
- const [user, setUser] = useState(null);
6
+ function AuthProvider({
7
+ apiKey,
8
+ baseUrl,
9
+ autoRefreshToken,
10
+ refreshThreshold,
11
+ timeout,
12
+ collectDeviceSignals,
13
+ onSessionExpired,
14
+ onTokenRefreshed,
15
+ onNewDeviceAlert,
16
+ children,
17
+ initialUser,
18
+ storage
19
+ }) {
20
+ const [client] = useState(() => {
21
+ const handleSessionExpired = () => {
22
+ setUser(null);
23
+ setSession(null);
24
+ onSessionExpired?.();
25
+ };
26
+ return new AuthClient({
27
+ apiKey,
28
+ baseUrl,
29
+ timeout,
30
+ autoRefreshToken,
31
+ refreshThreshold,
32
+ collectDeviceSignals,
33
+ onSessionExpired: handleSessionExpired,
34
+ onTokenRefreshed,
35
+ onNewDeviceAlert,
36
+ storage
37
+ });
38
+ });
39
+ const [user, setUser] = useState(initialUser ?? null);
40
+ const [session, setSession] = useState(null);
9
41
  const [isLoading] = useState(false);
42
+ const [error, setError] = useState(null);
43
+ const clearError = useCallback(() => {
44
+ setError(null);
45
+ }, []);
10
46
  const value = useMemo(
11
47
  () => ({
12
48
  client,
13
49
  user,
50
+ session,
14
51
  isAuthenticated: user !== null,
15
52
  isLoading,
16
- setUser
53
+ error,
54
+ setUser,
55
+ setSession,
56
+ setError,
57
+ clearError
17
58
  }),
18
- [client, user, isLoading]
59
+ [client, user, session, isLoading, error, clearError]
19
60
  );
20
61
  return /* @__PURE__ */ jsx(AuthContext.Provider, { value, children });
21
62
  }
22
- function useAuth() {
63
+ function useAuthContext() {
23
64
  const context = useContext(AuthContext);
24
65
  if (!context) {
25
- throw new Error("useAuth must be used within AuthProvider");
66
+ throw new Error("useAuthContext must be used within AuthProvider");
26
67
  }
27
- const { client, user, isAuthenticated, isLoading, setUser } = context;
68
+ return context;
69
+ }
70
+
71
+ // src/hooks/use-api-keys.ts
72
+ function useApiKeys() {
73
+ const { client } = useAuthContext();
74
+ const [apiKeys, setApiKeys] = useState([]);
75
+ const [isLoading, setIsLoading] = useState(false);
76
+ const [error, setError] = useState(null);
77
+ const refresh = useCallback(async () => {
78
+ setIsLoading(true);
79
+ setError(null);
80
+ try {
81
+ const response = await client.apiKeys.list();
82
+ setApiKeys(response.data);
83
+ } catch (err) {
84
+ setError(err);
85
+ } finally {
86
+ setIsLoading(false);
87
+ }
88
+ }, [client]);
89
+ const create = useCallback(
90
+ async (data) => {
91
+ const response = await client.apiKeys.create(data);
92
+ await refresh();
93
+ return response;
94
+ },
95
+ [client, refresh]
96
+ );
97
+ const get = useCallback(
98
+ async (keyId) => {
99
+ return client.apiKeys.get(keyId);
100
+ },
101
+ [client]
102
+ );
103
+ const update = useCallback(
104
+ async (keyId, data) => {
105
+ const updated = await client.apiKeys.update(keyId, data);
106
+ await refresh();
107
+ return updated;
108
+ },
109
+ [client, refresh]
110
+ );
111
+ const rotate = useCallback(
112
+ async (keyId) => {
113
+ const response = await client.apiKeys.rotate(keyId);
114
+ await refresh();
115
+ return response;
116
+ },
117
+ [client, refresh]
118
+ );
119
+ const revoke = useCallback(
120
+ async (keyId) => {
121
+ await client.apiKeys.revoke(keyId);
122
+ await refresh();
123
+ },
124
+ [client, refresh]
125
+ );
126
+ const validate = useCallback(
127
+ async (keyString) => {
128
+ return client.apiKeys.validate(keyString);
129
+ },
130
+ [client]
131
+ );
132
+ const getUsage = useCallback(
133
+ async (keyId) => {
134
+ return client.apiKeys.getUsage(keyId);
135
+ },
136
+ [client]
137
+ );
138
+ return {
139
+ apiKeys,
140
+ isLoading,
141
+ error,
142
+ refresh,
143
+ create,
144
+ get,
145
+ update,
146
+ rotate,
147
+ revoke,
148
+ validate,
149
+ getUsage
150
+ };
151
+ }
152
+ function useAuth() {
153
+ const { client, user, isAuthenticated, isLoading, error, setUser, clearError } = useAuthContext();
28
154
  const login = useCallback(
29
155
  async (credentials) => {
30
156
  const response = await client.login(credentials);
@@ -33,6 +159,14 @@ function useAuth() {
33
159
  },
34
160
  [client, setUser]
35
161
  );
162
+ const loginWithUsername = useCallback(
163
+ async (credentials) => {
164
+ const response = await client.loginWithUsername(credentials);
165
+ setUser(response.user);
166
+ return response;
167
+ },
168
+ [client, setUser]
169
+ );
36
170
  const signup = useCallback(
37
171
  async (data) => {
38
172
  const response = await client.signup(data);
@@ -41,26 +175,579 @@ function useAuth() {
41
175
  },
42
176
  [client, setUser]
43
177
  );
178
+ const logout = useCallback(async () => {
179
+ await client.logout();
180
+ setUser(null);
181
+ }, [client, setUser]);
182
+ const logoutAllDevices = useCallback(async () => {
183
+ await client.logoutAllDevices();
184
+ setUser(null);
185
+ }, [client, setUser]);
186
+ const getOAuthUrl = useCallback(
187
+ (config) => {
188
+ return client.getOAuthUrl(config);
189
+ },
190
+ [client]
191
+ );
192
+ const verifyOAuthCode = useCallback(
193
+ async (request) => {
194
+ const response = await client.verifyOAuthCode(request);
195
+ setUser(response.user);
196
+ return response;
197
+ },
198
+ [client, setUser]
199
+ );
200
+ const sendMagicLink = useCallback(
201
+ async (request) => {
202
+ await client.sendMagicLink(request);
203
+ },
204
+ [client]
205
+ );
206
+ const verifyMagicLink = useCallback(
207
+ async (request) => {
208
+ const response = await client.verifyMagicLink(request);
209
+ setUser(response.user);
210
+ return response;
211
+ },
212
+ [client, setUser]
213
+ );
214
+ const isUsernameAvailable = useCallback(
215
+ async (username) => {
216
+ return client.isUsernameAvailable(username);
217
+ },
218
+ [client]
219
+ );
220
+ const getAccessToken = useCallback(async () => {
221
+ return client.getAccessToken();
222
+ }, [client]);
223
+ const refreshToken = useCallback(async () => {
224
+ return client.refreshToken();
225
+ }, [client]);
226
+ const getAuthHeader = useCallback(async () => {
227
+ const token = await client.getAccessToken();
228
+ if (token) {
229
+ return { Authorization: `Bearer ${token}` };
230
+ }
231
+ return {};
232
+ }, [client]);
44
233
  return {
45
234
  user,
46
235
  isAuthenticated,
47
236
  isLoading,
237
+ error,
48
238
  login,
49
- signup
239
+ loginWithUsername,
240
+ signup,
241
+ logout,
242
+ logoutAllDevices,
243
+ getOAuthUrl,
244
+ verifyOAuthCode,
245
+ sendMagicLink,
246
+ verifyMagicLink,
247
+ isUsernameAvailable,
248
+ getAccessToken,
249
+ refreshToken,
250
+ getAuthHeader,
251
+ clearError
252
+ };
253
+ }
254
+ function useDevices() {
255
+ const { client } = useAuthContext();
256
+ const [devices, setDevices] = useState([]);
257
+ const [currentDevice, setCurrentDevice] = useState(null);
258
+ const [isLoading, setIsLoading] = useState(false);
259
+ const [error, setError] = useState(null);
260
+ const refresh = useCallback(async () => {
261
+ setIsLoading(true);
262
+ setError(null);
263
+ try {
264
+ const response = await client.devices.list();
265
+ setDevices(response.data);
266
+ const current = response.data.find((d) => d.isCurrent) ?? null;
267
+ setCurrentDevice(current);
268
+ } catch (err) {
269
+ setError(err);
270
+ } finally {
271
+ setIsLoading(false);
272
+ }
273
+ }, [client]);
274
+ const trustDevice = useCallback(
275
+ async (id) => {
276
+ await client.devices.trust(id);
277
+ await refresh();
278
+ },
279
+ [client, refresh]
280
+ );
281
+ const untrustDevice = useCallback(
282
+ async (id) => {
283
+ await client.devices.untrust(id);
284
+ await refresh();
285
+ },
286
+ [client, refresh]
287
+ );
288
+ const removeDevice = useCallback(
289
+ async (id) => {
290
+ await client.devices.remove(id);
291
+ await refresh();
292
+ },
293
+ [client, refresh]
294
+ );
295
+ const removeAllOtherDevices = useCallback(async () => {
296
+ await client.devices.removeAllOthers();
297
+ await refresh();
298
+ }, [client, refresh]);
299
+ return {
300
+ devices,
301
+ currentDevice,
302
+ isLoading,
303
+ error,
304
+ refresh,
305
+ trustDevice,
306
+ untrustDevice,
307
+ removeDevice,
308
+ removeAllOtherDevices
309
+ };
310
+ }
311
+ function useLoginActivity(options = {}) {
312
+ const { client } = useAuthContext();
313
+ const [events, setEvents] = useState([]);
314
+ const [total, setTotal] = useState(0);
315
+ const [isLoading, setIsLoading] = useState(false);
316
+ const [error, setError] = useState(null);
317
+ const [filterOptions, setFilterOptions] = useState({
318
+ limit: options.limit ?? 50,
319
+ offset: 0
320
+ });
321
+ const hasMore = events.length < total;
322
+ const refresh = useCallback(async () => {
323
+ setIsLoading(true);
324
+ setError(null);
325
+ try {
326
+ const response = await client.loginActivity.list(filterOptions);
327
+ setEvents(response.data);
328
+ setTotal(response.total);
329
+ } catch (err) {
330
+ setError(err);
331
+ } finally {
332
+ setIsLoading(false);
333
+ }
334
+ }, [client, filterOptions]);
335
+ const loadMore = useCallback(async () => {
336
+ setIsLoading(true);
337
+ setError(null);
338
+ try {
339
+ const response = await client.loginActivity.list({
340
+ ...filterOptions,
341
+ offset: events.length
342
+ });
343
+ setEvents((prev) => [...prev, ...response.data]);
344
+ setTotal(response.total);
345
+ } catch (err) {
346
+ setError(err);
347
+ } finally {
348
+ setIsLoading(false);
349
+ }
350
+ }, [client, filterOptions, events.length]);
351
+ const filter = useCallback(
352
+ (newOptions) => {
353
+ const merged = { ...filterOptions, ...newOptions, offset: 0 };
354
+ setFilterOptions(merged);
355
+ setEvents([]);
356
+ setTotal(0);
357
+ },
358
+ [filterOptions]
359
+ );
360
+ const markRecognized = useCallback(
361
+ async (eventId) => {
362
+ await client.loginActivity.markRecognized(eventId);
363
+ },
364
+ [client]
365
+ );
366
+ const reportSuspicious = useCallback(
367
+ async (eventId) => {
368
+ return client.loginActivity.reportSuspicious(eventId);
369
+ },
370
+ [client]
371
+ );
372
+ return {
373
+ events,
374
+ total,
375
+ hasMore,
376
+ isLoading,
377
+ error,
378
+ refresh,
379
+ loadMore,
380
+ filter,
381
+ markRecognized,
382
+ reportSuspicious
383
+ };
384
+ }
385
+ function useOrganizations() {
386
+ const { client } = useAuthContext();
387
+ const [organizations, setOrganizations] = useState([]);
388
+ const [isLoading, setIsLoading] = useState(false);
389
+ const [error, setError] = useState(null);
390
+ const refresh = useCallback(async () => {
391
+ setIsLoading(true);
392
+ setError(null);
393
+ try {
394
+ const response = await client.organizations.list();
395
+ setOrganizations(response.data);
396
+ } catch (err) {
397
+ setError(err);
398
+ } finally {
399
+ setIsLoading(false);
400
+ }
401
+ }, [client]);
402
+ const create = useCallback(
403
+ async (data) => {
404
+ const org = await client.organizations.create(data);
405
+ await refresh();
406
+ return org;
407
+ },
408
+ [client, refresh]
409
+ );
410
+ const update = useCallback(
411
+ async (orgId, data) => {
412
+ const org = await client.organizations.update(orgId, data);
413
+ await refresh();
414
+ return org;
415
+ },
416
+ [client, refresh]
417
+ );
418
+ const deleteOrg = useCallback(
419
+ async (orgId) => {
420
+ await client.organizations.delete(orgId);
421
+ await refresh();
422
+ },
423
+ [client, refresh]
424
+ );
425
+ const listMembers = useCallback(
426
+ async (orgId, options) => {
427
+ return client.organizations.listMembers(orgId, options);
428
+ },
429
+ [client]
430
+ );
431
+ const updateMember = useCallback(
432
+ async (orgId, userId, data) => {
433
+ return client.organizations.updateMember(orgId, userId, data);
434
+ },
435
+ [client]
436
+ );
437
+ const removeMember = useCallback(
438
+ async (orgId, userId) => {
439
+ await client.organizations.removeMember(orgId, userId);
440
+ },
441
+ [client]
442
+ );
443
+ const inviteMember = useCallback(
444
+ async (orgId, data) => {
445
+ return client.organizations.inviteMember(orgId, data);
446
+ },
447
+ [client]
448
+ );
449
+ const listInvitations = useCallback(
450
+ async (orgId, options) => {
451
+ return client.organizations.listInvitations(orgId, options);
452
+ },
453
+ [client]
454
+ );
455
+ const resendInvitation = useCallback(
456
+ async (orgId, invitationId) => {
457
+ await client.organizations.resendInvitation(orgId, invitationId);
458
+ },
459
+ [client]
460
+ );
461
+ const cancelInvitation = useCallback(
462
+ async (orgId, invitationId) => {
463
+ await client.organizations.cancelInvitation(orgId, invitationId);
464
+ },
465
+ [client]
466
+ );
467
+ const acceptInvitation = useCallback(
468
+ async (data) => {
469
+ await client.organizations.acceptInvitation(data);
470
+ },
471
+ [client]
472
+ );
473
+ const declineInvitation = useCallback(
474
+ async (data) => {
475
+ await client.organizations.declineInvitation(data);
476
+ },
477
+ [client]
478
+ );
479
+ const leave = useCallback(
480
+ async (orgId) => {
481
+ await client.organizations.leave(orgId);
482
+ await refresh();
483
+ },
484
+ [client, refresh]
485
+ );
486
+ return {
487
+ organizations,
488
+ isLoading,
489
+ error,
490
+ refresh,
491
+ create,
492
+ update,
493
+ delete: deleteOrg,
494
+ listMembers,
495
+ updateMember,
496
+ removeMember,
497
+ inviteMember,
498
+ listInvitations,
499
+ resendInvitation,
500
+ cancelInvitation,
501
+ acceptInvitation,
502
+ declineInvitation,
503
+ leave
50
504
  };
51
505
  }
506
+ function usePhone() {
507
+ const { client, setUser } = useAuthContext();
508
+ const [isSending, setIsSending] = useState(false);
509
+ const [isVerifying, setIsVerifying] = useState(false);
510
+ const [codeSent, setCodeSent] = useState(false);
511
+ const [expiresIn, setExpiresIn] = useState(null);
512
+ const [error, setError] = useState(null);
513
+ const sendOTP = useCallback(
514
+ async (phoneNumber) => {
515
+ setIsSending(true);
516
+ setError(null);
517
+ try {
518
+ const response = await client.phone.sendOTP({ phoneNumber });
519
+ setCodeSent(true);
520
+ setExpiresIn(response.expiresIn);
521
+ return response;
522
+ } catch (err) {
523
+ setError(err);
524
+ throw err;
525
+ } finally {
526
+ setIsSending(false);
527
+ }
528
+ },
529
+ [client]
530
+ );
531
+ const verify = useCallback(
532
+ async (phoneNumber, code) => {
533
+ setIsVerifying(true);
534
+ setError(null);
535
+ try {
536
+ const response = await client.phone.verify({ phoneNumber, code });
537
+ setUser(response.user);
538
+ return response;
539
+ } catch (err) {
540
+ setError(err);
541
+ throw err;
542
+ } finally {
543
+ setIsVerifying(false);
544
+ }
545
+ },
546
+ [client, setUser]
547
+ );
548
+ const signIn = useCallback(
549
+ async (phoneNumber, password) => {
550
+ setIsVerifying(true);
551
+ setError(null);
552
+ try {
553
+ const response = await client.phone.signIn({ phoneNumber, password });
554
+ setUser(response.user);
555
+ return response;
556
+ } catch (err) {
557
+ setError(err);
558
+ throw err;
559
+ } finally {
560
+ setIsVerifying(false);
561
+ }
562
+ },
563
+ [client, setUser]
564
+ );
565
+ return {
566
+ isSending,
567
+ isVerifying,
568
+ codeSent,
569
+ expiresIn,
570
+ error,
571
+ sendOTP,
572
+ verify,
573
+ signIn
574
+ };
575
+ }
576
+
577
+ // src/hooks/use-session.ts
52
578
  function useSession() {
53
- const context = useContext(AuthContext);
54
- if (!context) {
55
- throw new Error("useSession must be used within AuthProvider");
56
- }
579
+ const { user, session, isAuthenticated, isLoading } = useAuthContext();
580
+ return {
581
+ user,
582
+ session,
583
+ isAuthenticated,
584
+ isLoading
585
+ };
586
+ }
587
+ function useSessions() {
588
+ const { client, session, setUser } = useAuthContext();
589
+ const [sessions, setSessions] = useState([]);
590
+ const [deviceSessions, setDeviceSessions] = useState([]);
591
+ const [isLoading, setIsLoading] = useState(false);
592
+ const [error, setError] = useState(null);
593
+ const refresh = useCallback(async () => {
594
+ setIsLoading(true);
595
+ setError(null);
596
+ try {
597
+ const [sessionsResponse, deviceSessionsResponse] = await Promise.all([
598
+ client.sessions.list(),
599
+ client.sessions.listDeviceSessions()
600
+ ]);
601
+ setSessions(sessionsResponse.data);
602
+ setDeviceSessions(deviceSessionsResponse);
603
+ } catch (err) {
604
+ setError(err);
605
+ } finally {
606
+ setIsLoading(false);
607
+ }
608
+ }, [client]);
609
+ const revokeSession = useCallback(
610
+ async (id) => {
611
+ await client.sessions.revoke(id);
612
+ await refresh();
613
+ },
614
+ [client, refresh]
615
+ );
616
+ const revokeAllSessions = useCallback(
617
+ async (options) => {
618
+ await client.sessions.revokeAll(options);
619
+ await refresh();
620
+ },
621
+ [client, refresh]
622
+ );
623
+ const switchAccount = useCallback(
624
+ async (sessionToken) => {
625
+ const response = await client.sessions.setActive({ sessionToken });
626
+ setUser(response.user);
627
+ },
628
+ [client, setUser]
629
+ );
630
+ const revokeDeviceSession = useCallback(
631
+ async (sessionToken) => {
632
+ await client.sessions.revokeDeviceSession({ sessionToken });
633
+ await refresh();
634
+ },
635
+ [client, refresh]
636
+ );
637
+ return {
638
+ session,
639
+ sessions,
640
+ deviceSessions,
641
+ isLoading,
642
+ error,
643
+ refresh,
644
+ revokeSession,
645
+ revokeAllSessions,
646
+ switchAccount,
647
+ revokeDeviceSession
648
+ };
649
+ }
650
+ function useUser() {
651
+ const { client, user, setUser } = useAuthContext();
652
+ const [isLoading, setIsLoading] = useState(false);
653
+ const [error, setError] = useState(null);
654
+ const updateProfile = useCallback(
655
+ async (data) => {
656
+ setIsLoading(true);
657
+ setError(null);
658
+ try {
659
+ const updated = await client.users.update(data);
660
+ setUser(updated);
661
+ return updated;
662
+ } catch (err) {
663
+ setError(err);
664
+ throw err;
665
+ } finally {
666
+ setIsLoading(false);
667
+ }
668
+ },
669
+ [client, setUser]
670
+ );
671
+ const changePassword = useCallback(
672
+ async (currentPassword, newPassword) => {
673
+ await client.users.changePassword({ currentPassword, newPassword });
674
+ },
675
+ [client]
676
+ );
677
+ const setupTwoFactor = useCallback(async () => {
678
+ return client.users.setupTwoFactor();
679
+ }, [client]);
680
+ const verifyTwoFactorSetup = useCallback(
681
+ async (code) => {
682
+ await client.users.verifyTwoFactorSetup({ code });
683
+ },
684
+ [client]
685
+ );
686
+ const disableTwoFactor = useCallback(
687
+ async (password) => {
688
+ await client.users.disableTwoFactor({ password });
689
+ },
690
+ [client]
691
+ );
692
+ const deleteAccount = useCallback(
693
+ async (password, reason) => {
694
+ await client.users.deleteAccount({ password, reason });
695
+ setUser(null);
696
+ },
697
+ [client, setUser]
698
+ );
699
+ const listConnectedProviders = useCallback(async () => {
700
+ return client.users.listConnectedProviders();
701
+ }, [client]);
702
+ const connectOAuthProvider = useCallback(
703
+ async (data) => {
704
+ return client.users.connectOAuthProvider(data);
705
+ },
706
+ [client]
707
+ );
708
+ const disconnectOAuthProvider = useCallback(
709
+ async (provider) => {
710
+ await client.users.disconnectOAuthProvider(provider);
711
+ },
712
+ [client]
713
+ );
714
+ const addPhoneNumber = useCallback(
715
+ async (phoneNumber) => {
716
+ await client.users.addPhoneNumber({ phoneNumber });
717
+ },
718
+ [client]
719
+ );
720
+ const verifyPhoneNumber = useCallback(
721
+ async (code) => {
722
+ await client.users.verifyPhoneNumber({ code });
723
+ },
724
+ [client]
725
+ );
726
+ const removePhoneNumber = useCallback(
727
+ async (password) => {
728
+ await client.users.removePhoneNumber({ password });
729
+ },
730
+ [client]
731
+ );
57
732
  return {
58
- user: context.user,
59
- isAuthenticated: context.isAuthenticated,
60
- isLoading: context.isLoading
733
+ user,
734
+ isLoading,
735
+ error,
736
+ updateProfile,
737
+ changePassword,
738
+ setupTwoFactor,
739
+ verifyTwoFactorSetup,
740
+ disableTwoFactor,
741
+ deleteAccount,
742
+ listConnectedProviders,
743
+ connectOAuthProvider,
744
+ disconnectOAuthProvider,
745
+ addPhoneNumber,
746
+ verifyPhoneNumber,
747
+ removePhoneNumber
61
748
  };
62
749
  }
63
750
 
64
- export { AuthContext, AuthProvider, useAuth, useSession };
751
+ export { AuthContext, AuthProvider, useApiKeys, useAuth, useAuthContext, useDevices, useLoginActivity, useOrganizations, usePhone, useSession, useSessions, useUser };
65
752
  //# sourceMappingURL=index.js.map
66
753
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/use-auth.ts","../src/use-session.ts"],"names":["useContext"],"mappings":";;;;AAYO,IAAM,WAAA,GAAc,cAAuC,IAAI;AAO/D,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAsB;AACpE,EAAA,MAAM,CAAC,MAAM,CAAA,GAAI,QAAA,CAAS,MAAM,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,SAAS,CAAA,GAAI,QAAA,CAAS,KAAK,CAAA;AAElC,EAAA,MAAM,KAAA,GAA0B,OAAA;AAAA,IAC9B,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA,iBAAiB,IAAA,KAAS,IAAA;AAAA,MAC1B,SAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA,GAC1B;AAEA,EAAA,uBAAO,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AChCO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AAEtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,SAAQ,GAAI,OAAA;AAE9D,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IACZ,OAAO,WAAA,KAAkC;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAC/C,MAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AACrB,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,QAAQ,OAAO;AAAA,GAClB;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,OAAO,IAAA,KAAqB;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACzC,MAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AACrB,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,QAAQ,OAAO;AAAA,GAClB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;ACnCO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,OAAA,GAAUA,WAAW,WAAW,CAAA;AAEtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,WAAW,OAAA,CAAQ;AAAA,GACrB;AACF","file":"index.js","sourcesContent":["import type { AuthConfig, User } from \"@atzentis/auth-sdk\";\nimport { AuthClient } from \"@atzentis/auth-sdk\";\nimport { createContext, useMemo, useState } from \"react\";\n\nexport interface AuthContextValue {\n client: AuthClient;\n user: User | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n setUser: (user: User | null) => void;\n}\n\nexport const AuthContext = createContext<AuthContextValue | null>(null);\n\ninterface AuthProviderProps {\n config: AuthConfig;\n children: React.ReactNode;\n}\n\nexport function AuthProvider({ config, children }: AuthProviderProps) {\n const [client] = useState(() => new AuthClient(config));\n const [user, setUser] = useState<User | null>(null);\n const [isLoading] = useState(false);\n\n const value: AuthContextValue = useMemo(\n () => ({\n client,\n user,\n isAuthenticated: user !== null,\n isLoading,\n setUser,\n }),\n [client, user, isLoading],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n","import type { LoginCredentials, SignupData } from \"@atzentis/auth-sdk\";\nimport { useCallback, useContext } from \"react\";\nimport { AuthContext } from \"./provider\";\n\nexport function useAuth() {\n const context = useContext(AuthContext);\n\n if (!context) {\n throw new Error(\"useAuth must be used within AuthProvider\");\n }\n\n const { client, user, isAuthenticated, isLoading, setUser } = context;\n\n const login = useCallback(\n async (credentials: LoginCredentials) => {\n const response = await client.login(credentials);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n const signup = useCallback(\n async (data: SignupData) => {\n const response = await client.signup(data);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n return {\n user,\n isAuthenticated,\n isLoading,\n login,\n signup,\n };\n}\n","import { useContext } from \"react\";\nimport { AuthContext } from \"./provider\";\n\nexport function useSession() {\n const context = useContext(AuthContext);\n\n if (!context) {\n throw new Error(\"useSession must be used within AuthProvider\");\n }\n\n return {\n user: context.user,\n isAuthenticated: context.isAuthenticated,\n isLoading: context.isLoading,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/hooks/use-auth-context.ts","../src/hooks/use-api-keys.ts","../src/hooks/use-auth.ts","../src/hooks/use-devices.ts","../src/hooks/use-login-activity.ts","../src/hooks/use-organizations.ts","../src/hooks/use-phone.ts","../src/hooks/use-session.ts","../src/hooks/use-sessions.ts","../src/hooks/use-user.ts"],"names":["useState","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["// AuthProvider — React context provider for @atzentis/auth-react\n\nimport type { AuthError, User } from \"@atzentis/auth-sdk\";\nimport { AuthClient } from \"@atzentis/auth-sdk\";\nimport type { Session } from \"@atzentis/auth-sdk\";\nimport { createContext, useCallback, useMemo, useState } from \"react\";\nimport type { AuthContextValue, AuthProviderProps } from \"./types\";\n\nexport const AuthContext = createContext<AuthContextValue | null>(null);\n\nexport function AuthProvider({\n apiKey,\n baseUrl,\n autoRefreshToken,\n refreshThreshold,\n timeout,\n collectDeviceSignals,\n onSessionExpired,\n onTokenRefreshed,\n onNewDeviceAlert,\n children,\n initialUser,\n storage,\n}: AuthProviderProps) {\n const [client] = useState(() => {\n const handleSessionExpired = () => {\n setUser(null);\n setSession(null);\n onSessionExpired?.();\n };\n\n return new AuthClient({\n apiKey,\n baseUrl,\n timeout,\n autoRefreshToken,\n refreshThreshold,\n collectDeviceSignals,\n onSessionExpired: handleSessionExpired,\n onTokenRefreshed,\n onNewDeviceAlert,\n storage,\n });\n });\n\n const [user, setUser] = useState<User | null>(initialUser ?? null);\n const [session, setSession] = useState<Session | null>(null);\n const [isLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const value: AuthContextValue = useMemo(\n () => ({\n client,\n user,\n session,\n isAuthenticated: user !== null,\n isLoading,\n error,\n setUser,\n setSession,\n setError,\n clearError,\n }),\n [client, user, session, isLoading, error, clearError],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n","// Internal hook to access auth context with error boundary\n\nimport { useContext } from \"react\";\nimport { AuthContext } from \"../provider\";\nimport type { AuthContextValue } from \"../types\";\n\nexport function useAuthContext(): AuthContextValue {\n const context = useContext(AuthContext);\n\n if (!context) {\n throw new Error(\"useAuthContext must be used within AuthProvider\");\n }\n\n return context;\n}\n","// useApiKeys hook — API key management\n\nimport type {\n ApiKey,\n AuthError,\n CreateApiKeyRequest,\n UpdateApiKeyRequest,\n} from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useApiKeys() {\n const { client } = useAuthContext();\n\n const [apiKeys, setApiKeys] = useState<ApiKey[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await client.apiKeys.list();\n setApiKeys(response.data);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n const create = useCallback(\n async (data: CreateApiKeyRequest) => {\n const response = await client.apiKeys.create(data);\n await refresh();\n return response;\n },\n [client, refresh],\n );\n\n const get = useCallback(\n async (keyId: string) => {\n return client.apiKeys.get(keyId);\n },\n [client],\n );\n\n const update = useCallback(\n async (keyId: string, data: UpdateApiKeyRequest) => {\n const updated = await client.apiKeys.update(keyId, data);\n await refresh();\n return updated;\n },\n [client, refresh],\n );\n\n const rotate = useCallback(\n async (keyId: string) => {\n const response = await client.apiKeys.rotate(keyId);\n await refresh();\n return response;\n },\n [client, refresh],\n );\n\n const revoke = useCallback(\n async (keyId: string) => {\n await client.apiKeys.revoke(keyId);\n await refresh();\n },\n [client, refresh],\n );\n\n const validate = useCallback(\n async (keyString: string) => {\n return client.apiKeys.validate(keyString);\n },\n [client],\n );\n\n const getUsage = useCallback(\n async (keyId: string) => {\n return client.apiKeys.getUsage(keyId);\n },\n [client],\n );\n\n return {\n apiKeys,\n isLoading,\n error,\n refresh,\n create,\n get,\n update,\n rotate,\n revoke,\n validate,\n getUsage,\n };\n}\n","// useAuth hook — auth state and methods\n\nimport type {\n GetOAuthUrlRequest,\n LoginCredentials,\n SendMagicLinkRequest,\n SignupData,\n UsernameLoginCredentials,\n VerifyMagicLinkRequest,\n VerifyOAuthCodeRequest,\n} from \"@atzentis/auth-sdk\";\nimport { useCallback } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useAuth() {\n const { client, user, isAuthenticated, isLoading, error, setUser, clearError } = useAuthContext();\n\n const login = useCallback(\n async (credentials: LoginCredentials) => {\n const response = await client.login(credentials);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n const loginWithUsername = useCallback(\n async (credentials: UsernameLoginCredentials) => {\n const response = await client.loginWithUsername(credentials);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n const signup = useCallback(\n async (data: SignupData) => {\n const response = await client.signup(data);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n const logout = useCallback(async () => {\n await client.logout();\n setUser(null);\n }, [client, setUser]);\n\n const logoutAllDevices = useCallback(async () => {\n await client.logoutAllDevices();\n setUser(null);\n }, [client, setUser]);\n\n const getOAuthUrl = useCallback(\n (config: GetOAuthUrlRequest) => {\n return client.getOAuthUrl(config);\n },\n [client],\n );\n\n const verifyOAuthCode = useCallback(\n async (request: VerifyOAuthCodeRequest) => {\n const response = await client.verifyOAuthCode(request);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n const sendMagicLink = useCallback(\n async (request: SendMagicLinkRequest) => {\n await client.sendMagicLink(request);\n },\n [client],\n );\n\n const verifyMagicLink = useCallback(\n async (request: VerifyMagicLinkRequest) => {\n const response = await client.verifyMagicLink(request);\n setUser(response.user);\n return response;\n },\n [client, setUser],\n );\n\n const isUsernameAvailable = useCallback(\n async (username: string) => {\n return client.isUsernameAvailable(username);\n },\n [client],\n );\n\n const getAccessToken = useCallback(async () => {\n return client.getAccessToken();\n }, [client]);\n\n const refreshToken = useCallback(async () => {\n return client.refreshToken();\n }, [client]);\n\n const getAuthHeader = useCallback(async () => {\n const token = await client.getAccessToken();\n if (token) {\n return { Authorization: `Bearer ${token}` };\n }\n return {};\n }, [client]);\n\n return {\n user,\n isAuthenticated,\n isLoading,\n error,\n login,\n loginWithUsername,\n signup,\n logout,\n logoutAllDevices,\n getOAuthUrl,\n verifyOAuthCode,\n sendMagicLink,\n verifyMagicLink,\n isUsernameAvailable,\n getAccessToken,\n refreshToken,\n getAuthHeader,\n clearError,\n };\n}\n","// useDevices hook — device management and trust settings\n\nimport type { AuthError, Device } from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useDevices() {\n const { client } = useAuthContext();\n\n const [devices, setDevices] = useState<Device[]>([]);\n const [currentDevice, setCurrentDevice] = useState<Device | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await client.devices.list();\n setDevices(response.data);\n const current = response.data.find((d) => d.isCurrent) ?? null;\n setCurrentDevice(current);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n const trustDevice = useCallback(\n async (id: string) => {\n await client.devices.trust(id);\n await refresh();\n },\n [client, refresh],\n );\n\n const untrustDevice = useCallback(\n async (id: string) => {\n await client.devices.untrust(id);\n await refresh();\n },\n [client, refresh],\n );\n\n const removeDevice = useCallback(\n async (id: string) => {\n await client.devices.remove(id);\n await refresh();\n },\n [client, refresh],\n );\n\n const removeAllOtherDevices = useCallback(async () => {\n await client.devices.removeAllOthers();\n await refresh();\n }, [client, refresh]);\n\n return {\n devices,\n currentDevice,\n isLoading,\n error,\n refresh,\n trustDevice,\n untrustDevice,\n removeDevice,\n removeAllOtherDevices,\n };\n}\n","// useLoginActivity hook — login history with filtering and reporting\n\nimport type { AuthError, ListLoginEventsRequest, LoginEvent } from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\ninterface UseLoginActivityOptions {\n limit?: number;\n}\n\nexport function useLoginActivity(options: UseLoginActivityOptions = {}) {\n const { client } = useAuthContext();\n\n const [events, setEvents] = useState<LoginEvent[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n const [filterOptions, setFilterOptions] = useState<ListLoginEventsRequest>({\n limit: options.limit ?? 50,\n offset: 0,\n });\n\n const hasMore = events.length < total;\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await client.loginActivity.list(filterOptions);\n setEvents(response.data);\n setTotal(response.total);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [client, filterOptions]);\n\n const loadMore = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await client.loginActivity.list({\n ...filterOptions,\n offset: events.length,\n });\n setEvents((prev) => [...prev, ...response.data]);\n setTotal(response.total);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [client, filterOptions, events.length]);\n\n const filter = useCallback(\n (newOptions: ListLoginEventsRequest) => {\n const merged = { ...filterOptions, ...newOptions, offset: 0 };\n setFilterOptions(merged);\n setEvents([]);\n setTotal(0);\n },\n [filterOptions],\n );\n\n const markRecognized = useCallback(\n async (eventId: string) => {\n await client.loginActivity.markRecognized(eventId);\n },\n [client],\n );\n\n const reportSuspicious = useCallback(\n async (eventId: string) => {\n return client.loginActivity.reportSuspicious(eventId);\n },\n [client],\n );\n\n return {\n events,\n total,\n hasMore,\n isLoading,\n error,\n refresh,\n loadMore,\n filter,\n markRecognized,\n reportSuspicious,\n };\n}\n","// useOrganizations hook — organization management\n\nimport type {\n AcceptInvitationRequest,\n AuthError,\n CreateOrganizationRequest,\n DeclineInvitationRequest,\n InviteMemberRequest,\n ListInvitationsRequest,\n ListMembersRequest,\n Organization,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useOrganizations() {\n const { client } = useAuthContext();\n\n const [organizations, setOrganizations] = useState<Organization[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await client.organizations.list();\n setOrganizations(response.data);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n const create = useCallback(\n async (data: CreateOrganizationRequest) => {\n const org = await client.organizations.create(data);\n await refresh();\n return org;\n },\n [client, refresh],\n );\n\n const update = useCallback(\n async (orgId: string, data: UpdateOrganizationRequest) => {\n const org = await client.organizations.update(orgId, data);\n await refresh();\n return org;\n },\n [client, refresh],\n );\n\n const deleteOrg = useCallback(\n async (orgId: string) => {\n await client.organizations.delete(orgId);\n await refresh();\n },\n [client, refresh],\n );\n\n const listMembers = useCallback(\n async (orgId: string, options?: ListMembersRequest) => {\n return client.organizations.listMembers(orgId, options);\n },\n [client],\n );\n\n const updateMember = useCallback(\n async (orgId: string, userId: string, data: UpdateMemberRequest) => {\n return client.organizations.updateMember(orgId, userId, data);\n },\n [client],\n );\n\n const removeMember = useCallback(\n async (orgId: string, userId: string) => {\n await client.organizations.removeMember(orgId, userId);\n },\n [client],\n );\n\n const inviteMember = useCallback(\n async (orgId: string, data: InviteMemberRequest) => {\n return client.organizations.inviteMember(orgId, data);\n },\n [client],\n );\n\n const listInvitations = useCallback(\n async (orgId: string, options?: ListInvitationsRequest) => {\n return client.organizations.listInvitations(orgId, options);\n },\n [client],\n );\n\n const resendInvitation = useCallback(\n async (orgId: string, invitationId: string) => {\n await client.organizations.resendInvitation(orgId, invitationId);\n },\n [client],\n );\n\n const cancelInvitation = useCallback(\n async (orgId: string, invitationId: string) => {\n await client.organizations.cancelInvitation(orgId, invitationId);\n },\n [client],\n );\n\n const acceptInvitation = useCallback(\n async (data: AcceptInvitationRequest) => {\n await client.organizations.acceptInvitation(data);\n },\n [client],\n );\n\n const declineInvitation = useCallback(\n async (data: DeclineInvitationRequest) => {\n await client.organizations.declineInvitation(data);\n },\n [client],\n );\n\n const leave = useCallback(\n async (orgId: string) => {\n await client.organizations.leave(orgId);\n await refresh();\n },\n [client, refresh],\n );\n\n return {\n organizations,\n isLoading,\n error,\n refresh,\n create,\n update,\n delete: deleteOrg,\n listMembers,\n updateMember,\n removeMember,\n inviteMember,\n listInvitations,\n resendInvitation,\n cancelInvitation,\n acceptInvitation,\n declineInvitation,\n leave,\n };\n}\n","// usePhone hook — phone OTP authentication\n\nimport type { AuthError } from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function usePhone() {\n const { client, setUser } = useAuthContext();\n\n const [isSending, setIsSending] = useState(false);\n const [isVerifying, setIsVerifying] = useState(false);\n const [codeSent, setCodeSent] = useState(false);\n const [expiresIn, setExpiresIn] = useState<number | null>(null);\n const [error, setError] = useState<AuthError | null>(null);\n\n const sendOTP = useCallback(\n async (phoneNumber: string) => {\n setIsSending(true);\n setError(null);\n try {\n const response = await client.phone.sendOTP({ phoneNumber });\n setCodeSent(true);\n setExpiresIn(response.expiresIn);\n return response;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsSending(false);\n }\n },\n [client],\n );\n\n const verify = useCallback(\n async (phoneNumber: string, code: string) => {\n setIsVerifying(true);\n setError(null);\n try {\n const response = await client.phone.verify({ phoneNumber, code });\n setUser(response.user);\n return response;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsVerifying(false);\n }\n },\n [client, setUser],\n );\n\n const signIn = useCallback(\n async (phoneNumber: string, password: string) => {\n setIsVerifying(true);\n setError(null);\n try {\n const response = await client.phone.signIn({ phoneNumber, password });\n setUser(response.user);\n return response;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsVerifying(false);\n }\n },\n [client, setUser],\n );\n\n return {\n isSending,\n isVerifying,\n codeSent,\n expiresIn,\n error,\n sendOTP,\n verify,\n signIn,\n };\n}\n","// useSession hook — current session state\n\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useSession() {\n const { user, session, isAuthenticated, isLoading } = useAuthContext();\n\n return {\n user,\n session,\n isAuthenticated,\n isLoading,\n };\n}\n","// useSessions hook — session management with multi-session support\n\nimport type {\n AuthError,\n DeviceSession,\n RevokeAllSessionsOptions,\n Session,\n} from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useSessions() {\n const { client, session, setUser } = useAuthContext();\n\n const [sessions, setSessions] = useState<Session[]>([]);\n const [deviceSessions, setDeviceSessions] = useState<DeviceSession[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const [sessionsResponse, deviceSessionsResponse] = await Promise.all([\n client.sessions.list(),\n client.sessions.listDeviceSessions(),\n ]);\n setSessions(sessionsResponse.data);\n setDeviceSessions(deviceSessionsResponse);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n const revokeSession = useCallback(\n async (id: string) => {\n await client.sessions.revoke(id);\n await refresh();\n },\n [client, refresh],\n );\n\n const revokeAllSessions = useCallback(\n async (options?: RevokeAllSessionsOptions) => {\n await client.sessions.revokeAll(options);\n await refresh();\n },\n [client, refresh],\n );\n\n const switchAccount = useCallback(\n async (sessionToken: string) => {\n const response = await client.sessions.setActive({ sessionToken });\n setUser(response.user);\n },\n [client, setUser],\n );\n\n const revokeDeviceSession = useCallback(\n async (sessionToken: string) => {\n await client.sessions.revokeDeviceSession({ sessionToken });\n await refresh();\n },\n [client, refresh],\n );\n\n return {\n session,\n sessions,\n deviceSessions,\n isLoading,\n error,\n refresh,\n revokeSession,\n revokeAllSessions,\n switchAccount,\n revokeDeviceSession,\n };\n}\n","// useUser hook — profile, 2FA, OAuth, and phone management\n\nimport type { AuthError, ConnectOAuthRequest, UserUpdate } from \"@atzentis/auth-sdk\";\nimport { useCallback, useState } from \"react\";\nimport { useAuthContext } from \"./use-auth-context\";\n\nexport function useUser() {\n const { client, user, setUser } = useAuthContext();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const updateProfile = useCallback(\n async (data: UserUpdate) => {\n setIsLoading(true);\n setError(null);\n try {\n const updated = await client.users.update(data);\n setUser(updated);\n return updated;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [client, setUser],\n );\n\n const changePassword = useCallback(\n async (currentPassword: string, newPassword: string) => {\n await client.users.changePassword({ currentPassword, newPassword });\n },\n [client],\n );\n\n const setupTwoFactor = useCallback(async () => {\n return client.users.setupTwoFactor();\n }, [client]);\n\n const verifyTwoFactorSetup = useCallback(\n async (code: string) => {\n await client.users.verifyTwoFactorSetup({ code });\n },\n [client],\n );\n\n const disableTwoFactor = useCallback(\n async (password: string) => {\n await client.users.disableTwoFactor({ password });\n },\n [client],\n );\n\n const deleteAccount = useCallback(\n async (password: string, reason?: string) => {\n await client.users.deleteAccount({ password, reason });\n setUser(null);\n },\n [client, setUser],\n );\n\n const listConnectedProviders = useCallback(async () => {\n return client.users.listConnectedProviders();\n }, [client]);\n\n const connectOAuthProvider = useCallback(\n async (data: ConnectOAuthRequest) => {\n return client.users.connectOAuthProvider(data);\n },\n [client],\n );\n\n const disconnectOAuthProvider = useCallback(\n async (provider: string) => {\n await client.users.disconnectOAuthProvider(provider);\n },\n [client],\n );\n\n const addPhoneNumber = useCallback(\n async (phoneNumber: string) => {\n await client.users.addPhoneNumber({ phoneNumber });\n },\n [client],\n );\n\n const verifyPhoneNumber = useCallback(\n async (code: string) => {\n await client.users.verifyPhoneNumber({ code });\n },\n [client],\n );\n\n const removePhoneNumber = useCallback(\n async (password: string) => {\n await client.users.removePhoneNumber({ password });\n },\n [client],\n );\n\n return {\n user,\n isLoading,\n error,\n updateProfile,\n changePassword,\n setupTwoFactor,\n verifyTwoFactorSetup,\n disableTwoFactor,\n deleteAccount,\n listConnectedProviders,\n connectOAuthProvider,\n disconnectOAuthProvider,\n addPhoneNumber,\n verifyPhoneNumber,\n removePhoneNumber,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atzentis/auth-react",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "Atzentis Auth React — hooks and components for auth.atzentis.com",
5
5
  "keywords": [
6
6
  "atzentis",
@@ -34,13 +34,14 @@
34
34
  "LICENSE"
35
35
  ],
36
36
  "dependencies": {
37
- "@atzentis/auth-sdk": "0.0.11"
37
+ "@atzentis/auth-sdk": "0.0.13"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "react": ">=18.0.0",
41
41
  "react-dom": ">=18.0.0"
42
42
  },
43
43
  "devDependencies": {
44
+ "@testing-library/react": "^16.3.2",
44
45
  "@types/react": "^19.0.0",
45
46
  "jsdom": "^28.0.0",
46
47
  "react": "^19.0.0",