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