From cfdee5e5c15ba6017f2f8618023794f17a32f9ac Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Wed, 6 May 2026 01:05:40 +0200 Subject: [PATCH] refactor: rework S/MIME banner to match calendar invitation --- components/email/email-viewer.tsx | 2 +- components/email/smime-status-banner.tsx | 80 +++++++++++++----------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/components/email/email-viewer.tsx b/components/email/email-viewer.tsx index ad5a52cf..f5bfaac6 100644 --- a/components/email/email-viewer.tsx +++ b/components/email/email-viewer.tsx @@ -4789,7 +4789,7 @@ export function EmailViewer({ {/* S/MIME Status Banner */} {smimeStatus && (
-
+
= { + success: 'bg-success/15 text-success', + warning: 'bg-warning/15 text-warning', + error: 'bg-destructive/15 text-destructive', + info: 'bg-info/15 text-info', +}; + export function SmimeStatusBanner({ status, onUnlockKey, className }: SmimeStatusBannerProps) { const t = useTranslations('smime'); const items: Array<{ icon: React.ReactNode; text: string; - variant: 'success' | 'warning' | 'error' | 'info'; + variant: SmimeVariant; }> = []; // Encryption status @@ -26,26 +35,26 @@ export function SmimeStatusBanner({ status, onUnlockKey, className }: SmimeStatu if (status.decryptionError) { if (status.decryptionError === 'locked') { items.push({ - icon: , + icon: , text: t('unlock_key_desc'), variant: 'warning', }); } else if (status.decryptionError === 'no-key') { items.push({ - icon: , + icon: , text: t('status_encrypted_no_key'), variant: 'warning', }); } else { items.push({ - icon: , + icon: , text: t('status_encrypted_failed'), variant: 'error', }); } } else { items.push({ - icon: , + icon: , text: t('status_encrypted_ok'), variant: 'success', }); @@ -57,26 +66,26 @@ export function SmimeStatusBanner({ status, onUnlockKey, className }: SmimeStatu if (status.signatureValid === true) { if (status.selfSigned) { items.push({ - icon: , + icon: , text: t('status_signed_self_signed'), variant: 'warning', }); } else if (status.signerEmailMatch === false) { items.push({ - icon: , + icon: , text: t('status_signed_mismatch'), variant: 'warning', }); } else { items.push({ - icon: , + icon: , text: t('status_signed_valid'), variant: 'success', }); } } else if (status.signatureValid === false) { items.push({ - icon: , + icon: , text: status.signatureError || t('status_signed_invalid'), variant: 'error', }); @@ -86,7 +95,7 @@ export function SmimeStatusBanner({ status, onUnlockKey, className }: SmimeStatu // Unsupported S/MIME if (status.unsupportedReason) { items.push({ - icon: , + icon: , text: t('status_unsupported'), variant: 'info', }); @@ -94,33 +103,34 @@ export function SmimeStatusBanner({ status, onUnlockKey, className }: SmimeStatu if (items.length === 0) return null; - const variantStyles = { - success: 'bg-success/10 text-success border-success/30', - warning: 'bg-warning/10 text-warning border-warning/30', - error: 'bg-destructive/10 text-destructive border-destructive/30', - info: 'bg-info/10 text-info border-info/30', - }; - return ( -
+
{items.map((item, i) => ( -
- {item.icon} - {item.text} - {item.variant === 'warning' && status.decryptionError === 'locked' && onUnlockKey && ( - - )} +
+
+ {item.icon} +
+
+
+
+ S/MIME +
+
+ {item.text} +
+
+ {item.variant === 'warning' && status.decryptionError === 'locked' && onUnlockKey && ( + + )} +
))}