in packages/online-editor/src/accounts/openshift/ConnecToOpenShiftSimple.tsx [56:352]
export function ConnecToOpenShiftSimple(props: {
kieSandboxOpenShiftService: KieSandboxOpenShiftService | undefined;
setMode: React.Dispatch<React.SetStateAction<OpenShiftSettingsTabMode>>;
connection: KubernetesConnection;
setConnection: React.Dispatch<React.SetStateAction<KubernetesConnection>>;
status: OpenShiftInstanceStatus;
setStatus: React.Dispatch<React.SetStateAction<OpenShiftInstanceStatus>>;
setNewAuthSession: React.Dispatch<React.SetStateAction<OpenShiftAuthSession>>;
isLoadingService: boolean;
}) {
const { i18n } = useOnlineI18n();
const [isConnectionValidated, setConnectionValidated] = useState(FormValiationOptions.INITIAL);
const [isConnecting, setConnecting] = useState(false);
const authSessionsDispatch = useAuthSessionsDispatch();
const onConnect = useCallback(async () => {
if (isConnecting) {
return;
}
if (!isKubernetesConnectionValid(props.connection)) {
setConnectionValidated(FormValiationOptions.INVALID);
return;
}
setConnecting(true);
const isConnectionEstablished =
props.kieSandboxOpenShiftService && (await props.kieSandboxOpenShiftService.isConnectionEstablished());
setConnecting(false);
if (isConnectionEstablished === KubernetesConnectionStatus.CONNECTED && props.kieSandboxOpenShiftService) {
const newAuthSession: OpenShiftAuthSession = {
type: CloudAuthSessionType.OpenShift,
version: AUTH_SESSION_VERSION_NUMBER,
id: uuid(),
...props.connection,
authProviderId: "openshift",
createdAtDateISO: new Date().toISOString(),
k8sApiServerEndpointsByResourceKind: props.kieSandboxOpenShiftService.args.k8sApiServerEndpointsByResourceKind,
};
props.setStatus(OpenShiftInstanceStatus.CONNECTED);
authSessionsDispatch.add(newAuthSession);
props.setNewAuthSession(newAuthSession);
} else {
setConnectionValidated(FormValiationOptions.CONNECTION_ERROR);
return;
}
}, [authSessionsDispatch, isConnecting, props]);
const onClearHost = useCallback(() => props.setConnection({ ...props.connection, host: "" }), [props]);
const onClearNamespace = useCallback(() => props.setConnection({ ...props.connection, namespace: "" }), [props]);
const onClearToken = useCallback(() => props.setConnection({ ...props.connection, token: "" }), [props]);
const onHostChanged = useCallback(
(event: React.FormEvent<HTMLInputElement>, newValue: string) => {
props.setConnection({ ...props.connection, host: newValue });
},
[props]
);
const onNamespaceChanged = useCallback(
(event: React.FormEvent<HTMLInputElement>, newValue: string) => {
props.setConnection({ ...props.connection, namespace: newValue });
},
[props]
);
const onTokenChanged = useCallback(
(event: React.FormEvent<HTMLInputElement>, newValue: string) => {
props.setConnection({ ...props.connection, token: newValue });
},
[props]
);
const onInsecurelyDisableTlsCertificateValidationChange = useCallback(
(event: React.FormEvent<HTMLInputElement>, checked: boolean) => {
props.setConnection({ ...props.connection, insecurelyDisableTlsCertificateValidation: checked });
},
[props]
);
return (
<>
{isConnectionValidated === FormValiationOptions.INVALID && (
<>
<FormAlert>
<Alert
variant="danger"
title={i18n.devDeployments.configModal.validationError}
aria-live="polite"
isInline
data-testid="alert-validation-error"
/>
</FormAlert>
<br />
</>
)}
{isConnectionValidated === FormValiationOptions.CONNECTION_ERROR && (
<>
{" "}
<FormAlert>
<Alert
variant="danger"
title={i18n.devDeployments.configModal.connectionError}
aria-live="polite"
isInline
data-testid="alert-connection-error"
/>
</FormAlert>
<br />
</>
)}
<Button
style={{ paddingLeft: 0 }}
id="dev-deployments-config-use-wizard-button"
key="use-wizard"
className="pf-v5-u-p-0"
variant="link"
onClick={() => props.setMode(OpenShiftSettingsTabMode.WIZARD)}
data-testid="use-wizard-button"
isLoading={isConnecting}
>
{i18n.devDeployments.configModal.useOpenShiftWizard}
<ArrowRightIcon className="pf-v5-u-ml-sm" />
</Button>
<br />
<br />
<Form>
<FormGroup
label={i18n.terms.namespace}
labelIcon={
<Popover bodyContent={i18n.devDeployments.configModal.namespaceInfo}>
<button
type="button"
aria-label="More info for namespace field"
onClick={(e) => e.preventDefault()}
aria-describedby="namespace-field"
className="pf-v5-c-form__group-label-help"
>
<Icon isInline>
<HelpIcon />
</Icon>
</button>
</Popover>
}
isRequired
fieldId="namespace-field"
>
<InputGroup className="pf-v5-u-mt-sm">
<InputGroupItem isFill>
<TextInput
autoFocus={true}
autoComplete={"off"}
isRequired
type="text"
id="namespace-field"
name="namespace-field"
aria-label="Namespace field"
aria-describedby="namespace-field-helper"
value={props.connection.namespace}
onChange={onNamespaceChanged}
isDisabled={isConnecting}
tabIndex={1}
data-testid="namespace-text-field"
/>
</InputGroupItem>
<InputGroupText>
<Button size="sm" variant="plain" aria-label="Clear namespace button" onClick={onClearNamespace}>
<TimesIcon />
</Button>
</InputGroupText>
</InputGroup>
</FormGroup>
<FormGroup
label={i18n.terms.host}
labelIcon={
<Popover bodyContent={i18n.devDeployments.configModal.hostInfo}>
<button
type="button"
aria-label="More info for host field"
onClick={(e) => e.preventDefault()}
aria-describedby="host-field"
className="pf-v5-c-form__group-label-help"
>
<Icon isInline>
<HelpIcon />
</Icon>{" "}
</button>
</Popover>
}
isRequired
fieldId="host-field"
>
<InputGroup className="pf-v5-u-mt-sm">
<InputGroupItem isFill>
<TextInput
autoComplete={"off"}
isRequired
type="text"
id="host-field"
name="host-field"
aria-label="Host field"
aria-describedby="host-field-helper"
value={props.connection.host}
onChange={onHostChanged}
isDisabled={isConnecting}
tabIndex={2}
data-testid="host-text-field"
/>
</InputGroupItem>
<InputGroupText>
<Button size="sm" variant="plain" aria-label="Clear host button" onClick={onClearHost}>
<TimesIcon />
</Button>
</InputGroupText>
</InputGroup>
</FormGroup>
<FormGroup
label={i18n.terms.token}
labelIcon={
<Popover bodyContent={i18n.devDeployments.configModal.tokenInfo}>
<button
type="button"
aria-label="More info for token field"
onClick={(e) => e.preventDefault()}
aria-describedby="token-field"
className="pf-v5-c-form__group-label-help"
>
<Icon isInline>
<HelpIcon />
</Icon>{" "}
</button>
</Popover>
}
isRequired
fieldId="token-field"
>
<InputGroup className="pf-v5-u-mt-sm">
<InputGroupItem isFill>
<TextInput
autoComplete={"off"}
isRequired
type="text"
id="token-field"
name="token-field"
aria-label="Token field"
aria-describedby="token-field-helper"
value={props.connection.token}
onChange={onTokenChanged}
isDisabled={isConnecting}
tabIndex={3}
data-testid="token-text-field"
/>
</InputGroupItem>
<InputGroupText>
<Button size="sm" variant="plain" aria-label="Clear token button" onClick={onClearToken}>
<TimesIcon />
</Button>
</InputGroupText>
</InputGroup>
</FormGroup>
<FormGroup fieldId="disable-tls-validation">
<Checkbox
id="disable-tls-validation"
name="disable-tls-validation"
label={i18n.devDeployments.configModal.insecurelyDisableTlsCertificateValidation}
description={
<I18nHtml>{i18n.devDeployments.configModal.insecurelyDisableTlsCertificateValidationInfo}</I18nHtml>
}
aria-label="Disable TLS Certificate Validation"
tabIndex={4}
isChecked={props.connection.insecurelyDisableTlsCertificateValidation}
onChange={onInsecurelyDisableTlsCertificateValidationChange}
/>
</FormGroup>
<ActionGroup>
<Button
id="dev-deployments-config-save-button"
key="save"
variant="primary"
onClick={onConnect}
data-testid="save-config-button"
isLoading={isConnecting || props.isLoadingService}
isDisabled={isConnecting || props.isLoadingService}
spinnerAriaValueText={isConnecting || props.isLoadingService ? "Loading" : undefined}
>
{isConnecting || props.isLoadingService ? "Connecting" : "Connect"}
</Button>
</ActionGroup>
</Form>
</>
);
}