versionCheck.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { t } from "../translations";
  2. import { scriptInfo, host } from "../constants";
  3. import { getFeatures } from "../config";
  4. import { error, info, sendRequest } from "../utils";
  5. import pkg from "../../package.json" assert { type: "json" };
  6. // import { BytmMenu } from "src/menu/new/BytmMenu";
  7. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  8. import React from "react";
  9. const releaseURL = "https://github.com/Sv443/BetterYTM/releases/latest";
  10. export async function checkVersion() {
  11. try {
  12. if(getFeatures().versionCheck === false)
  13. return info("Version check is disabled");
  14. const lastCheck = await GM.getValue("bytm-version-check", 0);
  15. if(Date.now() - lastCheck < 1000 * 60 * 60 * 24)
  16. return;
  17. await GM.setValue("bytm-version-check", Date.now());
  18. const res = await sendRequest({
  19. method: "GET",
  20. url: releaseURL,
  21. });
  22. const latestTag = res.finalUrl.split("/").pop()?.replace(/[a-zA-Z]/g, "");
  23. if(!latestTag)
  24. return;
  25. const versionComp = compareVersions(scriptInfo.version, latestTag);
  26. info("Version check - current version:", scriptInfo.version, "- latest version:", latestTag);
  27. if(versionComp < 0) {
  28. const platformNames: Record<typeof host, string> = {
  29. github: "GitHub",
  30. greasyfork: "GreasyFork",
  31. openuserjs: "OpenUserJS",
  32. };
  33. // const menu = new BytmMenu({
  34. // id: "version-check",
  35. // closeOnBgClick: false,
  36. // closeOnEscPress: false,
  37. // renderBody() {
  38. // return (
  39. // <div>
  40. // <p>
  41. // {t("new_version_available", scriptInfo.name, scriptInfo.version, latestTag, platformNames[host])}
  42. // </p>
  43. // <button
  44. // className="bytm-btn"
  45. // onClick={() => window.open(pkg.updates[host])}
  46. // >
  47. // {t("update_now")}
  48. // </button>
  49. // </div>
  50. // );
  51. // },
  52. // });
  53. // menu.on("close", () => menu.destroy());
  54. // await menu.open();
  55. // TODO: replace with custom dialog
  56. if(confirm(t("new_version_available", scriptInfo.name, scriptInfo.version, latestTag, platformNames[host])))
  57. window.open(pkg.updates[host]);
  58. }
  59. }
  60. catch(err) {
  61. error("Version check failed:", err);
  62. }
  63. }
  64. /**
  65. * Crudely compares two semver version strings.
  66. * @returns Returns 1 if a > b or -1 if a < b or 0 if a == b
  67. */
  68. function compareVersions(a: string, b: string) {
  69. const pa = a.split(".");
  70. const pb = b.split(".");
  71. for(let i = 0; i < 3; i++) {
  72. const na = Number(pa[i]);
  73. const nb = Number(pb[i]);
  74. if(na > nb) return 1;
  75. if(nb > na) return -1;
  76. if(!isNaN(na) && isNaN(nb)) return 1;
  77. if(isNaN(na) && !isNaN(nb)) return -1;
  78. }
  79. return 0;
  80. }