diff --git a/public/locales/en-US/settings-email-pgp.json b/public/locales/en-US/settings-email-pgp.json index 3228df3..1795266 100644 --- a/public/locales/en-US/settings-email-pgp.json +++ b/public/locales/en-US/settings-email-pgp.json @@ -5,7 +5,8 @@ "fields": { "publicKey": { "label": "Your public key", - "helperText": "Paste your raw public key in armored format here." + "helperText": "Paste your raw public key in armored format here.", + "placeholder": "----BEGIN PGP PUBLIC KEY BLOCK----\n\n...\n----END PGP PUBLIC KEY BLOCK----" } }, "continueActionLabel": "Enable PGP encryption" diff --git a/src/App.tsx b/src/App.tsx index 8a44dad..43cf6f7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -116,6 +116,7 @@ const router = createBrowserRouter([ }, { path: "/settings/email-pgp", + loader: getServerSettings, element: , }, { diff --git a/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx b/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx index 05393f7..5f6877e 100644 --- a/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx +++ b/src/route-widgets/SettingsEmailPGPRoute/SetupPGPEncryptionForm.tsx @@ -1,23 +1,27 @@ import * as yup from "yup" +import {useLoaderData} from "react-router-dom" import {ReactElement, useContext, useState} from "react" import {useFormik} from "formik" +import {HiSearch} from "react-icons/hi" +import {AxiosError} from "axios" +import {RiLockFill} from "react-icons/ri" +import {useTranslation} from "react-i18next" + +import {LoadingButton} from "@mui/lab" import {useMutation} from "@tanstack/react-query" import {Box, FormGroup, FormHelperText, Grid, TextField} from "@mui/material" + import { FindPublicKeyResponse, UpdatePreferencesData, findPublicKey, updatePreferences, } from "~/apis" -import {HiSearch} from "react-icons/hi" -import {LoadingButton} from "@mui/lab" import {parseFastAPIError} from "~/utils" -import {AxiosError} from "axios" -import {RiLockFill} from "react-icons/ri" -import {SimpleDetailResponse, User} from "~/server-types" -import {useTranslation} from "react-i18next" +import {ServerSettings, SimpleDetailResponse, User} from "~/server-types" import {useErrorSuccessSnacks} from "~/hooks" import {AuthContext} from "~/components" + import ImportKeyDialog from "./ImportKeyDialog" interface Form { @@ -28,12 +32,13 @@ interface Form { export default function SetupPGPEncryptionForm(): ReactElement { const {t} = useTranslation(["settings-email-pgp", "common"]) + const serverSettings = useLoaderData() as ServerSettings const {showSuccess, showError} = useErrorSuccessSnacks() const [publicKeyResult, setPublicKeyResult] = useState(null) const schema = yup.object().shape({ - publicKey: yup.string().label(t("form.publicKey.label")), + publicKey: yup.string().label(t("form.publicKey.label")).min(1), }) const {user, _updateUser} = useContext(AuthContext) @@ -88,7 +93,7 @@ export default function SetupPGPEncryptionForm(): ReactElement { @@ -98,6 +103,7 @@ export default function SetupPGPEncryptionForm(): ReactElement { minRows={5} maxRows={15} label={t("form.fields.publicKey.label")} + placeholder={t("form.fields.publicKey.placeholder")} name="publicKey" value={formik.values.publicKey} onChange={formik.handleChange} @@ -111,16 +117,18 @@ export default function SetupPGPEncryptionForm(): ReactElement { {t("form.fields.publicKey.helperText")} - - } - onClick={() => findPublicKeyAsync()} - > - {t("findPublicKey.label")} - - + {serverSettings.allowPgpKeyDiscovery && ( + + } + onClick={() => findPublicKeyAsync()} + > + {t("findPublicKey.label")} + + + )} } + disabled={!formik.isValid} > {t("form.continueActionLabel")} diff --git a/src/server-types.ts b/src/server-types.ts index b0efbcf..3fb2513 100644 --- a/src/server-types.ts +++ b/src/server-types.ts @@ -88,6 +88,7 @@ export interface ServerSettings { allowAliasDeletion: boolean apiKeyMaxDays: number allowRegistrations: boolean + allowPgpKeyDiscovery: boolean } export interface Alias {