| | 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()) |
| | ) |
| | } |
| |
|
| | |
| | |
| | |
| | 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) => { |
| | |
| | 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\./, "") |
| | } |
| |
|