import React, { ReactNode, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useFormContext } from "react-hook-form"; import { FormGroup, TextInput, Switch } from "@patternfly/react-core"; import environment from "../../environment"; import { HelpItem } from "../../components/help-enabler/HelpItem"; import { useAdminClient } from "../../context/auth/AdminClient"; type DiscoveryEndpointFieldProps = { id: string; fileUpload: ReactNode; children: (readOnly: boolean) => ReactNode; }; export const DiscoveryEndpointField = ({ id, fileUpload, children, }: DiscoveryEndpointFieldProps) => { const { t } = useTranslation("identity-providers"); const adminClient = useAdminClient(); const { setValue, register, errors, setError, watch, clearErrors } = 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); }} /> {discovery && ( } validated={ errors.discoveryError || errors.discoveryEndpoint ? "error" : !discoveryResult ? "default" : "success" } helperTextInvalid={ errors.discoveryEndpoint ? t("common:required") : t("noValidMetaDataFound", { error: errors.discoveryError?.message, }) } isRequired > setDiscovering(true)} validated={ errors.discoveryError || errors.discoveryEndpoint ? "error" : !discoveryResult ? "default" : "success" } customIconUrl={ discovering ? environment.resourceUrl + "/discovery-load-indicator.svg" : "" } ref={register({ required: true })} /> )} {!discovery && fileUpload} {discovery && !errors.discoveryError && children(true)} {!discovery && children(false)} ); };