DNSCertificateModal.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { useQueryClient } from "@tanstack/react-query";
  2. import EasyModal, { type InnerModalProps } from "ez-modal-react";
  3. import { Form, Formik } from "formik";
  4. import { type ReactNode, useState } from "react";
  5. import { Alert } from "react-bootstrap";
  6. import Modal from "react-bootstrap/Modal";
  7. import { createCertificate } from "src/api/backend";
  8. import { Button, DNSProviderFields, DomainNamesField } from "src/components";
  9. import { T } from "src/locale";
  10. import { showObjectSuccess } from "src/notifications";
  11. const showDNSCertificateModal = () => {
  12. EasyModal.show(DNSCertificateModal);
  13. };
  14. const DNSCertificateModal = EasyModal.create(({ visible, remove }: InnerModalProps) => {
  15. const queryClient = useQueryClient();
  16. const [errorMsg, setErrorMsg] = useState<ReactNode | null>(null);
  17. const [isSubmitting, setIsSubmitting] = useState(false);
  18. const onSubmit = async (values: any, { setSubmitting }: any) => {
  19. if (isSubmitting) return;
  20. setIsSubmitting(true);
  21. setErrorMsg(null);
  22. try {
  23. await createCertificate(values);
  24. showObjectSuccess("certificate", "saved");
  25. remove();
  26. } catch (err: any) {
  27. setErrorMsg(<T id={err.message} />);
  28. }
  29. queryClient.invalidateQueries({ queryKey: ["certificates"] });
  30. setIsSubmitting(false);
  31. setSubmitting(false);
  32. };
  33. return (
  34. <Modal show={visible} onHide={remove}>
  35. <Formik
  36. initialValues={
  37. {
  38. domainNames: [],
  39. provider: "letsencrypt",
  40. meta: {
  41. dnsChallenge: true,
  42. },
  43. } as any
  44. }
  45. onSubmit={onSubmit}
  46. >
  47. {() => (
  48. <Form>
  49. <Modal.Header closeButton>
  50. <Modal.Title>
  51. <T id="object.add" tData={{ object: "lets-encrypt-via-dns" }} />
  52. </Modal.Title>
  53. </Modal.Header>
  54. <Modal.Body className="p-0">
  55. <Alert variant="danger" show={!!errorMsg} onClose={() => setErrorMsg(null)} dismissible>
  56. {errorMsg}
  57. </Alert>
  58. <div className="card m-0 border-0">
  59. <div className="card-body">
  60. <DomainNamesField isWildcardPermitted dnsProviderWildcardSupported />
  61. <DNSProviderFields />
  62. </div>
  63. </div>
  64. </Modal.Body>
  65. <Modal.Footer>
  66. <Button data-bs-dismiss="modal" onClick={remove} disabled={isSubmitting}>
  67. <T id="cancel" />
  68. </Button>
  69. <Button
  70. type="submit"
  71. actionType="primary"
  72. className="ms-auto bg-pink"
  73. data-bs-dismiss="modal"
  74. isLoading={isSubmitting}
  75. disabled={isSubmitting}
  76. >
  77. <T id="save" />
  78. </Button>
  79. </Modal.Footer>
  80. </Form>
  81. )}
  82. </Formik>
  83. </Modal>
  84. );
  85. });
  86. export { showDNSCertificateModal };