popup.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /* Config */
  2. const config = {
  3. advanced: false,
  4. disableVoteSubmission: false,
  5. coloredThumbs: false,
  6. coloredBar: false,
  7. colorTheme: "classic",
  8. numberDisplayFormat: 'compactShort',
  9. numberDisplayRoundDown: true,
  10. showAdvancedMessage: '<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"><rect fill="none" height="24" width="24"/><path d="M19.5,12c0-0.23-0.01-0.45-0.03-0.68l1.86-1.41c0.4-0.3,0.51-0.86,0.26-1.3l-1.87-3.23c-0.25-0.44-0.79-0.62-1.25-0.42 l-2.15,0.91c-0.37-0.26-0.76-0.49-1.17-0.68l-0.29-2.31C14.8,2.38,14.37,2,13.87,2h-3.73C9.63,2,9.2,2.38,9.14,2.88L8.85,5.19 c-0.41,0.19-0.8,0.42-1.17,0.68L5.53,4.96c-0.46-0.2-1-0.02-1.25,0.42L2.41,8.62c-0.25,0.44-0.14,0.99,0.26,1.3l1.86,1.41 C4.51,11.55,4.5,11.77,4.5,12s0.01,0.45,0.03,0.68l-1.86,1.41c-0.4,0.3-0.51,0.86-0.26,1.3l1.87,3.23c0.25,0.44,0.79,0.62,1.25,0.42 l2.15-0.91c0.37,0.26,0.76,0.49,1.17,0.68l0.29,2.31C9.2,21.62,9.63,22,10.13,22h3.73c0.5,0,0.93-0.38,0.99-0.88l0.29-2.31 c0.41-0.19,0.8-0.42,1.17-0.68l2.15,0.91c0.46,0.2,1,0.02,1.25-0.42l1.87-3.23c0.25-0.44,0.14-0.99-0.26-1.3l-1.86-1.41 C19.49,12.45,19.5,12.23,19.5,12z M12.04,15.5c-1.93,0-3.5-1.57-3.5-3.5s1.57-3.5,3.5-3.5s3.5,1.57,3.5,3.5S13.97,15.5,12.04,15.5z"/></svg>',
  11. hideAdvancedMessage: '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"><path d="M0 0h24v24H0V0z" fill="none" opacity=".87"/><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm4.3 14.3c-.39.39-1.02.39-1.41 0L12 13.41 9.11 16.3c-.39.39-1.02.39-1.41 0-.39-.39-.39-1.02 0-1.41L10.59 12 7.7 9.11c-.39-.39-.39-1.02 0-1.41.39-.39 1.02-.39 1.41 0L12 10.59l2.89-2.89c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41L13.41 12l2.89 2.89c.38.38.38 1.02 0 1.41z"/></svg>',
  12. links: {
  13. website: "https://returnyoutubedislike.com",
  14. github: "https://github.com/Anarios/return-youtube-dislike",
  15. discord: "https://discord.gg/mYnESY4Md5",
  16. donate: "https://returnyoutubedislike.com/donate",
  17. faq: "https://returnyoutubedislike.com/faq",
  18. help: "https://returnyoutubedislike.com/help"
  19. },
  20. };
  21. /* Change language */
  22. function localizeHtmlPage()
  23. {
  24. //Localize by replacing __MSG_***__ meta tags
  25. var objects = document.getElementsByTagName('html');
  26. for (var j = 0; j < objects.length; j++)
  27. {
  28. var obj = objects[j];
  29. var valStrH = obj.innerHTML.toString();
  30. var valNewH = valStrH.replace(/__MSG_(\w+)__/g, function(match, v1)
  31. {
  32. return v1 ? chrome.i18n.getMessage(v1) : "";
  33. });
  34. if(valNewH != valStrH)
  35. {
  36. obj.innerHTML = valNewH;
  37. }
  38. }
  39. }
  40. localizeHtmlPage();
  41. /* Links */
  42. createLink(config.links.website,"link_website")
  43. createLink(config.links.github,"link_github")
  44. createLink(config.links.discord,"link_discord")
  45. createLink(config.links.faq,"link_faq")
  46. createLink(config.links.donate,"link_donate")
  47. createLink(config.links.help,"link_help")
  48. function createLink(url,id) {
  49. document.getElementById(id).addEventListener("click",()=>{
  50. chrome.tabs.create({ url: url})
  51. })
  52. }
  53. document
  54. .getElementById("disable_vote_submission")
  55. .addEventListener("click", (ev) => {
  56. chrome.storage.sync.set({ disableVoteSubmission: ev.target.checked });
  57. });
  58. document
  59. .getElementById("colored_thumbs")
  60. .addEventListener("click", (ev) => {
  61. chrome.storage.sync.set({ coloredThumbs: ev.target.checked });
  62. });
  63. document
  64. .getElementById("colored_bar")
  65. .addEventListener("click", (ev) => {
  66. chrome.storage.sync.set({ coloredBar: ev.target.checked });
  67. });
  68. document
  69. .getElementById("color_theme")
  70. .addEventListener("click", (ev) => {
  71. chrome.storage.sync.set({ colorTheme: ev.target.value });
  72. });
  73. document.getElementById("number_round_down").addEventListener("click", (ev) => {
  74. chrome.storage.sync.set({ numberDisplayRoundDown: ev.target.checked });
  75. updateNumberDisplayFormatContent(ev.target.checked);
  76. });
  77. document.getElementById("number_format").addEventListener("change", (ev) => {
  78. chrome.storage.sync.set({ numberDisplayFormat: ev.target.value });
  79. });
  80. /* Advanced Toggle */
  81. const advancedToggle = document.getElementById("advancedToggle");
  82. advancedToggle.addEventListener("click", () => {
  83. const adv = document.getElementById("advancedSettings");
  84. if (config.advanced) {
  85. adv.style.transform = "scale(1.1)";
  86. adv.style.pointerEvents = "none";
  87. adv.style.opacity = "0";
  88. advancedToggle.innerHTML = config.showAdvancedMessage;
  89. config.advanced = false;
  90. } else {
  91. adv.style.transform = "scale(1)";
  92. adv.style.pointerEvents = "auto";
  93. adv.style.opacity = "1";
  94. advancedToggle.innerHTML = config.hideAdvancedMessage;
  95. config.advanced = true;
  96. }
  97. });
  98. initConfig();
  99. function initConfig() {
  100. initializeDisableVoteSubmission();
  101. initializeVersionNumber();
  102. initializeColoredThumbs();
  103. initializeColoredBar();
  104. initializeColorTheme();
  105. initializeNumberDisplayFormat();
  106. initializeNumberDisplayRoundDown();
  107. }
  108. function initializeVersionNumber() {
  109. const version = chrome.runtime.getManifest().version;
  110. document.getElementById('ext-version').innerHTML = 'v' + version;
  111. fetch(
  112. "https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json"
  113. )
  114. .then((response) => response.json())
  115. .then((json) => {
  116. if (version !== json.version) {
  117. document.getElementById('ext-update').innerHTML = chrome.i18n.getMessage("textUpdate") +' v' + json.version;
  118. document.getElementById('ext-update').style.padding = '.25rem .5rem';
  119. }
  120. });
  121. // .catch(console.error);
  122. }
  123. function initializeDisableVoteSubmission() {
  124. chrome.storage.sync.get(["disableVoteSubmission"], (res) => {
  125. handleDisableVoteSubmissionChangeEvent(res.disableVoteSubmission);
  126. });
  127. }
  128. function initializeColoredThumbs() {
  129. chrome.storage.sync.get(["coloredThumbs"], (res) => {
  130. handleColoredThumbsChangeEvent(res.coloredThumbs);
  131. });
  132. }
  133. function initializeColoredBar() {
  134. chrome.storage.sync.get(["coloredBar"], (res) => {
  135. handleColoredBarChangeEvent(res.coloredBar);
  136. });
  137. }
  138. function initializeColorTheme() {
  139. chrome.storage.sync.get(["colorTheme"], (res) => {
  140. handleColorThemeChangeEvent(res.colorTheme);
  141. });
  142. function initializeNumberDisplayRoundDown() {
  143. chrome.storage.sync.get(["numberDisplayRoundDown"], (res) => {
  144. handleNumberDisplayRoundDownChangeEvent(res.numberDisplayRoundDown);
  145. });
  146. }
  147. function initializeNumberDisplayFormat() {
  148. chrome.storage.sync.get(["numberDisplayFormat"], (res) => {
  149. handleNumberDisplayFormatChangeEvent(res.numberDisplayFormat);
  150. });
  151. updateNumberDisplayFormatContent();
  152. }
  153. function updateNumberDisplayFormatContent(roundDown) {
  154. let testValue;
  155. if (roundDown) {
  156. testValue = 123000;
  157. } else {
  158. testValue = 123456;
  159. }
  160. document.getElementById('number_format_compactShort').innerHTML =
  161. getNumberFormatter('compactShort').format(testValue);
  162. document.getElementById('number_format_compactLong').innerHTML =
  163. getNumberFormatter('compactLong').format(testValue);
  164. document.getElementById('number_format_standard').innerHTML =
  165. getNumberFormatter('standard').format(testValue);
  166. }
  167. chrome.storage.onChanged.addListener(storageChangeHandler);
  168. function storageChangeHandler(changes, area) {
  169. if (changes.disableVoteSubmission !== undefined) {
  170. handleDisableVoteSubmissionChangeEvent(
  171. changes.disableVoteSubmission.newValue
  172. );
  173. }
  174. if (changes.coloredThumbs !== undefined) {
  175. handleColoredThumbsChangeEvent(
  176. changes.coloredThumbs.newValue
  177. );
  178. }
  179. if (changes.coloredBar !== undefined) {
  180. handleColoredBarChangeEvent(
  181. changes.coloredBar.newValue
  182. );
  183. }
  184. if (changes.colorTheme !== undefined) {
  185. handleColorThemeChangeEvent(
  186. changes.colorTheme.newValue
  187. );
  188. if (changes.numberDisplayRoundDown !== undefined) {
  189. handleNumberDisplayRoundDownChangeEvent(
  190. changes.numberDisplayRoundDown.newValue
  191. );
  192. }
  193. if (changes.numberDisplayFormat !== undefined) {
  194. handleNumberDisplayFormatChangeEvent(changes.numberDisplayFormat.newValue);
  195. }
  196. }
  197. function handleDisableVoteSubmissionChangeEvent(value) {
  198. config.disableVoteSubmission = value;
  199. document.getElementById("disable_vote_submission").checked = value;
  200. }
  201. function handleColoredThumbsChangeEvent(value) {
  202. config.coloredThumbs = value;
  203. document.getElementById("colored_thumbs").checked = value;
  204. }
  205. function handleColoredBarChangeEvent(value) {
  206. config.coloredBar = value;
  207. document.getElementById("colored_bar").checked = value;
  208. }
  209. function handleColorThemeChangeEvent(value) {
  210. config.colorTheme = value;
  211. document
  212. .getElementById("color_theme")
  213. .querySelector('option[value="' + value + '"]').selected = true;
  214. updateColorThemePreviewContent(value);
  215. }
  216. function updateColorThemePreviewContent(themeName) {
  217. document.getElementById("color_theme_example_like").style.backgroundColor = getColorFromTheme(themeName, true);
  218. document.getElementById("color_theme_example_dislike").style.backgroundColor = getColorFromTheme(themeName, false);
  219. function handleNumberDisplayRoundDownChangeEvent(value) {
  220. config.numberDisplayRoundDown = value;
  221. document.getElementById("number_round_down").checked = value;
  222. }
  223. function handleNumberDisplayFormatChangeEvent(value) {
  224. config.numberDisplayFormat = value;
  225. document
  226. .getElementById("number_format")
  227. .querySelector('option[value="' + value + '"]').selected = true;
  228. }
  229. function getNumberFormatter(optionSelect) {
  230. let formatterNotation;
  231. let formatterCompactDisplay;
  232. switch (optionSelect) {
  233. case 'compactLong':
  234. formatterNotation = 'compact';
  235. formatterCompactDisplay = 'long';
  236. break;
  237. case 'standard':
  238. formatterNotation = 'standard';
  239. formatterCompactDisplay = 'short';
  240. break;
  241. case 'compactShort':
  242. default:
  243. formatterNotation = 'compact';
  244. formatterCompactDisplay = 'short';
  245. }
  246. const formatter = Intl.NumberFormat(
  247. document.documentElement.lang || userLocales || navigator.language,
  248. {
  249. notation: formatterNotation,
  250. compactDisplay: formatterCompactDisplay,
  251. }
  252. );
  253. return formatter;
  254. }
  255. (async function getStatus() {
  256. let status = document.getElementById("status");
  257. let serverStatus = document.getElementById("server-status");
  258. let resp = await fetch(
  259. "https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g"
  260. );
  261. let result = await resp.status;
  262. if (result === 200) {
  263. status.innerText = "Online";
  264. status.style.color = "green";
  265. serverStatus.style.filter =
  266. "invert(58%) sepia(81%) saturate(2618%) hue-rotate(81deg) brightness(119%) contrast(129%)";
  267. } else {
  268. status.innerText = "Offline";
  269. status.style.color = "red";
  270. serverStatus.style.filter =
  271. "invert(11%) sepia(100%) saturate(6449%) hue-rotate(3deg) brightness(116%) contrast(115%)";
  272. }
  273. })();
  274. function getColorFromTheme(colorTheme, voteIsLike) {
  275. let colorString;
  276. switch(colorTheme) {
  277. case 'accessible':
  278. if (voteIsLike === true) {
  279. colorString = 'dodgerblue';
  280. } else {
  281. colorString = 'gold';
  282. }
  283. break;
  284. case 'neon':
  285. if (voteIsLike === true) {
  286. colorString = 'aqua';
  287. } else {
  288. colorString = 'magenta';
  289. }
  290. break;
  291. case 'classic':
  292. default:
  293. if (voteIsLike === true) {
  294. colorString = 'lime';
  295. } else {
  296. colorString = 'red';
  297. }
  298. }
  299. return colorString;
  300. }
  301. /* popup-script.js
  302. document.querySelector('#login')
  303. .addEventListener('click', function () {
  304. chrome.runtime.sendMessage({ message: 'get_auth_token' });
  305. });
  306. document.querySelector("#log_off").addEventListener("click", function () {
  307. chrome.runtime.sendMessage({ message: "log_off" });
  308. });
  309. */