import React, { useCallback, useState } from "react"; import { Button, Form, FormGroup, FormHelperText, HelperText, HelperTextItem, TextArea, TextInput, } from "@patternfly/react-core"; import { Modal, ModalBody, ModalFooter, ModalHeader, } from "@patternfly/react-core/next"; // eslint-disable-next-line @typescript-eslint/no-namespace export namespace DiscoverySourceSetupModal { export type Props = { isOpen?: boolean; isDisabled?: boolean; onClose?: ((event: KeyboardEvent | React.MouseEvent) => void) | undefined; onSubmit: React.FormEventHandler | undefined; }; } export const DiscoverySourceSetupModal: React.FC< DiscoverySourceSetupModal.Props > = (props) => { const { isOpen = false, isDisabled = false, onClose, onSubmit } = props; const [sshKey, setSshKey] = useState(""); const [sshKeyError, setSshKeyError] = useState(null); const validateSshKey = useCallback((key: string): string | null => { // SSH key validation regex patterns const SSH_KEY_PATTERNS = { RSA: /^ssh-rsa\s+[A-Za-z0-9+/]+[=]{0,2}(\s+.*)?$/, ED25519: /^ssh-ed25519\s+[A-Za-z0-9+/]+[=]{0,2}(\s+.*)?$/, ECDSA: /^ssh-(ecdsa|sk-ecdsa)-sha2-nistp[0-9]+\s+[A-Za-z0-9+/]+[=]{0,2}(\s+.*)?$/, }; // Optional field, so empty is valid if (!key) return null; // Check if the key matches any of the known SSH key formats const isValidKey = Object.values(SSH_KEY_PATTERNS).some(pattern => pattern.test(key.trim())); return isValidKey ? null : "Invalid SSH key format. Please provide a valid SSH public key."; }, []); const handleSshKeyChange = (value: string): void => { setSshKey(value); setSshKeyError(validateSshKey(value)); }; const handleSubmit = useCallback>( (event) => { event.preventDefault(); // Validate SSH key before submission const keyValidationError = validateSshKey(sshKey); if (keyValidationError) { setSshKeyError(keyValidationError); return; } if (onSubmit) { onSubmit(event); } }, [onSubmit, sshKey, validateSshKey] ); return (
Name your environment.