feat: show avatars in recipient autocomplete suggestions

This commit is contained in:
Linus Rath
2026-06-14 14:54:27 +02:00
parent b32e102ff9
commit 848ed9774d
2 changed files with 11 additions and 5 deletions
+9 -5
View File
@@ -4,6 +4,7 @@ import { useState, useRef, useCallback, useEffect, forwardRef, useImperativeHand
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { X } from "lucide-react"; import { X } from "lucide-react";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Avatar } from "@/components/ui/avatar";
import { useContactStore } from "@/stores/contact-store"; import { useContactStore } from "@/stores/contact-store";
interface Participant { interface Participant {
@@ -144,14 +145,17 @@ export const ParticipantInput = forwardRef<ParticipantInputHandle, ParticipantIn
role="option" role="option"
aria-selected={i === activeIndex} aria-selected={i === activeIndex}
onMouseDown={(e) => { e.preventDefault(); addParticipant(s); }} onMouseDown={(e) => { e.preventDefault(); addParticipant(s); }}
className={`px-3 py-2 text-sm cursor-pointer transition-colors ${ className={`px-3 py-2 text-sm cursor-pointer transition-colors flex items-center gap-2 ${
i === activeIndex ? "bg-accent text-accent-foreground" : "hover:bg-muted" i === activeIndex ? "bg-accent text-accent-foreground" : "hover:bg-muted"
}`} }`}
> >
<div className="font-medium truncate">{s.name || s.email}</div> <Avatar name={s.name} email={s.email} size="sm" className="shrink-0 w-7 h-7 text-[10px]" />
{s.name && ( <div className="min-w-0">
<div className="text-xs text-muted-foreground truncate">{s.email}</div> <div className="font-medium truncate">{s.name || s.email}</div>
)} {s.name && (
<div className="text-xs text-muted-foreground truncate">{s.email}</div>
)}
</div>
</li> </li>
))} ))}
</ul> </ul>
+2
View File
@@ -28,6 +28,7 @@ import { buildMimeMessage, wrapCmsAsSmimeMessage } from "@/lib/smime/mime-builde
import type { MimeAttachment } from "@/lib/smime/mime-builder"; import type { MimeAttachment } from "@/lib/smime/mime-builder";
import { smimeSign } from "@/lib/smime/smime-sign"; import { smimeSign } from "@/lib/smime/smime-sign";
import { PluginSlot } from "@/components/plugins/plugin-slot"; import { PluginSlot } from "@/components/plugins/plugin-slot";
import { Avatar } from "@/components/ui/avatar";
import { FilePreviewModal } from "@/components/files/file-preview-modal"; import { FilePreviewModal } from "@/components/files/file-preview-modal";
import { smimeEncrypt } from "@/lib/smime/smime-encrypt"; import { smimeEncrypt } from "@/lib/smime/smime-encrypt";
import { useContactStore } from "@/stores/contact-store"; import { useContactStore } from "@/stores/contact-store";
@@ -2702,6 +2703,7 @@ const AutocompleteDropdown = React.forwardRef<HTMLDivElement, {
onSelect(r); onSelect(r);
}} }}
> >
<Avatar name={r.name} email={r.email} size="sm" className="shrink-0 w-6 h-6 text-[10px]" />
<span className="font-medium truncate">{r.name || r.email}</span> <span className="font-medium truncate">{r.name || r.email}</span>
{r.name && ( {r.name && (
<span className="text-muted-foreground truncate">&lt;{r.email}&gt;</span> <span className="text-muted-foreground truncate">&lt;{r.email}&gt;</span>