diff --git a/apps/mobile/app/screens/settings/components.tsx b/apps/mobile/app/screens/settings/components.tsx
index f18de97aa..006205569 100644
--- a/apps/mobile/app/screens/settings/components.tsx
+++ b/apps/mobile/app/screens/settings/components.tsx
@@ -48,7 +48,11 @@ import SoundPicker from "./sound-picker";
import ThemeSelector from "./theme-selector";
import { TitleFormat } from "./title-format";
import { NotesnookCircle } from "./notesnook-circle";
-import { ManageInboxKeys, InboxKeysList } from "./manage-inbox-keys";
+import {
+ ManageInboxKeys,
+ InboxKeysList,
+ SetupInboxKeys
+} from "./manage-inbox-keys";
import { FailedInboxItems } from "./failed-inbox-items";
export const components: { [name: string]: ReactElement } = {
@@ -84,5 +88,6 @@ export const components: { [name: string]: ReactElement } = {
"notesnook-circle": ,
"manage-inbox-keys": ,
"inbox-keys": ,
- "failed-inbox-items":
+ "failed-inbox-items": ,
+ "setup-inbox-keys":
};
diff --git a/apps/mobile/app/screens/settings/manage-inbox-keys.tsx b/apps/mobile/app/screens/settings/manage-inbox-keys.tsx
index bb21872d3..f0c7c3fb4 100644
--- a/apps/mobile/app/screens/settings/manage-inbox-keys.tsx
+++ b/apps/mobile/app/screens/settings/manage-inbox-keys.tsx
@@ -16,35 +16,168 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-import React from "react";
import { usePromise } from "@notesnook/common";
-import { db } from "../../common/database";
-import { ActivityIndicator, ScrollView, View } from "react-native";
-import { Button } from "../../components/ui/button";
-import { strings } from "@notesnook/intl";
-import Input from "../../components/ui/input";
-import { useEffect, useRef, useState } from "react";
+import { InboxApiKey } from "@notesnook/core";
import { SerializedKeyPair } from "@notesnook/crypto";
+import { strings } from "@notesnook/intl";
+import { useThemeColors } from "@notesnook/theme";
+import Clipboard from "@react-native-clipboard/clipboard";
+import dayjs from "dayjs";
+import React, { useEffect, useRef, useState } from "react";
+import { ActivityIndicator, ScrollView, View } from "react-native";
+import { DatabaseLogger, db } from "../../common/database";
+import { Storage } from "../../common/database/storage";
+import { presentDialog } from "../../components/dialog/functions";
+import AddApiKeySheet from "../../components/sheets/add-api-key";
+import { Button } from "../../components/ui/button";
+import { IconButton } from "../../components/ui/icon-button";
+import Input from "../../components/ui/input";
import FormInput, {
createFormRef,
validators
} from "../../components/ui/input/form-input";
+import { Notice } from "../../components/ui/notice";
+import Heading from "../../components/ui/typography/heading";
import Paragraph from "../../components/ui/typography/paragraph";
-import { DefaultAppStyles } from "../../utils/styles";
import { ToastManager } from "../../services/event-manager";
import Navigation from "../../services/navigation";
-import { Storage } from "../../common/database/storage";
-import { Notice } from "../../components/ui/notice";
-import { presentDialog } from "../../components/dialog/functions";
import { useSettingStore } from "../../stores/use-setting-store";
-import { InboxApiKey } from "@notesnook/core";
-import { IconButton } from "../../components/ui/icon-button";
-import Clipboard from "@react-native-clipboard/clipboard";
-import { useThemeColors } from "@notesnook/theme";
-import dayjs from "dayjs";
-import Heading from "../../components/ui/typography/heading";
import { AppFontSize } from "../../utils/size";
-import AddApiKeySheet from "../../components/sheets/add-api-key";
+import { DefaultAppStyles } from "../../utils/styles";
+
+export const SetupInboxKeys = () => {
+ const [mode, setMode] = useState<"choose" | "edit">("choose");
+ const [isLoading, setIsLoading] = useState(false);
+ const formRef = useRef(
+ createFormRef({
+ publicKey: "",
+ privateKey: ""
+ })
+ );
+
+ const handleAutoGenerate = async () => {
+ try {
+ setIsLoading(true);
+ await db.user.getInboxKeys();
+ ToastManager.show({
+ message: strings.inboxKeysSaved(),
+ type: "success"
+ });
+ useSettingStore.setState({
+ inboxEnabled: true
+ });
+ Navigation.goBack();
+ } catch (error) {
+ DatabaseLogger.error(error as Error);
+ ToastManager.error(error as Error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleSave = async () => {
+ try {
+ console.log("validated...");
+ if (!formRef.current.validate()) return;
+
+ console.log("validated...");
+
+ const keysEdited: SerializedKeyPair = {
+ publicKey: formRef.current.getValue("publicKey"),
+ privateKey: formRef.current.getValue("privateKey")
+ };
+
+ const result = await Storage.validatePGPKeyPair(keysEdited);
+
+ if (!result.isValid) {
+ formRef.current.setError("publicKey", result.message);
+ formRef.current.setError("privateKey", result.message);
+ return;
+ }
+ await db.user?.saveInboxKeys(keysEdited);
+ useSettingStore.setState({
+ inboxEnabled: true
+ });
+ Navigation.goBack();
+ } catch (e) {
+ DatabaseLogger.error(e);
+ ToastManager.error(e as Error);
+ }
+ };
+
+ return (
+
+ {mode === "choose" ? (
+ <>
+
+ {strings.setupInboxPgpKeysDescription()}
+
+
+
+
+ >
+ ) : (
+
+ {strings.publicKey()}
+
+ {strings.privateKey()}
+
+
+
+
+ )}
+
+ );
+};
const ManageInboxKeys = () => {
const keys = usePromise(() => db.user.getInboxKeys());
@@ -123,16 +256,23 @@ const ManageInboxKeys = () => {
positiveText: strings.yes(),
negativeText: strings.no(),
positivePress: async () => {
- await db.user?.saveInboxKeys(keysEdited);
- ToastManager.show({
- message: strings.inboxKeysSaved(),
- type: "success"
- });
- Navigation.goBack();
- return true;
+ try {
+ await db.user?.saveInboxKeys(keysEdited);
+ ToastManager.show({
+ message: strings.inboxKeysSaved(),
+ type: "success"
+ });
+ Navigation.goBack();
+ return true;
+ } catch (e) {
+ ToastManager.error(e as Error);
+ DatabaseLogger.error(e);
+ return false;
+ }
}
});
} catch (e) {
+ DatabaseLogger.error(e);
ToastManager.error(e as Error);
}
}}
@@ -170,6 +310,7 @@ const InboxKeysList = () => {
}
if (apiKeysPromise.status === "rejected") {
+ DatabaseLogger.log(apiKeysPromise.reason);
return (
{
const apiKeys = apiKeysPromise.value || [];
- console.log(apiKeys);
-
return (
useSettingStore((state) => state.inboxEnabled),
+ useHook: () => {
+ return useSettingStore((state) => state.inboxEnabled);
+ },
getter: (current) => current,
modifer: async (current) => {
if (current) {
@@ -754,21 +756,33 @@ export const settingsGroups: SettingSection[] = [
paragraph: strings.disableInboxAPIDesc(),
positiveText: strings.disable(),
positivePress: async () => {
- await db.user.discardInboxKeys();
- useSettingStore.setState({
- inboxEnabled: false
- });
- return true;
+ try {
+ await db.inboxItemsHistory.deleteFailed();
+ await db.user.discardInboxKeys();
+ useSettingStore.setState({
+ inboxEnabled: false
+ });
+ return true;
+ } catch (e) {
+ ToastManager.show({
+ message: (e as Error).message,
+ context: "local"
+ });
+ DatabaseLogger.error(e);
+ return false;
+ }
}
});
return;
}
try {
- await db.user.getInboxKeys();
- useSettingStore.setState({
- inboxEnabled: true
- });
+ Navigation.push("SettingsGroup", {
+ id: "setup-inbox-keys",
+ name: strings.setupInboxKeys(),
+ type: "screen",
+ component: "setup-inbox-keys"
+ } as any);
} catch (e) {
console.log(e);
}
diff --git a/apps/mobile/app/stores/index.ts b/apps/mobile/app/stores/index.ts
index 94200ecf7..82831963a 100644
--- a/apps/mobile/app/stores/index.ts
+++ b/apps/mobile/app/stores/index.ts
@@ -31,6 +31,7 @@ import { useNotebookStore } from "./use-notebook-store";
import { useNoteStore } from "./use-notes-store";
import { useRelationStore } from "./use-relation-store";
import { useReminderStore } from "./use-reminder-store";
+import { useSettingStore } from "./use-setting-store";
import { useTagStore } from "./use-tag-store";
import { useTrashStore } from "./use-trash-store";
import { useUserStore } from "./use-user-store";
@@ -121,6 +122,7 @@ export function initAfterSync(type: "full" | "send" = "send") {
useUserStore.setState({
profile: db.settings.getProfile()
});
+ useSettingStore.getState().refresh();
}
Notifications.setupReminders(true);
diff --git a/apps/mobile/package-lock.json b/apps/mobile/package-lock.json
index a7fd942da..1bb82b3ca 100644
--- a/apps/mobile/package-lock.json
+++ b/apps/mobile/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@notesnook/mobile",
- "version": "3.4.0-beta.0",
+ "version": "3.4.0-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@notesnook/mobile",
- "version": "3.4.0-beta.0",
+ "version": "3.4.0-beta.1",
"hasInstallScript": true,
"license": "GPL-3.0-or-later",
"dependencies": {
diff --git a/packages/intl/locale/en.po b/packages/intl/locale/en.po
index a16f3e488..98acebfa5 100644
--- a/packages/intl/locale/en.po
+++ b/packages/intl/locale/en.po
@@ -814,7 +814,7 @@ msgstr "All fields are required"
msgid "All files"
msgstr "All files"
-#: src/strings.ts:2758
+#: src/strings.ts:2762
msgid "All items deleted"
msgstr "All items deleted"
@@ -973,7 +973,7 @@ msgstr "Are you sure you want to clear all logs from {key}?"
msgid "Are you sure you want to clear trash?"
msgstr "Are you sure you want to clear trash?"
-#: src/strings.ts:2757
+#: src/strings.ts:2761
msgid "Are you sure you want to delete all failed inbox items?"
msgstr "Are you sure you want to delete all failed inbox items?"
@@ -989,7 +989,7 @@ msgstr "Are you sure you want to logout and clear all data stored on THIS DEVICE
msgid "Are you sure you want to logout from this device? Any unsynced changes will be lost."
msgstr "Are you sure you want to logout from this device? Any unsynced changes will be lost."
-#: src/strings.ts:2768
+#: src/strings.ts:2772
msgid "Are you sure you want to open this file: {filePath}?"
msgstr "Are you sure you want to open this file: {filePath}?"
@@ -1033,7 +1033,7 @@ msgstr "Attach image from URL"
msgid "Attached files"
msgstr "Attached files"
-#: src/strings.ts:2759
+#: src/strings.ts:2763
msgid "Attaching files"
msgstr "Attaching files"
@@ -1135,6 +1135,10 @@ msgstr "Auto save: off"
msgid "Auto start on system startup"
msgstr "Auto start on system startup"
+#: src/strings.ts:2750
+msgid "Auto-generate keys"
+msgstr "Auto-generate keys"
+
#: src/strings.ts:1220
#: src/strings.ts:1691
msgid "Automatic backups"
@@ -1585,6 +1589,10 @@ msgstr "Choose how time is displayed in the app"
msgid "Choose how you want to secure your notes locally."
msgstr "Choose how you want to secure your notes locally."
+#: src/strings.ts:2749
+msgid "Choose how you want to set up your Inbox PGP keys:"
+msgstr "Choose how you want to set up your Inbox PGP keys:"
+
#: src/strings.ts:2641
msgid "Choose what day to display as the first day of the week"
msgstr "Choose what day to display as the first day of the week"
@@ -1715,7 +1723,7 @@ msgstr "Click to update"
msgid "Close"
msgstr "Close"
-#: src/strings.ts:2760
+#: src/strings.ts:2764
msgid "Close ({seconds})"
msgstr "Close ({seconds})"
@@ -1828,11 +1836,11 @@ msgstr "Compress images before uploading"
msgid "Compressed images are uploaded in Full HD resolution and usually are good enough for most use cases."
msgstr "Compressed images are uploaded in Full HD resolution and usually are good enough for most use cases."
-#: src/strings.ts:2761
+#: src/strings.ts:2765
msgid "Compressing"
msgstr "Compressing"
-#: src/strings.ts:2765
+#: src/strings.ts:2769
msgid "Compression failed"
msgstr "Compression failed"
@@ -2184,7 +2192,7 @@ msgstr "Date format"
msgid "Date modified"
msgstr "Date modified"
-#: src/strings.ts:2749
+#: src/strings.ts:2753
msgid "Date synced"
msgstr "Date synced"
@@ -2273,7 +2281,7 @@ msgstr "Delete"
msgid "Delete account"
msgstr "Delete account"
-#: src/strings.ts:2755
+#: src/strings.ts:2759
msgid "Delete all"
msgstr "Delete all"
@@ -2345,7 +2353,7 @@ msgstr "Desktop app"
msgid "Desktop integration"
msgstr "Desktop integration"
-#: src/strings.ts:2748
+#: src/strings.ts:2752
msgid "Details"
msgstr "Details"
@@ -2692,7 +2700,7 @@ msgstr "Encrypted backup"
msgid "Encrypted, private, secure."
msgstr "Encrypted, private, secure."
-#: src/strings.ts:2762
+#: src/strings.ts:2766
msgid "Encrypting"
msgstr "Encrypting"
@@ -2804,6 +2812,14 @@ msgstr "Enter verification code sent to your new email"
msgid "Enter your new email"
msgstr "Enter your new email"
+#: src/strings.ts:2777
+msgid "Enter your PGP private key"
+msgstr "Enter your PGP private key"
+
+#: src/strings.ts:2776
+msgid "Enter your PGP public key"
+msgstr "Enter your PGP public key"
+
#: src/strings.ts:2101
msgid "Enter your username"
msgstr "Enter your username"
@@ -2969,7 +2985,7 @@ msgstr "Faced an issue or have a suggestion? Click here to create a bug report"
msgid "Failed"
msgstr "Failed"
-#: src/strings.ts:2750
+#: src/strings.ts:2754
msgid "Failed inbox items"
msgstr "Failed inbox items"
@@ -3107,7 +3123,7 @@ msgstr "File length is 0. Please upload this file again from the attachment mana
msgid "File length mismatch. Expected {expectedSize} but got {currentSize} bytes. Please upload this file again from the attachment manager."
msgstr "File length mismatch. Expected {expectedSize} but got {currentSize} bytes. Please upload this file again from the attachment manager."
-#: src/strings.ts:2770
+#: src/strings.ts:2774
msgid "File links cannot be opened in browsers. Please use the Notesnook desktop app."
msgstr "File links cannot be opened in browsers. Please use the Notesnook desktop app."
@@ -3115,7 +3131,7 @@ msgstr "File links cannot be opened in browsers. Please use the Notesnook deskto
msgid "File mismatch"
msgstr "File mismatch"
-#: src/strings.ts:2764
+#: src/strings.ts:2768
msgid "File size limit exceeded. Please upgrade your plan."
msgstr "File size limit exceeded. Please upgrade your plan."
@@ -3734,7 +3750,7 @@ msgstr "item"
msgid "Item"
msgstr "Item"
-#: src/strings.ts:2754
+#: src/strings.ts:2758
msgid "Item deleted"
msgstr "Item deleted"
@@ -4438,7 +4454,7 @@ msgstr "No downloads in progress."
msgid "No encryption key found"
msgstr "No encryption key found"
-#: src/strings.ts:2752
+#: src/strings.ts:2756
msgid "No failed inbox items"
msgstr "No failed inbox items"
@@ -4763,7 +4779,7 @@ msgstr "Open source."
msgid "Open the two-factor authentication (TOTP) app to view your authentication code."
msgstr "Open the two-factor authentication (TOTP) app to view your authentication code."
-#: src/strings.ts:2766
+#: src/strings.ts:2770
msgid "Opening local file"
msgstr "Opening local file"
@@ -5269,6 +5285,10 @@ msgstr "Properties"
msgid "Protect your notes"
msgstr "Protect your notes"
+#: src/strings.ts:2751
+msgid "Provide your own keys"
+msgstr "Provide your own keys"
+
#: src/strings.ts:2193
msgid "Proxy"
msgstr "Proxy"
@@ -6311,6 +6331,10 @@ msgstr "Setup app lock password"
msgid "Setup app lock pin"
msgstr "Setup app lock pin"
+#: src/strings.ts:2775
+msgid "Setup inbox keys"
+msgstr "Setup inbox keys"
+
#: src/strings.ts:681
msgid "Setup secondary 2FA method"
msgstr "Setup secondary 2FA method"
@@ -6375,7 +6399,7 @@ msgstr "shortcuts"
msgid "Shortcuts"
msgstr "Shortcuts"
-#: src/strings.ts:2753
+#: src/strings.ts:2757
msgid "Show"
msgstr "Show"
@@ -7503,7 +7527,7 @@ msgstr "View and manage inbox API keys"
msgid "View and share debug logs"
msgstr "View and share debug logs"
-#: src/strings.ts:2751
+#: src/strings.ts:2755
msgid "View failed inbox items and error contexts"
msgstr "View failed inbox items and error contexts"
diff --git a/packages/intl/locale/pseudo-LOCALE.po b/packages/intl/locale/pseudo-LOCALE.po
index e14f5d4e9..5b1a33374 100644
--- a/packages/intl/locale/pseudo-LOCALE.po
+++ b/packages/intl/locale/pseudo-LOCALE.po
@@ -814,7 +814,7 @@ msgstr ""
msgid "All files"
msgstr ""
-#: src/strings.ts:2758
+#: src/strings.ts:2762
msgid "All items deleted"
msgstr ""
@@ -973,7 +973,7 @@ msgstr ""
msgid "Are you sure you want to clear trash?"
msgstr ""
-#: src/strings.ts:2757
+#: src/strings.ts:2761
msgid "Are you sure you want to delete all failed inbox items?"
msgstr ""
@@ -989,7 +989,7 @@ msgstr ""
msgid "Are you sure you want to logout from this device? Any unsynced changes will be lost."
msgstr ""
-#: src/strings.ts:2768
+#: src/strings.ts:2772
msgid "Are you sure you want to open this file: {filePath}?"
msgstr ""
@@ -1033,7 +1033,7 @@ msgstr ""
msgid "Attached files"
msgstr ""
-#: src/strings.ts:2759
+#: src/strings.ts:2763
msgid "Attaching files"
msgstr ""
@@ -1135,6 +1135,10 @@ msgstr ""
msgid "Auto start on system startup"
msgstr ""
+#: src/strings.ts:2750
+msgid "Auto-generate keys"
+msgstr ""
+
#: src/strings.ts:1220
#: src/strings.ts:1691
msgid "Automatic backups"
@@ -1585,6 +1589,10 @@ msgstr ""
msgid "Choose how you want to secure your notes locally."
msgstr ""
+#: src/strings.ts:2749
+msgid "Choose how you want to set up your Inbox PGP keys:"
+msgstr ""
+
#: src/strings.ts:2641
msgid "Choose what day to display as the first day of the week"
msgstr ""
@@ -1704,7 +1712,7 @@ msgstr ""
msgid "Close"
msgstr ""
-#: src/strings.ts:2760
+#: src/strings.ts:2764
msgid "Close ({seconds})"
msgstr ""
@@ -1817,11 +1825,11 @@ msgstr ""
msgid "Compressed images are uploaded in Full HD resolution and usually are good enough for most use cases."
msgstr ""
-#: src/strings.ts:2761
+#: src/strings.ts:2765
msgid "Compressing"
msgstr ""
-#: src/strings.ts:2765
+#: src/strings.ts:2769
msgid "Compression failed"
msgstr ""
@@ -2173,7 +2181,7 @@ msgstr ""
msgid "Date modified"
msgstr ""
-#: src/strings.ts:2749
+#: src/strings.ts:2753
msgid "Date synced"
msgstr ""
@@ -2262,7 +2270,7 @@ msgstr ""
msgid "Delete account"
msgstr ""
-#: src/strings.ts:2755
+#: src/strings.ts:2759
msgid "Delete all"
msgstr ""
@@ -2334,7 +2342,7 @@ msgstr ""
msgid "Desktop integration"
msgstr ""
-#: src/strings.ts:2748
+#: src/strings.ts:2752
msgid "Details"
msgstr ""
@@ -2681,7 +2689,7 @@ msgstr ""
msgid "Encrypted, private, secure."
msgstr ""
-#: src/strings.ts:2762
+#: src/strings.ts:2766
msgid "Encrypting"
msgstr ""
@@ -2793,6 +2801,14 @@ msgstr ""
msgid "Enter your new email"
msgstr ""
+#: src/strings.ts:2777
+msgid "Enter your PGP private key"
+msgstr ""
+
+#: src/strings.ts:2776
+msgid "Enter your PGP public key"
+msgstr ""
+
#: src/strings.ts:2101
msgid "Enter your username"
msgstr ""
@@ -2958,7 +2974,7 @@ msgstr ""
msgid "Failed"
msgstr ""
-#: src/strings.ts:2750
+#: src/strings.ts:2754
msgid "Failed inbox items"
msgstr ""
@@ -3096,7 +3112,7 @@ msgstr ""
msgid "File length mismatch. Expected {expectedSize} but got {currentSize} bytes. Please upload this file again from the attachment manager."
msgstr ""
-#: src/strings.ts:2770
+#: src/strings.ts:2774
msgid "File links cannot be opened in browsers. Please use the Notesnook desktop app."
msgstr ""
@@ -3104,7 +3120,7 @@ msgstr ""
msgid "File mismatch"
msgstr ""
-#: src/strings.ts:2764
+#: src/strings.ts:2768
msgid "File size limit exceeded. Please upgrade your plan."
msgstr ""
@@ -3714,7 +3730,7 @@ msgstr ""
msgid "Item"
msgstr ""
-#: src/strings.ts:2754
+#: src/strings.ts:2758
msgid "Item deleted"
msgstr ""
@@ -4418,7 +4434,7 @@ msgstr ""
msgid "No encryption key found"
msgstr ""
-#: src/strings.ts:2752
+#: src/strings.ts:2756
msgid "No failed inbox items"
msgstr ""
@@ -4737,7 +4753,7 @@ msgstr ""
msgid "Open the two-factor authentication (TOTP) app to view your authentication code."
msgstr ""
-#: src/strings.ts:2766
+#: src/strings.ts:2770
msgid "Opening local file"
msgstr ""
@@ -5243,6 +5259,10 @@ msgstr ""
msgid "Protect your notes"
msgstr ""
+#: src/strings.ts:2751
+msgid "Provide your own keys"
+msgstr ""
+
#: src/strings.ts:2193
msgid "Proxy"
msgstr ""
@@ -6277,6 +6297,10 @@ msgstr ""
msgid "Setup app lock pin"
msgstr ""
+#: src/strings.ts:2775
+msgid "Setup inbox keys"
+msgstr ""
+
#: src/strings.ts:681
msgid "Setup secondary 2FA method"
msgstr ""
@@ -6341,7 +6365,7 @@ msgstr ""
msgid "Shortcuts"
msgstr ""
-#: src/strings.ts:2753
+#: src/strings.ts:2757
msgid "Show"
msgstr ""
@@ -7453,7 +7477,7 @@ msgstr ""
msgid "View and share debug logs"
msgstr ""
-#: src/strings.ts:2751
+#: src/strings.ts:2755
msgid "View failed inbox items and error contexts"
msgstr ""
diff --git a/packages/intl/src/strings.ts b/packages/intl/src/strings.ts
index 60d9b9306..d8dc8e2eb 100644
--- a/packages/intl/src/strings.ts
+++ b/packages/intl/src/strings.ts
@@ -2745,6 +2745,10 @@ Continue without attachments?`,
t`Please login to download attachments.`,
publicKeyRequired: () => t`Public key required`,
privateKeyRequired: () => t`Private key required`,
+ setupInboxPgpKeysDescription: () =>
+ t`Choose how you want to set up your Inbox PGP keys:`,
+ autoGenerateKeys: () => t`Auto-generate keys`,
+ provideOwnKeys: () => t`Provide your own keys`,
details: () => t`Details`,
dateSynced: () => t`Date synced`,
failedInboxItems: () => t`Failed inbox items`,
@@ -2783,5 +2787,8 @@ Continue without attachments?`,
t`We couldn't load this theme. The file appears to be incomplete or missing required theme properties.`,
copyLogs: () => t`Copy logs`,
permissionRequiredToSaveQRCode: () =>
- t`Permission required to save QR-Code to Gallery`
+ t`Permission required to save QR-Code to Gallery`,
+ setupInboxKeys: () => t`Setup inbox keys`,
+ enterPgpPublicKey: () => t`Enter your PGP public key`,
+ enterPgpPrivateKey: () => t`Enter your PGP private key`
};