@23blocks/react 3.0.4 → 4.0.0

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.esm.js CHANGED
@@ -697,7 +697,7 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
697
697
  /**
698
698
  * Hook for authentication operations with automatic token management.
699
699
  *
700
- * @example
700
+ * @example Basic login/logout
701
701
  * ```tsx
702
702
  * function LoginPage() {
703
703
  * const { signIn, signOut, isAuthenticated } = useAuth();
@@ -718,6 +718,22 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
718
718
  * }
719
719
  * ```
720
720
  *
721
+ * @example Validate email before registration
722
+ * ```tsx
723
+ * function SignUpForm() {
724
+ * const { validateEmail, signUp } = useAuth();
725
+ *
726
+ * const checkEmail = async (email: string) => {
727
+ * const result = await validateEmail({ email });
728
+ * if (result.exists) {
729
+ * alert('Email already registered');
730
+ * } else if (!result.wellFormed) {
731
+ * alert('Invalid email format');
732
+ * }
733
+ * };
734
+ * }
735
+ * ```
736
+ *
721
737
  * @example React Native - wait for tokens to load
722
738
  * ```tsx
723
739
  * function App() {
@@ -730,20 +746,48 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
730
746
  * return isAuthenticated() ? <HomeScreen /> : <LoginScreen />;
731
747
  * }
732
748
  * ```
733
- */ function useAuth$1() {
749
+ */ function useAuth() {
734
750
  const context = useClient();
751
+ const auth = context.authentication.auth;
735
752
  return {
753
+ // Core auth with automatic token management
736
754
  signIn: context.signIn,
737
755
  signUp: context.signUp,
738
756
  signOut: context.signOut,
757
+ // Token utilities
739
758
  getAccessToken: context.getAccessToken,
740
759
  getRefreshToken: context.getRefreshToken,
741
760
  setTokens: context.setTokens,
742
761
  clearTokens: context.clearTokens,
743
762
  isAuthenticated: context.isAuthenticated,
744
763
  onStorageChange: context.onStorageChange,
745
- authentication: context.authentication,
746
- isReady: context.isReady
764
+ isReady: context.isReady,
765
+ // Password management
766
+ requestPasswordReset: auth.requestPasswordReset.bind(auth),
767
+ updatePassword: auth.updatePassword.bind(auth),
768
+ // Token refresh
769
+ refreshToken: auth.refreshToken.bind(auth),
770
+ // Magic link (passwordless)
771
+ requestMagicLink: auth.requestMagicLink.bind(auth),
772
+ verifyMagicLink: auth.verifyMagicLink.bind(auth),
773
+ // Invitations
774
+ sendInvitation: auth.sendInvitation.bind(auth),
775
+ acceptInvitation: auth.acceptInvitation.bind(auth),
776
+ resendInvitation: auth.resendInvitation.bind(auth),
777
+ // Email confirmation
778
+ confirmEmail: auth.confirmEmail.bind(auth),
779
+ resendConfirmation: auth.resendConfirmation.bind(auth),
780
+ // Validation (pre-registration checks)
781
+ validateEmail: auth.validateEmail.bind(auth),
782
+ validateDocument: auth.validateDocument.bind(auth),
783
+ // Account recovery
784
+ requestAccountRecovery: auth.requestAccountRecovery.bind(auth),
785
+ completeAccountRecovery: auth.completeAccountRecovery.bind(auth),
786
+ // Token validation
787
+ validateToken: auth.validateToken.bind(auth),
788
+ getCurrentUser: auth.getCurrentUser.bind(auth),
789
+ // Full block access for advanced usage
790
+ authentication: context.authentication
747
791
  };
748
792
  }
749
793
  // ─────────────────────────────────────────────────────────────────────────────
@@ -751,7 +795,7 @@ const Blocks23Context = /*#__PURE__*/ createContext(null);
751
795
  // ─────────────────────────────────────────────────────────────────────────────
752
796
  /** @deprecated Use `Provider` instead */ const SimpleBlocks23Provider = Provider;
753
797
  /** @deprecated Use `useClient` instead */ const useSimpleBlocks23 = useClient;
754
- /** @deprecated Use `useAuth` instead */ const useSimpleAuth = useAuth$1;
798
+ /** @deprecated Use `useAuth` instead */ const useSimpleAuth = useAuth;
755
799
 
756
800
  // ─────────────────────────────────────────────────────────────────────────────
757
801
  // Context
@@ -944,49 +988,41 @@ function useUniversityBlock() {
944
988
  // Hook
945
989
  // ─────────────────────────────────────────────────────────────────────────────
946
990
  /**
947
- * Hook for authentication operations with state management.
991
+ * Hook for user management operations.
948
992
  *
949
993
  * @example
950
994
  * ```tsx
951
- * function LoginForm() {
952
- * const { signIn, isLoading, error, user } = useAuth();
995
+ * function UserList() {
996
+ * const { users, listUsers, isLoading, error } = useUsers();
953
997
  *
954
- * const handleSubmit = async (e: FormEvent) => {
955
- * e.preventDefault();
956
- * try {
957
- * await signIn({ email, password });
958
- * navigate('/dashboard');
959
- * } catch (err) {
960
- * // Error is automatically captured in `error` state
961
- * }
962
- * };
998
+ * useEffect(() => {
999
+ * listUsers({ page: 1, perPage: 20 });
1000
+ * }, [listUsers]);
963
1001
  *
964
- * if (user) {
965
- * return <p>Welcome, {user.email}!</p>;
966
- * }
1002
+ * if (isLoading) return <Spinner />;
1003
+ * if (error) return <Error message={error.message} />;
967
1004
  *
968
1005
  * return (
969
- * <form onSubmit={handleSubmit}>
970
- * {error && <p className="error">{error.message}</p>}
971
- * <button disabled={isLoading}>
972
- * {isLoading ? 'Signing in...' : 'Sign In'}
973
- * </button>
974
- * </form>
1006
+ * <ul>
1007
+ * {users.map(user => (
1008
+ * <li key={user.id}>{user.email}</li>
1009
+ * ))}
1010
+ * </ul>
975
1011
  * );
976
1012
  * }
977
1013
  * ```
978
- */ function useAuth() {
1014
+ */ function useUsers() {
979
1015
  const block = useAuthenticationBlock();
980
- const [user, setUser] = useState(null);
1016
+ const [users, setUsers] = useState([]);
981
1017
  const [isLoading, setIsLoading] = useState(false);
982
1018
  const [error, setError] = useState(null);
983
- const signIn = useCallback(async (request)=>{
1019
+ const listUsers = useCallback(async (params)=>{
984
1020
  setIsLoading(true);
985
1021
  setError(null);
986
1022
  try {
987
- const response = await block.auth.signIn(request);
988
- setUser(response.user);
989
- return response;
1023
+ const result = await block.users.list(params);
1024
+ setUsers(result.data);
1025
+ return result;
990
1026
  } catch (err) {
991
1027
  const error = err instanceof Error ? err : new Error(String(err));
992
1028
  setError(error);
@@ -995,15 +1031,13 @@ function useUniversityBlock() {
995
1031
  setIsLoading(false);
996
1032
  }
997
1033
  }, [
998
- block.auth
1034
+ block.users
999
1035
  ]);
1000
- const signUp = useCallback(async (request)=>{
1036
+ const getUser = useCallback(async (id)=>{
1001
1037
  setIsLoading(true);
1002
1038
  setError(null);
1003
1039
  try {
1004
- const response = await block.auth.signUp(request);
1005
- setUser(response.user);
1006
- return response;
1040
+ return await block.users.get(id);
1007
1041
  } catch (err) {
1008
1042
  const error = err instanceof Error ? err : new Error(String(err));
1009
1043
  setError(error);
@@ -1012,14 +1046,13 @@ function useUniversityBlock() {
1012
1046
  setIsLoading(false);
1013
1047
  }
1014
1048
  }, [
1015
- block.auth
1049
+ block.users
1016
1050
  ]);
1017
- const signOut = useCallback(async ()=>{
1051
+ const getUserByUniqueId = useCallback(async (uniqueId)=>{
1018
1052
  setIsLoading(true);
1019
1053
  setError(null);
1020
1054
  try {
1021
- await block.auth.signOut();
1022
- setUser(null);
1055
+ return await block.users.getByUniqueId(uniqueId);
1023
1056
  } catch (err) {
1024
1057
  const error = err instanceof Error ? err : new Error(String(err));
1025
1058
  setError(error);
@@ -1028,13 +1061,15 @@ function useUniversityBlock() {
1028
1061
  setIsLoading(false);
1029
1062
  }
1030
1063
  }, [
1031
- block.auth
1064
+ block.users
1032
1065
  ]);
1033
- const requestPasswordReset = useCallback(async (request)=>{
1066
+ const updateUser = useCallback(async (id, request)=>{
1034
1067
  setIsLoading(true);
1035
1068
  setError(null);
1036
1069
  try {
1037
- await block.auth.requestPasswordReset(request);
1070
+ const updated = await block.users.update(id, request);
1071
+ setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
1072
+ return updated;
1038
1073
  } catch (err) {
1039
1074
  const error = err instanceof Error ? err : new Error(String(err));
1040
1075
  setError(error);
@@ -1043,13 +1078,13 @@ function useUniversityBlock() {
1043
1078
  setIsLoading(false);
1044
1079
  }
1045
1080
  }, [
1046
- block.auth
1081
+ block.users
1047
1082
  ]);
1048
- const updatePassword = useCallback(async (request)=>{
1083
+ const updateUserProfile = useCallback(async (userId, request)=>{
1049
1084
  setIsLoading(true);
1050
1085
  setError(null);
1051
1086
  try {
1052
- await block.auth.updatePassword(request);
1087
+ return await block.users.updateProfile(userId, request);
1053
1088
  } catch (err) {
1054
1089
  const error = err instanceof Error ? err : new Error(String(err));
1055
1090
  setError(error);
@@ -1058,14 +1093,14 @@ function useUniversityBlock() {
1058
1093
  setIsLoading(false);
1059
1094
  }
1060
1095
  }, [
1061
- block.auth
1096
+ block.users
1062
1097
  ]);
1063
- const refreshUser = useCallback(async ()=>{
1098
+ const deleteUser = useCallback(async (id)=>{
1064
1099
  setIsLoading(true);
1065
1100
  setError(null);
1066
1101
  try {
1067
- const currentUser = await block.auth.getCurrentUser();
1068
- setUser(currentUser);
1102
+ await block.users.delete(id);
1103
+ setUsers((prev)=>prev.filter((u)=>u.id !== id));
1069
1104
  } catch (err) {
1070
1105
  const error = err instanceof Error ? err : new Error(String(err));
1071
1106
  setError(error);
@@ -1074,67 +1109,15 @@ function useUniversityBlock() {
1074
1109
  setIsLoading(false);
1075
1110
  }
1076
1111
  }, [
1077
- block.auth
1112
+ block.users
1078
1113
  ]);
1079
- const clearError = useCallback(()=>{
1080
- setError(null);
1081
- }, []);
1082
- return {
1083
- // State
1084
- user,
1085
- isLoading,
1086
- error,
1087
- isAuthenticated: user !== null,
1088
- // Actions
1089
- signIn,
1090
- signUp,
1091
- signOut,
1092
- requestPasswordReset,
1093
- updatePassword,
1094
- refreshUser,
1095
- clearError
1096
- };
1097
- }
1098
-
1099
- // ─────────────────────────────────────────────────────────────────────────────
1100
- // Hook
1101
- // ─────────────────────────────────────────────────────────────────────────────
1102
- /**
1103
- * Hook for user management operations.
1104
- *
1105
- * @example
1106
- * ```tsx
1107
- * function UserList() {
1108
- * const { users, listUsers, isLoading, error } = useUsers();
1109
- *
1110
- * useEffect(() => {
1111
- * listUsers({ page: 1, perPage: 20 });
1112
- * }, [listUsers]);
1113
- *
1114
- * if (isLoading) return <Spinner />;
1115
- * if (error) return <Error message={error.message} />;
1116
- *
1117
- * return (
1118
- * <ul>
1119
- * {users.map(user => (
1120
- * <li key={user.id}>{user.email}</li>
1121
- * ))}
1122
- * </ul>
1123
- * );
1124
- * }
1125
- * ```
1126
- */ function useUsers() {
1127
- const block = useAuthenticationBlock();
1128
- const [users, setUsers] = useState([]);
1129
- const [isLoading, setIsLoading] = useState(false);
1130
- const [error, setError] = useState(null);
1131
- const listUsers = useCallback(async (params)=>{
1114
+ const activateUser = useCallback(async (id)=>{
1132
1115
  setIsLoading(true);
1133
1116
  setError(null);
1134
1117
  try {
1135
- const result = await block.users.list(params);
1136
- setUsers(result);
1137
- return result;
1118
+ const activated = await block.users.activate(id);
1119
+ setUsers((prev)=>prev.map((u)=>u.id === id ? activated : u));
1120
+ return activated;
1138
1121
  } catch (err) {
1139
1122
  const error = err instanceof Error ? err : new Error(String(err));
1140
1123
  setError(error);
@@ -1145,11 +1128,13 @@ function useUniversityBlock() {
1145
1128
  }, [
1146
1129
  block.users
1147
1130
  ]);
1148
- const getUser = useCallback(async (id)=>{
1131
+ const deactivateUser = useCallback(async (id)=>{
1149
1132
  setIsLoading(true);
1150
1133
  setError(null);
1151
1134
  try {
1152
- return await block.users.get(id);
1135
+ const deactivated = await block.users.deactivate(id);
1136
+ setUsers((prev)=>prev.map((u)=>u.id === id ? deactivated : u));
1137
+ return deactivated;
1153
1138
  } catch (err) {
1154
1139
  const error = err instanceof Error ? err : new Error(String(err));
1155
1140
  setError(error);
@@ -1160,11 +1145,11 @@ function useUniversityBlock() {
1160
1145
  }, [
1161
1146
  block.users
1162
1147
  ]);
1163
- const updateUser = useCallback(async (id, request)=>{
1148
+ const changeUserRole = useCallback(async (id, roleUniqueId, reason, forceReauth)=>{
1164
1149
  setIsLoading(true);
1165
1150
  setError(null);
1166
1151
  try {
1167
- const updated = await block.users.update(id, request);
1152
+ const updated = await block.users.changeRole(id, roleUniqueId, reason, forceReauth);
1168
1153
  setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
1169
1154
  return updated;
1170
1155
  } catch (err) {
@@ -1177,12 +1162,165 @@ function useUniversityBlock() {
1177
1162
  }, [
1178
1163
  block.users
1179
1164
  ]);
1180
- const deleteUser = useCallback(async (id)=>{
1165
+ const searchUsers = useCallback(async (query, params)=>{
1181
1166
  setIsLoading(true);
1182
1167
  setError(null);
1183
1168
  try {
1184
- await block.users.delete(id);
1185
- setUsers((prev)=>prev.filter((u)=>u.id !== id));
1169
+ const result = await block.users.search(query, params);
1170
+ setUsers(result.data);
1171
+ return result;
1172
+ } catch (err) {
1173
+ const error = err instanceof Error ? err : new Error(String(err));
1174
+ setError(error);
1175
+ throw error;
1176
+ } finally{
1177
+ setIsLoading(false);
1178
+ }
1179
+ }, [
1180
+ block.users
1181
+ ]);
1182
+ const searchUsersAdvanced = useCallback(async (request, params)=>{
1183
+ setIsLoading(true);
1184
+ setError(null);
1185
+ try {
1186
+ const result = await block.users.searchAdvanced(request, params);
1187
+ setUsers(result.data);
1188
+ return result;
1189
+ } catch (err) {
1190
+ const error = err instanceof Error ? err : new Error(String(err));
1191
+ setError(error);
1192
+ throw error;
1193
+ } finally{
1194
+ setIsLoading(false);
1195
+ }
1196
+ }, [
1197
+ block.users
1198
+ ]);
1199
+ const getUserProfile = useCallback(async (userUniqueId)=>{
1200
+ setIsLoading(true);
1201
+ setError(null);
1202
+ try {
1203
+ return await block.users.getProfile(userUniqueId);
1204
+ } catch (err) {
1205
+ const error = err instanceof Error ? err : new Error(String(err));
1206
+ setError(error);
1207
+ throw error;
1208
+ } finally{
1209
+ setIsLoading(false);
1210
+ }
1211
+ }, [
1212
+ block.users
1213
+ ]);
1214
+ const createUserProfile = useCallback(async (request)=>{
1215
+ setIsLoading(true);
1216
+ setError(null);
1217
+ try {
1218
+ return await block.users.createProfile(request);
1219
+ } catch (err) {
1220
+ const error = err instanceof Error ? err : new Error(String(err));
1221
+ setError(error);
1222
+ throw error;
1223
+ } finally{
1224
+ setIsLoading(false);
1225
+ }
1226
+ }, [
1227
+ block.users
1228
+ ]);
1229
+ const updateUserEmail = useCallback(async (userUniqueId, request)=>{
1230
+ setIsLoading(true);
1231
+ setError(null);
1232
+ try {
1233
+ return await block.users.updateEmail(userUniqueId, request);
1234
+ } catch (err) {
1235
+ const error = err instanceof Error ? err : new Error(String(err));
1236
+ setError(error);
1237
+ throw error;
1238
+ } finally{
1239
+ setIsLoading(false);
1240
+ }
1241
+ }, [
1242
+ block.users
1243
+ ]);
1244
+ const getUserDevices = useCallback(async (userUniqueId, params)=>{
1245
+ setIsLoading(true);
1246
+ setError(null);
1247
+ try {
1248
+ return await block.users.getDevices(userUniqueId, params);
1249
+ } catch (err) {
1250
+ const error = err instanceof Error ? err : new Error(String(err));
1251
+ setError(error);
1252
+ throw error;
1253
+ } finally{
1254
+ setIsLoading(false);
1255
+ }
1256
+ }, [
1257
+ block.users
1258
+ ]);
1259
+ const addUserDevice = useCallback(async (request)=>{
1260
+ setIsLoading(true);
1261
+ setError(null);
1262
+ try {
1263
+ return await block.users.addDevice(request);
1264
+ } catch (err) {
1265
+ const error = err instanceof Error ? err : new Error(String(err));
1266
+ setError(error);
1267
+ throw error;
1268
+ } finally{
1269
+ setIsLoading(false);
1270
+ }
1271
+ }, [
1272
+ block.users
1273
+ ]);
1274
+ const getUserCompanies = useCallback(async (userUniqueId)=>{
1275
+ setIsLoading(true);
1276
+ setError(null);
1277
+ try {
1278
+ return await block.users.getCompanies(userUniqueId);
1279
+ } catch (err) {
1280
+ const error = err instanceof Error ? err : new Error(String(err));
1281
+ setError(error);
1282
+ throw error;
1283
+ } finally{
1284
+ setIsLoading(false);
1285
+ }
1286
+ }, [
1287
+ block.users
1288
+ ]);
1289
+ const addUserSubscription = useCallback(async (userUniqueId, request)=>{
1290
+ setIsLoading(true);
1291
+ setError(null);
1292
+ try {
1293
+ return await block.users.addSubscription(userUniqueId, request);
1294
+ } catch (err) {
1295
+ const error = err instanceof Error ? err : new Error(String(err));
1296
+ setError(error);
1297
+ throw error;
1298
+ } finally{
1299
+ setIsLoading(false);
1300
+ }
1301
+ }, [
1302
+ block.users
1303
+ ]);
1304
+ const updateUserSubscription = useCallback(async (userUniqueId, request)=>{
1305
+ setIsLoading(true);
1306
+ setError(null);
1307
+ try {
1308
+ return await block.users.updateSubscription(userUniqueId, request);
1309
+ } catch (err) {
1310
+ const error = err instanceof Error ? err : new Error(String(err));
1311
+ setError(error);
1312
+ throw error;
1313
+ } finally{
1314
+ setIsLoading(false);
1315
+ }
1316
+ }, [
1317
+ block.users
1318
+ ]);
1319
+ const resendConfirmationByUniqueId = useCallback(async (userUniqueId)=>{
1320
+ setIsLoading(true);
1321
+ setError(null);
1322
+ try {
1323
+ await block.users.resendConfirmationByUniqueId(userUniqueId);
1186
1324
  } catch (err) {
1187
1325
  const error = err instanceof Error ? err : new Error(String(err));
1188
1326
  setError(error);
@@ -1202,8 +1340,713 @@ function useUniversityBlock() {
1202
1340
  error,
1203
1341
  listUsers,
1204
1342
  getUser,
1343
+ getUserByUniqueId,
1205
1344
  updateUser,
1345
+ updateUserProfile,
1206
1346
  deleteUser,
1347
+ activateUser,
1348
+ deactivateUser,
1349
+ changeUserRole,
1350
+ searchUsers,
1351
+ searchUsersAdvanced,
1352
+ getUserProfile,
1353
+ createUserProfile,
1354
+ updateUserEmail,
1355
+ getUserDevices,
1356
+ addUserDevice,
1357
+ getUserCompanies,
1358
+ addUserSubscription,
1359
+ updateUserSubscription,
1360
+ resendConfirmationByUniqueId,
1361
+ clearError
1362
+ };
1363
+ }
1364
+
1365
+ // ─────────────────────────────────────────────────────────────────────────────
1366
+ // Hook
1367
+ // ─────────────────────────────────────────────────────────────────────────────
1368
+ /**
1369
+ * Hook for Multi-Factor Authentication operations.
1370
+ *
1371
+ * @example
1372
+ * ```tsx
1373
+ * function MfaSettings() {
1374
+ * const { setup, enable, disable, getStatus, status, isLoading, error } = useMfa();
1375
+ *
1376
+ * useEffect(() => {
1377
+ * getStatus();
1378
+ * }, [getStatus]);
1379
+ *
1380
+ * const handleSetup = async () => {
1381
+ * const data = await setup();
1382
+ * // Show QR code from data.qrCodeUri
1383
+ * };
1384
+ *
1385
+ * const handleEnable = async (code: string) => {
1386
+ * await enable({ totpCode: code });
1387
+ * };
1388
+ *
1389
+ * return (
1390
+ * <div>
1391
+ * {status?.enabled ? (
1392
+ * <button onClick={() => disable({ password: 'xxx' })}>Disable MFA</button>
1393
+ * ) : (
1394
+ * <button onClick={handleSetup}>Setup MFA</button>
1395
+ * )}
1396
+ * </div>
1397
+ * );
1398
+ * }
1399
+ * ```
1400
+ */ function useMfa() {
1401
+ const block = useAuthenticationBlock();
1402
+ const [isLoading, setIsLoading] = useState(false);
1403
+ const [error, setError] = useState(null);
1404
+ const [status, setStatus] = useState(null);
1405
+ const [setupData, setSetupData] = useState(null);
1406
+ const setup = useCallback(async ()=>{
1407
+ setIsLoading(true);
1408
+ setError(null);
1409
+ try {
1410
+ const result = await block.mfa.setup();
1411
+ setSetupData(result);
1412
+ return result;
1413
+ } catch (err) {
1414
+ const error = err instanceof Error ? err : new Error(String(err));
1415
+ setError(error);
1416
+ throw error;
1417
+ } finally{
1418
+ setIsLoading(false);
1419
+ }
1420
+ }, [
1421
+ block.mfa
1422
+ ]);
1423
+ const enable = useCallback(async (request)=>{
1424
+ setIsLoading(true);
1425
+ setError(null);
1426
+ try {
1427
+ const result = await block.mfa.enable(request);
1428
+ setSetupData(null);
1429
+ // Refresh status after enabling
1430
+ const newStatus = await block.mfa.status();
1431
+ setStatus(newStatus);
1432
+ return result;
1433
+ } catch (err) {
1434
+ const error = err instanceof Error ? err : new Error(String(err));
1435
+ setError(error);
1436
+ throw error;
1437
+ } finally{
1438
+ setIsLoading(false);
1439
+ }
1440
+ }, [
1441
+ block.mfa
1442
+ ]);
1443
+ const disable = useCallback(async (request)=>{
1444
+ setIsLoading(true);
1445
+ setError(null);
1446
+ try {
1447
+ const result = await block.mfa.disable(request);
1448
+ // Refresh status after disabling
1449
+ const newStatus = await block.mfa.status();
1450
+ setStatus(newStatus);
1451
+ return result;
1452
+ } catch (err) {
1453
+ const error = err instanceof Error ? err : new Error(String(err));
1454
+ setError(error);
1455
+ throw error;
1456
+ } finally{
1457
+ setIsLoading(false);
1458
+ }
1459
+ }, [
1460
+ block.mfa
1461
+ ]);
1462
+ const verify = useCallback(async (request)=>{
1463
+ setIsLoading(true);
1464
+ setError(null);
1465
+ try {
1466
+ return await block.mfa.verify(request);
1467
+ } catch (err) {
1468
+ const error = err instanceof Error ? err : new Error(String(err));
1469
+ setError(error);
1470
+ throw error;
1471
+ } finally{
1472
+ setIsLoading(false);
1473
+ }
1474
+ }, [
1475
+ block.mfa
1476
+ ]);
1477
+ const getStatus = useCallback(async ()=>{
1478
+ setIsLoading(true);
1479
+ setError(null);
1480
+ try {
1481
+ const result = await block.mfa.status();
1482
+ setStatus(result);
1483
+ return result;
1484
+ } catch (err) {
1485
+ const error = err instanceof Error ? err : new Error(String(err));
1486
+ setError(error);
1487
+ throw error;
1488
+ } finally{
1489
+ setIsLoading(false);
1490
+ }
1491
+ }, [
1492
+ block.mfa
1493
+ ]);
1494
+ const clearError = useCallback(()=>{
1495
+ setError(null);
1496
+ }, []);
1497
+ return {
1498
+ isLoading,
1499
+ error,
1500
+ status,
1501
+ setupData,
1502
+ setup,
1503
+ enable,
1504
+ disable,
1505
+ verify,
1506
+ getStatus,
1507
+ clearError
1508
+ };
1509
+ }
1510
+
1511
+ // ─────────────────────────────────────────────────────────────────────────────
1512
+ // Hook
1513
+ // ─────────────────────────────────────────────────────────────────────────────
1514
+ /**
1515
+ * Hook for OAuth and token management operations.
1516
+ *
1517
+ * @example
1518
+ * ```tsx
1519
+ * function SocialLogin() {
1520
+ * const { loginWithGoogle, loginWithFacebook, isLoading, error } = useOAuth();
1521
+ *
1522
+ * const handleGoogleLogin = async (googleToken: string) => {
1523
+ * try {
1524
+ * const response = await loginWithGoogle({ token: googleToken });
1525
+ * // User is now logged in
1526
+ * } catch (err) {
1527
+ * // Handle error
1528
+ * }
1529
+ * };
1530
+ *
1531
+ * return (
1532
+ * <div>
1533
+ * <button onClick={() => handleGoogleLogin('...')} disabled={isLoading}>
1534
+ * Login with Google
1535
+ * </button>
1536
+ * </div>
1537
+ * );
1538
+ * }
1539
+ * ```
1540
+ */ function useOAuth() {
1541
+ const block = useAuthenticationBlock();
1542
+ const [isLoading, setIsLoading] = useState(false);
1543
+ const [error, setError] = useState(null);
1544
+ const [tenantContext, setTenantContext] = useState(null);
1545
+ const loginWithFacebook = useCallback(async (request)=>{
1546
+ setIsLoading(true);
1547
+ setError(null);
1548
+ try {
1549
+ return await block.oauth.loginWithFacebook(request);
1550
+ } catch (err) {
1551
+ const error = err instanceof Error ? err : new Error(String(err));
1552
+ setError(error);
1553
+ throw error;
1554
+ } finally{
1555
+ setIsLoading(false);
1556
+ }
1557
+ }, [
1558
+ block.oauth
1559
+ ]);
1560
+ const loginWithGoogle = useCallback(async (request)=>{
1561
+ setIsLoading(true);
1562
+ setError(null);
1563
+ try {
1564
+ return await block.oauth.loginWithGoogle(request);
1565
+ } catch (err) {
1566
+ const error = err instanceof Error ? err : new Error(String(err));
1567
+ setError(error);
1568
+ throw error;
1569
+ } finally{
1570
+ setIsLoading(false);
1571
+ }
1572
+ }, [
1573
+ block.oauth
1574
+ ]);
1575
+ const loginWithTenant = useCallback(async (request)=>{
1576
+ setIsLoading(true);
1577
+ setError(null);
1578
+ try {
1579
+ return await block.oauth.loginWithTenant(request);
1580
+ } catch (err) {
1581
+ const error = err instanceof Error ? err : new Error(String(err));
1582
+ setError(error);
1583
+ throw error;
1584
+ } finally{
1585
+ setIsLoading(false);
1586
+ }
1587
+ }, [
1588
+ block.oauth
1589
+ ]);
1590
+ const introspectToken = useCallback(async (token)=>{
1591
+ setIsLoading(true);
1592
+ setError(null);
1593
+ try {
1594
+ return await block.oauth.introspectToken(token);
1595
+ } catch (err) {
1596
+ const error = err instanceof Error ? err : new Error(String(err));
1597
+ setError(error);
1598
+ throw error;
1599
+ } finally{
1600
+ setIsLoading(false);
1601
+ }
1602
+ }, [
1603
+ block.oauth
1604
+ ]);
1605
+ const revokeToken = useCallback(async (request)=>{
1606
+ setIsLoading(true);
1607
+ setError(null);
1608
+ try {
1609
+ return await block.oauth.revokeToken(request);
1610
+ } catch (err) {
1611
+ const error = err instanceof Error ? err : new Error(String(err));
1612
+ setError(error);
1613
+ throw error;
1614
+ } finally{
1615
+ setIsLoading(false);
1616
+ }
1617
+ }, [
1618
+ block.oauth
1619
+ ]);
1620
+ const revokeAllTokens = useCallback(async (request)=>{
1621
+ setIsLoading(true);
1622
+ setError(null);
1623
+ try {
1624
+ return await block.oauth.revokeAllTokens(request);
1625
+ } catch (err) {
1626
+ const error = err instanceof Error ? err : new Error(String(err));
1627
+ setError(error);
1628
+ throw error;
1629
+ } finally{
1630
+ setIsLoading(false);
1631
+ }
1632
+ }, [
1633
+ block.oauth
1634
+ ]);
1635
+ const createTenantContext = useCallback(async (request)=>{
1636
+ setIsLoading(true);
1637
+ setError(null);
1638
+ try {
1639
+ const result = await block.oauth.createTenantContext(request);
1640
+ setTenantContext(result);
1641
+ return result;
1642
+ } catch (err) {
1643
+ const error = err instanceof Error ? err : new Error(String(err));
1644
+ setError(error);
1645
+ throw error;
1646
+ } finally{
1647
+ setIsLoading(false);
1648
+ }
1649
+ }, [
1650
+ block.oauth
1651
+ ]);
1652
+ const revokeTenantContext = useCallback(async ()=>{
1653
+ setIsLoading(true);
1654
+ setError(null);
1655
+ try {
1656
+ await block.oauth.revokeTenantContext();
1657
+ setTenantContext(null);
1658
+ } catch (err) {
1659
+ const error = err instanceof Error ? err : new Error(String(err));
1660
+ setError(error);
1661
+ throw error;
1662
+ } finally{
1663
+ setIsLoading(false);
1664
+ }
1665
+ }, [
1666
+ block.oauth
1667
+ ]);
1668
+ const auditTenantContext = useCallback(async ()=>{
1669
+ setIsLoading(true);
1670
+ setError(null);
1671
+ try {
1672
+ return await block.oauth.auditTenantContext();
1673
+ } catch (err) {
1674
+ const error = err instanceof Error ? err : new Error(String(err));
1675
+ setError(error);
1676
+ throw error;
1677
+ } finally{
1678
+ setIsLoading(false);
1679
+ }
1680
+ }, [
1681
+ block.oauth
1682
+ ]);
1683
+ const clearError = useCallback(()=>{
1684
+ setError(null);
1685
+ }, []);
1686
+ return {
1687
+ isLoading,
1688
+ error,
1689
+ tenantContext,
1690
+ loginWithFacebook,
1691
+ loginWithGoogle,
1692
+ loginWithTenant,
1693
+ introspectToken,
1694
+ revokeToken,
1695
+ revokeAllTokens,
1696
+ createTenantContext,
1697
+ revokeTenantContext,
1698
+ auditTenantContext,
1699
+ clearError
1700
+ };
1701
+ }
1702
+
1703
+ // ─────────────────────────────────────────────────────────────────────────────
1704
+ // Hook
1705
+ // ─────────────────────────────────────────────────────────────────────────────
1706
+ /**
1707
+ * Hook for user avatar management.
1708
+ *
1709
+ * @example
1710
+ * ```tsx
1711
+ * function AvatarUpload({ userUniqueId }: { userUniqueId: string }) {
1712
+ * const { presignUpload, create, isLoading, error } = useAvatars();
1713
+ *
1714
+ * const handleUpload = async (file: File) => {
1715
+ * // Get presigned URL
1716
+ * const { uploadUrl, publicUrl } = await presignUpload(userUniqueId, file.name);
1717
+ *
1718
+ * // Upload directly to S3
1719
+ * await fetch(uploadUrl, { method: 'PUT', body: file });
1720
+ *
1721
+ * // Save avatar record
1722
+ * await create(userUniqueId, {
1723
+ * originalName: file.name,
1724
+ * name: file.name,
1725
+ * url: publicUrl,
1726
+ * fileType: file.type,
1727
+ * fileSize: file.size,
1728
+ * });
1729
+ * };
1730
+ *
1731
+ * return (
1732
+ * <input type="file" onChange={(e) => e.target.files?.[0] && handleUpload(e.target.files[0])} />
1733
+ * );
1734
+ * }
1735
+ * ```
1736
+ */ function useAvatars() {
1737
+ const block = useAuthenticationBlock();
1738
+ const [avatars, setAvatars] = useState([]);
1739
+ const [currentAvatar, setCurrentAvatar] = useState(null);
1740
+ const [isLoading, setIsLoading] = useState(false);
1741
+ const [error, setError] = useState(null);
1742
+ const list = useCallback(async (userUniqueId, params)=>{
1743
+ setIsLoading(true);
1744
+ setError(null);
1745
+ try {
1746
+ const result = await block.avatars.list(userUniqueId, params);
1747
+ setAvatars(result.data);
1748
+ return result;
1749
+ } catch (err) {
1750
+ const error = err instanceof Error ? err : new Error(String(err));
1751
+ setError(error);
1752
+ throw error;
1753
+ } finally{
1754
+ setIsLoading(false);
1755
+ }
1756
+ }, [
1757
+ block.avatars
1758
+ ]);
1759
+ const get = useCallback(async (userUniqueId)=>{
1760
+ setIsLoading(true);
1761
+ setError(null);
1762
+ try {
1763
+ const result = await block.avatars.get(userUniqueId);
1764
+ setCurrentAvatar(result);
1765
+ return result;
1766
+ } catch (err) {
1767
+ const error = err instanceof Error ? err : new Error(String(err));
1768
+ setError(error);
1769
+ throw error;
1770
+ } finally{
1771
+ setIsLoading(false);
1772
+ }
1773
+ }, [
1774
+ block.avatars
1775
+ ]);
1776
+ const create = useCallback(async (userUniqueId, request)=>{
1777
+ setIsLoading(true);
1778
+ setError(null);
1779
+ try {
1780
+ const result = await block.avatars.create(userUniqueId, request);
1781
+ setCurrentAvatar(result);
1782
+ setAvatars((prev)=>[
1783
+ ...prev,
1784
+ result
1785
+ ]);
1786
+ return result;
1787
+ } catch (err) {
1788
+ const error = err instanceof Error ? err : new Error(String(err));
1789
+ setError(error);
1790
+ throw error;
1791
+ } finally{
1792
+ setIsLoading(false);
1793
+ }
1794
+ }, [
1795
+ block.avatars
1796
+ ]);
1797
+ const update = useCallback(async (userUniqueId, request)=>{
1798
+ setIsLoading(true);
1799
+ setError(null);
1800
+ try {
1801
+ const result = await block.avatars.update(userUniqueId, request);
1802
+ setCurrentAvatar(result);
1803
+ setAvatars((prev)=>prev.map((a)=>a.userUniqueId === userUniqueId ? result : a));
1804
+ return result;
1805
+ } catch (err) {
1806
+ const error = err instanceof Error ? err : new Error(String(err));
1807
+ setError(error);
1808
+ throw error;
1809
+ } finally{
1810
+ setIsLoading(false);
1811
+ }
1812
+ }, [
1813
+ block.avatars
1814
+ ]);
1815
+ const remove = useCallback(async (userUniqueId)=>{
1816
+ setIsLoading(true);
1817
+ setError(null);
1818
+ try {
1819
+ await block.avatars.delete(userUniqueId);
1820
+ setCurrentAvatar(null);
1821
+ setAvatars((prev)=>prev.filter((a)=>a.userUniqueId !== userUniqueId));
1822
+ } catch (err) {
1823
+ const error = err instanceof Error ? err : new Error(String(err));
1824
+ setError(error);
1825
+ throw error;
1826
+ } finally{
1827
+ setIsLoading(false);
1828
+ }
1829
+ }, [
1830
+ block.avatars
1831
+ ]);
1832
+ const presignUpload = useCallback(async (userUniqueId, filename)=>{
1833
+ setIsLoading(true);
1834
+ setError(null);
1835
+ try {
1836
+ return await block.avatars.presignUpload(userUniqueId, filename);
1837
+ } catch (err) {
1838
+ const error = err instanceof Error ? err : new Error(String(err));
1839
+ setError(error);
1840
+ throw error;
1841
+ } finally{
1842
+ setIsLoading(false);
1843
+ }
1844
+ }, [
1845
+ block.avatars
1846
+ ]);
1847
+ const multipartPresign = useCallback(async (userUniqueId, request)=>{
1848
+ setIsLoading(true);
1849
+ setError(null);
1850
+ try {
1851
+ return await block.avatars.multipartPresign(userUniqueId, request);
1852
+ } catch (err) {
1853
+ const error = err instanceof Error ? err : new Error(String(err));
1854
+ setError(error);
1855
+ throw error;
1856
+ } finally{
1857
+ setIsLoading(false);
1858
+ }
1859
+ }, [
1860
+ block.avatars
1861
+ ]);
1862
+ const multipartComplete = useCallback(async (userUniqueId, request)=>{
1863
+ setIsLoading(true);
1864
+ setError(null);
1865
+ try {
1866
+ return await block.avatars.multipartComplete(userUniqueId, request);
1867
+ } catch (err) {
1868
+ const error = err instanceof Error ? err : new Error(String(err));
1869
+ setError(error);
1870
+ throw error;
1871
+ } finally{
1872
+ setIsLoading(false);
1873
+ }
1874
+ }, [
1875
+ block.avatars
1876
+ ]);
1877
+ const clearError = useCallback(()=>{
1878
+ setError(null);
1879
+ }, []);
1880
+ return {
1881
+ avatars,
1882
+ currentAvatar,
1883
+ isLoading,
1884
+ error,
1885
+ list,
1886
+ get,
1887
+ create,
1888
+ update,
1889
+ remove,
1890
+ presignUpload,
1891
+ multipartPresign,
1892
+ multipartComplete,
1893
+ clearError
1894
+ };
1895
+ }
1896
+
1897
+ // ─────────────────────────────────────────────────────────────────────────────
1898
+ // Hook
1899
+ // ─────────────────────────────────────────────────────────────────────────────
1900
+ /**
1901
+ * Hook for tenant management operations.
1902
+ *
1903
+ * @example
1904
+ * ```tsx
1905
+ * function TenantList() {
1906
+ * const { tenants, listChildren, isLoading, error } = useTenants();
1907
+ *
1908
+ * useEffect(() => {
1909
+ * listChildren();
1910
+ * }, [listChildren]);
1911
+ *
1912
+ * if (isLoading) return <Spinner />;
1913
+ * if (error) return <Error message={error.message} />;
1914
+ *
1915
+ * return (
1916
+ * <ul>
1917
+ * {tenants.map(tenant => (
1918
+ * <li key={tenant.id}>{tenant.name}</li>
1919
+ * ))}
1920
+ * </ul>
1921
+ * );
1922
+ * }
1923
+ * ```
1924
+ */ function useTenants() {
1925
+ const block = useAuthenticationBlock();
1926
+ const [tenants, setTenants] = useState([]);
1927
+ const [isLoading, setIsLoading] = useState(false);
1928
+ const [error, setError] = useState(null);
1929
+ const listChildren = useCallback(async (params)=>{
1930
+ setIsLoading(true);
1931
+ setError(null);
1932
+ try {
1933
+ const result = await block.tenants.listChildren(params);
1934
+ setTenants(result.data);
1935
+ return result;
1936
+ } catch (err) {
1937
+ const error = err instanceof Error ? err : new Error(String(err));
1938
+ setError(error);
1939
+ throw error;
1940
+ } finally{
1941
+ setIsLoading(false);
1942
+ }
1943
+ }, [
1944
+ block.tenants
1945
+ ]);
1946
+ const validateCode = useCallback(async (request)=>{
1947
+ setIsLoading(true);
1948
+ setError(null);
1949
+ try {
1950
+ return await block.tenants.validateCode(request);
1951
+ } catch (err) {
1952
+ const error = err instanceof Error ? err : new Error(String(err));
1953
+ setError(error);
1954
+ throw error;
1955
+ } finally{
1956
+ setIsLoading(false);
1957
+ }
1958
+ }, [
1959
+ block.tenants
1960
+ ]);
1961
+ const searchByName = useCallback(async (request)=>{
1962
+ setIsLoading(true);
1963
+ setError(null);
1964
+ try {
1965
+ return await block.tenants.searchByName(request);
1966
+ } catch (err) {
1967
+ const error = err instanceof Error ? err : new Error(String(err));
1968
+ setError(error);
1969
+ throw error;
1970
+ } finally{
1971
+ setIsLoading(false);
1972
+ }
1973
+ }, [
1974
+ block.tenants
1975
+ ]);
1976
+ const searchByCode = useCallback(async (request)=>{
1977
+ setIsLoading(true);
1978
+ setError(null);
1979
+ try {
1980
+ return await block.tenants.searchByCode(request);
1981
+ } catch (err) {
1982
+ const error = err instanceof Error ? err : new Error(String(err));
1983
+ setError(error);
1984
+ throw error;
1985
+ } finally{
1986
+ setIsLoading(false);
1987
+ }
1988
+ }, [
1989
+ block.tenants
1990
+ ]);
1991
+ const createTenantUser = useCallback(async (userUniqueId, request)=>{
1992
+ setIsLoading(true);
1993
+ setError(null);
1994
+ try {
1995
+ return await block.tenants.createTenantUser(userUniqueId, request);
1996
+ } catch (err) {
1997
+ const error = err instanceof Error ? err : new Error(String(err));
1998
+ setError(error);
1999
+ throw error;
2000
+ } finally{
2001
+ setIsLoading(false);
2002
+ }
2003
+ }, [
2004
+ block.tenants
2005
+ ]);
2006
+ const updateOnboarding = useCallback(async (userUniqueId, urlId, request)=>{
2007
+ setIsLoading(true);
2008
+ setError(null);
2009
+ try {
2010
+ return await block.tenants.updateOnboarding(userUniqueId, urlId, request);
2011
+ } catch (err) {
2012
+ const error = err instanceof Error ? err : new Error(String(err));
2013
+ setError(error);
2014
+ throw error;
2015
+ } finally{
2016
+ setIsLoading(false);
2017
+ }
2018
+ }, [
2019
+ block.tenants
2020
+ ]);
2021
+ const updateSales = useCallback(async (userUniqueId, urlId, request)=>{
2022
+ setIsLoading(true);
2023
+ setError(null);
2024
+ try {
2025
+ return await block.tenants.updateSales(userUniqueId, urlId, request);
2026
+ } catch (err) {
2027
+ const error = err instanceof Error ? err : new Error(String(err));
2028
+ setError(error);
2029
+ throw error;
2030
+ } finally{
2031
+ setIsLoading(false);
2032
+ }
2033
+ }, [
2034
+ block.tenants
2035
+ ]);
2036
+ const clearError = useCallback(()=>{
2037
+ setError(null);
2038
+ }, []);
2039
+ return {
2040
+ tenants,
2041
+ isLoading,
2042
+ error,
2043
+ listChildren,
2044
+ validateCode,
2045
+ searchByName,
2046
+ searchByCode,
2047
+ createTenantUser,
2048
+ updateOnboarding,
2049
+ updateSales,
1207
2050
  clearError
1208
2051
  };
1209
2052
  }
@@ -1436,4 +2279,4 @@ function useUniversityBlock() {
1436
2279
  };
1437
2280
  }
1438
2281
 
1439
- export { Blocks23Provider, Provider, SimpleBlocks23Provider, use23Blocks, useAssetsBlock, useAuth$1 as useAuth, useAuth as useAuthState, useAuthenticationBlock, useCampaignsBlock, useClient, useCompanyBlock, useContentBlock, useConversationsBlock, useCrmBlock, useFavorites, useFilesBlock, useFormsBlock, useGeolocationBlock, useJarvisBlock, useOnboardingBlock, useProductsBlock, useRewardsBlock, useSalesBlock, useSearch, useSearchBlock, useSimpleAuth, useSimpleBlocks23, useUniversityBlock, useUsers, useWalletBlock };
2282
+ export { Blocks23Provider, Provider, SimpleBlocks23Provider, use23Blocks, useAssetsBlock, useAuth, useAuthenticationBlock, useAvatars, useCampaignsBlock, useClient, useCompanyBlock, useContentBlock, useConversationsBlock, useCrmBlock, useFavorites, useFilesBlock, useFormsBlock, useGeolocationBlock, useJarvisBlock, useMfa, useOAuth, useOnboardingBlock, useProductsBlock, useRewardsBlock, useSalesBlock, useSearch, useSearchBlock, useSimpleAuth, useSimpleBlocks23, useTenants, useUniversityBlock, useUsers, useWalletBlock };