~ knotless Search/
↑↓ move↵ open⇧↵ all results

grain.social/grain

photography-focused photo sharing platform

grain.social
1 collaborator
0
2
56 lines · 2.3 KB Raw History
import { normalizeCountry } from "./country.ts";

/**
 * Build a display label for a stored location + address pair.
 *
 * `location.name` may be either a POI name ("Blue Bottle Coffee") or a
 * Nominatim-formatted fallback that already contains locality/region/country
 * ("New York, New York, United States"). It may also contain a county baked
 * in by older clients ("Kansas City, Jackson County, Missouri, United States").
 *
 * We take the first comma-separated chunk of the name as the primary label,
 * then append locality/region/country while dropping case-insensitive adjacent
 * duplicates. This preserves POI context ("Blue Bottle Coffee, Oakland,
 * California, US") and collapses redundancy in city fallbacks ("New York, US").
 *
 * The country tail is normalized to its ISO-2 form (so "USA" becomes "US",
 * matching the sidebar) and is suppressed when the primary label already
 * represents that country (avoiding "Greece, GR").
 *
 * Legacy records (community.lexicon.location.hthree) without structured
 * address use the stored name as-is so we don't strip useful commas.
 */
export function formatStoredLocation(
  location: { name?: string | null } | null | undefined,
  address:
    | { locality?: string | null; region?: string | null; country?: string | null }
    | null
    | undefined,
): string {
  const name = location?.name?.trim() ?? "";
  const hasAddressContext = !!(address?.locality || address?.region || address?.country);
  if (!hasAddressContext) return name;

  const primaryLabel = name.split(",")[0].trim() || name;
  const parts: string[] = [];
  const appendIfDistinct = (value?: string | null) => {
    const v = value?.trim();
    if (!v) return;
    if (parts[parts.length - 1]?.toLowerCase() === v.toLowerCase()) return;
    parts.push(v);
  };
  appendIfDistinct(primaryLabel);
  appendIfDistinct(address?.locality);
  appendIfDistinct(address?.region);

  // Suppress the country tail when the primary label already names the same
  // country — e.g. location.name="Greece" + address.country="GR" would become
  // "Greece, GR" without this check.
  const countryCode = normalizeCountry(address?.country);
  const primaryCountryCode = normalizeCountry(primaryLabel);
  if (countryCode && countryCode !== primaryCountryCode) {
    appendIfDistinct(countryCode);
  }

  return parts.join(", ");
}