DNSProviderFields.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { IconAlertTriangle } from "@tabler/icons-react";
  2. import CodeEditor from "@uiw/react-textarea-code-editor";
  3. import { Field, useFormikContext } from "formik";
  4. import { useState } from "react";
  5. import Select, { type ActionMeta } from "react-select";
  6. import type { DNSProvider } from "src/api/backend";
  7. import { useDnsProviders } from "src/hooks";
  8. import { intl, T } from "src/locale";
  9. import styles from "./DNSProviderFields.module.css";
  10. interface DNSProviderOption {
  11. readonly value: string;
  12. readonly label: string;
  13. readonly credentials: string;
  14. }
  15. interface Props {
  16. showBoundaryBox?: boolean;
  17. }
  18. export function DNSProviderFields({ showBoundaryBox = false }: Props) {
  19. const { values, setFieldValue } = useFormikContext();
  20. const { data: dnsProviders, isLoading } = useDnsProviders();
  21. const [dnsProviderId, setDnsProviderId] = useState<string | null>(null);
  22. const v: any = values || {};
  23. const handleChange = (newValue: any, _actionMeta: ActionMeta<DNSProviderOption>) => {
  24. setFieldValue("meta.dnsProvider", newValue?.value);
  25. setFieldValue("meta.dnsProviderCredentials", newValue?.credentials);
  26. setDnsProviderId(newValue?.value);
  27. };
  28. const options: DNSProviderOption[] =
  29. dnsProviders?.map((p: DNSProvider) => ({
  30. value: p.id,
  31. label: p.name,
  32. credentials: p.credentials,
  33. })) || [];
  34. return (
  35. <div className={showBoundaryBox ? styles.dnsChallengeWarning : undefined}>
  36. <p className="text-warning">
  37. <IconAlertTriangle size={16} className="me-1" />
  38. <T id="certificates.dns.warning" />
  39. </p>
  40. <Field name="meta.dnsProvider">
  41. {({ field }: any) => (
  42. <div className="row">
  43. <label htmlFor="dnsProvider" className="form-label">
  44. <T id="certificates.dns.provider" />
  45. </label>
  46. <Select
  47. className="react-select-container"
  48. classNamePrefix="react-select"
  49. name={field.name}
  50. id="dnsProvider"
  51. closeMenuOnSelect={true}
  52. isClearable={false}
  53. placeholder={intl.formatMessage({ id: "certificates.dns.provider.placeholder" })}
  54. isLoading={isLoading}
  55. isSearchable
  56. onChange={handleChange}
  57. options={options}
  58. />
  59. </div>
  60. )}
  61. </Field>
  62. {dnsProviderId ? (
  63. <>
  64. <Field name="meta.dnsProviderCredentials">
  65. {({ field }: any) => (
  66. <div className="mt-3">
  67. <label htmlFor="dnsProviderCredentials" className="form-label">
  68. <T id="certificates.dns.credentials" />
  69. </label>
  70. <CodeEditor
  71. language="bash"
  72. id="dnsProviderCredentials"
  73. padding={15}
  74. data-color-mode="dark"
  75. minHeight={130}
  76. indentWidth={2}
  77. style={{
  78. fontFamily:
  79. "ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace",
  80. borderRadius: "0.3rem",
  81. minHeight: "130px",
  82. backgroundColor: "var(--tblr-bg-surface-dark)",
  83. }}
  84. value={v.meta.dnsProviderCredentials || ""}
  85. {...field}
  86. />
  87. <div>
  88. <small className="text-muted">
  89. <T id="certificates.dns.credentials-note" />
  90. </small>
  91. </div>
  92. <div>
  93. <small className="text-danger">
  94. <T id="certificates.dns.credentials-warning" />
  95. </small>
  96. </div>
  97. </div>
  98. )}
  99. </Field>
  100. <Field name="meta.propagationSeconds">
  101. {({ field }: any) => (
  102. <div className="mt-3">
  103. <label htmlFor="propagationSeconds" className="form-label">
  104. <T id="certificates.dns.propagation-seconds" />
  105. </label>
  106. <input
  107. id="propagationSeconds"
  108. type="number"
  109. className="form-control"
  110. min={0}
  111. max={7200}
  112. {...field}
  113. />
  114. <small className="text-muted">
  115. <T id="certificates.dns.propagation-seconds-note" />
  116. </small>
  117. </div>
  118. )}
  119. </Field>
  120. </>
  121. ) : null}
  122. </div>
  123. );
  124. }