You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
986 B
46 lines
986 B
import { onMounted, onUnmounted, ref } from 'vue'; |
|
|
|
interface ScriptOptions { |
|
src: string; |
|
} |
|
|
|
export function useScript(opts: ScriptOptions) { |
|
const isLoading = ref(false); |
|
const error = ref(false); |
|
const success = ref(false); |
|
let script: HTMLScriptElement; |
|
|
|
const promise = new Promise((resolve, reject) => { |
|
onMounted(() => { |
|
script = document.createElement('script'); |
|
script.type = 'text/javascript'; |
|
script.onload = function () { |
|
isLoading.value = false; |
|
success.value = true; |
|
error.value = false; |
|
resolve(''); |
|
}; |
|
|
|
script.onerror = function (err) { |
|
isLoading.value = false; |
|
success.value = false; |
|
error.value = true; |
|
reject(err); |
|
}; |
|
|
|
script.src = opts.src; |
|
document.head.appendChild(script); |
|
}); |
|
}); |
|
|
|
onUnmounted(() => { |
|
script && script.remove(); |
|
}); |
|
|
|
return { |
|
isLoading, |
|
error, |
|
success, |
|
toPromise: () => promise, |
|
}; |
|
}
|
|
|