import { adjectives, animals, colors, names, starWars, uniqueNamesGenerator, } from "unique-names-generator" export const isBrowser = () => typeof window !== "undefined" export const secondsToTime = (s: number): string => { if (isNaN(s)) { return "00:00" } const hours = Math.floor(s / 3600) const minutes = Math.floor((s - hours * 3600) / 60) const seconds = Math.floor(s - hours * 3600 - minutes * 60) if (hours === 0) { return ( (minutes > 9 ? minutes.toString() : "0" + minutes.toString()) + ":" + (seconds > 9 ? seconds.toString() : "0" + seconds.toString()) ) } return ( (hours > 9 ? hours.toString() : "0" + hours.toString()) + ":" + (minutes > 9 ? minutes.toString() : "0" + minutes.toString()) + ":" + (seconds > 9 ? seconds.toString() : "0" + seconds.toString()) ) } /** * Time in s which is considered in sync */ export const SYNC_DELTA = 3 export const SYNC_PAUSED_DELTA = 0.2 export const isSync = ( playerTime: number, targetProgress: number, lastSync: number, paused: boolean, playbackRate: number = 1 ) => { const d = Math.abs( getTargetTime(targetProgress, lastSync, paused, playbackRate) - playerTime ) * playbackRate return d < (paused ? SYNC_PAUSED_DELTA : SYNC_DELTA) } export const getTargetTime = ( targetProgress: number, lastSync: number, paused: boolean, playbackRate: number ) => { if (paused) { return targetProgress } const time = new Date().getTime() / 1000 return targetProgress + (time - lastSync) * playbackRate } export const getRandomItem = (list: any[] | string) => { return list[Math.round(Math.random() * (list.length - 1))] } export const generateId = (length: number = 4) => { let result = "", chars = "abcdefghijklmnopqrstuvwxyz" for (let i = 0; i < length; i++) { result += getRandomItem(chars) } return result } const nameLists = [adjectives, animals, colors, starWars, names] export const getRandomName = (words = 2) => { let dictionaries = [] for (let i = 0; i < words; i++) { dictionaries.push(getRandomItem(nameLists)) } return uniqueNamesGenerator({ dictionaries, length: words, style: "capital", }).replace("_", " ") } export const isUrl = (url: string) => { // hell of a regex from @diegoperini, taken from https://mathiasbynens.be/demo/url-regex, note e.g. \x{ffff} is converted to \uffff return !!url.match( /^https?:\/\/(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4])|(?:[a-z\u00a1-\uffff\d]+-?)*[a-z\u00a1-\uffff\d]+(?:\.(?:[a-z\u00a1-\uffff\d]+-?)*[a-z\u00a1-\uffff\d]+)*\.[a-z\u00a1-\uffff]{2,})(?::\d{2,5})?(?:\/\S*)?$/ ) } export const shellSanitizeUrl = (url: string) => { return url.replace(/(&&)+/g, "&").replace(/([<>$;\\|])+/, "") } export const getDomain = (url: string) => { const matches = url.match(/^(?:https?:)?(?:\/\/)?([^\/?]+)/) return ((matches && matches[1]) || url).replace(/^www\./, "") }