FileUploadSetting.tsx 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import AdminAppContainer from '~/client/services/AdminAppContainer';
  4. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  5. import { withUnstatedContainers } from '../../UnstatedUtils';
  6. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  7. import AwsSetting from './AwsSetting';
  8. import GcsSettings from './GcsSettings';
  9. type Props = {
  10. adminAppContainer: AdminAppContainer,
  11. }
  12. const FileUploadSetting = (props: Props) => {
  13. const { t } = useTranslation();
  14. const { adminAppContainer } = props;
  15. const { fileUploadType } = adminAppContainer.state;
  16. const fileUploadTypes = ['aws', 'gcs', 'gridfs', 'local'];
  17. const submitHandler = useCallback(async() => {
  18. try {
  19. await adminAppContainer.updateFileUploadSettingHandler();
  20. toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.file_upload_settings') }));
  21. }
  22. catch (err) {
  23. toastError(err);
  24. }
  25. }, [adminAppContainer, t]);
  26. return (
  27. <>
  28. <p className="card well my-3">
  29. {t('admin:app_setting.file_upload')}
  30. <br />
  31. <br />
  32. <span className="text-danger">
  33. <i className="ti-unlink"></i>
  34. {t('admin:app_setting.change_setting')}
  35. </span>
  36. </p>
  37. <div className="row form-group mb-3">
  38. <label className="text-left text-md-right col-md-3 col-form-label">
  39. {t('admin:app_setting.file_upload_method')}
  40. </label>
  41. <div className="col-md-6 py-2">
  42. {fileUploadTypes.map((type) => {
  43. return (
  44. <div key={type} className="custom-control custom-radio custom-control-inline">
  45. <input
  46. type="radio"
  47. className="custom-control-input"
  48. name="file-upload-type"
  49. id={`file-upload-type-radio-${type}`}
  50. checked={adminAppContainer.state.fileUploadType === type}
  51. disabled={adminAppContainer.state.isFixedFileUploadByEnvVar}
  52. onChange={() => { adminAppContainer.changeFileUploadType(type) }}
  53. />
  54. <label className="custom-control-label" htmlFor={`file-upload-type-radio-${type}`}>{t(`admin:app_setting.${type}_label`)}</label>
  55. </div>
  56. );
  57. })}
  58. </div>
  59. {adminAppContainer.state.isFixedFileUploadByEnvVar && (
  60. <p className="alert alert-warning mt-2 text-left offset-3 col-6">
  61. <i className="icon-exclamation icon-fw">
  62. </i><b>FIXED</b><br />
  63. {/* eslint-disable-next-line react/no-danger */}
  64. <b dangerouslySetInnerHTML={{ __html: t('admin:app_setting.fixed_by_env_var', { fileUploadType: adminAppContainer.state.envFileUploadType }) }} />
  65. </p>
  66. )}
  67. </div>
  68. {fileUploadType === 'aws' && <AwsSetting />}
  69. {fileUploadType === 'gcs' && <GcsSettings />}
  70. <AdminUpdateButtonRow onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null} />
  71. </>
  72. );
  73. };
  74. /**
  75. * Wrapper component for using unstated
  76. */
  77. const FileUploadSettingWrapper = withUnstatedContainers(FileUploadSetting, [AdminAppContainer]);
  78. export default FileUploadSettingWrapper;