63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
import colorMap from "../data/az_2_letter_color_map.json";
|
|
|
|
const FALLBACK_COLOR = "#5c5763";
|
|
|
|
export function addressText(sender) {
|
|
if (typeof sender === "string") return sender;
|
|
return sender?.email || sender?.address || "";
|
|
}
|
|
|
|
export function senderDisplayName(email) {
|
|
const displayName =
|
|
email.sender_display_name ||
|
|
email.sender_name ||
|
|
email.from_name ||
|
|
(typeof email.sender === "object" ? email.sender?.name : "");
|
|
const address = addressText(email.sender || email.from);
|
|
return displayName?.trim() || address.split("@")[0] || "Unknown sender";
|
|
}
|
|
|
|
/** Two-letter key for color lookup: first + last word, or first two chars. */
|
|
export function initialsFromName(name) {
|
|
const cleaned = String(name || "")
|
|
.trim()
|
|
.replace(/[^a-zA-Z\s'-]/g, " ");
|
|
const parts = cleaned.split(/\s+/).filter(Boolean);
|
|
|
|
if (parts.length >= 2) {
|
|
const first = parts[0][0] || "";
|
|
const last = parts[parts.length - 1][0] || "";
|
|
return `${first}${last}`.toUpperCase();
|
|
}
|
|
|
|
const word = parts[0] || "?";
|
|
const letters = word.replace(/[^a-zA-Z]/g, "");
|
|
if (letters.length >= 2) {
|
|
return letters.slice(0, 2).toUpperCase();
|
|
}
|
|
if (letters.length === 1) {
|
|
return `${letters[0]}${letters[0]}`.toUpperCase();
|
|
}
|
|
return "??";
|
|
}
|
|
|
|
export function colorForInitials(initials) {
|
|
const key = String(initials || "").toUpperCase().slice(0, 2);
|
|
return colorMap[key] || FALLBACK_COLOR;
|
|
}
|
|
|
|
/** Registered-user avatar URL hook — wire when profile photos exist. */
|
|
export function senderAvatarUrl(email) {
|
|
return email.sender_avatar_url || email.sender?.avatar_url || null;
|
|
}
|
|
|
|
export function senderAvatar(email) {
|
|
const name = senderDisplayName(email);
|
|
const initials = initialsFromName(name);
|
|
return {
|
|
name,
|
|
initials,
|
|
color: colorForInitials(initials),
|
|
imageUrl: senderAvatarUrl(email),
|
|
};
|
|
}
|