import { FormGroup, Switch } from "@patternfly/react-core"; import { ReactNode, useEffect, useState } from "react"; import { useFormContext } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { HelpItem } from "ui-shared"; import { adminClient } from "../../admin-client"; import { KeycloakTextInput } from "../../components/keycloak-text-input/KeycloakTextInput"; import environment from "../../environment"; type DiscoveryEndpointFieldProps = { id: string; fileUpload: ReactNode; children: (readOnly: boolean) => ReactNode; }; export const DiscoveryEndpointField = ({ id, fileUpload, children, }: DiscoveryEndpointFieldProps) => { const { t } = useTranslation(); const { setValue, register, setError, watch, clearErrors, formState: { errors }, } = useFormContext(); const discoveryUrl = watch("discoveryEndpoint"); const [discovery, setDiscovery] = useState(true); const [discovering, setDiscovering] = useState(false); const [discoveryResult, setDiscoveryResult] = useState>(); const setupForm = (result: Record) => { Object.keys(result).map((k) => setValue(`config.${k}`, result[k])); }; useEffect(() => { if (!discoveryUrl) { setDiscovering(false); return; } (async () => { clearErrors("discoveryError"); try { const result = await adminClient.identityProviders.importFromUrl({ providerId: id, fromUrl: discoveryUrl, }); setupForm(result); setDiscoveryResult(result); } catch (error) { setError("discoveryError", { type: "manual", message: (error as Error).message, }); } setDiscovering(false); })(); }, [discovering]); return ( <> } > { clearErrors("discoveryError"); setDiscovery(checked); }} aria-label={t( id === "oidc" ? "useDiscoveryEndpoint" : "useEntityDescriptor", )} /> {discovery && ( } validated={ errors.discoveryError || errors.discoveryEndpoint ? "error" : !discoveryResult ? "default" : "success" } helperTextInvalid={ errors.discoveryEndpoint ? t("required") : t("noValidMetaDataFound", { error: errors.discoveryError?.message, }) } isRequired > setDiscovering(true), })} /> )} {!discovery && fileUpload} {discovery && !errors.discoveryError && children(true)} {!discovery && children(false)} ); };