@23blocks/react 3.0.4 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +959 -116
- package/dist/src/lib/hooks/index.d.ts +4 -0
- package/dist/src/lib/hooks/index.d.ts.map +1 -1
- package/dist/src/lib/hooks/use-auth.d.ts +13 -1
- package/dist/src/lib/hooks/use-auth.d.ts.map +1 -1
- package/dist/src/lib/hooks/use-avatars.d.ts +53 -0
- package/dist/src/lib/hooks/use-avatars.d.ts.map +1 -0
- package/dist/src/lib/hooks/use-mfa.d.ts +51 -0
- package/dist/src/lib/hooks/use-mfa.d.ts.map +1 -0
- package/dist/src/lib/hooks/use-oauth.d.ts +48 -0
- package/dist/src/lib/hooks/use-oauth.d.ts.map +1 -0
- package/dist/src/lib/hooks/use-tenants.d.ts +45 -0
- package/dist/src/lib/hooks/use-tenants.d.ts.map +1 -0
- package/dist/src/lib/hooks/use-users.d.ts +19 -5
- package/dist/src/lib/hooks/use-users.d.ts.map +1 -1
- package/dist/src/lib/index.d.ts +1 -1
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/simple-provider.d.ts +34 -2
- package/dist/src/lib/simple-provider.d.ts.map +1 -1
- package/package.json +1 -1
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,13 @@ 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)=>{
|
|
1018
1052
|
setIsLoading(true);
|
|
1019
1053
|
setError(null);
|
|
1020
1054
|
try {
|
|
1021
|
-
await block.
|
|
1022
|
-
setUser(null);
|
|
1055
|
+
return await block.users.getByUniqueId(uniqueId);
|
|
1023
1056
|
} catch (err) {
|
|
1024
1057
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1025
1058
|
setError(error);
|
|
@@ -1028,13 +1061,15 @@ function useUniversityBlock() {
|
|
|
1028
1061
|
setIsLoading(false);
|
|
1029
1062
|
}
|
|
1030
1063
|
}, [
|
|
1031
|
-
block.
|
|
1064
|
+
block.users
|
|
1032
1065
|
]);
|
|
1033
|
-
const
|
|
1066
|
+
const updateUser = useCallback(async (id, request)=>{
|
|
1034
1067
|
setIsLoading(true);
|
|
1035
1068
|
setError(null);
|
|
1036
1069
|
try {
|
|
1037
|
-
await block.
|
|
1070
|
+
const updated = await block.users.update(id, request);
|
|
1071
|
+
setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
|
|
1072
|
+
return updated;
|
|
1038
1073
|
} catch (err) {
|
|
1039
1074
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1040
1075
|
setError(error);
|
|
@@ -1043,13 +1078,13 @@ function useUniversityBlock() {
|
|
|
1043
1078
|
setIsLoading(false);
|
|
1044
1079
|
}
|
|
1045
1080
|
}, [
|
|
1046
|
-
block.
|
|
1081
|
+
block.users
|
|
1047
1082
|
]);
|
|
1048
|
-
const
|
|
1083
|
+
const updateUserProfile = useCallback(async (userId, request)=>{
|
|
1049
1084
|
setIsLoading(true);
|
|
1050
1085
|
setError(null);
|
|
1051
1086
|
try {
|
|
1052
|
-
await block.
|
|
1087
|
+
return await block.users.updateProfile(userId, request);
|
|
1053
1088
|
} catch (err) {
|
|
1054
1089
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1055
1090
|
setError(error);
|
|
@@ -1058,14 +1093,14 @@ function useUniversityBlock() {
|
|
|
1058
1093
|
setIsLoading(false);
|
|
1059
1094
|
}
|
|
1060
1095
|
}, [
|
|
1061
|
-
block.
|
|
1096
|
+
block.users
|
|
1062
1097
|
]);
|
|
1063
|
-
const
|
|
1098
|
+
const deleteUser = useCallback(async (id)=>{
|
|
1064
1099
|
setIsLoading(true);
|
|
1065
1100
|
setError(null);
|
|
1066
1101
|
try {
|
|
1067
|
-
|
|
1068
|
-
|
|
1102
|
+
await block.users.delete(id);
|
|
1103
|
+
setUsers((prev)=>prev.filter((u)=>u.id !== id));
|
|
1069
1104
|
} catch (err) {
|
|
1070
1105
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1071
1106
|
setError(error);
|
|
@@ -1074,67 +1109,15 @@ function useUniversityBlock() {
|
|
|
1074
1109
|
setIsLoading(false);
|
|
1075
1110
|
}
|
|
1076
1111
|
}, [
|
|
1077
|
-
block.
|
|
1112
|
+
block.users
|
|
1078
1113
|
]);
|
|
1079
|
-
const
|
|
1080
|
-
setError(null);
|
|
1081
|
-
}, []);
|
|
1082
|
-
return {
|
|
1083
|
-
// State
|
|
1084
|
-
user,
|
|
1085
|
-
isLoading,
|
|
1086
|
-
error,
|
|
1087
|
-
isAuthenticated: user !== null,
|
|
1088
|
-
// Actions
|
|
1089
|
-
signIn,
|
|
1090
|
-
signUp,
|
|
1091
|
-
signOut,
|
|
1092
|
-
requestPasswordReset,
|
|
1093
|
-
updatePassword,
|
|
1094
|
-
refreshUser,
|
|
1095
|
-
clearError
|
|
1096
|
-
};
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1100
|
-
// Hook
|
|
1101
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1102
|
-
/**
|
|
1103
|
-
* Hook for user management operations.
|
|
1104
|
-
*
|
|
1105
|
-
* @example
|
|
1106
|
-
* ```tsx
|
|
1107
|
-
* function UserList() {
|
|
1108
|
-
* const { users, listUsers, isLoading, error } = useUsers();
|
|
1109
|
-
*
|
|
1110
|
-
* useEffect(() => {
|
|
1111
|
-
* listUsers({ page: 1, perPage: 20 });
|
|
1112
|
-
* }, [listUsers]);
|
|
1113
|
-
*
|
|
1114
|
-
* if (isLoading) return <Spinner />;
|
|
1115
|
-
* if (error) return <Error message={error.message} />;
|
|
1116
|
-
*
|
|
1117
|
-
* return (
|
|
1118
|
-
* <ul>
|
|
1119
|
-
* {users.map(user => (
|
|
1120
|
-
* <li key={user.id}>{user.email}</li>
|
|
1121
|
-
* ))}
|
|
1122
|
-
* </ul>
|
|
1123
|
-
* );
|
|
1124
|
-
* }
|
|
1125
|
-
* ```
|
|
1126
|
-
*/ function useUsers() {
|
|
1127
|
-
const block = useAuthenticationBlock();
|
|
1128
|
-
const [users, setUsers] = useState([]);
|
|
1129
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
1130
|
-
const [error, setError] = useState(null);
|
|
1131
|
-
const listUsers = useCallback(async (params)=>{
|
|
1114
|
+
const activateUser = useCallback(async (id)=>{
|
|
1132
1115
|
setIsLoading(true);
|
|
1133
1116
|
setError(null);
|
|
1134
1117
|
try {
|
|
1135
|
-
const
|
|
1136
|
-
setUsers(
|
|
1137
|
-
return
|
|
1118
|
+
const activated = await block.users.activate(id);
|
|
1119
|
+
setUsers((prev)=>prev.map((u)=>u.id === id ? activated : u));
|
|
1120
|
+
return activated;
|
|
1138
1121
|
} catch (err) {
|
|
1139
1122
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1140
1123
|
setError(error);
|
|
@@ -1145,11 +1128,13 @@ function useUniversityBlock() {
|
|
|
1145
1128
|
}, [
|
|
1146
1129
|
block.users
|
|
1147
1130
|
]);
|
|
1148
|
-
const
|
|
1131
|
+
const deactivateUser = useCallback(async (id)=>{
|
|
1149
1132
|
setIsLoading(true);
|
|
1150
1133
|
setError(null);
|
|
1151
1134
|
try {
|
|
1152
|
-
|
|
1135
|
+
const deactivated = await block.users.deactivate(id);
|
|
1136
|
+
setUsers((prev)=>prev.map((u)=>u.id === id ? deactivated : u));
|
|
1137
|
+
return deactivated;
|
|
1153
1138
|
} catch (err) {
|
|
1154
1139
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1155
1140
|
setError(error);
|
|
@@ -1160,11 +1145,11 @@ function useUniversityBlock() {
|
|
|
1160
1145
|
}, [
|
|
1161
1146
|
block.users
|
|
1162
1147
|
]);
|
|
1163
|
-
const
|
|
1148
|
+
const changeUserRole = useCallback(async (id, roleUniqueId, reason, forceReauth)=>{
|
|
1164
1149
|
setIsLoading(true);
|
|
1165
1150
|
setError(null);
|
|
1166
1151
|
try {
|
|
1167
|
-
const updated = await block.users.
|
|
1152
|
+
const updated = await block.users.changeRole(id, roleUniqueId, reason, forceReauth);
|
|
1168
1153
|
setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
|
|
1169
1154
|
return updated;
|
|
1170
1155
|
} catch (err) {
|
|
@@ -1177,12 +1162,165 @@ function useUniversityBlock() {
|
|
|
1177
1162
|
}, [
|
|
1178
1163
|
block.users
|
|
1179
1164
|
]);
|
|
1180
|
-
const
|
|
1165
|
+
const searchUsers = useCallback(async (query, params)=>{
|
|
1181
1166
|
setIsLoading(true);
|
|
1182
1167
|
setError(null);
|
|
1183
1168
|
try {
|
|
1184
|
-
await block.users.
|
|
1185
|
-
setUsers(
|
|
1169
|
+
const result = await block.users.search(query, params);
|
|
1170
|
+
setUsers(result.data);
|
|
1171
|
+
return result;
|
|
1172
|
+
} catch (err) {
|
|
1173
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1174
|
+
setError(error);
|
|
1175
|
+
throw error;
|
|
1176
|
+
} finally{
|
|
1177
|
+
setIsLoading(false);
|
|
1178
|
+
}
|
|
1179
|
+
}, [
|
|
1180
|
+
block.users
|
|
1181
|
+
]);
|
|
1182
|
+
const searchUsersAdvanced = useCallback(async (request, params)=>{
|
|
1183
|
+
setIsLoading(true);
|
|
1184
|
+
setError(null);
|
|
1185
|
+
try {
|
|
1186
|
+
const result = await block.users.searchAdvanced(request, params);
|
|
1187
|
+
setUsers(result.data);
|
|
1188
|
+
return result;
|
|
1189
|
+
} catch (err) {
|
|
1190
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1191
|
+
setError(error);
|
|
1192
|
+
throw error;
|
|
1193
|
+
} finally{
|
|
1194
|
+
setIsLoading(false);
|
|
1195
|
+
}
|
|
1196
|
+
}, [
|
|
1197
|
+
block.users
|
|
1198
|
+
]);
|
|
1199
|
+
const getUserProfile = useCallback(async (userUniqueId)=>{
|
|
1200
|
+
setIsLoading(true);
|
|
1201
|
+
setError(null);
|
|
1202
|
+
try {
|
|
1203
|
+
return await block.users.getProfile(userUniqueId);
|
|
1204
|
+
} catch (err) {
|
|
1205
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1206
|
+
setError(error);
|
|
1207
|
+
throw error;
|
|
1208
|
+
} finally{
|
|
1209
|
+
setIsLoading(false);
|
|
1210
|
+
}
|
|
1211
|
+
}, [
|
|
1212
|
+
block.users
|
|
1213
|
+
]);
|
|
1214
|
+
const createUserProfile = useCallback(async (request)=>{
|
|
1215
|
+
setIsLoading(true);
|
|
1216
|
+
setError(null);
|
|
1217
|
+
try {
|
|
1218
|
+
return await block.users.createProfile(request);
|
|
1219
|
+
} catch (err) {
|
|
1220
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1221
|
+
setError(error);
|
|
1222
|
+
throw error;
|
|
1223
|
+
} finally{
|
|
1224
|
+
setIsLoading(false);
|
|
1225
|
+
}
|
|
1226
|
+
}, [
|
|
1227
|
+
block.users
|
|
1228
|
+
]);
|
|
1229
|
+
const updateUserEmail = useCallback(async (userUniqueId, request)=>{
|
|
1230
|
+
setIsLoading(true);
|
|
1231
|
+
setError(null);
|
|
1232
|
+
try {
|
|
1233
|
+
return await block.users.updateEmail(userUniqueId, request);
|
|
1234
|
+
} catch (err) {
|
|
1235
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1236
|
+
setError(error);
|
|
1237
|
+
throw error;
|
|
1238
|
+
} finally{
|
|
1239
|
+
setIsLoading(false);
|
|
1240
|
+
}
|
|
1241
|
+
}, [
|
|
1242
|
+
block.users
|
|
1243
|
+
]);
|
|
1244
|
+
const getUserDevices = useCallback(async (userUniqueId, params)=>{
|
|
1245
|
+
setIsLoading(true);
|
|
1246
|
+
setError(null);
|
|
1247
|
+
try {
|
|
1248
|
+
return await block.users.getDevices(userUniqueId, params);
|
|
1249
|
+
} catch (err) {
|
|
1250
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1251
|
+
setError(error);
|
|
1252
|
+
throw error;
|
|
1253
|
+
} finally{
|
|
1254
|
+
setIsLoading(false);
|
|
1255
|
+
}
|
|
1256
|
+
}, [
|
|
1257
|
+
block.users
|
|
1258
|
+
]);
|
|
1259
|
+
const addUserDevice = useCallback(async (request)=>{
|
|
1260
|
+
setIsLoading(true);
|
|
1261
|
+
setError(null);
|
|
1262
|
+
try {
|
|
1263
|
+
return await block.users.addDevice(request);
|
|
1264
|
+
} catch (err) {
|
|
1265
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1266
|
+
setError(error);
|
|
1267
|
+
throw error;
|
|
1268
|
+
} finally{
|
|
1269
|
+
setIsLoading(false);
|
|
1270
|
+
}
|
|
1271
|
+
}, [
|
|
1272
|
+
block.users
|
|
1273
|
+
]);
|
|
1274
|
+
const getUserCompanies = useCallback(async (userUniqueId)=>{
|
|
1275
|
+
setIsLoading(true);
|
|
1276
|
+
setError(null);
|
|
1277
|
+
try {
|
|
1278
|
+
return await block.users.getCompanies(userUniqueId);
|
|
1279
|
+
} catch (err) {
|
|
1280
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1281
|
+
setError(error);
|
|
1282
|
+
throw error;
|
|
1283
|
+
} finally{
|
|
1284
|
+
setIsLoading(false);
|
|
1285
|
+
}
|
|
1286
|
+
}, [
|
|
1287
|
+
block.users
|
|
1288
|
+
]);
|
|
1289
|
+
const addUserSubscription = useCallback(async (userUniqueId, request)=>{
|
|
1290
|
+
setIsLoading(true);
|
|
1291
|
+
setError(null);
|
|
1292
|
+
try {
|
|
1293
|
+
return await block.users.addSubscription(userUniqueId, request);
|
|
1294
|
+
} catch (err) {
|
|
1295
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1296
|
+
setError(error);
|
|
1297
|
+
throw error;
|
|
1298
|
+
} finally{
|
|
1299
|
+
setIsLoading(false);
|
|
1300
|
+
}
|
|
1301
|
+
}, [
|
|
1302
|
+
block.users
|
|
1303
|
+
]);
|
|
1304
|
+
const updateUserSubscription = useCallback(async (userUniqueId, request)=>{
|
|
1305
|
+
setIsLoading(true);
|
|
1306
|
+
setError(null);
|
|
1307
|
+
try {
|
|
1308
|
+
return await block.users.updateSubscription(userUniqueId, request);
|
|
1309
|
+
} catch (err) {
|
|
1310
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1311
|
+
setError(error);
|
|
1312
|
+
throw error;
|
|
1313
|
+
} finally{
|
|
1314
|
+
setIsLoading(false);
|
|
1315
|
+
}
|
|
1316
|
+
}, [
|
|
1317
|
+
block.users
|
|
1318
|
+
]);
|
|
1319
|
+
const resendConfirmationByUniqueId = useCallback(async (userUniqueId)=>{
|
|
1320
|
+
setIsLoading(true);
|
|
1321
|
+
setError(null);
|
|
1322
|
+
try {
|
|
1323
|
+
await block.users.resendConfirmationByUniqueId(userUniqueId);
|
|
1186
1324
|
} catch (err) {
|
|
1187
1325
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1188
1326
|
setError(error);
|
|
@@ -1202,8 +1340,713 @@ function useUniversityBlock() {
|
|
|
1202
1340
|
error,
|
|
1203
1341
|
listUsers,
|
|
1204
1342
|
getUser,
|
|
1343
|
+
getUserByUniqueId,
|
|
1205
1344
|
updateUser,
|
|
1345
|
+
updateUserProfile,
|
|
1206
1346
|
deleteUser,
|
|
1347
|
+
activateUser,
|
|
1348
|
+
deactivateUser,
|
|
1349
|
+
changeUserRole,
|
|
1350
|
+
searchUsers,
|
|
1351
|
+
searchUsersAdvanced,
|
|
1352
|
+
getUserProfile,
|
|
1353
|
+
createUserProfile,
|
|
1354
|
+
updateUserEmail,
|
|
1355
|
+
getUserDevices,
|
|
1356
|
+
addUserDevice,
|
|
1357
|
+
getUserCompanies,
|
|
1358
|
+
addUserSubscription,
|
|
1359
|
+
updateUserSubscription,
|
|
1360
|
+
resendConfirmationByUniqueId,
|
|
1361
|
+
clearError
|
|
1362
|
+
};
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1366
|
+
// Hook
|
|
1367
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1368
|
+
/**
|
|
1369
|
+
* Hook for Multi-Factor Authentication operations.
|
|
1370
|
+
*
|
|
1371
|
+
* @example
|
|
1372
|
+
* ```tsx
|
|
1373
|
+
* function MfaSettings() {
|
|
1374
|
+
* const { setup, enable, disable, getStatus, status, isLoading, error } = useMfa();
|
|
1375
|
+
*
|
|
1376
|
+
* useEffect(() => {
|
|
1377
|
+
* getStatus();
|
|
1378
|
+
* }, [getStatus]);
|
|
1379
|
+
*
|
|
1380
|
+
* const handleSetup = async () => {
|
|
1381
|
+
* const data = await setup();
|
|
1382
|
+
* // Show QR code from data.qrCodeUri
|
|
1383
|
+
* };
|
|
1384
|
+
*
|
|
1385
|
+
* const handleEnable = async (code: string) => {
|
|
1386
|
+
* await enable({ totpCode: code });
|
|
1387
|
+
* };
|
|
1388
|
+
*
|
|
1389
|
+
* return (
|
|
1390
|
+
* <div>
|
|
1391
|
+
* {status?.enabled ? (
|
|
1392
|
+
* <button onClick={() => disable({ password: 'xxx' })}>Disable MFA</button>
|
|
1393
|
+
* ) : (
|
|
1394
|
+
* <button onClick={handleSetup}>Setup MFA</button>
|
|
1395
|
+
* )}
|
|
1396
|
+
* </div>
|
|
1397
|
+
* );
|
|
1398
|
+
* }
|
|
1399
|
+
* ```
|
|
1400
|
+
*/ function useMfa() {
|
|
1401
|
+
const block = useAuthenticationBlock();
|
|
1402
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
1403
|
+
const [error, setError] = useState(null);
|
|
1404
|
+
const [status, setStatus] = useState(null);
|
|
1405
|
+
const [setupData, setSetupData] = useState(null);
|
|
1406
|
+
const setup = useCallback(async ()=>{
|
|
1407
|
+
setIsLoading(true);
|
|
1408
|
+
setError(null);
|
|
1409
|
+
try {
|
|
1410
|
+
const result = await block.mfa.setup();
|
|
1411
|
+
setSetupData(result);
|
|
1412
|
+
return result;
|
|
1413
|
+
} catch (err) {
|
|
1414
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1415
|
+
setError(error);
|
|
1416
|
+
throw error;
|
|
1417
|
+
} finally{
|
|
1418
|
+
setIsLoading(false);
|
|
1419
|
+
}
|
|
1420
|
+
}, [
|
|
1421
|
+
block.mfa
|
|
1422
|
+
]);
|
|
1423
|
+
const enable = useCallback(async (request)=>{
|
|
1424
|
+
setIsLoading(true);
|
|
1425
|
+
setError(null);
|
|
1426
|
+
try {
|
|
1427
|
+
const result = await block.mfa.enable(request);
|
|
1428
|
+
setSetupData(null);
|
|
1429
|
+
// Refresh status after enabling
|
|
1430
|
+
const newStatus = await block.mfa.status();
|
|
1431
|
+
setStatus(newStatus);
|
|
1432
|
+
return result;
|
|
1433
|
+
} catch (err) {
|
|
1434
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1435
|
+
setError(error);
|
|
1436
|
+
throw error;
|
|
1437
|
+
} finally{
|
|
1438
|
+
setIsLoading(false);
|
|
1439
|
+
}
|
|
1440
|
+
}, [
|
|
1441
|
+
block.mfa
|
|
1442
|
+
]);
|
|
1443
|
+
const disable = useCallback(async (request)=>{
|
|
1444
|
+
setIsLoading(true);
|
|
1445
|
+
setError(null);
|
|
1446
|
+
try {
|
|
1447
|
+
const result = await block.mfa.disable(request);
|
|
1448
|
+
// Refresh status after disabling
|
|
1449
|
+
const newStatus = await block.mfa.status();
|
|
1450
|
+
setStatus(newStatus);
|
|
1451
|
+
return result;
|
|
1452
|
+
} catch (err) {
|
|
1453
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1454
|
+
setError(error);
|
|
1455
|
+
throw error;
|
|
1456
|
+
} finally{
|
|
1457
|
+
setIsLoading(false);
|
|
1458
|
+
}
|
|
1459
|
+
}, [
|
|
1460
|
+
block.mfa
|
|
1461
|
+
]);
|
|
1462
|
+
const verify = useCallback(async (request)=>{
|
|
1463
|
+
setIsLoading(true);
|
|
1464
|
+
setError(null);
|
|
1465
|
+
try {
|
|
1466
|
+
return await block.mfa.verify(request);
|
|
1467
|
+
} catch (err) {
|
|
1468
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1469
|
+
setError(error);
|
|
1470
|
+
throw error;
|
|
1471
|
+
} finally{
|
|
1472
|
+
setIsLoading(false);
|
|
1473
|
+
}
|
|
1474
|
+
}, [
|
|
1475
|
+
block.mfa
|
|
1476
|
+
]);
|
|
1477
|
+
const getStatus = useCallback(async ()=>{
|
|
1478
|
+
setIsLoading(true);
|
|
1479
|
+
setError(null);
|
|
1480
|
+
try {
|
|
1481
|
+
const result = await block.mfa.status();
|
|
1482
|
+
setStatus(result);
|
|
1483
|
+
return result;
|
|
1484
|
+
} catch (err) {
|
|
1485
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1486
|
+
setError(error);
|
|
1487
|
+
throw error;
|
|
1488
|
+
} finally{
|
|
1489
|
+
setIsLoading(false);
|
|
1490
|
+
}
|
|
1491
|
+
}, [
|
|
1492
|
+
block.mfa
|
|
1493
|
+
]);
|
|
1494
|
+
const clearError = useCallback(()=>{
|
|
1495
|
+
setError(null);
|
|
1496
|
+
}, []);
|
|
1497
|
+
return {
|
|
1498
|
+
isLoading,
|
|
1499
|
+
error,
|
|
1500
|
+
status,
|
|
1501
|
+
setupData,
|
|
1502
|
+
setup,
|
|
1503
|
+
enable,
|
|
1504
|
+
disable,
|
|
1505
|
+
verify,
|
|
1506
|
+
getStatus,
|
|
1507
|
+
clearError
|
|
1508
|
+
};
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1512
|
+
// Hook
|
|
1513
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1514
|
+
/**
|
|
1515
|
+
* Hook for OAuth and token management operations.
|
|
1516
|
+
*
|
|
1517
|
+
* @example
|
|
1518
|
+
* ```tsx
|
|
1519
|
+
* function SocialLogin() {
|
|
1520
|
+
* const { loginWithGoogle, loginWithFacebook, isLoading, error } = useOAuth();
|
|
1521
|
+
*
|
|
1522
|
+
* const handleGoogleLogin = async (googleToken: string) => {
|
|
1523
|
+
* try {
|
|
1524
|
+
* const response = await loginWithGoogle({ token: googleToken });
|
|
1525
|
+
* // User is now logged in
|
|
1526
|
+
* } catch (err) {
|
|
1527
|
+
* // Handle error
|
|
1528
|
+
* }
|
|
1529
|
+
* };
|
|
1530
|
+
*
|
|
1531
|
+
* return (
|
|
1532
|
+
* <div>
|
|
1533
|
+
* <button onClick={() => handleGoogleLogin('...')} disabled={isLoading}>
|
|
1534
|
+
* Login with Google
|
|
1535
|
+
* </button>
|
|
1536
|
+
* </div>
|
|
1537
|
+
* );
|
|
1538
|
+
* }
|
|
1539
|
+
* ```
|
|
1540
|
+
*/ function useOAuth() {
|
|
1541
|
+
const block = useAuthenticationBlock();
|
|
1542
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
1543
|
+
const [error, setError] = useState(null);
|
|
1544
|
+
const [tenantContext, setTenantContext] = useState(null);
|
|
1545
|
+
const loginWithFacebook = useCallback(async (request)=>{
|
|
1546
|
+
setIsLoading(true);
|
|
1547
|
+
setError(null);
|
|
1548
|
+
try {
|
|
1549
|
+
return await block.oauth.loginWithFacebook(request);
|
|
1550
|
+
} catch (err) {
|
|
1551
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1552
|
+
setError(error);
|
|
1553
|
+
throw error;
|
|
1554
|
+
} finally{
|
|
1555
|
+
setIsLoading(false);
|
|
1556
|
+
}
|
|
1557
|
+
}, [
|
|
1558
|
+
block.oauth
|
|
1559
|
+
]);
|
|
1560
|
+
const loginWithGoogle = useCallback(async (request)=>{
|
|
1561
|
+
setIsLoading(true);
|
|
1562
|
+
setError(null);
|
|
1563
|
+
try {
|
|
1564
|
+
return await block.oauth.loginWithGoogle(request);
|
|
1565
|
+
} catch (err) {
|
|
1566
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1567
|
+
setError(error);
|
|
1568
|
+
throw error;
|
|
1569
|
+
} finally{
|
|
1570
|
+
setIsLoading(false);
|
|
1571
|
+
}
|
|
1572
|
+
}, [
|
|
1573
|
+
block.oauth
|
|
1574
|
+
]);
|
|
1575
|
+
const loginWithTenant = useCallback(async (request)=>{
|
|
1576
|
+
setIsLoading(true);
|
|
1577
|
+
setError(null);
|
|
1578
|
+
try {
|
|
1579
|
+
return await block.oauth.loginWithTenant(request);
|
|
1580
|
+
} catch (err) {
|
|
1581
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1582
|
+
setError(error);
|
|
1583
|
+
throw error;
|
|
1584
|
+
} finally{
|
|
1585
|
+
setIsLoading(false);
|
|
1586
|
+
}
|
|
1587
|
+
}, [
|
|
1588
|
+
block.oauth
|
|
1589
|
+
]);
|
|
1590
|
+
const introspectToken = useCallback(async (token)=>{
|
|
1591
|
+
setIsLoading(true);
|
|
1592
|
+
setError(null);
|
|
1593
|
+
try {
|
|
1594
|
+
return await block.oauth.introspectToken(token);
|
|
1595
|
+
} catch (err) {
|
|
1596
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1597
|
+
setError(error);
|
|
1598
|
+
throw error;
|
|
1599
|
+
} finally{
|
|
1600
|
+
setIsLoading(false);
|
|
1601
|
+
}
|
|
1602
|
+
}, [
|
|
1603
|
+
block.oauth
|
|
1604
|
+
]);
|
|
1605
|
+
const revokeToken = useCallback(async (request)=>{
|
|
1606
|
+
setIsLoading(true);
|
|
1607
|
+
setError(null);
|
|
1608
|
+
try {
|
|
1609
|
+
return await block.oauth.revokeToken(request);
|
|
1610
|
+
} catch (err) {
|
|
1611
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1612
|
+
setError(error);
|
|
1613
|
+
throw error;
|
|
1614
|
+
} finally{
|
|
1615
|
+
setIsLoading(false);
|
|
1616
|
+
}
|
|
1617
|
+
}, [
|
|
1618
|
+
block.oauth
|
|
1619
|
+
]);
|
|
1620
|
+
const revokeAllTokens = useCallback(async (request)=>{
|
|
1621
|
+
setIsLoading(true);
|
|
1622
|
+
setError(null);
|
|
1623
|
+
try {
|
|
1624
|
+
return await block.oauth.revokeAllTokens(request);
|
|
1625
|
+
} catch (err) {
|
|
1626
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1627
|
+
setError(error);
|
|
1628
|
+
throw error;
|
|
1629
|
+
} finally{
|
|
1630
|
+
setIsLoading(false);
|
|
1631
|
+
}
|
|
1632
|
+
}, [
|
|
1633
|
+
block.oauth
|
|
1634
|
+
]);
|
|
1635
|
+
const createTenantContext = useCallback(async (request)=>{
|
|
1636
|
+
setIsLoading(true);
|
|
1637
|
+
setError(null);
|
|
1638
|
+
try {
|
|
1639
|
+
const result = await block.oauth.createTenantContext(request);
|
|
1640
|
+
setTenantContext(result);
|
|
1641
|
+
return result;
|
|
1642
|
+
} catch (err) {
|
|
1643
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1644
|
+
setError(error);
|
|
1645
|
+
throw error;
|
|
1646
|
+
} finally{
|
|
1647
|
+
setIsLoading(false);
|
|
1648
|
+
}
|
|
1649
|
+
}, [
|
|
1650
|
+
block.oauth
|
|
1651
|
+
]);
|
|
1652
|
+
const revokeTenantContext = useCallback(async ()=>{
|
|
1653
|
+
setIsLoading(true);
|
|
1654
|
+
setError(null);
|
|
1655
|
+
try {
|
|
1656
|
+
await block.oauth.revokeTenantContext();
|
|
1657
|
+
setTenantContext(null);
|
|
1658
|
+
} catch (err) {
|
|
1659
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1660
|
+
setError(error);
|
|
1661
|
+
throw error;
|
|
1662
|
+
} finally{
|
|
1663
|
+
setIsLoading(false);
|
|
1664
|
+
}
|
|
1665
|
+
}, [
|
|
1666
|
+
block.oauth
|
|
1667
|
+
]);
|
|
1668
|
+
const auditTenantContext = useCallback(async ()=>{
|
|
1669
|
+
setIsLoading(true);
|
|
1670
|
+
setError(null);
|
|
1671
|
+
try {
|
|
1672
|
+
return await block.oauth.auditTenantContext();
|
|
1673
|
+
} catch (err) {
|
|
1674
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1675
|
+
setError(error);
|
|
1676
|
+
throw error;
|
|
1677
|
+
} finally{
|
|
1678
|
+
setIsLoading(false);
|
|
1679
|
+
}
|
|
1680
|
+
}, [
|
|
1681
|
+
block.oauth
|
|
1682
|
+
]);
|
|
1683
|
+
const clearError = useCallback(()=>{
|
|
1684
|
+
setError(null);
|
|
1685
|
+
}, []);
|
|
1686
|
+
return {
|
|
1687
|
+
isLoading,
|
|
1688
|
+
error,
|
|
1689
|
+
tenantContext,
|
|
1690
|
+
loginWithFacebook,
|
|
1691
|
+
loginWithGoogle,
|
|
1692
|
+
loginWithTenant,
|
|
1693
|
+
introspectToken,
|
|
1694
|
+
revokeToken,
|
|
1695
|
+
revokeAllTokens,
|
|
1696
|
+
createTenantContext,
|
|
1697
|
+
revokeTenantContext,
|
|
1698
|
+
auditTenantContext,
|
|
1699
|
+
clearError
|
|
1700
|
+
};
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1704
|
+
// Hook
|
|
1705
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1706
|
+
/**
|
|
1707
|
+
* Hook for user avatar management.
|
|
1708
|
+
*
|
|
1709
|
+
* @example
|
|
1710
|
+
* ```tsx
|
|
1711
|
+
* function AvatarUpload({ userUniqueId }: { userUniqueId: string }) {
|
|
1712
|
+
* const { presignUpload, create, isLoading, error } = useAvatars();
|
|
1713
|
+
*
|
|
1714
|
+
* const handleUpload = async (file: File) => {
|
|
1715
|
+
* // Get presigned URL
|
|
1716
|
+
* const { uploadUrl, publicUrl } = await presignUpload(userUniqueId, file.name);
|
|
1717
|
+
*
|
|
1718
|
+
* // Upload directly to S3
|
|
1719
|
+
* await fetch(uploadUrl, { method: 'PUT', body: file });
|
|
1720
|
+
*
|
|
1721
|
+
* // Save avatar record
|
|
1722
|
+
* await create(userUniqueId, {
|
|
1723
|
+
* originalName: file.name,
|
|
1724
|
+
* name: file.name,
|
|
1725
|
+
* url: publicUrl,
|
|
1726
|
+
* fileType: file.type,
|
|
1727
|
+
* fileSize: file.size,
|
|
1728
|
+
* });
|
|
1729
|
+
* };
|
|
1730
|
+
*
|
|
1731
|
+
* return (
|
|
1732
|
+
* <input type="file" onChange={(e) => e.target.files?.[0] && handleUpload(e.target.files[0])} />
|
|
1733
|
+
* );
|
|
1734
|
+
* }
|
|
1735
|
+
* ```
|
|
1736
|
+
*/ function useAvatars() {
|
|
1737
|
+
const block = useAuthenticationBlock();
|
|
1738
|
+
const [avatars, setAvatars] = useState([]);
|
|
1739
|
+
const [currentAvatar, setCurrentAvatar] = useState(null);
|
|
1740
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
1741
|
+
const [error, setError] = useState(null);
|
|
1742
|
+
const list = useCallback(async (userUniqueId, params)=>{
|
|
1743
|
+
setIsLoading(true);
|
|
1744
|
+
setError(null);
|
|
1745
|
+
try {
|
|
1746
|
+
const result = await block.avatars.list(userUniqueId, params);
|
|
1747
|
+
setAvatars(result.data);
|
|
1748
|
+
return result;
|
|
1749
|
+
} catch (err) {
|
|
1750
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1751
|
+
setError(error);
|
|
1752
|
+
throw error;
|
|
1753
|
+
} finally{
|
|
1754
|
+
setIsLoading(false);
|
|
1755
|
+
}
|
|
1756
|
+
}, [
|
|
1757
|
+
block.avatars
|
|
1758
|
+
]);
|
|
1759
|
+
const get = useCallback(async (userUniqueId)=>{
|
|
1760
|
+
setIsLoading(true);
|
|
1761
|
+
setError(null);
|
|
1762
|
+
try {
|
|
1763
|
+
const result = await block.avatars.get(userUniqueId);
|
|
1764
|
+
setCurrentAvatar(result);
|
|
1765
|
+
return result;
|
|
1766
|
+
} catch (err) {
|
|
1767
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1768
|
+
setError(error);
|
|
1769
|
+
throw error;
|
|
1770
|
+
} finally{
|
|
1771
|
+
setIsLoading(false);
|
|
1772
|
+
}
|
|
1773
|
+
}, [
|
|
1774
|
+
block.avatars
|
|
1775
|
+
]);
|
|
1776
|
+
const create = useCallback(async (userUniqueId, request)=>{
|
|
1777
|
+
setIsLoading(true);
|
|
1778
|
+
setError(null);
|
|
1779
|
+
try {
|
|
1780
|
+
const result = await block.avatars.create(userUniqueId, request);
|
|
1781
|
+
setCurrentAvatar(result);
|
|
1782
|
+
setAvatars((prev)=>[
|
|
1783
|
+
...prev,
|
|
1784
|
+
result
|
|
1785
|
+
]);
|
|
1786
|
+
return result;
|
|
1787
|
+
} catch (err) {
|
|
1788
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1789
|
+
setError(error);
|
|
1790
|
+
throw error;
|
|
1791
|
+
} finally{
|
|
1792
|
+
setIsLoading(false);
|
|
1793
|
+
}
|
|
1794
|
+
}, [
|
|
1795
|
+
block.avatars
|
|
1796
|
+
]);
|
|
1797
|
+
const update = useCallback(async (userUniqueId, request)=>{
|
|
1798
|
+
setIsLoading(true);
|
|
1799
|
+
setError(null);
|
|
1800
|
+
try {
|
|
1801
|
+
const result = await block.avatars.update(userUniqueId, request);
|
|
1802
|
+
setCurrentAvatar(result);
|
|
1803
|
+
setAvatars((prev)=>prev.map((a)=>a.userUniqueId === userUniqueId ? result : a));
|
|
1804
|
+
return result;
|
|
1805
|
+
} catch (err) {
|
|
1806
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1807
|
+
setError(error);
|
|
1808
|
+
throw error;
|
|
1809
|
+
} finally{
|
|
1810
|
+
setIsLoading(false);
|
|
1811
|
+
}
|
|
1812
|
+
}, [
|
|
1813
|
+
block.avatars
|
|
1814
|
+
]);
|
|
1815
|
+
const remove = useCallback(async (userUniqueId)=>{
|
|
1816
|
+
setIsLoading(true);
|
|
1817
|
+
setError(null);
|
|
1818
|
+
try {
|
|
1819
|
+
await block.avatars.delete(userUniqueId);
|
|
1820
|
+
setCurrentAvatar(null);
|
|
1821
|
+
setAvatars((prev)=>prev.filter((a)=>a.userUniqueId !== userUniqueId));
|
|
1822
|
+
} catch (err) {
|
|
1823
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1824
|
+
setError(error);
|
|
1825
|
+
throw error;
|
|
1826
|
+
} finally{
|
|
1827
|
+
setIsLoading(false);
|
|
1828
|
+
}
|
|
1829
|
+
}, [
|
|
1830
|
+
block.avatars
|
|
1831
|
+
]);
|
|
1832
|
+
const presignUpload = useCallback(async (userUniqueId, filename)=>{
|
|
1833
|
+
setIsLoading(true);
|
|
1834
|
+
setError(null);
|
|
1835
|
+
try {
|
|
1836
|
+
return await block.avatars.presignUpload(userUniqueId, filename);
|
|
1837
|
+
} catch (err) {
|
|
1838
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1839
|
+
setError(error);
|
|
1840
|
+
throw error;
|
|
1841
|
+
} finally{
|
|
1842
|
+
setIsLoading(false);
|
|
1843
|
+
}
|
|
1844
|
+
}, [
|
|
1845
|
+
block.avatars
|
|
1846
|
+
]);
|
|
1847
|
+
const multipartPresign = useCallback(async (userUniqueId, request)=>{
|
|
1848
|
+
setIsLoading(true);
|
|
1849
|
+
setError(null);
|
|
1850
|
+
try {
|
|
1851
|
+
return await block.avatars.multipartPresign(userUniqueId, request);
|
|
1852
|
+
} catch (err) {
|
|
1853
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1854
|
+
setError(error);
|
|
1855
|
+
throw error;
|
|
1856
|
+
} finally{
|
|
1857
|
+
setIsLoading(false);
|
|
1858
|
+
}
|
|
1859
|
+
}, [
|
|
1860
|
+
block.avatars
|
|
1861
|
+
]);
|
|
1862
|
+
const multipartComplete = useCallback(async (userUniqueId, request)=>{
|
|
1863
|
+
setIsLoading(true);
|
|
1864
|
+
setError(null);
|
|
1865
|
+
try {
|
|
1866
|
+
return await block.avatars.multipartComplete(userUniqueId, request);
|
|
1867
|
+
} catch (err) {
|
|
1868
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1869
|
+
setError(error);
|
|
1870
|
+
throw error;
|
|
1871
|
+
} finally{
|
|
1872
|
+
setIsLoading(false);
|
|
1873
|
+
}
|
|
1874
|
+
}, [
|
|
1875
|
+
block.avatars
|
|
1876
|
+
]);
|
|
1877
|
+
const clearError = useCallback(()=>{
|
|
1878
|
+
setError(null);
|
|
1879
|
+
}, []);
|
|
1880
|
+
return {
|
|
1881
|
+
avatars,
|
|
1882
|
+
currentAvatar,
|
|
1883
|
+
isLoading,
|
|
1884
|
+
error,
|
|
1885
|
+
list,
|
|
1886
|
+
get,
|
|
1887
|
+
create,
|
|
1888
|
+
update,
|
|
1889
|
+
remove,
|
|
1890
|
+
presignUpload,
|
|
1891
|
+
multipartPresign,
|
|
1892
|
+
multipartComplete,
|
|
1893
|
+
clearError
|
|
1894
|
+
};
|
|
1895
|
+
}
|
|
1896
|
+
|
|
1897
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1898
|
+
// Hook
|
|
1899
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1900
|
+
/**
|
|
1901
|
+
* Hook for tenant management operations.
|
|
1902
|
+
*
|
|
1903
|
+
* @example
|
|
1904
|
+
* ```tsx
|
|
1905
|
+
* function TenantList() {
|
|
1906
|
+
* const { tenants, listChildren, isLoading, error } = useTenants();
|
|
1907
|
+
*
|
|
1908
|
+
* useEffect(() => {
|
|
1909
|
+
* listChildren();
|
|
1910
|
+
* }, [listChildren]);
|
|
1911
|
+
*
|
|
1912
|
+
* if (isLoading) return <Spinner />;
|
|
1913
|
+
* if (error) return <Error message={error.message} />;
|
|
1914
|
+
*
|
|
1915
|
+
* return (
|
|
1916
|
+
* <ul>
|
|
1917
|
+
* {tenants.map(tenant => (
|
|
1918
|
+
* <li key={tenant.id}>{tenant.name}</li>
|
|
1919
|
+
* ))}
|
|
1920
|
+
* </ul>
|
|
1921
|
+
* );
|
|
1922
|
+
* }
|
|
1923
|
+
* ```
|
|
1924
|
+
*/ function useTenants() {
|
|
1925
|
+
const block = useAuthenticationBlock();
|
|
1926
|
+
const [tenants, setTenants] = useState([]);
|
|
1927
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
1928
|
+
const [error, setError] = useState(null);
|
|
1929
|
+
const listChildren = useCallback(async (params)=>{
|
|
1930
|
+
setIsLoading(true);
|
|
1931
|
+
setError(null);
|
|
1932
|
+
try {
|
|
1933
|
+
const result = await block.tenants.listChildren(params);
|
|
1934
|
+
setTenants(result.data);
|
|
1935
|
+
return result;
|
|
1936
|
+
} catch (err) {
|
|
1937
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1938
|
+
setError(error);
|
|
1939
|
+
throw error;
|
|
1940
|
+
} finally{
|
|
1941
|
+
setIsLoading(false);
|
|
1942
|
+
}
|
|
1943
|
+
}, [
|
|
1944
|
+
block.tenants
|
|
1945
|
+
]);
|
|
1946
|
+
const validateCode = useCallback(async (request)=>{
|
|
1947
|
+
setIsLoading(true);
|
|
1948
|
+
setError(null);
|
|
1949
|
+
try {
|
|
1950
|
+
return await block.tenants.validateCode(request);
|
|
1951
|
+
} catch (err) {
|
|
1952
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1953
|
+
setError(error);
|
|
1954
|
+
throw error;
|
|
1955
|
+
} finally{
|
|
1956
|
+
setIsLoading(false);
|
|
1957
|
+
}
|
|
1958
|
+
}, [
|
|
1959
|
+
block.tenants
|
|
1960
|
+
]);
|
|
1961
|
+
const searchByName = useCallback(async (request)=>{
|
|
1962
|
+
setIsLoading(true);
|
|
1963
|
+
setError(null);
|
|
1964
|
+
try {
|
|
1965
|
+
return await block.tenants.searchByName(request);
|
|
1966
|
+
} catch (err) {
|
|
1967
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1968
|
+
setError(error);
|
|
1969
|
+
throw error;
|
|
1970
|
+
} finally{
|
|
1971
|
+
setIsLoading(false);
|
|
1972
|
+
}
|
|
1973
|
+
}, [
|
|
1974
|
+
block.tenants
|
|
1975
|
+
]);
|
|
1976
|
+
const searchByCode = useCallback(async (request)=>{
|
|
1977
|
+
setIsLoading(true);
|
|
1978
|
+
setError(null);
|
|
1979
|
+
try {
|
|
1980
|
+
return await block.tenants.searchByCode(request);
|
|
1981
|
+
} catch (err) {
|
|
1982
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1983
|
+
setError(error);
|
|
1984
|
+
throw error;
|
|
1985
|
+
} finally{
|
|
1986
|
+
setIsLoading(false);
|
|
1987
|
+
}
|
|
1988
|
+
}, [
|
|
1989
|
+
block.tenants
|
|
1990
|
+
]);
|
|
1991
|
+
const createTenantUser = useCallback(async (userUniqueId, request)=>{
|
|
1992
|
+
setIsLoading(true);
|
|
1993
|
+
setError(null);
|
|
1994
|
+
try {
|
|
1995
|
+
return await block.tenants.createTenantUser(userUniqueId, request);
|
|
1996
|
+
} catch (err) {
|
|
1997
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1998
|
+
setError(error);
|
|
1999
|
+
throw error;
|
|
2000
|
+
} finally{
|
|
2001
|
+
setIsLoading(false);
|
|
2002
|
+
}
|
|
2003
|
+
}, [
|
|
2004
|
+
block.tenants
|
|
2005
|
+
]);
|
|
2006
|
+
const updateOnboarding = useCallback(async (userUniqueId, urlId, request)=>{
|
|
2007
|
+
setIsLoading(true);
|
|
2008
|
+
setError(null);
|
|
2009
|
+
try {
|
|
2010
|
+
return await block.tenants.updateOnboarding(userUniqueId, urlId, request);
|
|
2011
|
+
} catch (err) {
|
|
2012
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
2013
|
+
setError(error);
|
|
2014
|
+
throw error;
|
|
2015
|
+
} finally{
|
|
2016
|
+
setIsLoading(false);
|
|
2017
|
+
}
|
|
2018
|
+
}, [
|
|
2019
|
+
block.tenants
|
|
2020
|
+
]);
|
|
2021
|
+
const updateSales = useCallback(async (userUniqueId, urlId, request)=>{
|
|
2022
|
+
setIsLoading(true);
|
|
2023
|
+
setError(null);
|
|
2024
|
+
try {
|
|
2025
|
+
return await block.tenants.updateSales(userUniqueId, urlId, request);
|
|
2026
|
+
} catch (err) {
|
|
2027
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
2028
|
+
setError(error);
|
|
2029
|
+
throw error;
|
|
2030
|
+
} finally{
|
|
2031
|
+
setIsLoading(false);
|
|
2032
|
+
}
|
|
2033
|
+
}, [
|
|
2034
|
+
block.tenants
|
|
2035
|
+
]);
|
|
2036
|
+
const clearError = useCallback(()=>{
|
|
2037
|
+
setError(null);
|
|
2038
|
+
}, []);
|
|
2039
|
+
return {
|
|
2040
|
+
tenants,
|
|
2041
|
+
isLoading,
|
|
2042
|
+
error,
|
|
2043
|
+
listChildren,
|
|
2044
|
+
validateCode,
|
|
2045
|
+
searchByName,
|
|
2046
|
+
searchByCode,
|
|
2047
|
+
createTenantUser,
|
|
2048
|
+
updateOnboarding,
|
|
2049
|
+
updateSales,
|
|
1207
2050
|
clearError
|
|
1208
2051
|
};
|
|
1209
2052
|
}
|
|
@@ -1436,4 +2279,4 @@ function useUniversityBlock() {
|
|
|
1436
2279
|
};
|
|
1437
2280
|
}
|
|
1438
2281
|
|
|
1439
|
-
export { Blocks23Provider, Provider, SimpleBlocks23Provider, use23Blocks, useAssetsBlock, useAuth
|
|
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 };
|