Fooocus/web/assets/js/shared_utils.js

116 lines
2.9 KiB
JavaScript

export function getResolver(timeout = 5000) {
const resolver = {}
resolver.id = generateId(8)
resolver.completed = false
resolver.resolved = false
resolver.rejected = false
resolver.promise = new Promise((resolve, reject) => {
resolver.reject = () => {
resolver.completed = true
resolver.rejected = true
reject()
}
resolver.resolve = (data) => {
resolver.completed = true
resolver.resolved = true
resolve(data)
}
})
resolver.timeout = setTimeout(() => {
if (!resolver.completed) {
resolver.reject()
}
}, timeout)
return resolver
}
const DEBOUNCE_FN_TO_PROMISE = new WeakMap()
export function debounce(fn, ms = 64) {
if (!DEBOUNCE_FN_TO_PROMISE.get(fn)) {
DEBOUNCE_FN_TO_PROMISE.set(
fn,
wait(ms).then(() => {
DEBOUNCE_FN_TO_PROMISE.delete(fn)
fn()
}),
)
}
return DEBOUNCE_FN_TO_PROMISE.get(fn)
}
export function wait(ms = 16) {
if (ms === 16) {
return new Promise((resolve) => {
requestAnimationFrame(() => {
resolve()
})
})
}
return new Promise((resolve) => {
setTimeout(() => {
resolve()
}, ms)
})
}
function dec2hex(dec) {
return dec.toString(16).padStart(2, '0')
}
export function generateId(length) {
const arr = new Uint8Array(length / 2)
crypto.getRandomValues(arr)
return Array.from(arr, dec2hex).join('')
}
export function getObjectValue(obj, objKey, def) {
if (!obj || !objKey) return def
const keys = objKey.split('.')
const key = keys.shift()
const found = obj[key]
if (keys.length) {
return getObjectValue(found, keys.join('.'), def)
}
return found
}
export function setObjectValue(obj, objKey, value, createMissingObjects = true) {
if (!obj || !objKey) return obj
const keys = objKey.split('.')
const key = keys.shift()
if (obj[key] === undefined) {
if (!createMissingObjects) {
return
}
obj[key] = {}
}
if (!keys.length) {
obj[key] = value
} else {
if (typeof obj[key] != 'object') {
obj[key] = {}
}
setObjectValue(obj[key], keys.join('.'), value, createMissingObjects)
}
return obj
}
export function moveArrayItem(arr, itemOrFrom, to) {
const from = typeof itemOrFrom === 'number' ? itemOrFrom : arr.indexOf(itemOrFrom)
arr.splice(to, 0, arr.splice(from, 1)[0])
}
export function removeArrayItem(arr, itemOrIndex) {
const index = typeof itemOrIndex === 'number' ? itemOrIndex : arr.indexOf(itemOrIndex)
arr.splice(index, 1)
}
export function injectCss(href) {
if (document.querySelector(`link[href^="${href}"]`)) {
return Promise.resolve()
}
return new Promise((resolve) => {
const link = document.createElement('link')
link.setAttribute('rel', 'stylesheet')
link.setAttribute('type', 'text/css')
const timeout = setTimeout(resolve, 1000)
link.addEventListener('load', (e) => {
clearInterval(timeout)
resolve()
})
link.href = href
document.head.appendChild(link)
})
}