capsule AI-native Unix-like composition layer

src/app/src/common/utils.tsx

2,778 bytes · 126 lines · capsule://quake0day/[email protected] raw on github

import {
  uniqueNamesGenerator,
  Config,
  adjectives,
  colors,
} from "unique-names-generator"

import { Color } from "@common/types"

const customConfig: Config = {
  dictionaries: [adjectives, colors],
  separator: "-",
  length: 2,
}

export const randomName = () => {
  return uniqueNamesGenerator(customConfig)
}

export const saveRoomToLocalStorage = (roomName, nickName) => {
  var rooms: {}[] = JSON.parse(localStorage.getItem("rooms") || "[]")
  rooms = rooms.filter((room: any) => room.roomName !== roomName)
  rooms.push({ roomName: roomName, nickName: nickName })
  localStorage.setItem("rooms", JSON.stringify(rooms))
}

export const nameToColor = (name: string) => {
  let r = 0
  let g = 0
  let b = 0
  for (let i = 0; i < name.length / 3; i++) {
    let code = name.charCodeAt(i)
    g = g + code
    code = name.charCodeAt(i * 2)
    b = b + code
    code = name.charCodeAt(i * 3)
    r = r + code
  }
  return [r % 256, g % 256, b % 256]
}

export const weightedRand = (spec) => {
  var i,
    j,
    table = []
  for (i in spec) {
    // The constant 10 below should be computed based on the
    // weights in the spec for a correct and optimal table size.
    // E.g. the spec {0:0.999, 1:0.001} will break this impl.
    for (j = 0; j < spec[i] * 10; j++) {
      table.push(i)
    }
  }
  return function () {
    return table[Math.floor(Math.random() * table.length)]
  }
}

export const rgbToBgColor = (color: Color) => {
  return (
    "rgb(" +
    color.r +
    " " +
    color.b +
    " " +
    color.g +
    " / var(--tw-bg-opacity))"
  )
}

export const strToBgColor = (str: string) => {
  const color = nameToColor(str)
  return (
    "rgb(" +
    color[0] +
    " " +
    color[1] +
    " " +
    color[2] +
    " / var(--tw-bg-opacity))"
  )
}

export const strToRGB = (str: string) => {
  const color = nameToColor(str)
  return "rgb(" + color[0] + "," + color[1] + "," + color[2] + ")"
}

export const gtagEvent = (action, category, label, value) => {
  if (!Object.hasOwn(window, "gtag")) {
    return
  }
  // @ts-ignore
  window.gtag("event", action, {
    event_category: category,
    event_label: label,
    value: value,
  })
}

export const umamiEvent = (eventName, eventData) => {
  if (!Object.hasOwn(window, "umami")) {
    return
  }
  // @ts-ignore
  window.umami.track(eventName, eventData)
}

export const hashRoom = (roomName: string): string => {
  let h = 0x811c9dc5
  for (let i = 0; i < roomName.length; i++) {
    h ^= roomName.charCodeAt(i)
    h = (h * 0x01000193) >>> 0
  }
  return h.toString(16).padStart(8, "0")
}

export const participantsBucket = (
  count: number
): "1" | "2-3" | "4-9" | "10+" => {
  if (count >= 10) return "10+"
  if (count >= 4) return "4-9"
  if (count >= 2) return "2-3"
  return "1"
}