state.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { getLikeButton, getDislikeButton, getButtons } from "./buttons";
  2. import { createRateBar } from "./bar";
  3. import { getBrowser, getVideoId, cLog, numberFormat } from "./utils";
  4. import { sendVideoIds } from "./events";
  5. const LIKED_STATE = "LIKED_STATE";
  6. const DISLIKED_STATE = "DISLIKED_STATE";
  7. const NEUTRAL_STATE = "NEUTRAL_STATE";
  8. function isMobile() {
  9. return location.hostname == "m.youtube.com";
  10. }
  11. function isVideoLiked() {
  12. if (isMobile()) {
  13. return (
  14. getLikeButton().querySelector("button").getAttribute("aria-label") ==
  15. "true"
  16. );
  17. }
  18. return getLikeButton().classList.contains("style-default-active");
  19. }
  20. function isVideoDisliked() {
  21. if (isMobile()) {
  22. return (
  23. getDislikeButton().querySelector("button").getAttribute("aria-label") ==
  24. "true"
  25. );
  26. }
  27. return getDislikeButton().classList.contains("style-default-active");
  28. }
  29. function getState(storedData) {
  30. if (isVideoLiked()) {
  31. return { current: LIKED_STATE, previous: storedData.previousState };
  32. }
  33. if (isVideoDisliked()) {
  34. return { current: DISLIKED_STATE, previous: storedData.previousState };
  35. }
  36. return { current: NEUTRAL_STATE, previous: storedData.previousState };
  37. }
  38. //--- Sets The Likes And Dislikes Values ---//
  39. function setLikes(likesCount) {
  40. getButtons().children[0].querySelector("#text").innerText = likesCount;
  41. }
  42. function setDislikes(dislikesCount) {
  43. if (isMobile()) {
  44. getButtons().children[1].querySelector(".button-renderer-text").innerText =
  45. dislikesCount;
  46. return;
  47. }
  48. getButtons().children[1].querySelector("#text").innerText = dislikesCount;
  49. }
  50. function getLikeCountFromButton() {
  51. let likesStr = getLikeButton()
  52. .querySelector("button")
  53. .getAttribute("aria-label")
  54. .replace(/\D/g, "");
  55. return likesStr.length > 0 ? parseInt(likesStr) : false;
  56. }
  57. function processResponse(response, storedData) {
  58. const formattedDislike = numberFormat(response.dislikes);
  59. setDislikes(formattedDislike);
  60. storedData.dislikes = parseInt(response.dislikes);
  61. storedData.likes = getLikeCountFromButton() || parseInt(response.likes);
  62. createRateBar(storedData.likes, storedData.dislikes);
  63. }
  64. function setState(storedData) {
  65. storedData.previousState = isVideoDisliked()
  66. ? DISLIKED_STATE
  67. : isVideoLiked()
  68. ? LIKED_STATE
  69. : NEUTRAL_STATE;
  70. let statsSet = false;
  71. getBrowser().runtime.sendMessage(
  72. {
  73. message: "set_state",
  74. videoId: getVideoId(window.location.href),
  75. state: getState(storedData).current,
  76. likeCount: getLikeCountFromButton() || null,
  77. },
  78. function (response) {
  79. cLog("response from api:");
  80. cLog(JSON.stringify(response));
  81. if (response !== undefined && !("traceId" in response) && !statsSet) {
  82. processResponse(response, storedData);
  83. } else {
  84. }
  85. }
  86. );
  87. }
  88. function setInitialState(storedData) {
  89. setState(storedData);
  90. setTimeout(() => {
  91. sendVideoIds();
  92. }, 1500);
  93. }
  94. export {
  95. isMobile,
  96. isVideoDisliked,
  97. isVideoLiked,
  98. getState,
  99. setState,
  100. setInitialState,
  101. setLikes,
  102. setDislikes,
  103. getLikeCountFromButton,
  104. LIKED_STATE,
  105. DISLIKED_STATE,
  106. NEUTRAL_STATE,
  107. };