aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMax Baumann <[email protected]>2020-12-14 11:08:56 +0100
committerMax Baumann <[email protected]>2020-12-14 11:08:56 +0100
commitc3f32aae267d263504e5be07ade8ca1799d9b2d3 (patch)
tree6351dd46f45f63e2909b2a7a0fcb22061dc88f7e /src
parentbdcfec38c2c82b4cec53eaaa970a9e70182dc51b (diff)
parent55856c556663aa9201e2ca6a880b661b8c1187a3 (diff)
downloadSponsorBlock-c3f32aae267d263504e5be07ade8ca1799d9b2d3.tar.gz
SponsorBlock-c3f32aae267d263504e5be07ade8ca1799d9b2d3.zip
Merge branch 'master' of github.com:ajayyy/SponsorBlock into fosefx-eslint
Diffstat (limited to 'src')
-rw-r--r--src/background.ts3
-rw-r--r--src/content.ts28
-rw-r--r--src/popup.ts687
3 files changed, 205 insertions, 513 deletions
diff --git a/src/background.ts b/src/background.ts
index 8326d8e1..2bab479f 100644
--- a/src/background.ts
+++ b/src/background.ts
@@ -32,6 +32,9 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
case "openConfig":
chrome.runtime.openOptionsPage();
return;
+ case "openHelp":
+ window.open(chrome.runtime.getURL('help/index_en.html'));
+ return;
case "sendRequest":
sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => {
callback({
diff --git a/src/content.ts b/src/content.ts
index 07c2b477..d58fb524 100644
--- a/src/content.ts
+++ b/src/content.ts
@@ -1125,7 +1125,7 @@ async function createButtons(): Promise<boolean> {
let createdButton = false;
// Add button if does not already exist in html
- createdButton = createButton("startSponsor", "sponsorStart", startSponsorClicked, "PlayerStartIconSponsorBlocker256px.png") || createdButton;
+ createdButton = createButton("startSponsor", "sponsorStart", startSponsorClicked, "PlayerStartIconSponsorBlocker256px.png") || createdButton;
createdButton = createButton("info", "openPopup", openInfoMenu, "PlayerInfoIconSponsorBlocker256px.png") || createdButton;
createdButton = createButton("delete", "clearTimes", clearSponsorTimes, "PlayerDeleteIconSponsorBlocker256px.png") || createdButton;
createdButton = createButton("submit", "SubmitTimes", submitSponsorTimes, "PlayerUploadIconSponsorBlocker256px.png") || createdButton;
@@ -1275,9 +1275,17 @@ function openInfoMenu() {
sendRequestToCustomServer('GET', chrome.extension.getURL("popup.html"), function(xmlhttp) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
- const popup = document.createElement("div");
+ let popup = document.createElement("div");
popup.id = "sponsorBlockPopupContainer";
- popup.innerHTML = xmlhttp.responseText
+
+ let htmlData = xmlhttp.responseText;
+ // Hack to replace head data (title, favicon)
+ htmlData = htmlData.replace(/<head>[\S\s]*<\/head>/gi, "");
+ // Hack to replace body tag with div
+ htmlData = htmlData.replace(/<body/gi, "<div");
+ htmlData = htmlData.replace(/<\/body/gi, "</div");
+
+ popup.innerHTML = htmlData;
//close button
const closeButton = document.createElement("div");
@@ -1302,16 +1310,18 @@ function openInfoMenu() {
//old youtube theme
parentNode = document.getElementById("watch7-sidebar-contents");
}
-
//make the logo source not 404
//query selector must be used since getElementByID doesn't work on a node and this isn't added to the document yet
- const logo = <HTMLImageElement> popup.querySelector("#sponsorBlockPopupLogo");
+ let logo = <HTMLImageElement> popup.querySelector("#sponsorBlockPopupLogo");
+ let settings = <HTMLImageElement> popup.querySelector("#sbPopupIconSettings");
+ let edit = <HTMLImageElement> popup.querySelector("#sbPopupIconEdit");
+ let check = <HTMLImageElement> popup.querySelector("#sbPopupIconCheck");
logo.src = chrome.extension.getURL("icons/LogoSponsorBlocker256px.png");
-
- //remove the style sheet and font that are not necessary
- popup.querySelector("#sponsorBlockPopupFont").remove();
- popup.querySelector("#sponsorBlockStyleSheet").remove();
+ settings.src = chrome.extension.getURL("icons/settings.svg");
+ edit.src = chrome.extension.getURL("icons/pencil.svg");
+ check.src = chrome.extension.getURL("icons/check.svg");
+ check.src = chrome.extension.getURL("icons/thumb.svg");
parentNode.insertBefore(popup, parentNode.firstChild);
diff --git a/src/popup.ts b/src/popup.ts
index 961a5bdd..81f92b00 100644
--- a/src/popup.ts
+++ b/src/popup.ts
@@ -33,7 +33,7 @@ class MessageHandler {
} else {
chrome.tabs.query(config, callback);
}
-
+
}
}
@@ -47,121 +47,109 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const PageElements: any = {};
- ["sponsorStart",
- // Top toggles
- "whitelistChannel",
- "unwhitelistChannel",
- "whitelistForceCheck",
- "disableSkipping",
- "enableSkipping",
- // Options
- "showNoticeAgain",
- "optionsButton",
- // More controls
- "submitTimes",
- "reportAnIssue",
- // sponsorTimesContributions
- "sponsorTimesContributionsContainer",
- "sponsorTimesContributionsDisplay",
- "sponsorTimesContributionsDisplayEndWord",
- // sponsorTimesViewsDisplay
- "sponsorTimesViewsContainer",
- "sponsorTimesViewsDisplay",
- "sponsorTimesViewsDisplayEndWord",
- // sponsorTimesOthersTimeSaved
- "sponsorTimesOthersTimeSavedContainer",
- "sponsorTimesOthersTimeSavedDisplay",
- "sponsorTimesOthersTimeSavedEndWord",
- // sponsorTimesSkipsDone
- "sponsorTimesSkipsDoneContainer",
- "sponsorTimesSkipsDoneDisplay",
- "sponsorTimesSkipsDoneEndWord",
- // sponsorTimeSaved
- "sponsorTimeSavedContainer",
- "sponsorTimeSavedDisplay",
- "sponsorTimeSavedEndWord",
- // discordButtons
- "discordButtonContainer",
- "hideDiscordButton",
- // Username
- "setUsernameContainer",
- "setUsernameButton",
- "setUsernameStatusContainer",
- "setUsernameStatus",
- "setUsername",
- "usernameInput",
- "submitUsername",
- // More
- "submissionSection",
- "mainControls",
- "loadingIndicator",
- "videoFound",
- "sponsorMessageTimes",
- "downloadedSponsorMessageTimes",
+ [
+ "sponsorblockPopup",
+ "sponsorStart",
+ // Top toggles
+ "whitelistChannel",
+ "unwhitelistChannel",
+ "whitelistToggle",
+ "whitelistForceCheck",
+ "disableSkipping",
+ "enableSkipping",
+ "toggleSwitch",
+ // Options
+ "showNoticeAgain",
+ "optionsButton",
+ "helpButton",
+ // More controls
+ "submitTimes",
+ "sponsorTimesContributionsContainer",
+ "sponsorTimesContributionsDisplay",
+ "sponsorTimesViewsContainer",
+ "sponsorTimesViewsDisplay",
+ "sponsorTimesViewsDisplayEndWord",
+ "sponsorTimesOthersTimeSavedDisplay",
+ "sponsorTimesOthersTimeSavedEndWord",
+ "sponsorTimesSkipsDoneContainer",
+ "sponsorTimesSkipsDoneDisplay",
+ "sponsorTimesSkipsDoneEndWord",
+ "sponsorTimeSavedDisplay",
+ "sponsorTimeSavedEndWord",
+ // Username
+ "setUsernameContainer",
+ "setUsernameButton",
+ "setUsernameStatusContainer",
+ "setUsernameStatus",
+ "setUsername",
+ "usernameInput",
+ "usernameValue",
+ "submitUsername",
+ // More
+ "submissionSection",
+ "mainControls",
+ "loadingIndicator",
+ "videoFound",
+ "sponsorMessageTimes",
+ //"downloadedSponsorMessageTimes",
+ "whitelistButton",
].forEach(id => PageElements[id] = document.getElementById(id));
//setup click listeners
PageElements.sponsorStart.addEventListener("click", sendSponsorStartMessage);
- PageElements.whitelistChannel.addEventListener("click", whitelistChannel);
+ PageElements.whitelistToggle.addEventListener("change", function() {
+ if (this.checked) {
+ whitelistChannel();
+ } else {
+ unwhitelistChannel();
+ }
+ });
PageElements.whitelistForceCheck.addEventListener("click", openOptions);
- PageElements.unwhitelistChannel.addEventListener("click", unwhitelistChannel);
- PageElements.disableSkipping.addEventListener("click", () => toggleSkipping(true));
- PageElements.enableSkipping.addEventListener("click", () => toggleSkipping(false));
+ PageElements.toggleSwitch.addEventListener("change", function() {
+ toggleSkipping(!this.checked);
+ });
PageElements.submitTimes.addEventListener("click", submitTimes);
PageElements.showNoticeAgain.addEventListener("click", showNoticeAgain);
PageElements.setUsernameButton.addEventListener("click", setUsernameButton);
+ PageElements.usernameValue.addEventListener("click", setUsernameButton);
PageElements.submitUsername.addEventListener("click", submitUsername);
PageElements.optionsButton.addEventListener("click", openOptions);
- PageElements.reportAnIssue.addEventListener("click", reportAnIssue);
- PageElements.hideDiscordButton.addEventListener("click", hideDiscordButton);
-
+ PageElements.helpButton.addEventListener("click", openHelp);
+
//if true, the button now selects the end time
let startTimeChosen = false;
-
+
//the start and end time pairs (2d)
let sponsorTimes: SponsorTime[] = [];
-
+
//current video ID of this tab
let currentVideoID = null;
-
- //see if discord link can be shown
- const hideDiscordLink = Config.config.hideDiscordLink;
- if (hideDiscordLink == undefined || !hideDiscordLink) {
- let hideDiscordLaunches = Config.config.hideDiscordLaunches;
- //only if less than 10 launches
- if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) {
- PageElements.discordButtonContainer.style.display = null;
-
- if (hideDiscordLaunches == undefined) {
- hideDiscordLaunches = 1;
- }
- Config.config.hideDiscordLaunches = hideDiscordLaunches + 1;
- }
- }
//show proper disable skipping button
const disableSkipping = Config.config.disableSkipping;
if (disableSkipping != undefined && disableSkipping) {
PageElements.disableSkipping.style.display = "none";
PageElements.enableSkipping.style.display = "unset";
+ PageElements.toggleSwitch.checked = false;
}
- //if the don't show notice again variable is true, an option to
+ //if the don't show notice again variable is true, an option to
// disable should be available
const dontShowNotice = Config.config.dontShowNotice;
if (dontShowNotice != undefined && dontShowNotice) {
PageElements.showNoticeAgain.style.display = "unset";
}
+ utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, (res) => {
+ if (res.status === 200) {
+ PageElements.usernameValue.innerText = JSON.parse(res.responseText).userName
+ }
+ })
+
//get the amount of times this user has contributed and display it to thank them
if (Config.config.sponsorTimesContributed != undefined) {
- if (Config.config.sponsorTimesContributed !== 1) {
- PageElements.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
- } else {
- PageElements.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Segment");
- }
- PageElements.sponsorTimesContributionsDisplay.innerText = Config.config.sponsorTimesContributed;
- PageElements.sponsorTimesContributionsContainer.style.display = "unset";
+ PageElements.sponsorTimesContributionsDisplay.innerText = Config.config.sponsorTimesContributed.toLocaleString();
+ PageElements.sponsorTimesContributionsContainer.classList.remove("hidden");
//get the userID
const userID = Config.config.userID;
@@ -178,7 +166,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segment");
}
- PageElements.sponsorTimesViewsDisplay.innerText = viewCount;
+ PageElements.sponsorTimesViewsDisplay.innerText = viewCount.toLocaleString();
PageElements.sponsorTimesViewsContainer.style.display = "unset";
}
}
@@ -196,7 +184,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
PageElements.sponsorTimesOthersTimeSavedDisplay.innerText = getFormattedHours(minutesSaved);
- PageElements.sponsorTimesOthersTimeSavedContainer.style.display = "unset";
}
}
});
@@ -211,7 +198,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.sponsorTimesSkipsDoneEndWord.innerText = chrome.i18n.getMessage("Segment");
}
- PageElements.sponsorTimesSkipsDoneDisplay.innerText = Config.config.skipCount;
+ PageElements.sponsorTimesSkipsDoneDisplay.innerText = Config.config.skipCount.toLocaleString();
PageElements.sponsorTimesSkipsDoneContainer.style.display = "unset";
}
@@ -224,14 +211,16 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
PageElements.sponsorTimeSavedDisplay.innerText = getFormattedHours(Config.config.minutesSaved);
- PageElements.sponsorTimeSavedContainer.style.display = "unset";
}
-
+
+ // Must be delayed so it only happens once loaded
+ setTimeout(() => PageElements.sponsorblockPopup.classList.remove("preload"), 250);
+
messageHandler.query({
active: true,
currentWindow: true
}, onTabs);
-
+
function onTabs(tabs) {
messageHandler.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
if (result != undefined && result.videoID) {
@@ -250,9 +239,9 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
displayNoVideo();
return;
}
-
- //load video times for this video
- const sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
+
+ //load video times for this video
+ let sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].segment.length < 2) {
startTimeChosen = true;
@@ -266,7 +255,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
showSubmitTimesIfNecessary();
}
-
+
//check if this video's sponsors are known
messageHandler.sendMessage(
tabs[0].id,
@@ -274,18 +263,19 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
infoFound
);
}
-
+
function infoFound(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
if(chrome.runtime.lastError) {
//This page doesn't have the injected content script, or at least not yet
displayNoVideo();
return;
}
-
+
//if request is undefined, then the page currently being browsed is not YouTube
if (request != undefined) {
//remove loading text
- PageElements.mainControls.style.display = "unset"
+ PageElements.mainControls.style.display = "flex";
+ PageElements.whitelistButton.classList.remove("hidden");
PageElements.loadingIndicator.style.display = "none";
if (request.found) {
@@ -309,15 +299,14 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
if (response.value) {
PageElements.whitelistChannel.style.display = "none";
PageElements.unwhitelistChannel.style.display = "unset";
-
- PageElements.downloadedSponsorMessageTimes.innerText = chrome.i18n.getMessage("channelWhitelisted");
- PageElements.downloadedSponsorMessageTimes.style.fontWeight = "bold";
+ PageElements.whitelistToggle.checked = true;
+ document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
}
});
}
);
}
-
+
function sendSponsorStartMessage() {
//the content script will get the message if a YouTube page is open
messageHandler.query({
@@ -331,10 +320,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
);
});
}
-
+
function startSponsorCallback(response) {
- const sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
-
+ let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
+
if (sponsorTimes[sponsorTimesIndex] == undefined) {
sponsorTimes[sponsorTimesIndex] = {
segment: [],
@@ -342,12 +331,12 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
UUID: null
};
}
-
+
sponsorTimes[sponsorTimesIndex].segment[startTimeChosen ? 1 : 0] = response.time;
const localStartTimeChosen = startTimeChosen;
Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
-
+
//send a message to the client script
if (localStartTimeChosen) {
messageHandler.query({
@@ -360,391 +349,102 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
);
});
}
-
+
updateStartTimeChosen();
-
+
//show submission section
PageElements.submissionSection.style.display = "unset";
-
+
showSubmitTimesIfNecessary();
}
-
+
//display the video times from the array at the top, in a different section
function displayDownloadedSponsorTimes(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
if (request.sponsorTimes != undefined) {
- //set it to the message
- if (PageElements.downloadedSponsorMessageTimes.innerText != chrome.i18n.getMessage("channelWhitelisted")) {
- PageElements.downloadedSponsorMessageTimes.innerText = getSponsorTimesMessage(request.sponsorTimes);
- }
+
+ // Sort list by start time
+ let segmentTimes = request.sponsorTimes
+ .sort((a, b) => a.segment[1] - b.segment[1])
+ .sort((a, b) => a.segment[0] - b.segment[0]);
//add them as buttons to the issue reporting container
- const container = document.getElementById("issueReporterTimeButtons");
- for (let i = 0; i < request.sponsorTimes.length; i++) {
- const sponsorTimeButton = document.createElement("button");
- sponsorTimeButton.className = "warningButton popupElement";
+ let container = document.getElementById("issueReporterTimeButtons");
+ for (let i = 0; i < segmentTimes.length; i++) {
+ let UUID = segmentTimes[i].UUID;
+
+ let sponsorTimeButton = document.createElement("button");
+ sponsorTimeButton.className = "segmentTimeButton popupElement";
+
+ let prefix = chrome.i18n.getMessage("category_" + segmentTimes[i].category) + ": ";
let extraInfo = "";
- if (request.sponsorTimes[i].hidden === SponsorHideType.Downvoted) {
+ if (segmentTimes[i].hidden === SponsorHideType.Downvoted) {
//this one is downvoted
extraInfo = " (" + chrome.i18n.getMessage("hiddenDueToDownvote") + ")";
- } else if (request.sponsorTimes[i].hidden === SponsorHideType.MinimumDuration) {
+ } else if (segmentTimes[i].hidden === SponsorHideType.MinimumDuration) {
//this one is too short
extraInfo = " (" + chrome.i18n.getMessage("hiddenDueToDuration") + ")";
}
- sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i].segment[0]) + " " + chrome.i18n.getMessage("to") + " " + getFormattedTime(request.sponsorTimes[i].segment[1]) + extraInfo;
-
- const votingButtons = document.createElement("div");
-
- const UUID = request.sponsorTimes[i].UUID;
-
+ sponsorTimeButton.innerText = prefix + getFormattedTime(segmentTimes[i].segment[0]) + " " + chrome.i18n.getMessage("to") + " " + getFormattedTime(segmentTimes[i].segment[1]) + extraInfo;
+
+ let categoryColorCircle = document.createElement("span");
+ categoryColorCircle.id = "sponsorTimesCategoryColorCircle" + UUID;
+ categoryColorCircle.style.backgroundColor = Config.config.barTypes[segmentTimes[i].category].color;
+ categoryColorCircle.classList.add("dot");
+ categoryColorCircle.classList.add("sponsorTimesCategoryColorCircle");
+
+ let votingButtons = document.createElement("div");
+ votingButtons.classList.add("votingButtons");
+
//thumbs up and down buttons
const voteButtonsContainer = document.createElement("div");
voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID;
voteButtonsContainer.setAttribute("align", "center");
voteButtonsContainer.style.display = "none"
-
- const upvoteButton = document.createElement("img");
+
+ let upvoteButton = document.createElement("img");
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
- upvoteButton.className = "voteButton popupElement";
- upvoteButton.src = chrome.extension.getURL("icons/upvote.png");
+ upvoteButton.className = "voteButton";
+ upvoteButton.src = chrome.extension.getURL("icons/thumbs_up.svg");
upvoteButton.addEventListener("click", () => vote(1, UUID));
-
- const downvoteButton = document.createElement("img");
+
+ let downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
- downvoteButton.className = "voteButton popupElement";
- downvoteButton.src = chrome.extension.getURL("icons/downvote.png");
+ downvoteButton.className = "voteButton";
+ downvoteButton.src = chrome.extension.getURL("icons/thumbs_down.svg");
downvoteButton.addEventListener("click", () => vote(0, UUID));
-
+
//add thumbs up and down buttons to the container
- voteButtonsContainer.appendChild(document.createElement("br"));
- voteButtonsContainer.appendChild(document.createElement("br"));
voteButtonsContainer.appendChild(upvoteButton);
voteButtonsContainer.appendChild(downvoteButton);
-
+
//add click listener to open up vote panel
sponsorTimeButton.addEventListener("click", function() {
- voteButtonsContainer.style.display = "unset";
+ voteButtonsContainer.style.removeProperty("display");
});
-
- container.appendChild(sponsorTimeButton);
- container.appendChild(voteButtonsContainer);
-
- //if it is not the last iteration
- if (i != request.sponsorTimes.length - 1) {
- container.appendChild(document.createElement("br"));
- container.appendChild(document.createElement("br"));
- }
- }
- }
- }
-
- //get the message that visually displays the video times
- function getSponsorTimesMessage(sponsorTimes: SponsorTime[]) {
- let sponsorTimesMessage = "";
-
- for (let i = 0; i < sponsorTimes.length; i++) {
- for (let s = 0; s < sponsorTimes[i].segment.length; s++) {
- let timeMessage = getFormattedTime(sponsorTimes[i].segment[s]);
- //if this is an end time
- if (s == 1) {
- timeMessage = " " + chrome.i18n.getMessage("to") + " " + timeMessage;
- } else if (i > 0) {
- //add commas if necessary
- timeMessage = ", " + timeMessage;
- }
-
- if (sponsorTimes[i].hidden === SponsorHideType.Downvoted) {
- //this one is downvoted
- timeMessage += " (" + chrome.i18n.getMessage("hiddenDueToDownvote") + ")";
- } else if (sponsorTimes[i].hidden === SponsorHideType.MinimumDuration) {
- //this one is too short
- timeMessage += " (" + chrome.i18n.getMessage("hiddenDueToDuration") + ")";
- }
-
- sponsorTimesMessage += timeMessage;
- }
- }
-
- return sponsorTimesMessage;
- }
-
- //get the message that visually displays the video times
- //this version is a div that contains each with delete buttons
- function getSponsorTimesMessageDiv(sponsorTimes) {
- // let sponsorTimesMessage = "";
- const sponsorTimesContainer = document.createElement("div");
- sponsorTimesContainer.id = "sponsorTimesContainer";
-
- for (let i = 0; i < sponsorTimes.length; i++) {
- const currentSponsorTimeContainer = document.createElement("div");
- currentSponsorTimeContainer.id = "sponsorTimeContainer" + i;
- currentSponsorTimeContainer.className = "sponsorTime popupElement";
- let currentSponsorTimeMessage = "";
-
- const deleteButton = document.createElement("span");
- deleteButton.id = "sponsorTimeDeleteButton" + i;
- deleteButton.innerText = "Delete";
- deleteButton.className = "mediumLink popupElement";
- const index = i;
- deleteButton.addEventListener("click", () => deleteSponsorTime(index));
-
- const previewButton = document.createElement("span");
- previewButton.id = "sponsorTimePreviewButton" + i;
- previewButton.innerText = "Preview";
- previewButton.className = "mediumLink popupElement";
- previewButton.addEventListener("click", () => previewSponsorTime(index));
-
- const editButton = document.createElement("span");
- editButton.id = "sponsorTimeEditButton" + i;
- editButton.innerText = "Edit";
- editButton.className = "mediumLink popupElement";
- editButton.addEventListener("click", () => editSponsorTime(index));
-
- for (let s = 0; s < sponsorTimes[i].length; s++) {
- let timeMessage = getFormattedTime(sponsorTimes[i][s]);
- //if this is an end time
- if (s == 1) {
- timeMessage = " " + chrome.i18n.getMessage("to") + " " + timeMessage;
- } else if (i > 0) {
- //add commas if necessary
- timeMessage = timeMessage;
- }
-
- currentSponsorTimeMessage += timeMessage;
- }
-
- currentSponsorTimeContainer.innerText = currentSponsorTimeMessage;
-
- sponsorTimesContainer.appendChild(currentSponsorTimeContainer);
- sponsorTimesContainer.appendChild(deleteButton);
-
- //only if it is a complete sponsor time
- if (sponsorTimes[i].length > 1) {
- sponsorTimesContainer.appendChild(previewButton);
- sponsorTimesContainer.appendChild(editButton);
-
- currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index));
- }
- }
-
- return sponsorTimesContainer;
- }
- function previewSponsorTime(index) {
- let skipTime = sponsorTimes[index].segment[0];
+ // Will contain request status
+ let voteStatusContainer = document.createElement("div");
+ voteStatusContainer.id = "sponsorTimesVoteStatusContainer" + UUID;
+ voteStatusContainer.classList.add("sponsorTimesVoteStatusContainer");
+ voteStatusContainer.style.display = "none";
- if (document.getElementById("startTimeMinutes" + index) != null) {
- //edit is currently open, use that time
+ let thanksForVotingText = document.createElement("div");
+ thanksForVotingText.id = "sponsorTimesThanksForVotingText" + UUID;
+ thanksForVotingText.classList.add("sponsorTimesThanksForVotingText");
+ voteStatusContainer.appendChild(thanksForVotingText);
- skipTime = getSponsorTimeEditTimes("startTime", index);
+ votingButtons.append(categoryColorCircle);
+ votingButtons.append(sponsorTimeButton);
+ votingButtons.append(voteButtonsContainer);
+ votingButtons.append(voteStatusContainer);
- //save the edit
- saveSponsorTimeEdit(index, false);
- }
-
- messageHandler.query({
- active: true,
- currentWindow: true
- }, tabs => {
- messageHandler.sendMessage(
- tabs[0].id, {
- message: "skipToTime",
- time: skipTime - 2
- }
- );
- });
- }
-
- function editSponsorTime(index) {
- if (document.getElementById("startTimeMinutes" + index) != null) {
- //already open
- return;
- }
-
- //hide submit button
- document.getElementById("submitTimesContainer").style.display = "none";
-
- const sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index);
-
- //the button to set the current time
- const startTimeNowButton = document.createElement("span");
- startTimeNowButton.id = "startTimeNowButton" + index;
- startTimeNowButton.innerText = "(Now)";
- startTimeNowButton.className = "tinyLink popupElement";
- startTimeNowButton.addEventListener("click", () => setEditTimeToCurrentTime("startTime", index));
-
- //get sponsor time minutes and seconds boxes
- const startTimeMinutes = document.createElement("input");
- startTimeMinutes.id = "startTimeMinutes" + index;
- startTimeMinutes.className = "sponsorTime popupElement";
- startTimeMinutes.type = "text";
- startTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index].segment[0]));
- startTimeMinutes.style.width = "45px";
-
- const startTimeSeconds = document.createElement("input");
- startTimeSeconds.id = "startTimeSeconds" + index;
- startTimeSeconds.className = "sponsorTime popupElement";
- startTimeSeconds.type = "text";
- startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index].segment[0]);
- startTimeSeconds.style.width = "60px";
-
- const endTimeMinutes = document.createElement("input");
- endTimeMinutes.id = "endTimeMinutes" + index;
- endTimeMinutes.className = "sponsorTime popupElement";
- endTimeMinutes.type = "text";
- endTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index].segment[1]));
- endTimeMinutes.style.width = "45px";
-
- const endTimeSeconds = document.createElement("input");
- endTimeSeconds.id = "endTimeSeconds" + index;
- endTimeSeconds.className = "sponsorTime popupElement";
- endTimeSeconds.type = "text";
- endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index].segment[1]);
- endTimeSeconds.style.width = "60px";
-
- //the button to set the current time
- const endTimeNowButton = document.createElement("span");
- endTimeNowButton.id = "endTimeNowButton" + index;
- endTimeNowButton.innerText = "(Now)";
- endTimeNowButton.className = "tinyLink popupElement";
- endTimeNowButton.addEventListener("click", () => setEditTimeToCurrentTime("endTime", index));
-
- const colonText = document.createElement("span");
- colonText.innerText = ":";
-
- const toText = document.createElement("span");
- toText.innerText = " " + chrome.i18n.getMessage("to") + " ";
-
- //remove all children to replace
- while (sponsorTimeContainer.firstChild) {
- sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild);
+ container.appendChild(votingButtons);
+ }
}
-
- sponsorTimeContainer.appendChild(startTimeNowButton);
- sponsorTimeContainer.appendChild(startTimeMinutes);
- sponsorTimeContainer.appendChild(colonText);
- sponsorTimeContainer.appendChild(startTimeSeconds);
- sponsorTimeContainer.appendChild(toText);
- sponsorTimeContainer.appendChild(endTimeMinutes);
- sponsorTimeContainer.appendChild(colonText);
- sponsorTimeContainer.appendChild(endTimeSeconds);
- sponsorTimeContainer.appendChild(endTimeNowButton);
-
- //add save button and remove edit button
- const saveButton = document.createElement("span");
- saveButton.id = "sponsorTimeSaveButton" + index;
- saveButton.innerText = "Save";
- saveButton.className = "mediumLink popupElement";
- saveButton.addEventListener("click", () => saveSponsorTimeEdit(index));
-
- const editButton = document.getElementById("sponsorTimeEditButton" + index);
- const sponsorTimesContainer = document.getElementById("sponsorTimesContainer");
-
- sponsorTimesContainer.replaceChild(saveButton, editButton);
- }
-
- function setEditTimeToCurrentTime(idStartName, index) {
- messageHandler.query({
- active: true,
- currentWindow: true
- }, tabs => {
- messageHandler.sendMessage(
- tabs[0].id,
- {message: "getCurrentTime"},
- function (response) {
- const minutes = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Minutes" + index);
- const seconds = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Seconds" + index);
-
- minutes.value = String(getTimeInMinutes(response.currentTime));
- seconds.value = getTimeInFormattedSeconds(response.currentTime);
- });
- });
}
- //id start name is whether it is the startTime or endTime
- //gives back the time in seconds
- function getSponsorTimeEditTimes(idStartName, index): number {
- const minutes = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Minutes" + index);
- const seconds = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Seconds" + index);
-
- return parseInt(minutes.value) * 60 + parseFloat(seconds.value);
- }
-
- function saveSponsorTimeEdit(index, closeEditMode = true) {
- sponsorTimes[index].segment[0] = getSponsorTimeEditTimes("startTime", index);
- sponsorTimes[index].segment[1] = getSponsorTimeEditTimes("endTime", index);
-
- //save this
- Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
-
- messageHandler.query({
- active: true,
- currentWindow: true
- }, tabs => {
- messageHandler.sendMessage(
- tabs[0].id,
- {message: "sponsorDataChanged"}
- );
- });
-
- if (closeEditMode) {
- showSubmitTimesIfNecessary();
- }
- }
-
- //deletes the sponsor time submitted at an index
- function deleteSponsorTime(index) {
- //if it is not a complete sponsor time
- if (sponsorTimes[index].segment.length < 2) {
- messageHandler.query({
- active: true,
- currentWindow: true
- }, function(tabs) {
- messageHandler.sendMessage(tabs[0].id, {
- message: "changeStartSponsorButton",
- showStartSponsor: true,
- uploadButtonVisible: false
- });
- });
-
- resetStartTimeChosen();
- }
-
- sponsorTimes.splice(index, 1);
-
- //save this
- Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
-
- //if they are all removed
- if (sponsorTimes.length == 0) {
- //update chrome tab
- messageHandler.query({
- active: true,
- currentWindow: true
- }, function(tabs) {
- messageHandler.sendMessage(tabs[0].id, {
- message: "changeStartSponsorButton",
- showStartSponsor: true,
- uploadButtonVisible: false
- });
- });
-
- //hide submission section
- document.getElementById("submissionSection").style.display = "none";
- }
-
- messageHandler.query({
- active: true,
- currentWindow: true
- }, tabs => {
- messageHandler.sendMessage(
- tabs[0].id,
- {message: "sponsorDataChanged"}
- );
- });
- }
-
function submitTimes() {
if (sponsorTimes.length > 0) {
messageHandler.query({
@@ -786,7 +486,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//check if an end time has been specified for the latest sponsor time
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].segment.length > 1) {
//show submit times button
- document.getElementById("submitTimesContainer").style.display = "unset";
+ document.getElementById("submitTimesContainer").style.display = "flex";
} else {
//hide submit times button
document.getElementById("submitTimesContainer").style.display = "none";
@@ -798,29 +498,24 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
chrome.runtime.sendMessage({"message": "openConfig"});
}
+ function openHelp() {
+ chrome.runtime.sendMessage({"message": "openHelp"});
+ }
+
//make the options username setting option visible
function setUsernameButton() {
- //get username from the server
- utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, function (response) {
- if (response.status == 200) {
- PageElements.usernameInput.value = JSON.parse(response.responseText).userName;
+ PageElements.usernameInput.value = PageElements.usernameValue.innerText;
- PageElements.submitUsername.style.display = "unset";
- PageElements.usernameInput.style.display = "unset";
+ PageElements.submitUsername.style.display = "unset";
+ PageElements.usernameInput.style.display = "unset";
- PageElements.setUsernameContainer.style.display = "none";
- PageElements.setUsername.style.display = "unset";
- PageElements
- PageElements.setUsernameStatusContainer.style.display = "none";
- } else {
- PageElements.setUsername.style.display = "unset";
- PageElements.submitUsername.style.display = "none";
- PageElements.usernameInput.style.display = "none";
+ PageElements.setUsernameContainer.style.display = "none";
+ PageElements.setUsername.style.display = "flex";
+ PageElements.setUsername.classList.add("SBExpanded");
+
+ PageElements.setUsernameStatusContainer.style.display = "none";
- PageElements.setUsernameStatusContainer.style.display = "unset";
- PageElements.setUsernameStatus.innerText = utils.getErrorMessage(response.status);
- }
- });
+ PageElements.sponsorTimesContributionsContainer.classList.add("hidden");
}
//submit the new username
@@ -829,15 +524,20 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.setUsernameStatusContainer.style.display = "unset";
PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("Loading");
- //get the userID
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (response) {
if (response.status == 200) {
//submitted
PageElements.submitUsername.style.display = "none";
PageElements.usernameInput.style.display = "none";
- PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("success");
- } else {
+ PageElements.setUsernameContainer.style.removeProperty("display");
+ PageElements.setUsername.classList.remove("SBExpanded");
+ PageElements.usernameValue.innerText = PageElements.usernameInput.value;
+
+ PageElements.setUsernameStatusContainer.style.display = "none";
+
+ PageElements.sponsorTimesContributionsContainer.classList.remove("hidden");
+ } else {
PageElements.setUsernameStatus.innerText = utils.getErrorMessage(response.status);
}
});
@@ -852,24 +552,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
document.getElementById("loadingIndicator").innerText = chrome.i18n.getMessage("noVideoID");
}
- function reportAnIssue() {
- document.getElementById("issueReporterContainer").style.display = "unset";
- PageElements.reportAnIssue.style.display = "none";
- }
-
function addVoteMessage(message, UUID) {
- const container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
- //remove all children
- while (container.firstChild) {
- container.removeChild(container.firstChild);
- }
-
- const thanksForVotingText = document.createElement("h2");
+ let voteButtonsContainer = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
+ voteButtonsContainer.style.display = "none";
+
+ let voteStatusContainer = document.getElementById("sponsorTimesVoteStatusContainer" + UUID);
+ voteStatusContainer.style.removeProperty("display");
+
+ let thanksForVotingText = document.getElementById("sponsorTimesThanksForVotingText" + UUID);
thanksForVotingText.innerText = message;
- //there are already breaks there
- thanksForVotingText.style.marginBottom = "0px";
-
- container.appendChild(thanksForVotingText);
}
function vote(type, UUID) {
@@ -894,11 +585,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
});
}
- function hideDiscordButton() {
- Config.config.hideDiscordLink = true;
- PageElements.discordButtonContainer.style.display = "none";
- }
-
//converts time in seconds to minutes:seconds
function getFormattedTime(seconds) {
const minutes = Math.floor(seconds / 60);
@@ -942,10 +628,9 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//change button
PageElements.whitelistChannel.style.display = "none";
PageElements.unwhitelistChannel.style.display = "unset";
- if (!Config.config.forceChannelCheck) PageElements.whitelistForceCheck.style.display = "unset";
+ document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
- PageElements.downloadedSponsorMessageTimes.innerText = chrome.i18n.getMessage("channelWhitelisted");
- PageElements.downloadedSponsorMessageTimes.style.fontWeight = "bold";
+ if (!Config.config.forceChannelCheck) PageElements.whitelistForceCheck.classList.remove("hidden");
//save this
Config.config.whitelistedChannels = whitelistedChannels;
@@ -990,9 +675,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//change button
PageElements.whitelistChannel.style.display = "unset";
PageElements.unwhitelistChannel.style.display = "none";
-
- PageElements.downloadedSponsorMessageTimes.innerText = "";
- PageElements.downloadedSponsorMessageTimes.style.fontWeight = "unset";
+ document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
//save this
Config.config.whitelistedChannels = whitelistedChannels;
@@ -1067,10 +750,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
if (chrome.tabs != undefined) {
- //add the width restriction (because Firefox)
- const link = <HTMLLinkElement> document.getElementById("sponsorBlockStyleSheet");
- (<CSSStyleSheet> link.sheet).insertRule('.popupBody { width: 325 }', 0);
-
//this means it is actually opened in the popup
runThePopup();
}