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;