state.js 2.9 KB

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