@23blocks/react 3.1.0 → 4.0.1

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,30 @@ 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)=>{
1052
+ setIsLoading(true);
1053
+ setError(null);
1054
+ try {
1055
+ return await block.users.getByUniqueId(uniqueId);
1056
+ } catch (err) {
1057
+ const error = err instanceof Error ? err : new Error(String(err));
1058
+ setError(error);
1059
+ throw error;
1060
+ } finally{
1061
+ setIsLoading(false);
1062
+ }
1063
+ }, [
1064
+ block.users
1065
+ ]);
1066
+ const updateUser = useCallback(async (id, request)=>{
1018
1067
  setIsLoading(true);
1019
1068
  setError(null);
1020
1069
  try {
1021
- await block.auth.signOut();
1022
- setUser(null);
1070
+ const updated = await block.users.update(id, request);
1071
+ setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
1072
+ return updated;
1023
1073
  } catch (err) {
1024
1074
  const error = err instanceof Error ? err : new Error(String(err));
1025
1075
  setError(error);
@@ -1028,13 +1078,13 @@ function useUniversityBlock() {
1028
1078
  setIsLoading(false);
1029
1079
  }
1030
1080
  }, [
1031
- block.auth
1081
+ block.users
1032
1082
  ]);
1033
- const requestPasswordReset = useCallback(async (request)=>{
1083
+ const updateUserProfile = useCallback(async (userId, request)=>{
1034
1084
  setIsLoading(true);
1035
1085
  setError(null);
1036
1086
  try {
1037
- await block.auth.requestPasswordReset(request);
1087
+ return await block.users.updateProfile(userId, request);
1038
1088
  } catch (err) {
1039
1089
  const error = err instanceof Error ? err : new Error(String(err));
1040
1090
  setError(error);
@@ -1043,13 +1093,14 @@ function useUniversityBlock() {
1043
1093
  setIsLoading(false);
1044
1094
  }
1045
1095
  }, [
1046
- block.auth
1096
+ block.users
1047
1097
  ]);
1048
- const updatePassword = useCallback(async (request)=>{
1098
+ const deleteUser = useCallback(async (id)=>{
1049
1099
  setIsLoading(true);
1050
1100
  setError(null);
1051
1101
  try {
1052
- await block.auth.updatePassword(request);
1102
+ await block.users.delete(id);
1103
+ setUsers((prev)=>prev.filter((u)=>u.id !== id));
1053
1104
  } catch (err) {
1054
1105
  const error = err instanceof Error ? err : new Error(String(err));
1055
1106
  setError(error);
@@ -1058,14 +1109,15 @@ function useUniversityBlock() {
1058
1109
  setIsLoading(false);
1059
1110
  }
1060
1111
  }, [
1061
- block.auth
1112
+ block.users
1062
1113
  ]);
1063
- const refreshUser = useCallback(async ()=>{
1114
+ const activateUser = useCallback(async (id)=>{
1064
1115
  setIsLoading(true);
1065
1116
  setError(null);
1066
1117
  try {
1067
- const currentUser = await block.auth.getCurrentUser();
1068
- setUser(currentUser);
1118
+ const activated = await block.users.activate(id);
1119
+ setUsers((prev)=>prev.map((u)=>u.id === id ? activated : u));
1120
+ return activated;
1069
1121
  } catch (err) {
1070
1122
  const error = err instanceof Error ? err : new Error(String(err));
1071
1123
  setError(error);
@@ -1074,13 +1126,15 @@ function useUniversityBlock() {
1074
1126
  setIsLoading(false);
1075
1127
  }
1076
1128
  }, [
1077
- block.auth
1129
+ block.users
1078
1130
  ]);
1079
- const refreshToken = useCallback(async (request)=>{
1131
+ const deactivateUser = useCallback(async (id)=>{
1080
1132
  setIsLoading(true);
1081
1133
  setError(null);
1082
1134
  try {
1083
- return await block.auth.refreshToken(request);
1135
+ const deactivated = await block.users.deactivate(id);
1136
+ setUsers((prev)=>prev.map((u)=>u.id === id ? deactivated : u));
1137
+ return deactivated;
1084
1138
  } catch (err) {
1085
1139
  const error = err instanceof Error ? err : new Error(String(err));
1086
1140
  setError(error);
@@ -1089,13 +1143,15 @@ function useUniversityBlock() {
1089
1143
  setIsLoading(false);
1090
1144
  }
1091
1145
  }, [
1092
- block.auth
1146
+ block.users
1093
1147
  ]);
1094
- const requestMagicLink = useCallback(async (request)=>{
1148
+ const changeUserRole = useCallback(async (id, roleUniqueId, reason, forceReauth)=>{
1095
1149
  setIsLoading(true);
1096
1150
  setError(null);
1097
1151
  try {
1098
- await block.auth.requestMagicLink(request);
1152
+ const updated = await block.users.changeRole(id, roleUniqueId, reason, forceReauth);
1153
+ setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
1154
+ return updated;
1099
1155
  } catch (err) {
1100
1156
  const error = err instanceof Error ? err : new Error(String(err));
1101
1157
  setError(error);
@@ -1104,15 +1160,15 @@ function useUniversityBlock() {
1104
1160
  setIsLoading(false);
1105
1161
  }
1106
1162
  }, [
1107
- block.auth
1163
+ block.users
1108
1164
  ]);
1109
- const verifyMagicLink = useCallback(async (request)=>{
1165
+ const searchUsers = useCallback(async (query, params)=>{
1110
1166
  setIsLoading(true);
1111
1167
  setError(null);
1112
1168
  try {
1113
- const response = await block.auth.verifyMagicLink(request);
1114
- setUser(response.user);
1115
- return response;
1169
+ const result = await block.users.search(query, params);
1170
+ setUsers(result.data);
1171
+ return result;
1116
1172
  } catch (err) {
1117
1173
  const error = err instanceof Error ? err : new Error(String(err));
1118
1174
  setError(error);
@@ -1121,13 +1177,15 @@ function useUniversityBlock() {
1121
1177
  setIsLoading(false);
1122
1178
  }
1123
1179
  }, [
1124
- block.auth
1180
+ block.users
1125
1181
  ]);
1126
- const sendInvitation = useCallback(async (request)=>{
1182
+ const searchUsersAdvanced = useCallback(async (request, params)=>{
1127
1183
  setIsLoading(true);
1128
1184
  setError(null);
1129
1185
  try {
1130
- await block.auth.sendInvitation(request);
1186
+ const result = await block.users.searchAdvanced(request, params);
1187
+ setUsers(result.data);
1188
+ return result;
1131
1189
  } catch (err) {
1132
1190
  const error = err instanceof Error ? err : new Error(String(err));
1133
1191
  setError(error);
@@ -1136,15 +1194,28 @@ function useUniversityBlock() {
1136
1194
  setIsLoading(false);
1137
1195
  }
1138
1196
  }, [
1139
- block.auth
1197
+ block.users
1140
1198
  ]);
1141
- const acceptInvitation = useCallback(async (request)=>{
1199
+ const getUserProfile = useCallback(async (userUniqueId)=>{
1142
1200
  setIsLoading(true);
1143
1201
  setError(null);
1144
1202
  try {
1145
- const response = await block.auth.acceptInvitation(request);
1146
- setUser(response.user);
1147
- return response;
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);
1148
1219
  } catch (err) {
1149
1220
  const error = err instanceof Error ? err : new Error(String(err));
1150
1221
  setError(error);
@@ -1153,15 +1224,13 @@ function useUniversityBlock() {
1153
1224
  setIsLoading(false);
1154
1225
  }
1155
1226
  }, [
1156
- block.auth
1227
+ block.users
1157
1228
  ]);
1158
- const confirmEmail = useCallback(async (token)=>{
1229
+ const updateUserEmail = useCallback(async (userUniqueId, request)=>{
1159
1230
  setIsLoading(true);
1160
1231
  setError(null);
1161
1232
  try {
1162
- const confirmedUser = await block.auth.confirmEmail(token);
1163
- setUser(confirmedUser);
1164
- return confirmedUser;
1233
+ return await block.users.updateEmail(userUniqueId, request);
1165
1234
  } catch (err) {
1166
1235
  const error = err instanceof Error ? err : new Error(String(err));
1167
1236
  setError(error);
@@ -1170,13 +1239,13 @@ function useUniversityBlock() {
1170
1239
  setIsLoading(false);
1171
1240
  }
1172
1241
  }, [
1173
- block.auth
1242
+ block.users
1174
1243
  ]);
1175
- const resendConfirmation = useCallback(async (request)=>{
1244
+ const getUserDevices = useCallback(async (userUniqueId, params)=>{
1176
1245
  setIsLoading(true);
1177
1246
  setError(null);
1178
1247
  try {
1179
- await block.auth.resendConfirmation(request);
1248
+ return await block.users.getDevices(userUniqueId, params);
1180
1249
  } catch (err) {
1181
1250
  const error = err instanceof Error ? err : new Error(String(err));
1182
1251
  setError(error);
@@ -1185,13 +1254,13 @@ function useUniversityBlock() {
1185
1254
  setIsLoading(false);
1186
1255
  }
1187
1256
  }, [
1188
- block.auth
1257
+ block.users
1189
1258
  ]);
1190
- const validateEmail = useCallback(async (request)=>{
1259
+ const addUserDevice = useCallback(async (request)=>{
1191
1260
  setIsLoading(true);
1192
1261
  setError(null);
1193
1262
  try {
1194
- return await block.auth.validateEmail(request);
1263
+ return await block.users.addDevice(request);
1195
1264
  } catch (err) {
1196
1265
  const error = err instanceof Error ? err : new Error(String(err));
1197
1266
  setError(error);
@@ -1200,13 +1269,13 @@ function useUniversityBlock() {
1200
1269
  setIsLoading(false);
1201
1270
  }
1202
1271
  }, [
1203
- block.auth
1272
+ block.users
1204
1273
  ]);
1205
- const validateDocument = useCallback(async (request)=>{
1274
+ const getUserCompanies = useCallback(async (userUniqueId)=>{
1206
1275
  setIsLoading(true);
1207
1276
  setError(null);
1208
1277
  try {
1209
- return await block.auth.validateDocument(request);
1278
+ return await block.users.getCompanies(userUniqueId);
1210
1279
  } catch (err) {
1211
1280
  const error = err instanceof Error ? err : new Error(String(err));
1212
1281
  setError(error);
@@ -1215,13 +1284,13 @@ function useUniversityBlock() {
1215
1284
  setIsLoading(false);
1216
1285
  }
1217
1286
  }, [
1218
- block.auth
1287
+ block.users
1219
1288
  ]);
1220
- const resendInvitation = useCallback(async (request)=>{
1289
+ const addUserSubscription = useCallback(async (userUniqueId, request)=>{
1221
1290
  setIsLoading(true);
1222
1291
  setError(null);
1223
1292
  try {
1224
- return await block.auth.resendInvitation(request);
1293
+ return await block.users.addSubscription(userUniqueId, request);
1225
1294
  } catch (err) {
1226
1295
  const error = err instanceof Error ? err : new Error(String(err));
1227
1296
  setError(error);
@@ -1230,13 +1299,13 @@ function useUniversityBlock() {
1230
1299
  setIsLoading(false);
1231
1300
  }
1232
1301
  }, [
1233
- block.auth
1302
+ block.users
1234
1303
  ]);
1235
- const requestAccountRecovery = useCallback(async (request)=>{
1304
+ const updateUserSubscription = useCallback(async (userUniqueId, request)=>{
1236
1305
  setIsLoading(true);
1237
1306
  setError(null);
1238
1307
  try {
1239
- return await block.auth.requestAccountRecovery(request);
1308
+ return await block.users.updateSubscription(userUniqueId, request);
1240
1309
  } catch (err) {
1241
1310
  const error = err instanceof Error ? err : new Error(String(err));
1242
1311
  setError(error);
@@ -1245,15 +1314,13 @@ function useUniversityBlock() {
1245
1314
  setIsLoading(false);
1246
1315
  }
1247
1316
  }, [
1248
- block.auth
1317
+ block.users
1249
1318
  ]);
1250
- const completeAccountRecovery = useCallback(async (request)=>{
1319
+ const resendConfirmationByUniqueId = useCallback(async (userUniqueId)=>{
1251
1320
  setIsLoading(true);
1252
1321
  setError(null);
1253
1322
  try {
1254
- const recoveredUser = await block.auth.completeAccountRecovery(request);
1255
- setUser(recoveredUser);
1256
- return recoveredUser;
1323
+ await block.users.resendConfirmationByUniqueId(userUniqueId);
1257
1324
  } catch (err) {
1258
1325
  const error = err instanceof Error ? err : new Error(String(err));
1259
1326
  setError(error);
@@ -1262,36 +1329,35 @@ function useUniversityBlock() {
1262
1329
  setIsLoading(false);
1263
1330
  }
1264
1331
  }, [
1265
- block.auth
1332
+ block.users
1266
1333
  ]);
1267
1334
  const clearError = useCallback(()=>{
1268
1335
  setError(null);
1269
1336
  }, []);
1270
1337
  return {
1271
- // State
1272
- user,
1338
+ users,
1273
1339
  isLoading,
1274
1340
  error,
1275
- isAuthenticated: user !== null,
1276
- // Actions
1277
- signIn,
1278
- signUp,
1279
- signOut,
1280
- requestPasswordReset,
1281
- updatePassword,
1282
- refreshUser,
1283
- refreshToken,
1284
- requestMagicLink,
1285
- verifyMagicLink,
1286
- sendInvitation,
1287
- acceptInvitation,
1288
- confirmEmail,
1289
- resendConfirmation,
1290
- validateEmail,
1291
- validateDocument,
1292
- resendInvitation,
1293
- requestAccountRecovery,
1294
- completeAccountRecovery,
1341
+ listUsers,
1342
+ getUser,
1343
+ getUserByUniqueId,
1344
+ updateUser,
1345
+ updateUserProfile,
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,
1295
1361
  clearError
1296
1362
  };
1297
1363
  }
@@ -1300,40 +1366,49 @@ function useUniversityBlock() {
1300
1366
  // Hook
1301
1367
  // ─────────────────────────────────────────────────────────────────────────────
1302
1368
  /**
1303
- * Hook for user management operations.
1369
+ * Hook for Multi-Factor Authentication operations.
1304
1370
  *
1305
1371
  * @example
1306
1372
  * ```tsx
1307
- * function UserList() {
1308
- * const { users, listUsers, isLoading, error } = useUsers();
1373
+ * function MfaSettings() {
1374
+ * const { setup, enable, disable, getStatus, status, isLoading, error } = useMfa();
1309
1375
  *
1310
1376
  * useEffect(() => {
1311
- * listUsers({ page: 1, perPage: 20 });
1312
- * }, [listUsers]);
1377
+ * getStatus();
1378
+ * }, [getStatus]);
1313
1379
  *
1314
- * if (isLoading) return <Spinner />;
1315
- * if (error) return <Error message={error.message} />;
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
+ * };
1316
1388
  *
1317
1389
  * return (
1318
- * <ul>
1319
- * {users.map(user => (
1320
- * <li key={user.id}>{user.email}</li>
1321
- * ))}
1322
- * </ul>
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>
1323
1397
  * );
1324
1398
  * }
1325
1399
  * ```
1326
- */ function useUsers() {
1400
+ */ function useMfa() {
1327
1401
  const block = useAuthenticationBlock();
1328
- const [users, setUsers] = useState([]);
1329
1402
  const [isLoading, setIsLoading] = useState(false);
1330
1403
  const [error, setError] = useState(null);
1331
- const listUsers = useCallback(async (params)=>{
1404
+ const [status, setStatus] = useState(null);
1405
+ const [setupData, setSetupData] = useState(null);
1406
+ const setup = useCallback(async ()=>{
1332
1407
  setIsLoading(true);
1333
1408
  setError(null);
1334
1409
  try {
1335
- const result = await block.users.list(params);
1336
- setUsers(result.data);
1410
+ const result = await block.mfa.setup();
1411
+ setSetupData(result);
1337
1412
  return result;
1338
1413
  } catch (err) {
1339
1414
  const error = err instanceof Error ? err : new Error(String(err));
@@ -1343,13 +1418,18 @@ function useUniversityBlock() {
1343
1418
  setIsLoading(false);
1344
1419
  }
1345
1420
  }, [
1346
- block.users
1421
+ block.mfa
1347
1422
  ]);
1348
- const getUser = useCallback(async (id)=>{
1423
+ const enable = useCallback(async (request)=>{
1349
1424
  setIsLoading(true);
1350
1425
  setError(null);
1351
1426
  try {
1352
- return await block.users.get(id);
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;
1353
1433
  } catch (err) {
1354
1434
  const error = err instanceof Error ? err : new Error(String(err));
1355
1435
  setError(error);
@@ -1358,13 +1438,17 @@ function useUniversityBlock() {
1358
1438
  setIsLoading(false);
1359
1439
  }
1360
1440
  }, [
1361
- block.users
1441
+ block.mfa
1362
1442
  ]);
1363
- const getUserByUniqueId = useCallback(async (uniqueId)=>{
1443
+ const disable = useCallback(async (request)=>{
1364
1444
  setIsLoading(true);
1365
1445
  setError(null);
1366
1446
  try {
1367
- return await block.users.getByUniqueId(uniqueId);
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;
1368
1452
  } catch (err) {
1369
1453
  const error = err instanceof Error ? err : new Error(String(err));
1370
1454
  setError(error);
@@ -1373,15 +1457,13 @@ function useUniversityBlock() {
1373
1457
  setIsLoading(false);
1374
1458
  }
1375
1459
  }, [
1376
- block.users
1460
+ block.mfa
1377
1461
  ]);
1378
- const updateUser = useCallback(async (id, request)=>{
1462
+ const verify = useCallback(async (request)=>{
1379
1463
  setIsLoading(true);
1380
1464
  setError(null);
1381
1465
  try {
1382
- const updated = await block.users.update(id, request);
1383
- setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
1384
- return updated;
1466
+ return await block.mfa.verify(request);
1385
1467
  } catch (err) {
1386
1468
  const error = err instanceof Error ? err : new Error(String(err));
1387
1469
  setError(error);
@@ -1390,13 +1472,15 @@ function useUniversityBlock() {
1390
1472
  setIsLoading(false);
1391
1473
  }
1392
1474
  }, [
1393
- block.users
1475
+ block.mfa
1394
1476
  ]);
1395
- const updateUserProfile = useCallback(async (userId, request)=>{
1477
+ const getStatus = useCallback(async ()=>{
1396
1478
  setIsLoading(true);
1397
1479
  setError(null);
1398
1480
  try {
1399
- return await block.users.updateProfile(userId, request);
1481
+ const result = await block.mfa.status();
1482
+ setStatus(result);
1483
+ return result;
1400
1484
  } catch (err) {
1401
1485
  const error = err instanceof Error ? err : new Error(String(err));
1402
1486
  setError(error);
@@ -1405,14 +1489,64 @@ function useUniversityBlock() {
1405
1489
  setIsLoading(false);
1406
1490
  }
1407
1491
  }, [
1408
- block.users
1492
+ block.mfa
1409
1493
  ]);
1410
- const deleteUser = useCallback(async (id)=>{
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)=>{
1411
1546
  setIsLoading(true);
1412
1547
  setError(null);
1413
1548
  try {
1414
- await block.users.delete(id);
1415
- setUsers((prev)=>prev.filter((u)=>u.id !== id));
1549
+ return await block.oauth.loginWithFacebook(request);
1416
1550
  } catch (err) {
1417
1551
  const error = err instanceof Error ? err : new Error(String(err));
1418
1552
  setError(error);
@@ -1421,15 +1555,13 @@ function useUniversityBlock() {
1421
1555
  setIsLoading(false);
1422
1556
  }
1423
1557
  }, [
1424
- block.users
1558
+ block.oauth
1425
1559
  ]);
1426
- const activateUser = useCallback(async (id)=>{
1560
+ const loginWithGoogle = useCallback(async (request)=>{
1427
1561
  setIsLoading(true);
1428
1562
  setError(null);
1429
1563
  try {
1430
- const activated = await block.users.activate(id);
1431
- setUsers((prev)=>prev.map((u)=>u.id === id ? activated : u));
1432
- return activated;
1564
+ return await block.oauth.loginWithGoogle(request);
1433
1565
  } catch (err) {
1434
1566
  const error = err instanceof Error ? err : new Error(String(err));
1435
1567
  setError(error);
@@ -1438,15 +1570,13 @@ function useUniversityBlock() {
1438
1570
  setIsLoading(false);
1439
1571
  }
1440
1572
  }, [
1441
- block.users
1573
+ block.oauth
1442
1574
  ]);
1443
- const deactivateUser = useCallback(async (id)=>{
1575
+ const loginWithTenant = useCallback(async (request)=>{
1444
1576
  setIsLoading(true);
1445
1577
  setError(null);
1446
1578
  try {
1447
- const deactivated = await block.users.deactivate(id);
1448
- setUsers((prev)=>prev.map((u)=>u.id === id ? deactivated : u));
1449
- return deactivated;
1579
+ return await block.oauth.loginWithTenant(request);
1450
1580
  } catch (err) {
1451
1581
  const error = err instanceof Error ? err : new Error(String(err));
1452
1582
  setError(error);
@@ -1455,15 +1585,13 @@ function useUniversityBlock() {
1455
1585
  setIsLoading(false);
1456
1586
  }
1457
1587
  }, [
1458
- block.users
1588
+ block.oauth
1459
1589
  ]);
1460
- const changeUserRole = useCallback(async (id, roleUniqueId, reason, forceReauth)=>{
1590
+ const introspectToken = useCallback(async (token)=>{
1461
1591
  setIsLoading(true);
1462
1592
  setError(null);
1463
1593
  try {
1464
- const updated = await block.users.changeRole(id, roleUniqueId, reason, forceReauth);
1465
- setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
1466
- return updated;
1594
+ return await block.oauth.introspectToken(token);
1467
1595
  } catch (err) {
1468
1596
  const error = err instanceof Error ? err : new Error(String(err));
1469
1597
  setError(error);
@@ -1472,14 +1600,44 @@ function useUniversityBlock() {
1472
1600
  setIsLoading(false);
1473
1601
  }
1474
1602
  }, [
1475
- block.users
1603
+ block.oauth
1476
1604
  ]);
1477
- const searchUsers = useCallback(async (query, params)=>{
1605
+ const revokeToken = useCallback(async (request)=>{
1478
1606
  setIsLoading(true);
1479
1607
  setError(null);
1480
1608
  try {
1481
- const result = await block.users.search(query, params);
1482
- setUsers(result.data);
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);
1483
1641
  return result;
1484
1642
  } catch (err) {
1485
1643
  const error = err instanceof Error ? err : new Error(String(err));
@@ -1489,14 +1647,104 @@ function useUniversityBlock() {
1489
1647
  setIsLoading(false);
1490
1648
  }
1491
1649
  }, [
1492
- block.users
1650
+ block.oauth
1493
1651
  ]);
1494
- const searchUsersAdvanced = useCallback(async (request, params)=>{
1652
+ const revokeTenantContext = useCallback(async ()=>{
1495
1653
  setIsLoading(true);
1496
1654
  setError(null);
1497
1655
  try {
1498
- const result = await block.users.searchAdvanced(request, params);
1499
- setUsers(result.data);
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);
1500
1748
  return result;
1501
1749
  } catch (err) {
1502
1750
  const error = err instanceof Error ? err : new Error(String(err));
@@ -1506,13 +1754,15 @@ function useUniversityBlock() {
1506
1754
  setIsLoading(false);
1507
1755
  }
1508
1756
  }, [
1509
- block.users
1757
+ block.avatars
1510
1758
  ]);
1511
- const getUserProfile = useCallback(async (userUniqueId)=>{
1759
+ const get = useCallback(async (userUniqueId)=>{
1512
1760
  setIsLoading(true);
1513
1761
  setError(null);
1514
1762
  try {
1515
- return await block.users.getProfile(userUniqueId);
1763
+ const result = await block.avatars.get(userUniqueId);
1764
+ setCurrentAvatar(result);
1765
+ return result;
1516
1766
  } catch (err) {
1517
1767
  const error = err instanceof Error ? err : new Error(String(err));
1518
1768
  setError(error);
@@ -1521,13 +1771,19 @@ function useUniversityBlock() {
1521
1771
  setIsLoading(false);
1522
1772
  }
1523
1773
  }, [
1524
- block.users
1774
+ block.avatars
1525
1775
  ]);
1526
- const createUserProfile = useCallback(async (request)=>{
1776
+ const create = useCallback(async (userUniqueId, request)=>{
1527
1777
  setIsLoading(true);
1528
1778
  setError(null);
1529
1779
  try {
1530
- return await block.users.createProfile(request);
1780
+ const result = await block.avatars.create(userUniqueId, request);
1781
+ setCurrentAvatar(result);
1782
+ setAvatars((prev)=>[
1783
+ ...prev,
1784
+ result
1785
+ ]);
1786
+ return result;
1531
1787
  } catch (err) {
1532
1788
  const error = err instanceof Error ? err : new Error(String(err));
1533
1789
  setError(error);
@@ -1536,13 +1792,16 @@ function useUniversityBlock() {
1536
1792
  setIsLoading(false);
1537
1793
  }
1538
1794
  }, [
1539
- block.users
1795
+ block.avatars
1540
1796
  ]);
1541
- const updateUserEmail = useCallback(async (userUniqueId, request)=>{
1797
+ const update = useCallback(async (userUniqueId, request)=>{
1542
1798
  setIsLoading(true);
1543
1799
  setError(null);
1544
1800
  try {
1545
- return await block.users.updateEmail(userUniqueId, request);
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;
1546
1805
  } catch (err) {
1547
1806
  const error = err instanceof Error ? err : new Error(String(err));
1548
1807
  setError(error);
@@ -1551,13 +1810,15 @@ function useUniversityBlock() {
1551
1810
  setIsLoading(false);
1552
1811
  }
1553
1812
  }, [
1554
- block.users
1813
+ block.avatars
1555
1814
  ]);
1556
- const getUserDevices = useCallback(async (userUniqueId, params)=>{
1815
+ const remove = useCallback(async (userUniqueId)=>{
1557
1816
  setIsLoading(true);
1558
1817
  setError(null);
1559
1818
  try {
1560
- return await block.users.getDevices(userUniqueId, params);
1819
+ await block.avatars.delete(userUniqueId);
1820
+ setCurrentAvatar(null);
1821
+ setAvatars((prev)=>prev.filter((a)=>a.userUniqueId !== userUniqueId));
1561
1822
  } catch (err) {
1562
1823
  const error = err instanceof Error ? err : new Error(String(err));
1563
1824
  setError(error);
@@ -1566,13 +1827,13 @@ function useUniversityBlock() {
1566
1827
  setIsLoading(false);
1567
1828
  }
1568
1829
  }, [
1569
- block.users
1830
+ block.avatars
1570
1831
  ]);
1571
- const addUserDevice = useCallback(async (request)=>{
1832
+ const presignUpload = useCallback(async (userUniqueId, filename)=>{
1572
1833
  setIsLoading(true);
1573
1834
  setError(null);
1574
1835
  try {
1575
- return await block.users.addDevice(request);
1836
+ return await block.avatars.presignUpload(userUniqueId, filename);
1576
1837
  } catch (err) {
1577
1838
  const error = err instanceof Error ? err : new Error(String(err));
1578
1839
  setError(error);
@@ -1581,13 +1842,13 @@ function useUniversityBlock() {
1581
1842
  setIsLoading(false);
1582
1843
  }
1583
1844
  }, [
1584
- block.users
1845
+ block.avatars
1585
1846
  ]);
1586
- const getUserCompanies = useCallback(async (userUniqueId)=>{
1847
+ const multipartPresign = useCallback(async (userUniqueId, request)=>{
1587
1848
  setIsLoading(true);
1588
1849
  setError(null);
1589
1850
  try {
1590
- return await block.users.getCompanies(userUniqueId);
1851
+ return await block.avatars.multipartPresign(userUniqueId, request);
1591
1852
  } catch (err) {
1592
1853
  const error = err instanceof Error ? err : new Error(String(err));
1593
1854
  setError(error);
@@ -1596,13 +1857,13 @@ function useUniversityBlock() {
1596
1857
  setIsLoading(false);
1597
1858
  }
1598
1859
  }, [
1599
- block.users
1860
+ block.avatars
1600
1861
  ]);
1601
- const addUserSubscription = useCallback(async (userUniqueId, request)=>{
1862
+ const multipartComplete = useCallback(async (userUniqueId, request)=>{
1602
1863
  setIsLoading(true);
1603
1864
  setError(null);
1604
1865
  try {
1605
- return await block.users.addSubscription(userUniqueId, request);
1866
+ return await block.avatars.multipartComplete(userUniqueId, request);
1606
1867
  } catch (err) {
1607
1868
  const error = err instanceof Error ? err : new Error(String(err));
1608
1869
  setError(error);
@@ -1611,13 +1872,67 @@ function useUniversityBlock() {
1611
1872
  setIsLoading(false);
1612
1873
  }
1613
1874
  }, [
1614
- block.users
1875
+ block.avatars
1615
1876
  ]);
1616
- const updateUserSubscription = useCallback(async (userUniqueId, request)=>{
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)=>{
1617
1930
  setIsLoading(true);
1618
1931
  setError(null);
1619
1932
  try {
1620
- return await block.users.updateSubscription(userUniqueId, request);
1933
+ const result = await block.tenants.listChildren(params);
1934
+ setTenants(result.data);
1935
+ return result;
1621
1936
  } catch (err) {
1622
1937
  const error = err instanceof Error ? err : new Error(String(err));
1623
1938
  setError(error);
@@ -1626,13 +1941,13 @@ function useUniversityBlock() {
1626
1941
  setIsLoading(false);
1627
1942
  }
1628
1943
  }, [
1629
- block.users
1944
+ block.tenants
1630
1945
  ]);
1631
- const resendConfirmationByUniqueId = useCallback(async (userUniqueId)=>{
1946
+ const validateCode = useCallback(async (request)=>{
1632
1947
  setIsLoading(true);
1633
1948
  setError(null);
1634
1949
  try {
1635
- await block.users.resendConfirmationByUniqueId(userUniqueId);
1950
+ return await block.tenants.validateCode(request);
1636
1951
  } catch (err) {
1637
1952
  const error = err instanceof Error ? err : new Error(String(err));
1638
1953
  setError(error);
@@ -1641,35 +1956,97 @@ function useUniversityBlock() {
1641
1956
  setIsLoading(false);
1642
1957
  }
1643
1958
  }, [
1644
- block.users
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
1645
2035
  ]);
1646
2036
  const clearError = useCallback(()=>{
1647
2037
  setError(null);
1648
2038
  }, []);
1649
2039
  return {
1650
- users,
2040
+ tenants,
1651
2041
  isLoading,
1652
2042
  error,
1653
- listUsers,
1654
- getUser,
1655
- getUserByUniqueId,
1656
- updateUser,
1657
- updateUserProfile,
1658
- deleteUser,
1659
- activateUser,
1660
- deactivateUser,
1661
- changeUserRole,
1662
- searchUsers,
1663
- searchUsersAdvanced,
1664
- getUserProfile,
1665
- createUserProfile,
1666
- updateUserEmail,
1667
- getUserDevices,
1668
- addUserDevice,
1669
- getUserCompanies,
1670
- addUserSubscription,
1671
- updateUserSubscription,
1672
- resendConfirmationByUniqueId,
2043
+ listChildren,
2044
+ validateCode,
2045
+ searchByName,
2046
+ searchByCode,
2047
+ createTenantUser,
2048
+ updateOnboarding,
2049
+ updateSales,
1673
2050
  clearError
1674
2051
  };
1675
2052
  }
@@ -1902,4 +2279,4 @@ function useUniversityBlock() {
1902
2279
  };
1903
2280
  }
1904
2281
 
1905
- 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 };