FileUploadSetting.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import type { JSX } from 'react';
  2. import { useCallback } from 'react';
  3. import { useTranslation } from 'next-i18next';
  4. import { useForm, useController } from 'react-hook-form';
  5. import { toastSuccess, toastError } from '~/client/util/toastr';
  6. import { FileUploadType } from '~/interfaces/file-uploader';
  7. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  8. import { AwsSettingMolecule } from './AwsSetting';
  9. import { AzureSettingMolecule } from './AzureSetting';
  10. import type { FileUploadFormValues } from './FileUploadSetting.types';
  11. import { GcsSettingMolecule } from './GcsSetting';
  12. import { useFileUploadSettings } from './useFileUploadSettings';
  13. const FileUploadSetting = (): JSX.Element => {
  14. const { t } = useTranslation(['admin', 'commons']);
  15. const {
  16. data, isLoading, error, updateSettings,
  17. } = useFileUploadSettings();
  18. const {
  19. register, handleSubmit, control, watch, formState,
  20. } = useForm<FileUploadFormValues>({
  21. values: data ? {
  22. fileUploadType: data.fileUploadType,
  23. s3Region: data.s3Region,
  24. s3CustomEndpoint: data.s3CustomEndpoint,
  25. s3Bucket: data.s3Bucket,
  26. s3AccessKeyId: data.s3AccessKeyId,
  27. s3SecretAccessKey: data.s3SecretAccessKey,
  28. s3ReferenceFileWithRelayMode: data.s3ReferenceFileWithRelayMode,
  29. gcsApiKeyJsonPath: data.gcsApiKeyJsonPath,
  30. gcsBucket: data.gcsBucket,
  31. gcsUploadNamespace: data.gcsUploadNamespace,
  32. gcsReferenceFileWithRelayMode: data.gcsReferenceFileWithRelayMode,
  33. azureTenantId: data.azureTenantId,
  34. azureClientId: data.azureClientId,
  35. azureClientSecret: data.azureClientSecret,
  36. azureStorageAccountName: data.azureStorageAccountName,
  37. azureStorageContainerName: data.azureStorageContainerName,
  38. azureReferenceFileWithRelayMode: data.azureReferenceFileWithRelayMode,
  39. } : undefined,
  40. });
  41. // Use controller for fileUploadType radio buttons
  42. const { field: fileUploadTypeField } = useController({
  43. name: 'fileUploadType',
  44. control,
  45. });
  46. // Use controller for relay mode fields
  47. const { field: s3RelayModeField } = useController({
  48. name: 's3ReferenceFileWithRelayMode',
  49. control,
  50. });
  51. const { field: gcsRelayModeField } = useController({
  52. name: 'gcsReferenceFileWithRelayMode',
  53. control,
  54. });
  55. const { field: azureRelayModeField } = useController({
  56. name: 'azureReferenceFileWithRelayMode',
  57. control,
  58. });
  59. const fileUploadType = watch('fileUploadType');
  60. const onSubmit = useCallback(async(formData: FileUploadFormValues) => {
  61. try {
  62. await updateSettings(formData, formState.dirtyFields);
  63. toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.file_upload_settings'), ns: 'commons' }));
  64. }
  65. catch (err) {
  66. toastError(err);
  67. }
  68. }, [updateSettings, formState.dirtyFields, t]);
  69. if (isLoading) {
  70. return <div>Loading...</div>;
  71. }
  72. if (error || !data) {
  73. return <div>Error loading settings</div>;
  74. }
  75. return (
  76. <form onSubmit={handleSubmit(onSubmit)}>
  77. <p className="card custom-card bg-warning-subtle my-3">
  78. {t('admin:app_setting.file_upload')}
  79. <span className="text-danger mt-1">
  80. <span className="material-symbols-outlined">link_off</span>
  81. {t('admin:app_setting.change_setting')}
  82. </span>
  83. </p>
  84. <div className="row mb-3">
  85. <label className="text-start text-md-end col-md-3 col-form-label">
  86. {t('admin:app_setting.file_upload_method')}
  87. </label>
  88. <div className="col-md-6 py-2">
  89. {Object.values(FileUploadType).map((type) => {
  90. return (
  91. <div key={type} className="form-check form-check-inline">
  92. <input
  93. type="radio"
  94. className="form-check-input"
  95. name="file-upload-type"
  96. id={`file-upload-type-radio-${type}`}
  97. checked={fileUploadTypeField.value === type}
  98. disabled={data.isFixedFileUploadByEnvVar}
  99. onChange={() => fileUploadTypeField.onChange(type)}
  100. />
  101. <label className="form-label form-check-label" htmlFor={`file-upload-type-radio-${type}`}>
  102. {t(`admin:app_setting.${type}_label`)}
  103. </label>
  104. </div>
  105. );
  106. })}
  107. </div>
  108. {data.isFixedFileUploadByEnvVar && (
  109. <p className="alert alert-warning mt-2 text-start offset-3 col-6">
  110. <span className="material-symbols-outlined">help</span>
  111. <b>FIXED</b>
  112. <br />
  113. {/* eslint-disable-next-line react/no-danger */}
  114. <b dangerouslySetInnerHTML={{
  115. __html: t('admin:app_setting.fixed_by_env_var', {
  116. envKey: 'FILE_UPLOAD',
  117. envVar: data.envFileUploadType,
  118. }),
  119. }}
  120. />
  121. </p>
  122. )}
  123. </div>
  124. {fileUploadType === 'aws' && (
  125. <AwsSettingMolecule
  126. register={register}
  127. s3ReferenceFileWithRelayMode={s3RelayModeField.value}
  128. onChangeS3ReferenceFileWithRelayMode={s3RelayModeField.onChange}
  129. />
  130. )}
  131. {fileUploadType === 'gcs' && (
  132. <GcsSettingMolecule
  133. register={register}
  134. gcsReferenceFileWithRelayMode={gcsRelayModeField.value}
  135. gcsUseOnlyEnvVars={data.gcsUseOnlyEnvVars}
  136. envGcsApiKeyJsonPath={data.envGcsApiKeyJsonPath}
  137. envGcsBucket={data.envGcsBucket}
  138. envGcsUploadNamespace={data.envGcsUploadNamespace}
  139. onChangeGcsReferenceFileWithRelayMode={gcsRelayModeField.onChange}
  140. />
  141. )}
  142. {fileUploadType === 'azure' && (
  143. <AzureSettingMolecule
  144. register={register}
  145. azureReferenceFileWithRelayMode={azureRelayModeField.value}
  146. azureUseOnlyEnvVars={data.azureUseOnlyEnvVars}
  147. envAzureTenantId={data.envAzureTenantId}
  148. envAzureClientId={data.envAzureClientId}
  149. envAzureClientSecret={data.envAzureClientSecret}
  150. envAzureStorageAccountName={data.envAzureStorageAccountName}
  151. envAzureStorageContainerName={data.envAzureStorageContainerName}
  152. onChangeAzureReferenceFileWithRelayMode={azureRelayModeField.onChange}
  153. />
  154. )}
  155. <AdminUpdateButtonRow type="submit" disabled={isLoading} />
  156. </form>
  157. );
  158. };
  159. export default FileUploadSetting;