utils

PreviousNext
Docs
limeplaylib

Preview

Loading preview…
registry/default/lib/utils.ts
import type React from "react"

import { type ClassValue, clsx } from "clsx"
import { twMerge } from "tailwind-merge"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}

/**
 * Type-safe event handler utility function
 * Provides autocomplete for available events based on element type
 */

// // Helper type to extract valid event names from an element type
// type EventNames<T> = {
//   [K in keyof T]: K extends `on${infer E}` ? Lowercase<E> : never
// }[keyof T]

// // Helper type to get the event type for a given event name and element
// type EventType<T, E> = T extends {
//   addEventListener: (event: any, handler: infer H) => any
// }
//   ? H extends (event: infer Event) => any
//     ? Event
//     : never
//   : never

export function getDeviceLanguage() {
  const primaryLocale = navigator.language
  return primaryLocale.split("-")[0]
}

/**
 * No-op function
 * @returns undefined
 */
export function noop() {
  // noop
}

/**
 * Overloaded function for React synthetic events
 */
export function off<R extends HTMLElement>(
  element: EventTarget,
  events: string | string[],
  callback: (event: React.SyntheticEvent<R>) => void
): EventTarget

/**
 * Implementation
 */
export function off(
  element: EventTarget,
  events: string | string[],
  callback: (event: any) => void
): EventTarget {
  if (Array.isArray(events)) {
    events.forEach((event) => {
      element.removeEventListener(event, callback as EventListener)
    })
  } else {
    element.removeEventListener(events, callback as EventListener)
  }

  return element
}

/**
 * Overloaded function for React synthetic events
 */
export function on<R extends HTMLElement>(
  element: EventTarget,
  events: string | string[],
  callback: (event: React.SyntheticEvent<R>) => void
): EventTarget

/**
 * Implementation
 */
export function on(
  element: EventTarget,
  events: string | string[],
  callback: (event: any) => void
): EventTarget {
  if (Array.isArray(events)) {
    events.forEach((event) => {
      element.addEventListener(event, callback as EventListener)
    })
  } else {
    element.addEventListener(events, callback as EventListener)
  }

  return element
}

export function toFixedNumber(num: number, digits: number, base = 10) {
  const pow = Math.pow(base, digits)
  return Math.round(num * pow) / pow
}

Installation

npx shadcn@latest add @limeplay/utils

Usage

import { Utils } from "@/lib/utils"
Utils()