state.js 3.6 KB

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