add option to automatically decrypt DMs

This commit is contained in:
hzrd149
2024-03-04 11:14:17 +00:00
parent 16ae69c3a6
commit e053e5dc0c
6 changed files with 43 additions and 51 deletions

View File

@@ -0,0 +1,5 @@
---
"nostrudel": minor
---
Add option to automatically decrypt DMs

View File

@@ -33,34 +33,12 @@ export type AppSettingsV3 = Omit<AppSettingsV2, "version"> & { version: 3; quick
export type AppSettingsV4 = Omit<AppSettingsV3, "version"> & { version: 4; loadOpenGraphData: boolean };
export type AppSettingsV5 = Omit<AppSettingsV4, "version"> & { version: 5; hideUsernames: boolean };
export type AppSettingsV6 = Omit<AppSettingsV5, "version"> & { version: 6; noteDifficulty: number | null };
export type AppSettingsV7 = Omit<AppSettingsV6, "version"> & { version: 7; defaultRelays: string[] };
export type AppSettingsV7 = Omit<AppSettingsV6, "version"> & { version: 7; autoDecryptDMs: boolean };
export function isV0(settings: { version: number }): settings is AppSettingsV0 {
return settings.version === undefined || settings.version === 0;
}
export function isV1(settings: { version: number }): settings is AppSettingsV1 {
return settings.version === 1;
}
export function isV2(settings: { version: number }): settings is AppSettingsV2 {
return settings.version === 2;
}
export function isV3(settings: { version: number }): settings is AppSettingsV3 {
return settings.version === 3;
}
export function isV4(settings: { version: number }): settings is AppSettingsV4 {
return settings.version === 4;
}
export function isV5(settings: { version: number }): settings is AppSettingsV5 {
return settings.version === 5;
}
export function isV6(settings: { version: number }): settings is AppSettingsV6 {
return settings.version === 6;
}
export type AppSettings = AppSettingsV6;
export type AppSettings = AppSettingsV7;
export const defaultSettings: AppSettings = {
version: 6,
version: 7,
theme: "default",
colorMode: "system",
defaultRelays: ["wss://relay.damus.io", "wss://nostr.wine", "wss://nos.lol", "wss://welcome.nostr.wine"],
@@ -74,6 +52,8 @@ export const defaultSettings: AppSettings = {
showSignatureVerification: false,
noteDifficulty: null,
autoDecryptDMs: false,
quickReactions: ["🤙", "❤️", "🤣", "😍", "🔥"],
autoPayWithWebLN: true,
@@ -89,14 +69,7 @@ export const defaultSettings: AppSettings = {
};
export function upgradeSettings(settings: { version: number }): AppSettings | null {
if (isV0(settings)) return { ...defaultSettings, ...settings, version: 6 };
if (isV1(settings)) return { ...defaultSettings, ...settings, version: 6 };
if (isV2(settings)) return { ...defaultSettings, ...settings, version: 6 };
if (isV3(settings)) return { ...defaultSettings, ...settings, version: 6 };
if (isV4(settings)) return { ...defaultSettings, ...settings, version: 6 };
if (isV5(settings)) return { ...defaultSettings, ...settings, version: 6 };
if (isV6(settings)) return settings;
return null;
return { ...defaultSettings, ...settings, version: 7 };
}
export function parseAppSettings(event: NostrEvent): AppSettings {

View File

@@ -25,6 +25,7 @@ import DirectMessageBlock from "./components/direct-message-block";
import useParamsProfilePointer from "../../hooks/use-params-pubkey-pointer";
import useUserMailboxes from "../../hooks/use-user-mailboxes";
import RelaySet from "../../classes/relay-set";
import useAppSettings from "../../hooks/use-app-settings";
/** This is broken out from DirectMessageChatPage for performance reasons. Don't use outside of file */
const ChatLog = memo(({ timeline }: { timeline: TimelineLoader }) => {
@@ -46,6 +47,7 @@ const ChatLog = memo(({ timeline }: { timeline: TimelineLoader }) => {
function DirectMessageChatPage({ pubkey }: { pubkey: string }) {
const account = useCurrentAccount()!;
const { autoDecryptDMs } = useAppSettings();
const navigate = useNavigate();
const location = useLocation();
const { getOrCreateContainer, addToQueue, startQueue } = useDecryptionContext();
@@ -124,9 +126,11 @@ function DirectMessageChatPage({ pubkey }: { pubkey: string }) {
<UserDnsIdentityIcon pubkey={pubkey} onlyIcon />
</Flex>
<ButtonGroup ml="auto">
<Button onClick={decryptAll} isLoading={loading}>
Decrypt All
</Button>
{!autoDecryptDMs && (
<Button onClick={decryptAll} isLoading={loading}>
Decrypt All
</Button>
)}
<IconButton
aria-label="Threads"
title="Threads"

View File

@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import { Alert, AlertDescription, AlertIcon, Button, ButtonProps } from "@chakra-ui/react";
import { UnlockIcon } from "../../../components/icons";
@@ -7,6 +7,7 @@ import useCurrentAccount from "../../../hooks/use-current-account";
import { getDMRecipient, getDMSender } from "../../../helpers/nostr/dms";
import { NostrEvent } from "../../../types/nostr-event";
import DebugEventButton from "../../../components/debug-modal/debug-event-button";
import useAppSettings from "../../../hooks/use-app-settings";
export default function DecryptPlaceholder({
children,
@@ -17,6 +18,7 @@ export default function DecryptPlaceholder({
message: NostrEvent;
} & Omit<ButtonProps, "children">): JSX.Element {
const account = useCurrentAccount();
const { autoDecryptDMs } = useAppSettings();
const isOwn = account?.pubkey === message.pubkey;
const [loading, setLoading] = useState(false);
const { requestDecrypt, plaintext, error } = useDecryptionContainer(
@@ -32,6 +34,18 @@ export default function DecryptPlaceholder({
setLoading(false);
};
// auto decrypt
useEffect(() => {
if (autoDecryptDMs && !plaintext && !error) {
setLoading(true);
requestDecrypt()
.catch(() => {})
.finally(() => {
setLoading(false);
});
}
}, [autoDecryptDMs, error, plaintext]);
if (plaintext) {
return children(plaintext);
}

View File

@@ -1,6 +1,5 @@
import { Button, Flex, Accordion, Link, useToast } from "@chakra-ui/react";
import { Link as RouterLink } from "react-router-dom";
import { GithubIcon, ToolsIcon } from "../../components/icons";
import { GithubIcon } from "../../components/icons";
import LightningSettings from "./lightning-settings";
import DatabaseSettings from "./database-settings";
import DisplaySettings from "./display-settings";

View File

@@ -13,17 +13,6 @@ import {
Input,
Link,
FormErrorMessage,
Code,
Button,
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalCloseButton,
ModalBody,
useDisclosure,
Text,
Heading,
} from "@chakra-ui/react";
import { safeUrl } from "../../helpers/parse";
import { AppSettings } from "../../services/settings/migrations";
@@ -31,7 +20,6 @@ import { PerformanceIcon } from "../../components/icons";
export default function PerformanceSettings() {
const { register, formState } = useFormContext<AppSettings>();
const cacheDetails = useDisclosure();
return (
<AccordionItem>
@@ -107,6 +95,15 @@ export default function PerformanceSettings() {
</Flex>
<FormHelperText>Enabled: show signature verification on notes</FormHelperText>
</FormControl>
<FormControl>
<Flex alignItems="center">
<FormLabel htmlFor="autoDecryptDMs" mb="0">
Automatically decrypt DMs
</FormLabel>
<Switch id="autoDecryptDMs" {...register("autoDecryptDMs")} />
</Flex>
<FormHelperText>Enabled: automatically decrypt direct messages</FormHelperText>
</FormControl>
</Flex>
</AccordionPanel>
</AccordionItem>