external-script-loader.ts 643 B

12345678910111213141516171819202122232425262728293031
  1. import { useState, useEffect } from 'react'
  2. type ExternalScriptLoaderProps = {
  3. children: JSX.Element
  4. src: string
  5. }
  6. function ExternalScriptLoader({ children, src }: ExternalScriptLoaderProps) {
  7. const [loaded, setLoaded] = useState(false)
  8. useEffect(() => {
  9. const body = document.querySelector('body')
  10. const script = document.createElement('script')
  11. script.async = true
  12. script.src = src
  13. script.onload = () => {
  14. setLoaded(true)
  15. }
  16. body?.appendChild(script)
  17. return () => {
  18. body?.removeChild(script)
  19. }
  20. }, [src])
  21. return loaded ? children : null
  22. }
  23. export default ExternalScriptLoader