From 5790d77847920ac55da690232d136727de00da37 Mon Sep 17 00:00:00 2001 From: Aj Wazzan Date: Thu, 3 Jul 2025 23:02:34 -0700 Subject: [PATCH] minor fixes --- .../app/(routes)/settings/privacy/page.tsx | 25 +++++++++---------- apps/mail/components/mail/mail-content.tsx | 5 ++-- apps/mail/components/mail/mail-display.tsx | 6 ++++- apps/mail/hooks/use-mail-navigation.ts | 20 +++++++++------ apps/server/src/lib/email-processor.ts | 2 +- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/apps/mail/app/(routes)/settings/privacy/page.tsx b/apps/mail/app/(routes)/settings/privacy/page.tsx index 3ae49d0173..b95fafaa67 100644 --- a/apps/mail/app/(routes)/settings/privacy/page.tsx +++ b/apps/mail/app/(routes)/settings/privacy/page.tsx @@ -15,11 +15,11 @@ import { useTRPC } from '@/providers/query-provider'; import { useMutation } from '@tanstack/react-query'; // import { saveUserSettings } from '@/actions/settings'; import { useSettings } from '@/hooks/use-settings'; -import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; +import { Button } from '@/components/ui/button'; import { useState, useEffect } from 'react'; -import { m } from '@/paraglide/messages'; import { useForm } from 'react-hook-form'; +import { m } from '@/paraglide/messages'; import { XIcon } from 'lucide-react'; import { toast } from 'sonner'; import * as z from 'zod'; @@ -32,17 +32,16 @@ export default function PrivacyPage() { const form = useForm>({ resolver: zodResolver(userSettingsSchema), - defaultValues: { - externalImages: true, - trustedSenders: [], - }, }); - const externalImages = form.watch('externalImages'); - + const externalImages = data?.settings.externalImages; useEffect(() => { if (data) { - form.reset(data.settings); + form.reset({ + ...data.settings, + trustedSenders: data.settings.trustedSenders, + externalImages: !!data.settings.externalImages, + }); } }, [form, data]); @@ -87,10 +86,10 @@ export default function PrivacyPage() {
- {m['pages.settings.privacy.externalImages']()} + {m['pages.settings.privacy.externalImages']()} - {m['pages.settings.privacy.externalImagesDescription']()} + {m['pages.settings.privacy.externalImagesDescription']()}
@@ -107,10 +106,10 @@ export default function PrivacyPage() {
- {m['pages.settings.privacy.trustedSenders']()} + {m['pages.settings.privacy.trustedSenders']()} - {m['pages.settings.privacy.trustedSendersDescription']()} + {m['pages.settings.privacy.trustedSendersDescription']()}
diff --git a/apps/mail/components/mail/mail-content.tsx b/apps/mail/components/mail/mail-content.tsx index ba48df31d8..5599a259bb 100644 --- a/apps/mail/components/mail/mail-content.tsx +++ b/apps/mail/components/mail/mail-content.tsx @@ -11,11 +11,12 @@ import { cn } from '@/lib/utils'; import { toast } from 'sonner'; interface MailContentProps { + id: string; html: string; senderEmail: string; } -export function MailContent({ html, senderEmail }: MailContentProps) { +export function MailContent({ id, html, senderEmail }: MailContentProps) { const { data, refetch } = useSettings(); const queryClient = useQueryClient(); const isTrustedSender = useMemo( @@ -67,7 +68,7 @@ export function MailContent({ html, senderEmail }: MailContentProps) { ); const { data: processedData } = useQuery({ - queryKey: ['email-content', html, isTrustedSender || temporaryImagesEnabled, resolvedTheme], + queryKey: ['email-content', id, isTrustedSender || temporaryImagesEnabled, resolvedTheme], queryFn: async () => { const result = await processEmailContent({ html, diff --git a/apps/mail/components/mail/mail-display.tsx b/apps/mail/components/mail/mail-display.tsx index 288559e39b..53306ced90 100644 --- a/apps/mail/components/mail/mail-display.tsx +++ b/apps/mail/components/mail/mail-display.tsx @@ -1768,7 +1768,11 @@ const MailDisplay = ({ emailData, index, totalEmails, demo, threadAttachments }:
{/* mail main body */} {emailData?.decodedBody ? ( - + ) : null} {/* mail attachments */} {emailData?.attachments && emailData?.attachments.length > 0 ? ( diff --git a/apps/mail/hooks/use-mail-navigation.ts b/apps/mail/hooks/use-mail-navigation.ts index f7c18f3d0b..2b4326527c 100644 --- a/apps/mail/hooks/use-mail-navigation.ts +++ b/apps/mail/hooks/use-mail-navigation.ts @@ -4,6 +4,7 @@ import { useOptimisticActions } from './use-optimistic-actions'; import { useMail } from '@/components/mail/use-mail'; import { useHotkeys } from 'react-hotkeys-hook'; import { atom, useAtom } from 'jotai'; +import { useQueryState } from 'nuqs'; export const focusedIndexAtom = atom(null); export const mailNavigationCommandAtom = atom(null); @@ -23,7 +24,8 @@ export function useMailNavigation({ items, containerRef, onNavigate }: UseMailNa itemsRef.current = items; const onNavigateRef = useRef(onNavigate); onNavigateRef.current = onNavigate; - const { open: isCommandPaletteOpen } = useCommandPalette(); + const [threadId] = useQueryState('threadId'); + const [isCommandPaletteOpen] = useQueryState('isCommandPaletteOpen'); const hoveredMailRef = useRef(null); const keyboardActiveRef = useRef(false); @@ -77,8 +79,7 @@ export function useMailNavigation({ items, containerRef, onNavigate }: UseMailNa const message = itemsRef.current[index]; const threadId = message.id; - const currentThreadId = window.location.search.includes('threadId='); - if (currentThreadId) { + if (threadId) { onNavigateRef.current(threadId); optimisticMarkAsRead([threadId], true); } @@ -88,7 +89,7 @@ export function useMailNavigation({ items, containerRef, onNavigate }: UseMailNa bulkSelected: [], })); }, - [setMail], + [setMail, threadId], ); const navigateNext = useCallback(() => { @@ -196,11 +197,14 @@ export function useMailNavigation({ items, containerRef, onNavigate }: UseMailNa }, [setFocusedIndex, onNavigateRef]); useHotkeys('ArrowUp', handleArrowUp, { preventDefault: true, enabled: !isCommandPaletteOpen }); - useHotkeys('ArrowDown', handleArrowDown, { preventDefault: true, enabled: !isCommandPaletteOpen }); - useHotkeys('j', handleArrowDown,{enabled: !isCommandPaletteOpen }); + useHotkeys('ArrowDown', handleArrowDown, { + preventDefault: true, + enabled: !isCommandPaletteOpen, + }); + useHotkeys('j', handleArrowDown, { enabled: !isCommandPaletteOpen }); useHotkeys('k', handleArrowUp, { enabled: !isCommandPaletteOpen }); - useHotkeys('Enter', handleEnter, { preventDefault: true,enabled: !isCommandPaletteOpen }); - useHotkeys('Escape', handleEscape, { preventDefault: true,enabled: !isCommandPaletteOpen }); + useHotkeys('Enter', handleEnter, { preventDefault: true, enabled: !isCommandPaletteOpen }); + useHotkeys('Escape', handleEscape, { preventDefault: true, enabled: !isCommandPaletteOpen }); const handleMouseEnter = useCallback( (threadId: string) => { diff --git a/apps/server/src/lib/email-processor.ts b/apps/server/src/lib/email-processor.ts index 3ca52592bb..6d40d1baee 100644 --- a/apps/server/src/lib/email-processor.ts +++ b/apps/server/src/lib/email-processor.ts @@ -14,7 +14,7 @@ export function processEmailHtml({ html, shouldLoadImages, theme }: ProcessEmail let hasBlockedImages = false; const sanitizeConfig: sanitizeHtml.IOptions = { - allowedTags: false, + allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']), allowedAttributes: false, allowedSchemes: shouldLoadImages ? ['http', 'https', 'mailto', 'tel', 'data', 'cid', 'blob']