import type { SavedIdentity } from "../shared/types"; export type IdentityFilterMode = "both" | "email" | "username"; export type IdentityKind = "email" | "username"; function compareSavedIdentity(a: SavedIdentity, b: SavedIdentity): number { return ( b.lastUsed - a.lastUsed || b.useCount - a.useCount || a.value.localeCompare(b.value) || a.type.localeCompare(b.type) ); } function matchesQuery(identity: SavedIdentity, query: string): boolean { const q = query.trim().toLowerCase(); if (!q) return true; return [identity.value, identity.exampleDomain ?? "", identity.type] .join(" ") .toLowerCase() .includes(q); } export function sortSavedIdentities(identities: SavedIdentity[]): SavedIdentity[] { return [...identities].sort(compareSavedIdentity); } export function filterSavedIdentities( identities: SavedIdentity[], query: string, mode: IdentityFilterMode, ): SavedIdentity[] { const typeFiltered = identities.filter((identity) => { if (mode === "email") return identity.type === "email"; if (mode === "username") return identity.type === "username"; return true; }); return sortSavedIdentities(typeFiltered).filter((identity) => matchesQuery(identity, query)); } export function resolveCustomIdentityKind( query: string, mode: IdentityFilterMode, fallback: IdentityKind, ): IdentityKind { if (mode === "email") return "email"; if (mode === "username") return "username"; const trimmed = query.trim(); if (!trimmed) return fallback; return trimmed.includes("@") ? "email" : fallback; } export function identityFilterLabel(mode: IdentityFilterMode): string { if (mode === "email") return "Emails"; if (mode === "username") return "Usernames"; return "Both"; }