@23blocks/react 3.1.0 → 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
|
|
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
|
-
|
|
746
|
-
|
|
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
|
|
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
|
|
991
|
+
* Hook for user management operations.
|
|
948
992
|
*
|
|
949
993
|
* @example
|
|
950
994
|
* ```tsx
|
|
951
|
-
* function
|
|
952
|
-
* const {
|
|
995
|
+
* function UserList() {
|
|
996
|
+
* const { users, listUsers, isLoading, error } = useUsers();
|
|
953
997
|
*
|
|
954
|
-
*
|
|
955
|
-
*
|
|
956
|
-
*
|
|
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 (
|
|
965
|
-
*
|
|
966
|
-
* }
|
|
1002
|
+
* if (isLoading) return <Spinner />;
|
|
1003
|
+
* if (error) return <Error message={error.message} />;
|
|
967
1004
|
*
|
|
968
1005
|
* return (
|
|
969
|
-
* <
|
|
970
|
-
* {
|
|
971
|
-
*
|
|
972
|
-
*
|
|
973
|
-
*
|
|
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
|
|
1014
|
+
*/ function useUsers() {
|
|
979
1015
|
const block = useAuthenticationBlock();
|
|
980
|
-
const [
|
|
1016
|
+
const [users, setUsers] = useState([]);
|
|
981
1017
|
const [isLoading, setIsLoading] = useState(false);
|
|
982
1018
|
const [error, setError] = useState(null);
|
|
983
|
-
const
|
|
1019
|
+
const listUsers = useCallback(async (params)=>{
|
|
984
1020
|
setIsLoading(true);
|
|
985
1021
|
setError(null);
|
|
986
1022
|
try {
|
|
987
|
-
const
|
|
988
|
-
|
|
989
|
-
return
|
|
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.
|
|
1034
|
+
block.users
|
|
999
1035
|
]);
|
|
1000
|
-
const
|
|
1036
|
+
const getUser = useCallback(async (id)=>{
|
|
1001
1037
|
setIsLoading(true);
|
|
1002
1038
|
setError(null);
|
|
1003
1039
|
try {
|
|
1004
|
-
|
|
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.
|
|
1049
|
+
block.users
|
|
1016
1050
|
]);
|
|
1017
|
-
const
|
|
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.
|
|
1022
|
-
|
|
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.
|
|
1081
|
+
block.users
|
|
1032
1082
|
]);
|
|
1033
|
-
const
|
|
1083
|
+
const updateUserProfile = useCallback(async (userId, request)=>{
|
|
1034
1084
|
setIsLoading(true);
|
|
1035
1085
|
setError(null);
|
|
1036
1086
|
try {
|
|
1037
|
-
await block.
|
|
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.
|
|
1096
|
+
block.users
|
|
1047
1097
|
]);
|
|
1048
|
-
const
|
|
1098
|
+
const deleteUser = useCallback(async (id)=>{
|
|
1049
1099
|
setIsLoading(true);
|
|
1050
1100
|
setError(null);
|
|
1051
1101
|
try {
|
|
1052
|
-
await block.
|
|
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.
|
|
1112
|
+
block.users
|
|
1062
1113
|
]);
|
|
1063
|
-
const
|
|
1114
|
+
const activateUser = useCallback(async (id)=>{
|
|
1064
1115
|
setIsLoading(true);
|
|
1065
1116
|
setError(null);
|
|
1066
1117
|
try {
|
|
1067
|
-
const
|
|
1068
|
-
|
|
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.
|
|
1129
|
+
block.users
|
|
1078
1130
|
]);
|
|
1079
|
-
const
|
|
1131
|
+
const deactivateUser = useCallback(async (id)=>{
|
|
1080
1132
|
setIsLoading(true);
|
|
1081
1133
|
setError(null);
|
|
1082
1134
|
try {
|
|
1083
|
-
|
|
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.
|
|
1146
|
+
block.users
|
|
1093
1147
|
]);
|
|
1094
|
-
const
|
|
1148
|
+
const changeUserRole = useCallback(async (id, roleUniqueId, reason, forceReauth)=>{
|
|
1095
1149
|
setIsLoading(true);
|
|
1096
1150
|
setError(null);
|
|
1097
1151
|
try {
|
|
1098
|
-
await block.
|
|
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.
|
|
1163
|
+
block.users
|
|
1108
1164
|
]);
|
|
1109
|
-
const
|
|
1165
|
+
const searchUsers = useCallback(async (query, params)=>{
|
|
1110
1166
|
setIsLoading(true);
|
|
1111
1167
|
setError(null);
|
|
1112
1168
|
try {
|
|
1113
|
-
const
|
|
1114
|
-
|
|
1115
|
-
return
|
|
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.
|
|
1180
|
+
block.users
|
|
1125
1181
|
]);
|
|
1126
|
-
const
|
|
1182
|
+
const searchUsersAdvanced = useCallback(async (request, params)=>{
|
|
1127
1183
|
setIsLoading(true);
|
|
1128
1184
|
setError(null);
|
|
1129
1185
|
try {
|
|
1130
|
-
await block.
|
|
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.
|
|
1197
|
+
block.users
|
|
1140
1198
|
]);
|
|
1141
|
-
const
|
|
1199
|
+
const getUserProfile = useCallback(async (userUniqueId)=>{
|
|
1142
1200
|
setIsLoading(true);
|
|
1143
1201
|
setError(null);
|
|
1144
1202
|
try {
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
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.
|
|
1227
|
+
block.users
|
|
1157
1228
|
]);
|
|
1158
|
-
const
|
|
1229
|
+
const updateUserEmail = useCallback(async (userUniqueId, request)=>{
|
|
1159
1230
|
setIsLoading(true);
|
|
1160
1231
|
setError(null);
|
|
1161
1232
|
try {
|
|
1162
|
-
|
|
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.
|
|
1242
|
+
block.users
|
|
1174
1243
|
]);
|
|
1175
|
-
const
|
|
1244
|
+
const getUserDevices = useCallback(async (userUniqueId, params)=>{
|
|
1176
1245
|
setIsLoading(true);
|
|
1177
1246
|
setError(null);
|
|
1178
1247
|
try {
|
|
1179
|
-
await block.
|
|
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.
|
|
1257
|
+
block.users
|
|
1189
1258
|
]);
|
|
1190
|
-
const
|
|
1259
|
+
const addUserDevice = useCallback(async (request)=>{
|
|
1191
1260
|
setIsLoading(true);
|
|
1192
1261
|
setError(null);
|
|
1193
1262
|
try {
|
|
1194
|
-
return await block.
|
|
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.
|
|
1272
|
+
block.users
|
|
1204
1273
|
]);
|
|
1205
|
-
const
|
|
1274
|
+
const getUserCompanies = useCallback(async (userUniqueId)=>{
|
|
1206
1275
|
setIsLoading(true);
|
|
1207
1276
|
setError(null);
|
|
1208
1277
|
try {
|
|
1209
|
-
return await block.
|
|
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.
|
|
1287
|
+
block.users
|
|
1219
1288
|
]);
|
|
1220
|
-
const
|
|
1289
|
+
const addUserSubscription = useCallback(async (userUniqueId, request)=>{
|
|
1221
1290
|
setIsLoading(true);
|
|
1222
1291
|
setError(null);
|
|
1223
1292
|
try {
|
|
1224
|
-
return await block.
|
|
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.
|
|
1302
|
+
block.users
|
|
1234
1303
|
]);
|
|
1235
|
-
const
|
|
1304
|
+
const updateUserSubscription = useCallback(async (userUniqueId, request)=>{
|
|
1236
1305
|
setIsLoading(true);
|
|
1237
1306
|
setError(null);
|
|
1238
1307
|
try {
|
|
1239
|
-
return await block.
|
|
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.
|
|
1317
|
+
block.users
|
|
1249
1318
|
]);
|
|
1250
|
-
const
|
|
1319
|
+
const resendConfirmationByUniqueId = useCallback(async (userUniqueId)=>{
|
|
1251
1320
|
setIsLoading(true);
|
|
1252
1321
|
setError(null);
|
|
1253
1322
|
try {
|
|
1254
|
-
|
|
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.
|
|
1332
|
+
block.users
|
|
1266
1333
|
]);
|
|
1267
1334
|
const clearError = useCallback(()=>{
|
|
1268
1335
|
setError(null);
|
|
1269
1336
|
}, []);
|
|
1270
1337
|
return {
|
|
1271
|
-
|
|
1272
|
-
user,
|
|
1338
|
+
users,
|
|
1273
1339
|
isLoading,
|
|
1274
1340
|
error,
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
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
|
|
1369
|
+
* Hook for Multi-Factor Authentication operations.
|
|
1304
1370
|
*
|
|
1305
1371
|
* @example
|
|
1306
1372
|
* ```tsx
|
|
1307
|
-
* function
|
|
1308
|
-
* const {
|
|
1373
|
+
* function MfaSettings() {
|
|
1374
|
+
* const { setup, enable, disable, getStatus, status, isLoading, error } = useMfa();
|
|
1309
1375
|
*
|
|
1310
1376
|
* useEffect(() => {
|
|
1311
|
-
*
|
|
1312
|
-
* }, [
|
|
1377
|
+
* getStatus();
|
|
1378
|
+
* }, [getStatus]);
|
|
1313
1379
|
*
|
|
1314
|
-
*
|
|
1315
|
-
*
|
|
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
|
-
* <
|
|
1319
|
-
* {
|
|
1320
|
-
* <
|
|
1321
|
-
* )
|
|
1322
|
-
*
|
|
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
|
|
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
|
|
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.
|
|
1336
|
-
|
|
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.
|
|
1421
|
+
block.mfa
|
|
1347
1422
|
]);
|
|
1348
|
-
const
|
|
1423
|
+
const enable = useCallback(async (request)=>{
|
|
1349
1424
|
setIsLoading(true);
|
|
1350
1425
|
setError(null);
|
|
1351
1426
|
try {
|
|
1352
|
-
|
|
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.
|
|
1441
|
+
block.mfa
|
|
1362
1442
|
]);
|
|
1363
|
-
const
|
|
1443
|
+
const disable = useCallback(async (request)=>{
|
|
1364
1444
|
setIsLoading(true);
|
|
1365
1445
|
setError(null);
|
|
1366
1446
|
try {
|
|
1367
|
-
|
|
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.
|
|
1460
|
+
block.mfa
|
|
1377
1461
|
]);
|
|
1378
|
-
const
|
|
1462
|
+
const verify = useCallback(async (request)=>{
|
|
1379
1463
|
setIsLoading(true);
|
|
1380
1464
|
setError(null);
|
|
1381
1465
|
try {
|
|
1382
|
-
|
|
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.
|
|
1475
|
+
block.mfa
|
|
1394
1476
|
]);
|
|
1395
|
-
const
|
|
1477
|
+
const getStatus = useCallback(async ()=>{
|
|
1396
1478
|
setIsLoading(true);
|
|
1397
1479
|
setError(null);
|
|
1398
1480
|
try {
|
|
1399
|
-
|
|
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.
|
|
1492
|
+
block.mfa
|
|
1409
1493
|
]);
|
|
1410
|
-
const
|
|
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.
|
|
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.
|
|
1558
|
+
block.oauth
|
|
1425
1559
|
]);
|
|
1426
|
-
const
|
|
1560
|
+
const loginWithGoogle = useCallback(async (request)=>{
|
|
1427
1561
|
setIsLoading(true);
|
|
1428
1562
|
setError(null);
|
|
1429
1563
|
try {
|
|
1430
|
-
|
|
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.
|
|
1573
|
+
block.oauth
|
|
1442
1574
|
]);
|
|
1443
|
-
const
|
|
1575
|
+
const loginWithTenant = useCallback(async (request)=>{
|
|
1444
1576
|
setIsLoading(true);
|
|
1445
1577
|
setError(null);
|
|
1446
1578
|
try {
|
|
1447
|
-
|
|
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.
|
|
1588
|
+
block.oauth
|
|
1459
1589
|
]);
|
|
1460
|
-
const
|
|
1590
|
+
const introspectToken = useCallback(async (token)=>{
|
|
1461
1591
|
setIsLoading(true);
|
|
1462
1592
|
setError(null);
|
|
1463
1593
|
try {
|
|
1464
|
-
|
|
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.
|
|
1603
|
+
block.oauth
|
|
1476
1604
|
]);
|
|
1477
|
-
const
|
|
1605
|
+
const revokeToken = useCallback(async (request)=>{
|
|
1478
1606
|
setIsLoading(true);
|
|
1479
1607
|
setError(null);
|
|
1480
1608
|
try {
|
|
1481
|
-
|
|
1482
|
-
|
|
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.
|
|
1650
|
+
block.oauth
|
|
1493
1651
|
]);
|
|
1494
|
-
const
|
|
1652
|
+
const revokeTenantContext = useCallback(async ()=>{
|
|
1495
1653
|
setIsLoading(true);
|
|
1496
1654
|
setError(null);
|
|
1497
1655
|
try {
|
|
1498
|
-
|
|
1499
|
-
|
|
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.
|
|
1757
|
+
block.avatars
|
|
1510
1758
|
]);
|
|
1511
|
-
const
|
|
1759
|
+
const get = useCallback(async (userUniqueId)=>{
|
|
1512
1760
|
setIsLoading(true);
|
|
1513
1761
|
setError(null);
|
|
1514
1762
|
try {
|
|
1515
|
-
|
|
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.
|
|
1774
|
+
block.avatars
|
|
1525
1775
|
]);
|
|
1526
|
-
const
|
|
1776
|
+
const create = useCallback(async (userUniqueId, request)=>{
|
|
1527
1777
|
setIsLoading(true);
|
|
1528
1778
|
setError(null);
|
|
1529
1779
|
try {
|
|
1530
|
-
|
|
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.
|
|
1795
|
+
block.avatars
|
|
1540
1796
|
]);
|
|
1541
|
-
const
|
|
1797
|
+
const update = useCallback(async (userUniqueId, request)=>{
|
|
1542
1798
|
setIsLoading(true);
|
|
1543
1799
|
setError(null);
|
|
1544
1800
|
try {
|
|
1545
|
-
|
|
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.
|
|
1813
|
+
block.avatars
|
|
1555
1814
|
]);
|
|
1556
|
-
const
|
|
1815
|
+
const remove = useCallback(async (userUniqueId)=>{
|
|
1557
1816
|
setIsLoading(true);
|
|
1558
1817
|
setError(null);
|
|
1559
1818
|
try {
|
|
1560
|
-
|
|
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.
|
|
1830
|
+
block.avatars
|
|
1570
1831
|
]);
|
|
1571
|
-
const
|
|
1832
|
+
const presignUpload = useCallback(async (userUniqueId, filename)=>{
|
|
1572
1833
|
setIsLoading(true);
|
|
1573
1834
|
setError(null);
|
|
1574
1835
|
try {
|
|
1575
|
-
return await block.
|
|
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.
|
|
1845
|
+
block.avatars
|
|
1585
1846
|
]);
|
|
1586
|
-
const
|
|
1847
|
+
const multipartPresign = useCallback(async (userUniqueId, request)=>{
|
|
1587
1848
|
setIsLoading(true);
|
|
1588
1849
|
setError(null);
|
|
1589
1850
|
try {
|
|
1590
|
-
return await block.
|
|
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.
|
|
1860
|
+
block.avatars
|
|
1600
1861
|
]);
|
|
1601
|
-
const
|
|
1862
|
+
const multipartComplete = useCallback(async (userUniqueId, request)=>{
|
|
1602
1863
|
setIsLoading(true);
|
|
1603
1864
|
setError(null);
|
|
1604
1865
|
try {
|
|
1605
|
-
return await block.
|
|
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.
|
|
1875
|
+
block.avatars
|
|
1615
1876
|
]);
|
|
1616
|
-
const
|
|
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
|
-
|
|
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.
|
|
1944
|
+
block.tenants
|
|
1630
1945
|
]);
|
|
1631
|
-
const
|
|
1946
|
+
const validateCode = useCallback(async (request)=>{
|
|
1632
1947
|
setIsLoading(true);
|
|
1633
1948
|
setError(null);
|
|
1634
1949
|
try {
|
|
1635
|
-
await block.
|
|
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.
|
|
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
|
-
|
|
2040
|
+
tenants,
|
|
1651
2041
|
isLoading,
|
|
1652
2042
|
error,
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
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
|
|
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 };
|