export type DiscoverNearbyProfileWire = { id: string; display_name: string | null; birth_date: string | null; distance_m: number; primary_photo_path: string | null; photo_url?: string | null; is_online: boolean | null; last_seen?: string | null; is_creator?: boolean | null; has_new_media?: boolean | null; traveling?: boolean | null; right_now_until?: string | null; is_right_now?: boolean | null; }; export type DiscoverGridProfileItemWire = { kind: 'profile'; id: string; person: DiscoverNearbyProfileWire; }; export type DiscoverGridAdItemWire = { kind: 'ad'; id: string; placement?: string; }; export type DiscoverGridItemWire = DiscoverGridProfileItemWire | DiscoverGridAdItemWire; export function profileAgeFromBirthDate(birthDate: string | null | undefined): number | null { if (!birthDate) return null; const born = new Date(birthDate); if (Number.isNaN(born.getTime())) return null; const today = new Date(); let age = today.getFullYear() - born.getFullYear(); const monthDelta = today.getMonth() - born.getMonth(); if (monthDelta < 0 || (monthDelta === 0 && today.getDate() < born.getDate())) { age -= 1; } return age >= 0 ? age : null; } export function formatDistanceLabel( distanceM: number, unit: 'metric' | 'imperial' = 'metric', ): string { if (unit === 'imperial') { const feet = distanceM * 3.28084; if (feet < 528) return `${Math.round(feet)} ft`; const miles = distanceM / 1609.34; return miles < 10 ? `${miles.toFixed(1)} mi` : `${Math.round(miles)} mi`; } if (distanceM < 1000) return `${Math.round(distanceM)} m`; const km = distanceM / 1000; return km < 10 ? `${km.toFixed(1)} km` : `${Math.round(km)} km`; } export type PresenceStatus = 'online' | 'recent' | 'offline'; export function getPresenceStatus(lastSeen?: string | null): PresenceStatus { if (!lastSeen) return 'offline'; const seenAt = new Date(lastSeen).getTime(); if (Number.isNaN(seenAt)) return 'offline'; const deltaMs = Date.now() - seenAt; if (deltaMs <= 5 * 60 * 1000) return 'online'; if (deltaMs <= 24 * 60 * 60 * 1000) return 'recent'; return 'offline'; } export function isDiscoverGridItem(value: unknown): value is DiscoverGridItemWire { if (!value || typeof value !== 'object') return false; const kind = (value as { kind?: unknown }).kind; return kind === 'profile' || kind === 'ad'; } export function readDiscoverGridItems(data: Record, ref: string): DiscoverGridItemWire[] { const raw = ref.split('.').reduce((acc, key) => { if (acc && typeof acc === 'object' && key in (acc as Record)) { return (acc as Record)[key]; } return undefined; }, data); if (!Array.isArray(raw)) return []; return raw.filter(isDiscoverGridItem); }