import { clsx, type ClassValue } from 'clsx' import { twMerge } from 'tailwind-merge' import { StoreApi, UseBoundStore } from 'zustand' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } export function randomColor() { const digits = '0123456789abcdef' let code = '#' for (let i = 0; i < 6; i++) { code += digits.charAt(Math.floor(Math.random() * 16)) } return code } export function errorMessage(error: any) { return error instanceof Error ? error.message : `${error}` } type WithSelectors = S extends { getState: () => infer T } ? S & { use: { [K in keyof T]: () => T[K] } } : never export const createSelectors = >>(_store: S) => { const store = _store as WithSelectors store.use = {} for (const k of Object.keys(store.getState())) { ;(store.use as any)[k] = () => store((s) => s[k as keyof typeof s]) } return store }