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()} + +