diff --git a/src/components/UserSettings.tsx b/src/components/UserSettings.tsx
index a070e4df..3b833575 100644
--- a/src/components/UserSettings.tsx
+++ b/src/components/UserSettings.tsx
@@ -34,9 +34,17 @@ import UsersEmployeeInfo from "src/components/UsersSections/UsersEmployeeInfo";
import UsersAttributesSMB from "src/components/UsersSections/UsersAttributesSMB";
export interface PropsToUserSettings {
- user: User;
+ user: User; // TODO: Replace with `userData` in all subsections
onUserChange: (user: User) => void;
metadata: Metadata;
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ userData: any;
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ pwPolicyData: any;
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ krbPolicyData: any;
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ certData: any;
from: "active-users" | "stage-users" | "preserved-users";
}
@@ -169,7 +177,7 @@ const UserSettings = (props: PropsToUserSettings) => {
text="Identity settings"
/>
diff --git a/src/hooks/useUserSettingsData.tsx b/src/hooks/useUserSettingsData.tsx
new file mode 100644
index 00000000..dfb5097a
--- /dev/null
+++ b/src/hooks/useUserSettingsData.tsx
@@ -0,0 +1,49 @@
+// RPC
+import {
+ Command,
+ useGetObjectMetadataQuery,
+ useGetUsersFullDataQuery,
+} from "src/services/rpc";
+
+const useUserSettingsData = (userId: string) => {
+ // [API call] Metadata
+ const metadataQuery = useGetObjectMetadataQuery();
+ const metadata = metadataQuery.data || {};
+ const metadataLoading = metadataQuery.isLoading;
+
+ // [API call] Users data
+ const userShowCommand: Command = {
+ method: "user_show",
+ params: [userId, { all: true, rights: true }],
+ };
+
+ const pwpolicyShowCommand: Command = {
+ method: "pwpolicy_show",
+ params: [[], { user: userId[0], all: true, rights: true }],
+ };
+
+ const krbtpolicyShowCommand: Command = {
+ method: "krbtpolicy_show",
+ params: [userId, { all: true, rights: true }],
+ };
+
+ const certFindCommand: Command = {
+ method: "cert_find",
+ params: [[], { user: userId[0], sizelimit: 0, all: true }],
+ };
+
+ const batchPayload: Command[] = [
+ userShowCommand,
+ pwpolicyShowCommand,
+ krbtpolicyShowCommand,
+ certFindCommand,
+ ];
+
+ const batchQuery = useGetUsersFullDataQuery(batchPayload);
+ const batchResponse = batchQuery.data || {};
+ const isBatchLoading = batchQuery.isLoading;
+
+ return { metadata, metadataLoading, batchResponse, isBatchLoading };
+};
+
+export default useUserSettingsData;
diff --git a/src/pages/ActiveUsers/ActiveUsersTabs.tsx b/src/pages/ActiveUsers/ActiveUsersTabs.tsx
index 8b8006b9..26e8c22f 100644
--- a/src/pages/ActiveUsers/ActiveUsersTabs.tsx
+++ b/src/pages/ActiveUsers/ActiveUsersTabs.tsx
@@ -23,8 +23,8 @@ import UserMemberOf from "./UserMemberOf";
// Layouts
import BreadcrumbLayout from "src/components/layouts/BreadcrumbLayout";
import DataSpinner from "src/components/layouts/DataSpinner";
-// RPC client
-import { useGetObjectMetadataQuery } from "src/services/rpc";
+// Hooks
+import useUserSettingsData from "src/hooks/useUserSettingsData";
const ActiveUsersTabs = () => {
// Get location (React Router DOM) and get state data
@@ -33,9 +33,9 @@ const ActiveUsersTabs = () => {
const [user, setUser] = useState(userData);
- const metadataQuery = useGetObjectMetadataQuery();
- const metadata = metadataQuery.data || {};
- const metadataLoading = metadataQuery.isLoading;
+ // Make API calls needed for user Settings' data
+ const { metadata, metadataLoading, batchResponse, isBatchLoading } =
+ useUserSettingsData(userData.uid);
// Tab
const [activeTabKey, setActiveTabKey] = useState(0);
@@ -56,7 +56,7 @@ const ActiveUsersTabs = () => {
},
];
- if (metadataLoading) {
+ if (metadataLoading || isBatchLoading) {
return ;
}
@@ -91,6 +91,10 @@ const ActiveUsersTabs = () => {
diff --git a/src/pages/PreservedUsers/PreservedUsersTabs.tsx b/src/pages/PreservedUsers/PreservedUsersTabs.tsx
index 87201f24..05ab1b41 100644
--- a/src/pages/PreservedUsers/PreservedUsersTabs.tsx
+++ b/src/pages/PreservedUsers/PreservedUsersTabs.tsx
@@ -22,8 +22,8 @@ import UserSettings from "src/components/UserSettings";
// Layouts
import BreadcrumbLayout from "src/components/layouts/BreadcrumbLayout";
import DataSpinner from "src/components/layouts/DataSpinner";
-// RPC client
-import { useGetObjectMetadataQuery } from "src/services/rpc";
+// Hooks
+import useUserSettingsData from "src/hooks/useUserSettingsData";
const PreservedUsersTabs = () => {
// Get location (React Router DOM) and get state data
@@ -32,9 +32,9 @@ const PreservedUsersTabs = () => {
const [user, setUser] = useState(userData);
- const metadataQuery = useGetObjectMetadataQuery();
- const metadata = metadataQuery.data || {};
- const metadataLoading = metadataQuery.isLoading;
+ // Make API calls needed for user Settings' data
+ const { metadata, metadataLoading, batchResponse, isBatchLoading } =
+ useUserSettingsData(userData.uid);
// Tab
const [activeTabKey, setActiveTabKey] = useState(0);
@@ -55,7 +55,7 @@ const PreservedUsersTabs = () => {
},
];
- if (metadataLoading) {
+ if (metadataLoading || isBatchLoading) {
return ;
}
@@ -90,6 +90,10 @@ const PreservedUsersTabs = () => {
diff --git a/src/pages/StageUsers/StageUsersTabs.tsx b/src/pages/StageUsers/StageUsersTabs.tsx
index 38aedc87..b4b81034 100644
--- a/src/pages/StageUsers/StageUsersTabs.tsx
+++ b/src/pages/StageUsers/StageUsersTabs.tsx
@@ -22,8 +22,8 @@ import UserSettings from "src/components/UserSettings";
// Layouts
import BreadcrumbLayout from "src/components/layouts/BreadcrumbLayout";
import DataSpinner from "src/components/layouts/DataSpinner";
-// RPC client
-import { useGetObjectMetadataQuery } from "src/services/rpc";
+// Hooks
+import useUserSettingsData from "src/hooks/useUserSettingsData";
const StageUsersTabs = () => {
// Get location (React Router DOM) and get state data
@@ -32,9 +32,9 @@ const StageUsersTabs = () => {
const [user, setUser] = useState(userData);
- const metadataQuery = useGetObjectMetadataQuery();
- const metadata = metadataQuery.data || {};
- const metadataLoading = metadataQuery.isLoading;
+ // Make API calls needed for user Settings' data
+ const { metadata, metadataLoading, batchResponse, isBatchLoading } =
+ useUserSettingsData(userData.uid);
// Tab
const [activeTabKey, setActiveTabKey] = useState(0);
@@ -55,7 +55,7 @@ const StageUsersTabs = () => {
},
];
- if (metadataLoading) {
+ if (metadataLoading || isBatchLoading) {
return ;
}
@@ -90,6 +90,10 @@ const StageUsersTabs = () => {
diff --git a/src/services/rpc.ts b/src/services/rpc.ts
index d4022767..6890d22b 100644
--- a/src/services/rpc.ts
+++ b/src/services/rpc.ts
@@ -29,6 +29,19 @@ export interface ShowRPCResponse {
result: Record;
}
+export interface BatchResult {
+ result: Record;
+ count: number;
+ truncated: boolean;
+ summary: string;
+}
+
+export interface BatchResponse {
+ result: {
+ results: BatchResult[];
+ };
+}
+
// 'FindRPCResponse' type
// - Has 'result' > 'result' structure
export interface FindRPCResponse {
@@ -117,7 +130,7 @@ export const getBatchCommand = (commandData: Command[], apiVersion: string) => {
export const api = createApi({
reducerPath: "api",
baseQuery: fetchBaseQuery({ baseUrl: "/" }), // TODO: Global settings!
- tagTypes: ["ObjectMetadata"],
+ tagTypes: ["ObjectMetadata", "FullUserData"],
endpoints: (build) => ({
simpleCommand: build.query({
query: (payloadData: Command) => getCommand(payloadData),
@@ -217,6 +230,14 @@ export const api = createApi({
response.result,
providesTags: ["ObjectMetadata"],
}),
+ getUsersFullData: build.query({
+ query: (payloadData: Command[], apiVersion?: string) => {
+ return getBatchCommand(payloadData, apiVersion || API_VERSION_BACKUP);
+ },
+ transformResponse: (response: BatchResponse): BatchResult[] =>
+ response.result.results,
+ providesTags: ["FullUserData"],
+ }),
}),
});
@@ -227,4 +248,5 @@ export const {
useBatchMutCommandMutation,
useGettingUserDataQuery,
useGetObjectMetadataQuery,
+ useGetUsersFullDataQuery,
} = api;