import type { JSX } from 'react'; import { useCallback } from 'react'; import { useTranslation } from 'next-i18next'; import { useController, useForm } from 'react-hook-form'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { FileUploadType } from '~/interfaces/file-uploader'; import { useGrowiAppIdForGrowiCloud, useGrowiCloudUri } from '~/states/global'; import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow'; import { AwsSettingMolecule } from './AwsSetting'; import { AzureSettingMolecule } from './AzureSetting'; import type { FileUploadFormValues } from './FileUploadSetting.types'; import { GcsSettingMolecule } from './GcsSetting'; import { useFileUploadSettings } from './useFileUploadSettings'; const FileUploadSetting = (): JSX.Element => { const { t } = useTranslation(['admin', 'commons']); const growiCloudUri = useGrowiCloudUri(); const growiAppIdForGrowiCloud = useGrowiAppIdForGrowiCloud(); const isCloud = growiCloudUri != null && growiAppIdForGrowiCloud != null; const { data, isLoading, error, updateSettings } = useFileUploadSettings(); const { register, handleSubmit, control, watch, formState } = useForm({ values: data ? { fileUploadType: data.fileUploadType, s3Region: data.s3Region, s3CustomEndpoint: data.s3CustomEndpoint, s3Bucket: data.s3Bucket, s3AccessKeyId: data.s3AccessKeyId, s3SecretAccessKey: data.s3SecretAccessKey, s3ReferenceFileWithRelayMode: data.s3ReferenceFileWithRelayMode, gcsApiKeyJsonPath: data.gcsApiKeyJsonPath, gcsBucket: data.gcsBucket, gcsUploadNamespace: data.gcsUploadNamespace, gcsReferenceFileWithRelayMode: data.gcsReferenceFileWithRelayMode, azureTenantId: data.azureTenantId, azureClientId: data.azureClientId, azureClientSecret: data.azureClientSecret, azureStorageAccountName: data.azureStorageAccountName, azureStorageContainerName: data.azureStorageContainerName, azureReferenceFileWithRelayMode: data.azureReferenceFileWithRelayMode, } : undefined, }); // Use controller for fileUploadType radio buttons const { field: fileUploadTypeField } = useController({ name: 'fileUploadType', control, }); // Use controller for relay mode fields const { field: s3RelayModeField } = useController({ name: 's3ReferenceFileWithRelayMode', control, }); const { field: gcsRelayModeField } = useController({ name: 'gcsReferenceFileWithRelayMode', control, }); const { field: azureRelayModeField } = useController({ name: 'azureReferenceFileWithRelayMode', control, }); const fileUploadType = watch('fileUploadType'); const onSubmit = useCallback( async (formData: FileUploadFormValues) => { try { await updateSettings(formData, formState.dirtyFields); toastSuccess( t('toaster.update_successed', { target: t('admin:app_setting.file_upload_settings'), ns: 'commons', }), ); } catch (err) { toastError(err); } }, [updateSettings, formState.dirtyFields, t], ); if (isLoading) { return
Loading...
; } if (error || !data) { return
Error loading settings
; } return (

{t('admin:app_setting.file_upload')} link_off {t('admin:app_setting.change_setting')}

{t('admin:app_setting.file_upload_method')} {!isCloud && (
{Object.values(FileUploadType).map((type) => { return (
fileUploadTypeField.onChange(type)} />
); })}
)} {isCloud ? (

{t('admin:cloud_setting_management.storage_change_from_cloud', { fileUploadType: t(`admin:app_setting.${fileUploadType}_label`), })}

share {t('admin:cloud_setting_management.to_cloud_settings')}
) : ( data.isFixedFileUploadByEnvVar && (

help FIXED

) )}
{fileUploadType === 'aws' && ( )} {fileUploadType === 'gcs' && ( )} {fileUploadType === 'azure' && ( )} {!isCloud && } ); }; export default FileUploadSetting;