{"version":3,"file":"utils.mjs","sources":["../../../src/primitives/EmojiPicker/utils.ts"],"sourcesContent":["import type {\n  Emoji as EmojibaseEmoji,\n  Locale as EmojibaseLocale,\n  MessagesDataset as EmojibaseMessagesDataset,\n} from \"emojibase\";\n\nimport { EMOJI_FONT_FAMILY } from \"../../constants\";\nimport { capitalize } from \"../../utils/capitalize\";\nimport { chunk } from \"../../utils/chunk\";\nimport type {\n  Emoji,\n  EmojiCategory,\n  EmojiData,\n  EmojiPickerData,\n  EmojiPickerRow,\n} from \"./types\";\n\nconst EMOJIBASE_VERSION = \"15.3.0\";\nconst EMOJIBASE_CDN_URL = `https://cdn.jsdelivr.net/npm/emojibase-data@${EMOJIBASE_VERSION}`;\nconst EMOJIBASE_EMOJIS_URL = (locale: EmojibaseLocale) =>\n  `${EMOJIBASE_CDN_URL}/${locale}/data.json`;\nconst EMOJIBASE_MESSAGES_URL = (locale: EmojibaseLocale) =>\n  `${EMOJIBASE_CDN_URL}/${locale}/messages.json`;\nconst EMOJIBASE_LOCALES: EmojibaseLocale[] = [\n  \"bn\",\n  \"da\",\n  \"de\",\n  \"en\",\n  \"en-gb\",\n  \"es\",\n  \"es-mx\",\n  \"et\",\n  \"fi\",\n  \"fr\",\n  \"hi\",\n  \"hu\",\n  \"it\",\n  \"ja\",\n  \"ko\",\n  \"lt\",\n  \"ms\",\n  \"nb\",\n  \"nl\",\n  \"pl\",\n  \"pt\",\n  \"ru\",\n  \"sv\",\n  \"th\",\n  \"uk\",\n  \"zh\",\n  \"zh-hant\",\n];\nconst EMOJIBASE_DEFAULT_LOCALE: EmojibaseLocale = \"en\";\n\nconst CACHE_EMOJI_DATA_KEY = (locale: string) => `lb-emoji-data-${locale}`;\nconst CACHE_EMOJI_METADATA_KEY = (locale: string) =>\n  `lb-emoji-metadata-${locale}`;\nconst CACHE_EMOJI_SESSION_METADATA_KEY = \"lb-emoji-metadata\";\n\nconst EMOJI_DETECTION_CANVAS_WIDTH = 20;\nconst EMOJI_DETECTION_CANVAS_HEIGHT = 25;\nconst EMOJI_DETECTION_COUNTRY_FLAG = \"🇫🇷\";\n\ntype EmojiMetadata = {\n  emojisEtag: string | null;\n  messagesEtag: string | null;\n};\n\ntype EmojiSessionMetadata = {\n  emojiVersion: number;\n  countryFlags: boolean;\n};\n\nfunction generateRangeIndices(start: number, end: number) {\n  const range: number[] = [];\n\n  for (let i = start; i <= end; i++) {\n    range.push(i);\n  }\n\n  return range;\n}\n\nfunction getStorageItem<T>(storage: Storage, key: string) {\n  const item = storage.getItem(key);\n\n  return item ? (JSON.parse(item) as T) : null;\n}\n\nfunction setStorageItem<T>(storage: Storage, key: string, value: T) {\n  storage.setItem(key, JSON.stringify(value));\n}\n\nasync function fetchEtag(url: string) {\n  try {\n    const response = await fetch(url, { method: \"HEAD\" });\n\n    return response.headers.get(\"etag\");\n  } catch (error) {\n    return null;\n  }\n}\n\nfunction getEmojibaseSupportedLocale(locale: string): EmojibaseLocale {\n  return EMOJIBASE_LOCALES.includes(locale as EmojibaseLocale)\n    ? (locale as EmojibaseLocale)\n    : EMOJIBASE_DEFAULT_LOCALE;\n}\n\nasync function fetchEmojibaseData(locale: EmojibaseLocale) {\n  const [{ emojis, emojisEtag }, { messages, messagesEtag }] =\n    await Promise.all([\n      fetch(EMOJIBASE_EMOJIS_URL(locale)).then(async (response) => {\n        return {\n          emojis: (await response.json()) as EmojibaseEmoji[],\n          emojisEtag: response.headers.get(\"etag\"),\n        };\n      }),\n      fetch(EMOJIBASE_MESSAGES_URL(locale)).then(async (response) => {\n        return {\n          messages: (await response.json()) as EmojibaseMessagesDataset,\n          messagesEtag: response.headers.get(\"etag\"),\n        };\n      }),\n    ]);\n\n  return {\n    emojis,\n    messages,\n    emojisEtag,\n    messagesEtag,\n  };\n}\n\nasync function fetchEmojibaseEtags(locale: EmojibaseLocale) {\n  const [emojisEtag, messagesEtag] = await Promise.all([\n    fetchEtag(EMOJIBASE_EMOJIS_URL(locale)),\n    fetchEtag(EMOJIBASE_MESSAGES_URL(locale)),\n  ]);\n\n  return {\n    emojisEtag,\n    messagesEtag,\n  };\n}\n\nasync function fetchEmojiData(locale: EmojibaseLocale): Promise<EmojiData> {\n  const { emojis, emojisEtag, messages, messagesEtag } =\n    await fetchEmojibaseData(locale);\n  const countryFlagsSubgroup = messages.subgroups.find(\n    (subgroup) => subgroup.key === \"subdivision-flag\"\n  );\n\n  // Filter out component/modifier category and emojis\n  const filteredGroups = messages.groups.filter(\n    (group) => group.key !== \"component\"\n  );\n  const filteredEmojis = emojis.filter((emoji) => {\n    return \"group\" in emoji;\n  });\n\n  // Pick and compact the data\n  const categories = filteredGroups.map((group) => ({\n    key: group.order,\n    name: capitalize(group.message),\n  }));\n  const skinTones = messages.skinTones.map((skinTone) => ({\n    key: skinTone.key,\n    name: capitalize(skinTone.message),\n  }));\n  const compactEmojis = filteredEmojis.map((emoji) => {\n    const compactEmoji: Emoji = {\n      emoji: emoji.emoji,\n      category: emoji.group!,\n      version: emoji.version,\n      name: capitalize(emoji.label),\n      tags: emoji.tags,\n    };\n\n    if (countryFlagsSubgroup && emoji.subgroup === countryFlagsSubgroup.order) {\n      compactEmoji.countryFlag = true;\n    }\n\n    return compactEmoji;\n  });\n\n  const emojiData = {\n    emojis: compactEmojis,\n    categories,\n    skinTones,\n  };\n\n  // Cache the data and metadata\n  setStorageItem<EmojiData>(\n    localStorage,\n    CACHE_EMOJI_DATA_KEY(locale),\n    emojiData\n  );\n  setStorageItem<EmojiMetadata>(\n    localStorage,\n    CACHE_EMOJI_METADATA_KEY(locale),\n    {\n      emojisEtag,\n      messagesEtag,\n    }\n  );\n\n  return emojiData;\n}\n\n// Adapted from https://github.com/koala-interactive/is-emoji-supported/tree/master\nfunction detectEmojiSupport(\n  canvasContext: CanvasRenderingContext2D,\n  emoji: string\n): boolean {\n  canvasContext.clearRect(\n    0,\n    0,\n    EMOJI_DETECTION_CANVAS_WIDTH * 2,\n    EMOJI_DETECTION_CANVAS_HEIGHT\n  );\n\n  // Draw in red on the left\n  canvasContext.fillStyle = \"#f00\";\n  canvasContext.fillText(emoji, 0, 22);\n\n  // Draw in blue on right\n  canvasContext.fillStyle = \"#00f\";\n  canvasContext.fillText(emoji, EMOJI_DETECTION_CANVAS_WIDTH, 22);\n\n  const pixels = canvasContext.getImageData(\n    0,\n    0,\n    EMOJI_DETECTION_CANVAS_WIDTH,\n    EMOJI_DETECTION_CANVAS_HEIGHT\n  ).data;\n  const pixelCount = pixels.length;\n  let i = 0;\n\n  // Search for the first visible pixel\n  for (; i < pixelCount && !pixels[i + 3]; i += 4);\n\n  // No visible pixel\n  if (i >= pixelCount) {\n    return false;\n  }\n\n  // Emojis have an immutable color, so we check the color of the emoji in two\n  // different colors, the result should be the same\n  const x =\n    EMOJI_DETECTION_CANVAS_WIDTH + ((i / 4) % EMOJI_DETECTION_CANVAS_WIDTH);\n  const y = Math.floor(i / 4 / EMOJI_DETECTION_CANVAS_WIDTH);\n  const pixel = canvasContext.getImageData(x, y, 1, 1).data;\n\n  if (pixels[i] !== pixel[0] || pixels[i + 2] !== pixel[2]) {\n    return false;\n  }\n\n  // Unsupported ZWJ sequence emojis show up as separate emojis\n  if (canvasContext.measureText(emoji).width >= EMOJI_DETECTION_CANVAS_WIDTH) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction getEmojiFontFamily() {\n  try {\n    const element = document.createElement(\"span\");\n    element.style.display = \"none\";\n    element.dataset.emoji = \"\";\n\n    document.body.appendChild(element);\n\n    const computedFontFamily = window.getComputedStyle(element).fontFamily;\n\n    document.body.removeChild(element);\n\n    return computedFontFamily;\n  } catch {\n    return EMOJI_FONT_FAMILY;\n  }\n}\n\nfunction getEmojiSessionMetadata(emojis: Emoji[]): EmojiSessionMetadata {\n  const versions = new Map<number, string>();\n\n  for (const emoji of emojis) {\n    if (!versions.has(emoji.version)) {\n      versions.set(emoji.version, emoji.emoji);\n    }\n  }\n\n  const descendingVersions = [...versions.keys()].sort((a, b) => b - a);\n\n  const canvasContext = document\n    .createElement(\"canvas\")\n    .getContext(\"2d\", { willReadFrequently: true });\n\n  if (!canvasContext) {\n    return { emojiVersion: descendingVersions[0], countryFlags: true };\n  }\n\n  canvasContext.font = `${Math.floor(\n    EMOJI_DETECTION_CANVAS_HEIGHT / 2\n  )}px ${getEmojiFontFamily()}`;\n  canvasContext.textBaseline = \"top\";\n  canvasContext.canvas.width = EMOJI_DETECTION_CANVAS_WIDTH * 2;\n  canvasContext.canvas.height = EMOJI_DETECTION_CANVAS_HEIGHT;\n\n  const supportsCountryFlags = detectEmojiSupport(\n    canvasContext,\n    EMOJI_DETECTION_COUNTRY_FLAG\n  );\n\n  for (const version of descendingVersions) {\n    const emoji = versions.get(version)!;\n    const isSupported = detectEmojiSupport(canvasContext, emoji);\n\n    if (isSupported) {\n      return {\n        emojiVersion: version,\n        countryFlags: supportsCountryFlags,\n      };\n    }\n  }\n\n  return {\n    emojiVersion: descendingVersions[0],\n    countryFlags: supportsCountryFlags,\n  };\n}\n\nexport async function getEmojiData(locale: string): Promise<EmojiData> {\n  const emojibaseLocale = getEmojibaseSupportedLocale(locale);\n\n  const sessionMetadata = getStorageItem<EmojiSessionMetadata>(\n    sessionStorage,\n    CACHE_EMOJI_SESSION_METADATA_KEY\n  );\n  const cachedData = getStorageItem<EmojiData>(\n    localStorage,\n    CACHE_EMOJI_DATA_KEY(emojibaseLocale)\n  );\n  let data: EmojiData;\n\n  // If there is data already cached, check if the ETags are the same.\n  // If they are, return the cached data, otherwise fetch it again.\n  if (cachedData) {\n    // ETags only need to be checked once per session\n    if (sessionMetadata) {\n      data = cachedData;\n    } else {\n      const { emojisEtag, messagesEtag } =\n        await fetchEmojibaseEtags(emojibaseLocale);\n      const cachedMetadata = getStorageItem<EmojiMetadata>(\n        localStorage,\n        CACHE_EMOJI_METADATA_KEY(emojibaseLocale)\n      );\n\n      if (\n        cachedMetadata &&\n        emojisEtag === cachedMetadata.emojisEtag &&\n        messagesEtag === cachedMetadata.messagesEtag\n      ) {\n        data = cachedData;\n      } else {\n        data = await fetchEmojiData(emojibaseLocale);\n      }\n    }\n  } else {\n    data = await fetchEmojiData(emojibaseLocale);\n  }\n\n  const newSessionMetadata =\n    sessionMetadata ?? getEmojiSessionMetadata(data.emojis);\n  setStorageItem(\n    sessionStorage,\n    CACHE_EMOJI_SESSION_METADATA_KEY,\n    newSessionMetadata\n  );\n\n  // Filter out unsupported emojis\n  const filteredEmojis = data.emojis.filter((emoji) => {\n    const isSupportedVersion = emoji.version <= newSessionMetadata.emojiVersion;\n\n    return emoji.countryFlag\n      ? isSupportedVersion && newSessionMetadata.countryFlags\n      : isSupportedVersion;\n  });\n\n  return {\n    emojis: filteredEmojis,\n    categories: data.categories,\n    skinTones: data.skinTones,\n  };\n}\n\nexport function filterEmojis(emojis: Emoji[], search?: string) {\n  if (!search) {\n    return emojis;\n  }\n\n  const searchText = search.toLowerCase().trim();\n\n  return emojis.filter(\n    (emoji) =>\n      emoji.name.toLowerCase().includes(searchText) ||\n      emoji.tags?.some((tag) => tag.toLowerCase().includes(searchText))\n  );\n}\n\nexport function generateEmojiPickerData(\n  emojis: Emoji[],\n  categories: EmojiCategory[],\n  columns: number\n): EmojiPickerData {\n  let currentIndex = 0;\n  const rows: EmojiPickerRow[] = [];\n  const indexedEmojis = emojis.map((emoji, index) => ({ ...emoji, index }));\n  const categoriesRowCounts: number[] = [];\n  const categoriesRowIndices: number[][] = [];\n  const categoriesNames: string[] = [];\n  const categorizedEmojis = categories\n    .map((category) => ({\n      ...category,\n      emojis: indexedEmojis.filter((emoji) => emoji.category === category.key),\n    }))\n    .filter((category) => category.emojis.length > 0);\n\n  for (const category of categorizedEmojis) {\n    const categoryRows = chunk(category.emojis, columns);\n    const nextIndex = currentIndex + categoryRows.length;\n\n    rows.push(...categoryRows);\n    categoriesNames.push(category.name);\n    categoriesRowCounts.push(categoryRows.length);\n    categoriesRowIndices.push(\n      generateRangeIndices(currentIndex, nextIndex - 1)\n    );\n    currentIndex = nextIndex;\n  }\n\n  return {\n    count: emojis.length,\n    rows,\n    categories: categoriesNames,\n    categoriesRowCounts,\n    categoriesRowIndices,\n  };\n}\n"],"names":[],"mappings":"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"}