keycloak-scim/js/apps/admin-ui/src/realm-settings/user-profile/UserProfileContext.tsx
Pedro Igor c7f63d5843 Add options to change behavior on how unmanaged attributes are managed
Closes #24934

Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com>
2023-11-30 06:58:21 -03:00

78 lines
2.2 KiB
TypeScript

import type { UserProfileConfig } from "@keycloak/keycloak-admin-client/lib/defs/userProfileMetadata";
import { AlertVariant } from "@patternfly/react-core";
import { PropsWithChildren, useState } from "react";
import { useTranslation } from "react-i18next";
import { createNamedContext, useRequiredContext } from "ui-shared";
import { adminClient } from "../../admin-client";
import { useAlerts } from "../../components/alert/Alerts";
import { useRealm } from "../../context/realm-context/RealmContext";
import { useFetch } from "../../utils/useFetch";
type UserProfileProps = {
config: UserProfileConfig | null;
save: SaveCallback;
isSaving: boolean;
};
export type SaveCallback = (
updatedConfig: UserProfileConfig,
options?: SaveOptions,
) => Promise<boolean>;
export type SaveOptions = {
successMessageKey?: string;
errorMessageKey?: string;
};
export const UserProfileContext = createNamedContext<
UserProfileProps | undefined
>("UserProfileContext", undefined);
export const UserProfileProvider = ({ children }: PropsWithChildren) => {
const { realm } = useRealm();
const { addAlert, addError } = useAlerts();
const { t } = useTranslation();
const [config, setConfig] = useState<UserProfileConfig | null>(null);
const [refreshCount, setRefreshCount] = useState(0);
const [isSaving, setIsSaving] = useState(false);
useFetch(
() => adminClient.users.getProfile({ realm }),
(config) => setConfig(config),
[refreshCount],
);
const save: SaveCallback = async (updatedConfig, options) => {
setIsSaving(true);
try {
await adminClient.users.updateProfile({
...updatedConfig,
realm,
});
setIsSaving(false);
setRefreshCount(refreshCount + 1);
addAlert(
t(options?.successMessageKey ?? "userProfileSuccess"),
AlertVariant.success,
);
return true;
} catch (error) {
setIsSaving(false);
addError(options?.errorMessageKey ?? "userProfileError", error);
return false;
}
};
return (
<UserProfileContext.Provider value={{ config, save, isSaving }}>
{children}
</UserProfileContext.Provider>
);
};
export const useUserProfile = () => useRequiredContext(UserProfileContext);