Files
onboard/resources/js/Components/Tour/composables/useWaitTarget.js

61 lines
1.3 KiB
JavaScript

import { nextTick } from "vue"
export function useWaitTarget() {
async function waitTarget(target, options = {}) {
const {
timeout = 5000,
interval = 50,
visible = false
} = options
const start = Date.now()
while (Date.now() - start < timeout) {
await nextTick()
let element = null
if (typeof target === "function") {
element = target()
}
else {
element = document.querySelector(target)
}
if (element) {
if (visible) {
const rect = element.getBoundingClientRect()
if (
rect.width === 0 ||
rect.height === 0
) {
await sleep(interval)
continue
}
}
return element
}
await sleep(interval)
}
console.warn(
`[Tour] Target not found:`,
target
)
return null
}
return {
waitTarget
}
}
function sleep(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms)
})
}