type Callback = () => void;

export const onAppFullyReady = (callback: Callback) => {
  let domReady = false;
  let bodyVisible = false;

  const tryFinish = () => {
    if (domReady && bodyVisible) {
      callback();
    }
  };

  const handleDom = () => {
    domReady = true;
    document.removeEventListener("DOMContentLoaded", handleDom);
    tryFinish();
  };

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", handleDom);
  } else {
    domReady = true;
  }

  const body = document.body;

  const checkBody = () => {
    if (!body.classList.contains("opacity-0")) {
      bodyVisible = true;
      observer.disconnect();
      tryFinish();
    }
  };

  const observer = new MutationObserver(checkBody);

  observer.observe(body, { attributes: true, attributeFilter: ["class"] });

  checkBody();
};
