Smarter Base.vn - DEV

Make base.vn smarter

console.log("=======FROM SWD WITH CODE=======")
const version = '0.2.8.5';
const env = 'dev';

// ==UserScript==
// @name         Smarter Base.vn - DEV
// @description  Make base.vn smarter
// @namespace    http://tampermonkey.net/
// @version      0.2.8.5
// @author       duclh - SWD
// @include      /https:\/\/(.*).base.vn/(.*)
// @icon         https://www.google.com/s2/favicons?sz=64&domain=base.vn
// @grant        none
// @license MIT
// ==/UserScript==

let currentUrl = window.location.href;
let CONFIG = {
  CURRENT_SELECT_NOTI_SERVICE: "",
  SERVICE: {
    "all": {
      BG_COLOR: "#ccc7c7"
    },
    "+5": {
      BG_COLOR: "rgb(66 184 20 / 80%)"
    },
    "wework": {
      TITLE_SELECTOR: "#js-task-display > div.main-body > div.section.js-task-main > div.task-main > div.edit-box.compact.edit-task-name > div.edit-display > h1",
      BG_COLOR: "rgb(88 159 201 / 44%)",
      LINK_SELECTOR: ".tasklist .tasks div"
    },
    "meeting": {
      TITLE_SELECTOR: "#js-meeting-cover > div.main > div > div.text > div.name > span",
      BG_COLOR: "#ed6334b0"
    },
    "request": {
      TITLE_SELECTOR: "#obj-main > h1",
      BG_COLOR: "rgb(66 184 20 / 57%)"
    },
    "workflow": {
      TITLE_SELECTOR: "",
      BG_COLOR: "rgb(66 152 244 / 67%)"
    },
    "office": {
      TITLE_SELECTOR: "",
      BG_COLOR: "rgb(66 184 20 / 80%)"
    },
    "hiring": {
      TITLE_SELECTOR: "",
      BG_COLOR: "rgb(88 159 201 / 40%)"
    },
  },
  HIDE_NOTI: [],
  NOTI: {
    LOAD_MORE_NUMBER: 2,
    OPEN_NOTI_SELECTOR: {
      "wework": "#navigator > div.header > div.icon",
      "meeting": "#base-panel > div > div.item.url.item-followup.item-notis",
      "request": "#base-panel-hoz > div.items > div.item.item-notis",
      "workflow": "#navigator > div.icons.clear-fix > div:nth-child(3)",
      "office": "#header > div > div.header-side > div.header-item.item-notis.url",
      "inside": "#header > div > div.header-side > div.header-item.item-notis.-std.url > div.icon",
      "hiring": "",
      "booking": ".base-notis"
    },
    LOAD_MORE_SELECTOR: ".-more"
  },
  THEME: {
    MASK_SELECTOR: "#apdialogs"
  },
  ENABLE_SERVICES: {
    "disableAll": false,
    "smarterTitle": false,
    "smarterUrl": false,

    "smarterNoti": false,
    "smarterNoti_faster_like_it_gone": false,
    "smarterNoti_hide_noti": false,

    "wwHyperlink": false,
    "smarterTaskTime": false,

    "bonkSound": false,
    "bonkSoundUrl": ""
  }
};
let THEME_CONFIG = {
  TIP_INIT: false
};
let notiCountIntial = {
  "all": 0,
  "wework": 0,
  "meeting": 0,
  "request": 0,
  "workflow": 0,
  "office": 0,
  "hiring": 0
};
let notiCount = { ...notiCountIntial };
let notiOpened = false;
let firstTimeOpenNoti = true;

let noti_grid_1 = document.createElement("div");
noti_grid_1.style.display = "inline-block";
noti_grid_1.style.borderRight = "2px ridge grey";
noti_grid_1.style.paddingRight = "5px";

let noti_grid_2 = document.createElement("div");
noti_grid_2.style.display = "inline-block";
noti_grid_2.style.marginLeft = "5px";

const main_styling = () => {
  // let loadingDiv = document.querySelector('#base-xs');
  // let noNeedLoading = setInterval(() => {
  //   if (loadingDiv.style.display === '') loadingDiv.style.display = "none";
  //   clearInterval(noNeedLoading);
  // }, 50)

};

const main_makeWwCanHyperlink = () => {
  let taskUrl = "https://wework.base.vn" + window.location.pathname + "?task=";
  let links = document.querySelectorAll(CONFIG.SERVICE.wework.LINK_SELECTOR);
  if (!THEME_CONFIG.TIP_INIT) {
    wwHyperlink_tips();
    THEME_CONFIG.TIP_INIT = true;
  }

  if (links.length) {
    for (let link of links) {
      let linkDiv = link.querySelector(".mn .url");
      if (!linkDiv) continue;

      let isDone = link.querySelector(".check.url") && link.querySelector(".check.url").innerHTML.includes("-done");
      let taskId = linkDiv.getAttribute("data-url");
      if (!taskId || taskId === "") continue;
      taskId = taskId.split("/")[1];

      let newATag = linkDiv.outerHTML;
      newATag = newATag.replace("</span>", "</a>");
      newATag = newATag.replace("<span", `<a href="${taskUrl + taskId}" onClick="return false;" style="font-weight: 400; ${!isDone && "color: #111"}"  `);
      linkDiv.outerHTML = newATag;
    }
  };

  let subtaskLinks = document.querySelectorAll('.etask-detail'); //Lười viết config quá
  if (subtaskLinks.length) {
    for (let subtask of subtaskLinks) {
      let isDone = subtask.getAttribute("data-status") === '1';;

      let linkDiv = subtask.querySelector(".etask-name");
      let taskId = subtask.getAttribute("data-id");

      let newATag = linkDiv.outerHTML;
      newATag = newATag.replace("</div>", "</a>");
      newATag = newATag.replace("<div", `<a href="${taskUrl + taskId}"  onclick='Base.task._showID("${taskId}", "", "undefined");return false;' style="font-weight: 400; ${!isDone && "color: #111"}"  `);
      linkDiv.outerHTML = newATag;
    };
  };

}

const wwHyperlink_tips = () => {
  let clickedTip = true;
  let iconTip = document.createElement("img");
  iconTip.setAttribute("src", "https://cdn-icons-png.flaticon.com/512/551/551080.png");
  iconTip.style.width = '20px';
  iconTip.style.paddingBottom = '10px';
  iconTip.style.paddingLeft = '30px';

  let tipTextDiv = document.createElement("span");
  tipTextDiv.innerText = "Mẹo vặt cuộc sống: Link task giờ đây có thể \nbấm chuột phải (mở menu) \nhoặc chuột giữa (để nhảy tab mới)";
  tipTextDiv.style.display = 'none'
  tipTextDiv.style.position = 'absolute';
  tipTextDiv.style.backgroundColor = '#71e1ff';
  tipTextDiv.style.zIndex = '9009';


  iconTip.onclick = () => {
    tipTextDiv.style.display = clickedTip ? 'block' : 'none';
    clickedTip = !clickedTip;
  }
  if (document.querySelector('#header > div.title > div.name')) document.querySelector('#header > div.title > div.name').appendChild(iconTip);
  if (document.querySelector('#header > div.title > div.name')) document.querySelector('#header > div.title > div.name').appendChild(tipTextDiv);
}

const main_smarterNoti = (options) => {
  addAction_onClickNoti(options);
  utils_stylingFilterBar();

  const all = () => utils_showNotiByService("all");
  const ww = () => utils_showNotiByService("wework");
  const rq = () => utils_showNotiByService("request");
  const wf = () => utils_showNotiByService("workflow");
  const off = () => utils_showNotiByService("office");
  const hir = () => utils_showNotiByService("hiring");
  const mt = () => utils_showNotiByService("meeting");

  const plus5 = () => utils_loadMoreNoti({ num: 5, isFirstTime: false });
  const selectSound = () => utils_loadMoreNoti();

  const grid_1_items = [
    ["all", all],
    ["wework", ww],
    ["request", rq],
    ["workflow", wf],
    ["office", off],
    ["hiring", hir],
    ["meeting", mt],
  ];

  const grid_2_items = [
    ["+5", plus5],
  ];

  let titleDiv = document.querySelector("#base-notis > div.list.list-notis > div.-title");
  if (!titleDiv) return;
  titleDiv.innerHTML = "";
  titleDiv.appendChild(noti_grid_1);
  titleDiv.appendChild(noti_grid_2);

  for (let service of grid_1_items) {
    let filterServiceButton = document.createElement("button");
    filterServiceButton.classList.add("filter-service");
    filterServiceButton.classList.add(`s-${service[0]}`);
    filterServiceButton.innerText = `0 - ${service[0]}`;
    filterServiceButton.onclick = service[1];
    filterServiceButton.style.backgroundColor = CONFIG.SERVICE[service[0]].BG_COLOR;
    utils_stylingFilterButton(filterServiceButton);
    if (titleDiv) { noti_grid_1.appendChild(filterServiceButton); }
  }

  for (let service_2 of grid_2_items) {
    let btn = document.createElement("button");
    btn.innerText = `+5 trang`;
    btn.classList.add("load-more-noti");
    btn.onclick = service_2[1];
    btn.style.backgroundColor = CONFIG.SERVICE[service_2[0]].BG_COLOR;
    utils_stylingFilterButton(btn);
    if (titleDiv) noti_grid_2.appendChild(btn);
  }

  let soundDivDiv = document.createElement("div");
  soundDivDiv.innerHTML = "<label>Âm thanh thông báo</label>";
  let soundDiv = noti_genSelectSoundDiv();
  soundDivDiv.appendChild(soundDiv);
  soundDivDiv.style.display = "inline";
  soundDivDiv.style.fontSize = "16px";
  soundDivDiv.style.marginLeft = "5px";
  noti_grid_2.appendChild(soundDivDiv);

  let checkHasNoti = setInterval(() => { // Count noti
    if (document.querySelectorAll(".notis").length) {
      clearInterval(checkHasNoti);
      noti_recountNoti();
    }
  }, 200);

};

const noti_selectNotiSound = () => {

}

const noti_genSelectSoundDiv = () => {
  let notiSoundList = localStorage.getItem("noti_sound_list");
  if (!notiSoundList || !notiSoundList.length) return;
  notiSoundList = JSON.parse(notiSoundList);
  let userInfo = JSON.parse(localStorage.getItem('ajs_user_traits'));
  let sb_config = JSON.parse(localStorage.getItem('sb_config'));
  let email = userInfo.email;
  let userNotiSoundKey = sb_config.noti_sound_key;
  /*
  <select name="cars" id="cars">
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="mercedes">Mercedes</option>
    <option value="audi">Audi</option>
  </select>
  */

  // <label for="noti_sound_list">Âm thanh thông báo</label>
  let selectDiv = document.createElement("select");
  selectDiv.name = "noti_sound_list";
  selectDiv.id = "noti_sound_list";
  selectDiv.onchange = (soundKey) => {
    noti_onSelectSound(email, soundKey.target.value)
  }
  // let selectDiv = `<select name="noti_sound_list" id="noti_sound_list" selected="${userNotiSound}">  `
  for (let sound of notiSoundList) {
    let key = sound[0];
    let value = sound[1];
    let optionDiv = document.createElement("option");
    optionDiv.value = key;
    optionDiv.innerText = value;
    optionDiv.selected = key === userNotiSoundKey ? "selected" : "";
    // optionDiv.addEventListener("select", () => { noti_onSelectSound(username, key) });

    selectDiv.appendChild(optionDiv);
    // let optionDiv = `<option value="${key}" onselect={noti_onSelectSound("${username}","${key}")}>${value}</option>`;
  }
  return selectDiv;
}

const noti_onSelectSound = (email, soundKey) => {
  let notiSoundObj = JSON.parse(localStorage.getItem("noti_sound_obj"));
  var audio = new Audio(notiSoundObj[soundKey].link);
  audio.play();
  // Write local
  let sb_config = JSON.parse(localStorage.getItem('sb_config'));
  sb_config.noti_sound_key = soundKey;
  localStorage.setItem("sb_config", JSON.stringify(sb_config))
  //Write API
  callAPI("changeNotiSound",
    {
      email,
      config: {
        noti_sound_key:
          soundKey
      }
    })
}

const noti_changeSound = () => {
  let sb_config = JSON.parse(localStorage.getItem('sb_config'));

  let notiSoundObj = localStorage.getItem("noti_sound_obj");
  if (!notiSoundObj || !notiSoundObj.length) return;
  notiSoundObj = JSON.parse(notiSoundObj);
  let userSoundKey = sb_config["noti_sound_key"];
  if (!userSoundKey) return;

  let link = notiSoundObj[userSoundKey]["link"];

  if (link === "default") return;
  if (document.querySelector("#audios")) {
    if (link === "silent") {
      document.querySelector('#audios').outerHTML = "";
    } else {
      document.querySelector('#audio3').setAttribute("src", link);
    }

  }
}
noti_changeSound();


const main_smarterTitle = () => {
  let oldTitle = "";
  let hostName = utils_getCurrentService();

  let hasServiceCfg = CONFIG.SERVICE[hostName];
  if (!hasServiceCfg) return;

  let newTitle = document.querySelector(CONFIG.SERVICE[hostName].TITLE_SELECTOR);
  if (newTitle && newTitle !== oldTitle) {
    oldTitle = newTitle;
    document.title = newTitle.innerHTML;
  }
}


const main_smarterUrl = () => {
  let hostName = utils_getCurrentService();
  let hasServiceCfg = CONFIG.SERVICE[hostName];
  if (!hasServiceCfg) return;

  let taskId = document.querySelector("#js-task-display").getAttribute("data-id");
  let title = document.querySelector(CONFIG.SERVICE[hostName].TITLE_SELECTOR);
  title = title.innerHTML.replace(/ /g, '-');
  title = utils_removeVietnameseTones(title);

  let checkHasSearch = setInterval(() => {
    if (window.location.search && window.location.search.includes("task=")) {
      clearInterval(checkHasSearch);
      let newUrl = "/?n=" + title + "&task=" + taskId
      // +  window.location.pathname.replace("/");
      history.replaceState(null, '', newUrl);
    };
  }, 200);

}

const utils_removeVietnameseTones = (str) => {
  str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a");
  str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e");
  str = str.replace(/ì|í|ị|ỉ|ĩ/g, "i");
  str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o");
  str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u");
  str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y");
  str = str.replace(/đ/g, "d");
  str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, "A");
  str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, "E");
  str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, "I");
  str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, "O");
  str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, "U");
  str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, "Y");
  str = str.replace(/Đ/g, "D");
  // Some system encode vietnamese combining accent as individual utf-8 characters
  // Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này
  str = str.replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, ""); // ̀ ́ ̃ ̉ ̣  huyền, sắc, ngã, hỏi, nặng
  str = str.replace(/\u02C6|\u0306|\u031B/g, ""); // ˆ ̆ ̛  Â, Ê, Ă, Ơ, Ư
  // Remove extra spaces
  // Bỏ các khoảng trắng liền nhau
  str = str.trim();
  // Remove punctuations
  // Bỏ dấu câu, kí tự đặc biệt
  // str = str.replace(/!|@|%|\^|\*|\(|\)|\+|\=|\<|\>|\?|\/|,|\.|\:|\;|\'|\"|\&|\#|\[|\]|~|\$|_|`|-|{|}|\||\\/g, " ");
  return str;
}

const utils_getCurrentService = () => {
  let hostName = window.location.hostname;
  hostName = hostName.split(".")[0];
  return hostName;
}

const utils_showNotiByService = (selectedService, filter = {}) => {
  CONFIG.CURRENT_SELECT_NOTI_SERVICE = selectedService;
  let notis = document.getElementsByClassName("notis");
  for (let noti of notis) {
    noti.classList.remove("hidden");
    if (selectedService === "all") continue;
    let currentService = utils_getCurrentService();
    if (!noti) continue;
    let notiService = currentService;
    let url = noti.getAttributeNode("data-url").value;
    if (url.includes("https")) {
      url = url.split(".");
      notiService = url[0].replace("https://", "")
    }
    if (
      (notiService !== selectedService)
      || noti.getElementsByClassName("-title")[0].innerHTML.includes("sinh nhật")
    ) {
      noti = noti.classList.add("hidden");
    };
  }
}
const addAction_onClickNoti = (options) => {
  let currentService = utils_getCurrentService();
  if (!CONFIG.NOTI.OPEN_NOTI_SELECTOR[currentService]) return;
  let openNotiButton = document.querySelector(CONFIG.NOTI.OPEN_NOTI_SELECTOR[currentService]);

  let intervalCheckNotiAppear = setInterval(() => {
    if (openNotiButton) {
      openNotiButton.addEventListener('click', () => {

        if (options.smarterNoti_faster_like_it_gone && currentService !== "inside") {
          document.querySelector("#base-notis").style.display = notiOpened ? "none" : "block";
          notiOpened = !notiOpened;
        }

        if (firstTimeOpenNoti) {
          // setTimeout(() => { noti_recountNoti(); }, 500);
          let checkHasNoti = setInterval(() => {
            if (document.querySelectorAll(".notis").length) {
              clearInterval(checkHasNoti);
              noti_recountNoti();
            }
          }, 200);
          firstTimeOpenNoti = false;
          document.querySelector("#base-notis > div.full-mask").addEventListener("click", () => notiOpened = false);
        }



      });

      clearInterval(intervalCheckNotiAppear);
    }
  }, 200);
}

const noti_openNow = () => {
  let openStatus = notiOpened;
  let currentService = utils_getCurrentService();
  if (!CONFIG.NOTI.OPEN_NOTI_SELECTOR[currentService]) return;
  let openNotiButton = document.querySelector(CONFIG.NOTI.OPEN_NOTI_SELECTOR[currentService]);
  openNotiButton.onclick = 'Base.toggle("notis");';

};
// noti_openNow();

const noti_recountNoti = (reclickService = false) => {
  notiCount = { ...notiCountIntial };
  let notis = document.getElementsByClassName("notis");
  let currentService = utils_getCurrentService();
  for (let noti of notis) {
    notiCount['all'] += 1;
    let notiService = currentService;
    let url = noti.getAttributeNode("data-url").value;
    if (url.includes("https")) {
      url = url.split(".");
      notiService = url[0].replace("https://", "")
    };
    if (!CONFIG.SERVICE[notiService]) continue;
    notiCount[notiService] += 1;
  };
  utils_rewriteNotiCountToButton();
}

const utils_rewriteNotiCountToButton = () => {
  let openNotiButton = document.querySelectorAll(".filter-service");
  for (let btn of openNotiButton) {
    let serviceName = btn.classList[1];
    if (serviceName) serviceName = serviceName.split('s-')[1];
    let serviceNotiCount = notiCount[serviceName] || 0;
    btn.innerText = `${serviceNotiCount} - ${serviceName}`;
    if (serviceNotiCount === 0) btn.setAttribute("disabled", true)
    else btn.removeAttribute("disabled");
  }
}

const utils_stylingFilterBar = () => {
  let titleNoti = document.querySelector(".-title");
  let listNoti = document.querySelector(".list-notis");
  if (listNoti) listNoti.style.width = "60%";
  if (titleNoti) {
    titleNoti.style.width = "300%";
    titleNoti.style.height = "55px";
    titleNoti.style.background = "white";
    document.querySelector("#notis-items-w").style.top = "55pxpx";
  }
}

const utils_stylingFilterButton = (filterServiceButton) => {
  filterServiceButton.style.borderRadius = "5px";
  filterServiceButton.style.marginRight = "3px";
  filterServiceButton.style.marginLeft = "3px";
  filterServiceButton.style.paddingRight = "3px";
  filterServiceButton.style.paddingLeft = "3px";
  filterServiceButton.style.fontSize = "16px";
}

const utils_loadMoreNoti = ({ num = 10, isFirstTime = false }) => {
  let loadMoreButton = document.querySelector(CONFIG.NOTI.LOAD_MORE_SELECTOR);
  utils_toogleElemByClass({ classname: ".load-more-noti", isDisable: true });
  let count = 0;
  let intervalClickLoadMore = setInterval(() => {
    if (count === num) {
      clearInterval(intervalClickLoadMore);
      setTimeout(() => { noti_recountNoti(); }, 500);
      utils_toogleElemByClass({ classname: ".load-more-noti", isDisable: false });

    }
    loadMoreButton.click();
    count += 1;
  }, 200);

}

const utils_toogleElemByClass = ({ classname = "", isDisable = false }) => {
  let divs = document.querySelectorAll(classname);
  if (isDisable) divs.forEach(e => e.setAttribute("disabled", true));
  else divs.forEach(e => e.removeAttribute("disabled"));
}


const utils_getUserConfig = async () => {
  try {
    const pingUrl = 'https://script.google.com/macros/s/AKfycbwq3EpWpIY4zpebj3svXRsenyr_2kSTZvNuArOj5plyQE0Mp4EXVoGa4v4fmhwU4QkAkg/exec';
    let userInfo = JSON.parse(localStorage.getItem('ajs_user_traits'));
    let data = {
      route: "getUserConfig",
      name: userInfo.name,
      email: userInfo.email,
      version,
      env
    };

    let cfg = await fetch(pingUrl, {
      method: 'POST',
      redirect: "follow",
      body: JSON.stringify(data),
      headers: { 'Content-Type': 'text/plain;charset=utf-8' }
    })
    cfg = await cfg.json();

    let notiSoundArr = cfg.data.notiSoundList;

    let notiSoundObj = {};
    notiSoundArr.forEach(e => {
      notiSoundObj[e[0]] = {
        value: e[1],
        link: e[2]
      }
    });

    localStorage.setItem("noti_sound_list", JSON.stringify(notiSoundArr));
    localStorage.setItem("noti_sound_obj", JSON.stringify(notiSoundObj));
    localStorage.setItem("sb_config", JSON.stringify(cfg.data.config));

    console.log("🚀 Live config", cfg);
    return cfg;
  } catch (error) {
    sendErrorLog(error)
  }
}


const config_load = async () => {
  let cfg = CONFIG.ENABLE_SERVICES; // Default
  await utils_getUserConfig();
  let localCfg = localStorage.getItem("sb_config");

  if (!localCfg || localCfg.disableAll === null) { // If no, call API get cfg
    let liveCfg = await utils_getUserConfig();
    cfg = liveCfg.data.config;
    localStorage.setItem("sb_config", JSON.stringify(cfg));
  } else {
    cfg = { ...JSON.parse(localCfg) };
  }

  CONFIG.ENABLE_SERVICES = cfg;
  if (cfg.disableAll) return;

  if (cfg.smarterNoti) {
    main_smarterNoti({
      smarterNoti_faster_like_it_gone: cfg.smarterNoti_faster_like_it_gone
    })
  };
  if (cfg.smarterTitle) main_smarterTitle();
  if (currentUrl.includes("wework")) {
    if (cfg.wwHyperlink) main_makeWwCanHyperlink();
  };
  if (cfg.bonkSound) {
    if (document.querySelector("#audios")) {
      document
        .querySelector('#audio3')
        .setAttribute("src",
          (cfg.bonkSoundUrl !== "" && cfg.bonkSoundUrl)
          || "https://www.freesoundslibrary.com/wp-content/uploads/2021/03/bonk-sound-effect.mp3");
    }
  }
}

const utils_hookApi = () => {
  let proxied = window.XMLHttpRequest.prototype.open;
  window.XMLHttpRequest.prototype.open = function () {
    let cfg = CONFIG.ENABLE_SERVICES;
    if (cfg.disableAll) return;

    let xhrUrl = arguments[1];
    // console.log("==============CATCH API ", arguments);
    console.log(cfg)

    if (xhrUrl.includes("/ajax/api/comment/load")) {
      if (cfg.smarterTitle) main_smarterTitle();
      if (cfg.smarterUrl) main_smarterUrl();
    };

    if (xhrUrl.includes("/ajax/api/activity")) {
      //  main_hyperlinkTask();
    };

    if (xhrUrl.includes("wework.base.vn")) {
      setTimeout(() => { if (cfg.wwHyperlink) main_makeWwCanHyperlink() }, 2000);
    };
    if (xhrUrl.includes("/ajax/task/display")) { // Page task WW

    };
    return proxied.apply(this, [].slice.call(arguments));
  };
}

const callAPI = async (route, data) => {
  console.log("🚀 ~ file: dev.js ~ line 645 ~ callAPI ~ data", data);
  const url = 'https://script.google.com/macros/s/AKfycbwq3EpWpIY4zpebj3svXRsenyr_2kSTZvNuArOj5plyQE0Mp4EXVoGa4v4fmhwU4QkAkg/exec';

  let req = await fetch(url, {
    method: 'POST',
    redirect: "follow",
    body: JSON.stringify({
      route,
      ...data
    }),
    headers: { 'Content-Type': 'text/plain;charset=utf-8' }
  })
  return req.json();
}

const sendErrorLog = async (error) => {
  const pingUrl = 'https://script.google.com/macros/s/AKfycbwq3EpWpIY4zpebj3svXRsenyr_2kSTZvNuArOj5plyQE0Mp4EXVoGa4v4fmhwU4QkAkg/exec';

  let sendErr = await fetch(pingUrl, {
    method: 'POST',
    redirect: "follow",
    body: JSON.stringify({
      route: "sendError",
      error: error.message
    }),
    headers: { 'Content-Type': 'text/plain;charset=utf-8' }
  })
  console.log("🚀 ~ file: dev.js ~ line 546 ~ sendErrorLog ~ sendErr", sendErr);
};

try {
  config_load();
  utils_hookApi();
} catch (error) {
  console.log(error)
  sendErrorLog(error)
}