import type { ChangeEvent } from 'react'; import React, { useCallback } from 'react'; import type { ConnectionOptions } from 'mongodb-data-service'; import { Accordion, Banner, Body, Checkbox, FormFieldContainer, Label, Link, Description, TextInput, spacing, css, } from '@mongodb-js/compass-components'; import type { Document, AutoEncryptionOptions } from 'mongodb'; import type { UpdateConnectionFormField } from '../../../hooks/use-connect-form'; import KMSProviderStatusIndicator from './kms-provider-status-indicator'; import KMSProviderFieldsForm from './kms-provider-fields'; import EncryptedFieldConfigInput from './encrypted-field-config-input'; import type { ConnectionFormError } from '../../../utils/validation'; import { errorsByFieldTab, errorMessageByFieldName, fieldNameHasError, } from '../../../utils/validation'; import type { KMSProviderName, KMSField, } from '../../../utils/csfle-kms-fields'; import { KMSProviderFields } from '../../../utils/csfle-kms-fields'; import { useConnectionFormPreference } from '../../../hooks/use-connect-form-preferences'; const kmsProviderComponentWrapperStyles = css({ paddingLeft: spacing[3], marginBottom: spacing[3], }); interface KMSProviderMetadata { kmsProvider: KMSProviderName; title: string; noTLS?: boolean; clientCertIsOptional?: boolean; } const options: KMSProviderMetadata[] = [ { title: 'Local KMS', kmsProvider: 'local', noTLS: true, }, { title: 'AWS', kmsProvider: 'aws', }, { title: 'GCP', kmsProvider: 'gcp', }, { title: 'Azure', kmsProvider: 'azure', }, { title: 'KMIP', kmsProvider: 'kmip', clientCertIsOptional: false, }, ]; const containerStyles = css({ marginTop: spacing[3], }); const accordionContainerStyles = css({ marginTop: spacing[3], }); const titleStyles = css({ display: 'flex', alignItems: 'center', }); function CSFLETab({ connectionOptions, updateConnectionFormField, errors: errors_, }: { errors: ConnectionFormError[]; updateConnectionFormField: UpdateConnectionFormField; connectionOptions: ConnectionOptions; }): React.ReactElement { const autoEncryptionOptions = connectionOptions.fleOptions?.autoEncryption ?? {}; const enableSchemaMapDebugFlag = useConnectionFormPreference( 'enableDebugUseCsfleSchemaMap' ); const errors = errorsByFieldTab(errors_, 'csfle'); const handleFieldChanged = useCallback( ( key: keyof AutoEncryptionOptions, value?: AutoEncryptionOptions[keyof AutoEncryptionOptions] ) => { return updateConnectionFormField({ type: 'update-csfle-param', key: key, value, }); }, [updateConnectionFormField] ); const handleStoreCredentialsChanged = useCallback( (value: boolean) => { return updateConnectionFormField({ type: 'update-csfle-store-credentials', value, }); }, [updateConnectionFormField] ); return (