import React, { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Controller, useForm } from "react-hook-form"; import { ActionGroup, AlertVariant, Button, FormGroup, PageSection, Select, SelectOption, SelectVariant, } from "@patternfly/react-core"; import { FormAccess } from "../components/form-access/FormAccess"; import { FormPanel } from "../components/scroll-form/FormPanel"; import { HelpItem } from "../components/help-enabler/HelpItem"; import { useServerInfo } from "../context/server-info/ServerInfoProvider"; import type ClientPolicyRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientPolicyRepresentation"; import { camelCase } from "lodash"; import { useAdminClient, useFetch } from "../context/auth/AdminClient"; import { useAlerts } from "../components/alert/Alerts"; import { useHistory, useParams } from "react-router"; import type ClientPolicyConditionRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientPolicyConditionRepresentation"; import type ComponentTypeRepresentation from "@keycloak/keycloak-admin-client/lib/defs/componentTypeRepresentation"; import { useRealm } from "../context/realm-context/RealmContext"; import type { EditClientPolicyParams } from "./routes/EditClientPolicy"; export default function NewClientPolicyCondition() { const { t } = useTranslation("realm-settings"); const { addAlert, addError } = useAlerts(); const history = useHistory(); const { realm } = useRealm(); const { handleSubmit, control } = useForm({ mode: "onChange", }); const [openConditionType, setOpenConditionType] = useState(false); const [policies, setPolicies] = useState([]); const [condition, setCondition] = useState< ClientPolicyConditionRepresentation[] >([]); const [conditionType, setConditionType] = useState(""); const { policyName } = useParams(); const serverInfo = useServerInfo(); const conditionTypes = serverInfo.componentTypes?.[ "org.keycloak.services.clientpolicy.condition.ClientPolicyConditionProvider" ]; const adminClient = useAdminClient(); const currentPolicy = useMemo( () => policies.find(({ name }) => name === policyName), [policies, policyName] ); useFetch( () => adminClient.clientPolicies.listPolicies(), (policies) => { setPolicies(policies.policies ?? []); }, [] ); const save = async () => { const createdPolicy = { ...currentPolicy, profiles: [], conditions: currentPolicy?.conditions?.concat(condition), }; const index = policies.findIndex( (policy) => createdPolicy.name === policy.name ); if (index === -1) { return; } const newPolicies = [ ...policies.slice(0, index), createdPolicy, ...policies.slice(index + 1), ]; try { await adminClient.clientPolicies.updatePolicy({ policies: newPolicies, }); setPolicies(newPolicies); history.push( `/${realm}/realm-settings/clientPolicies/${policyName}/edit-policy` ); addAlert( t("realm-settings:createClientConditionSuccess"), AlertVariant.success ); } catch (error) { addError("realm-settings:createClientConditionError", error); } }; return ( } > ( )} /> ); }