fix: demo-only features for gender inference and custom avatars in development
This commit is contained in:
@@ -4,6 +4,8 @@ import { useState } from "react";
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { useSettingsStore } from "@/stores/settings-store";
|
import { useSettingsStore } from "@/stores/settings-store";
|
||||||
|
|
||||||
|
const IS_DEV = process.env.NODE_ENV !== "production";
|
||||||
|
|
||||||
// Personal email domains where the favicon is the mail provider logo, not the sender
|
// Personal email domains where the favicon is the mail provider logo, not the sender
|
||||||
const PERSONAL_DOMAINS = new Set([
|
const PERSONAL_DOMAINS = new Set([
|
||||||
"gmail.com", "googlemail.com", "outlook.com", "hotmail.com", "live.com",
|
"gmail.com", "googlemail.com", "outlook.com", "hotmail.com", "live.com",
|
||||||
@@ -24,24 +26,24 @@ function emailHash(email: string): number {
|
|||||||
return Math.abs(hash);
|
return Math.abs(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common first names to infer gender for portrait selection
|
// Dev-only: common first names to infer gender for demo portrait selection
|
||||||
const FEMALE_NAMES = new Set([
|
const FEMALE_NAMES: Set<string> = IS_DEV ? new Set([
|
||||||
"alice", "emily", "sarah", "priya", "carol", "anna", "maria", "emma", "olivia",
|
"alice", "emily", "sarah", "priya", "carol", "anna", "maria", "emma", "olivia",
|
||||||
"sophia", "isabella", "mia", "charlotte", "amelia", "harper", "ella", "grace",
|
"sophia", "isabella", "mia", "charlotte", "amelia", "harper", "ella", "grace",
|
||||||
"chloe", "luna", "lily", "zoey", "hannah", "nora", "riley", "elena", "maya",
|
"chloe", "luna", "lily", "zoey", "hannah", "nora", "riley", "elena", "maya",
|
||||||
"claire", "victoria", "natalie", "rachel", "jessica", "jennifer", "lisa",
|
"claire", "victoria", "natalie", "rachel", "jessica", "jennifer", "lisa",
|
||||||
"karen", "nancy", "betty", "sandra", "ashley", "margaret", "dorothy",
|
"karen", "nancy", "betty", "sandra", "ashley", "margaret", "dorothy",
|
||||||
"julia", "laura", "susan", "andrea", "diana", "marie", "sophie",
|
"julia", "laura", "susan", "andrea", "diana", "marie", "sophie",
|
||||||
]);
|
]) : new Set();
|
||||||
|
|
||||||
const MALE_NAMES = new Set([
|
const MALE_NAMES: Set<string> = IS_DEV ? new Set([
|
||||||
"bob", "marcus", "alex", "david", "james", "john", "robert", "michael",
|
"bob", "marcus", "alex", "david", "james", "john", "robert", "michael",
|
||||||
"william", "richard", "joseph", "thomas", "charles", "daniel", "matthew",
|
"william", "richard", "joseph", "thomas", "charles", "daniel", "matthew",
|
||||||
"anthony", "mark", "steven", "paul", "andrew", "kevin", "brian", "george",
|
"anthony", "mark", "steven", "paul", "andrew", "kevin", "brian", "george",
|
||||||
"timothy", "jason", "ryan", "jacob", "gary", "eric", "peter", "frank",
|
"timothy", "jason", "ryan", "jacob", "gary", "eric", "peter", "frank",
|
||||||
"samuel", "benjamin", "henry", "patrick", "jack", "noah", "liam", "oliver",
|
"samuel", "benjamin", "henry", "patrick", "jack", "noah", "liam", "oliver",
|
||||||
"lucas", "ethan", "mason", "logan", "leo", "max", "oscar", "hugo",
|
"lucas", "ethan", "mason", "logan", "leo", "max", "oscar", "hugo",
|
||||||
]);
|
]) : new Set();
|
||||||
|
|
||||||
function inferGender(name: string | undefined, hash: number): "women" | "men" {
|
function inferGender(name: string | undefined, hash: number): "women" | "men" {
|
||||||
if (name) {
|
if (name) {
|
||||||
@@ -52,19 +54,20 @@ function inferGender(name: string | undefined, hash: number): "women" | "men" {
|
|||||||
return hash % 2 === 0 ? "women" : "men";
|
return hash % 2 === 0 ? "women" : "men";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom avatar URLs for specific demo senders (e.g. newsletters with custom logos)
|
// Dev-only: custom avatar URLs for specific demo senders
|
||||||
const CUSTOM_AVATARS: Record<string, string> = {
|
const CUSTOM_AVATARS: Record<string, string> = IS_DEV ? {
|
||||||
"newsletter@launchweekly.com": "https://img.freepik.com/premium-vector/swoosh-letter-lw-logo-design-business-company-identity-water-wave-lw-logo-with-modern-trendy_754537-799.jpg?w=360",
|
"newsletter@launchweekly.com": "https://img.freepik.com/premium-vector/swoosh-letter-lw-logo-design-business-company-identity-water-wave-lw-logo-with-modern-trendy_754537-799.jpg?w=360",
|
||||||
"hello@launchpad.example": "https://img.freepik.com/premium-vector/swoosh-letter-lw-logo-design-business-company-identity-water-wave-lw-logo-with-modern-trendy_754537-799.jpg?w=360",
|
"hello@launchpad.example": "https://img.freepik.com/premium-vector/swoosh-letter-lw-logo-design-business-company-identity-water-wave-lw-logo-with-modern-trendy_754537-799.jpg?w=360",
|
||||||
"news@techdigest.example": "https://img.freepik.com/premium-vector/technology-letter-t-logo-design-template_125964-1249.jpg?w=360",
|
"news@techdigest.example": "https://img.freepik.com/premium-vector/technology-letter-t-logo-design-template_125964-1249.jpg?w=360",
|
||||||
"alice@example.com": "https://randomuser.me/api/portraits/thumb/women/44.jpg",
|
"alice@example.com": "https://randomuser.me/api/portraits/thumb/women/44.jpg",
|
||||||
"bob@example.org": "https://randomuser.me/api/portraits/thumb/men/32.jpg",
|
"bob@example.org": "https://randomuser.me/api/portraits/thumb/men/32.jpg",
|
||||||
"carol@example.com": "https://randomuser.me/api/portraits/thumb/women/68.jpg",
|
"carol@example.com": "https://randomuser.me/api/portraits/thumb/women/68.jpg",
|
||||||
};
|
} : {};
|
||||||
|
|
||||||
// For personal-domain emails, deterministically pick a randomuser.me portrait.
|
// Dev-only: for personal-domain emails, deterministically pick a randomuser.me portrait.
|
||||||
// Returns null for ~30% of addresses so not everyone has a photo.
|
// Returns null for ~30% of addresses so not everyone has a photo.
|
||||||
function getProfilePictureUrl(email: string, domain: string, name?: string): string | null {
|
function getProfilePictureUrl(email: string, domain: string, name?: string): string | null {
|
||||||
|
if (!IS_DEV) return null;
|
||||||
if (!PERSONAL_DOMAINS.has(domain)) return null;
|
if (!PERSONAL_DOMAINS.has(domain)) return null;
|
||||||
const h = emailHash(email);
|
const h = emailHash(email);
|
||||||
if (h % 10 < 3) return null; // ~30% get no photo
|
if (h % 10 < 3) return null; // ~30% get no photo
|
||||||
|
|||||||
Reference in New Issue
Block a user