mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-09 13:07:05 +03:00
293 lines
11 KiB
TypeScript
293 lines
11 KiB
TypeScript
import * as React from "react";
|
|
import Config from "../config"
|
|
|
|
import NoticeComponent from "./NoticeComponent";
|
|
|
|
export interface SkipNoticeProps {
|
|
UUID: string;
|
|
manualSkip: boolean;
|
|
// Contains functions and variables from the content script needed by the skip notice
|
|
contentContainer: () => any;
|
|
}
|
|
|
|
export interface SkipNoticeState {
|
|
noticeTitle: string,
|
|
|
|
countdownTime: number,
|
|
maxCountdownTime: () => number;
|
|
countdownText: string,
|
|
|
|
unskipText: string,
|
|
unskipCallback: () => void
|
|
}
|
|
|
|
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
|
UUID: string;
|
|
manualSkip: boolean;
|
|
// Contains functions and variables from the content script needed by the skip notice
|
|
contentContainer: () => any;
|
|
|
|
amountOfPreviousNotices: number;
|
|
|
|
idSuffix: any;
|
|
|
|
noticeRef: React.MutableRefObject<NoticeComponent>;
|
|
|
|
constructor(props: SkipNoticeProps) {
|
|
super(props);
|
|
this.noticeRef = React.createRef();
|
|
|
|
this.UUID = props.UUID;
|
|
this.manualSkip = props.manualSkip;
|
|
this.contentContainer = props.contentContainer;
|
|
|
|
let noticeTitle = chrome.i18n.getMessage("noticeTitle");
|
|
|
|
if (this.manualSkip) {
|
|
noticeTitle = chrome.i18n.getMessage("noticeTitleNotSkipped");
|
|
}
|
|
|
|
//add notice
|
|
this.amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
|
|
|
//this is the suffix added at the end of every id
|
|
this.idSuffix = this.UUID + this.amountOfPreviousNotices;
|
|
|
|
if (this.amountOfPreviousNotices > 0) {
|
|
//another notice exists
|
|
|
|
let previousNotice = document.getElementsByClassName("sponsorSkipNotice")[0];
|
|
previousNotice.classList.add("secondSkipNotice")
|
|
}
|
|
|
|
// Setup state
|
|
this.state = {
|
|
noticeTitle,
|
|
|
|
//the countdown until this notice closes
|
|
maxCountdownTime: () => 4,
|
|
countdownTime: 4,
|
|
countdownText: null,
|
|
|
|
unskipText: chrome.i18n.getMessage("unskip"),
|
|
unskipCallback: this.unskip.bind(this)
|
|
}
|
|
}
|
|
|
|
render() {
|
|
let noticeStyle: React.CSSProperties = {
|
|
zIndex: 50 + this.amountOfPreviousNotices
|
|
}
|
|
if (this.contentContainer().onMobileYouTube) {
|
|
noticeStyle.bottom = "4em";
|
|
noticeStyle.transform = "scale(0.8) translate(10%, 10%)";
|
|
}
|
|
|
|
return (
|
|
<NoticeComponent noticeTitle={this.state.noticeTitle}
|
|
amountOfPreviousNotices={this.amountOfPreviousNotices}
|
|
idSuffix={this.idSuffix}
|
|
maxCountdownTime={this.state.maxCountdownTime}
|
|
ref={this.noticeRef}>
|
|
|
|
{/* Spacer */}
|
|
<tr id={"sponsorSkipNoticeSpacer" + this.idSuffix}
|
|
className="sponsorBlockSpacer">
|
|
</tr>
|
|
|
|
{/* Last Row */}
|
|
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
|
|
|
|
{/* Vote Button Container */}
|
|
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
|
className="sponsorTimesVoteButtonsContainer">
|
|
|
|
{/* Report Text */}
|
|
<span id={"sponsorTimesReportText" + this.idSuffix}
|
|
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
|
|
title={chrome.i18n.getMessage("reportButtonInfo")}
|
|
style={{marginRight: "5px"}}>
|
|
|
|
{chrome.i18n.getMessage("reportButtonTitle")}
|
|
</span>
|
|
|
|
{/* Report Button */}
|
|
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
|
className="sponsorSkipObject voteButton"
|
|
src={chrome.extension.getURL("icons/report.png")}
|
|
title={chrome.i18n.getMessage("reportButtonInfo")}
|
|
onClick={() => this.contentContainer().vote(0, this.UUID, this)}>
|
|
|
|
</img>
|
|
|
|
</td>
|
|
|
|
{/* Unskip Button */}
|
|
<td className="sponsorSkipNoticeUnskipSection">
|
|
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
|
className="sponsorSkipObject sponsorSkipNoticeButton"
|
|
style={{marginLeft: "4px"}}
|
|
onClick={this.state.unskipCallback}>
|
|
|
|
{this.state.unskipText}
|
|
</button>
|
|
</td>
|
|
|
|
{/* Never show button if manualSkip is disabled */}
|
|
{this.manualSkip ? "" :
|
|
<td className="sponsorSkipNoticeRightSection">
|
|
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
|
onClick={this.contentContainer().dontShowNoticeAgain}>
|
|
|
|
{chrome.i18n.getMessage("Hide")}
|
|
</button>
|
|
</td>
|
|
}
|
|
</tr>
|
|
|
|
</NoticeComponent>
|
|
);
|
|
}
|
|
|
|
unskip() {
|
|
this.contentContainer().unskipSponsorTime(this.UUID);
|
|
|
|
this.unskippedMode(chrome.i18n.getMessage("reskip"));
|
|
}
|
|
|
|
/** Sets up notice to be not skipped yet */
|
|
unskippedMode(buttonText) {
|
|
//setup new callback
|
|
this.setState({
|
|
unskipText: buttonText,
|
|
unskipCallback: this.reskip.bind(this)
|
|
});
|
|
|
|
let maxCountdownTime = function() {
|
|
let sponsorTime = this.contentContainer().sponsorTimes[this.contentContainer().UUIDs.indexOf(this.UUID)];
|
|
let duration = Math.round(sponsorTime[1] - this.contentContainer().v.currentTime);
|
|
|
|
return Math.max(duration, 4);
|
|
}.bind(this);
|
|
|
|
//reset countdown
|
|
this.setState({
|
|
//change max duration to however much of the sponsor is left
|
|
maxCountdownTime: maxCountdownTime,
|
|
|
|
countdownTime: maxCountdownTime()
|
|
}, () => {
|
|
this.noticeRef.current.resetCountdown();
|
|
});
|
|
}
|
|
|
|
reskip() {
|
|
this.contentContainer().reskipSponsorTime(this.UUID);
|
|
|
|
//reset countdown
|
|
this.setState({
|
|
unskipText: chrome.i18n.getMessage("unskip"),
|
|
unskipCallback: this.unskip.bind(this),
|
|
|
|
maxCountdownTime: () => 4,
|
|
countdownTime: 4
|
|
});
|
|
|
|
// See if the title should be changed
|
|
if (this.manualSkip) {
|
|
this.setState({
|
|
noticeTitle: chrome.i18n.getMessage("noticeTitle")
|
|
});
|
|
|
|
if(Config.config.autoUpvote) this.contentContainer().vote(1, this.UUID);
|
|
}
|
|
}
|
|
|
|
afterDownvote() {
|
|
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
|
this.addNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
|
|
|
//remove this sponsor from the sponsors looked up
|
|
//find which one it is
|
|
for (let i = 0; i < this.contentContainer().sponsorTimes.length; i++) {
|
|
if (this.contentContainer().UUIDs[i] == this.UUID) {
|
|
//this one is the one to hide
|
|
|
|
//add this as a hidden sponsorTime
|
|
this.contentContainer().hiddenSponsorTimes.push(i);
|
|
|
|
this.contentContainer().updatePreviewBar();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
addNoticeInfoMessage(message: string, message2: string = "") {
|
|
let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix);
|
|
if (previousInfoMessage != null) {
|
|
//remove it
|
|
document.getElementById("sponsorSkipNotice" + this.idSuffix).removeChild(previousInfoMessage);
|
|
}
|
|
|
|
let previousInfoMessage2 = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix + "2");
|
|
if (previousInfoMessage2 != null) {
|
|
//remove it
|
|
document.getElementById("sponsorSkipNotice" + this.idSuffix).removeChild(previousInfoMessage2);
|
|
}
|
|
|
|
//add info
|
|
let thanksForVotingText = document.createElement("p");
|
|
thanksForVotingText.id = "sponsorTimesInfoMessage" + this.idSuffix;
|
|
thanksForVotingText.className = "sponsorTimesInfoMessage";
|
|
thanksForVotingText.innerText = message;
|
|
|
|
//add element to div
|
|
document.querySelector("#sponsorSkipNotice" + this.idSuffix + " > tbody").insertBefore(thanksForVotingText, document.getElementById("sponsorSkipNoticeSpacer" + this.idSuffix));
|
|
|
|
if (message2 !== undefined) {
|
|
let thanksForVotingText2 = document.createElement("p");
|
|
thanksForVotingText2.id = "sponsorTimesInfoMessage" + this.idSuffix + "2";
|
|
thanksForVotingText2.className = "sponsorTimesInfoMessage";
|
|
thanksForVotingText2.innerText = message2;
|
|
|
|
//add element to div
|
|
document.querySelector("#sponsorSkipNotice" + this.idSuffix + " > tbody").insertBefore(thanksForVotingText2, document.getElementById("sponsorSkipNoticeSpacer" + this.idSuffix));
|
|
}
|
|
}
|
|
|
|
addVoteButtonInfo(message) {
|
|
this.resetVoteButtonInfo();
|
|
|
|
//hide report button and text for it
|
|
let downvoteButton = document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix);
|
|
if (downvoteButton != null) {
|
|
downvoteButton.style.display = "none";
|
|
}
|
|
let downvoteButtonText = document.getElementById("sponsorTimesReportText" + this.idSuffix);
|
|
if (downvoteButtonText != null) {
|
|
downvoteButtonText.style.display = "none";
|
|
}
|
|
|
|
//add info
|
|
let thanksForVotingText = document.createElement("td");
|
|
thanksForVotingText.id = "sponsorTimesVoteButtonInfoMessage" + this.idSuffix;
|
|
thanksForVotingText.className = "sponsorTimesInfoMessage sponsorTimesVoteButtonMessage";
|
|
thanksForVotingText.innerText = message;
|
|
|
|
//add element to div
|
|
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).prepend(thanksForVotingText);
|
|
}
|
|
|
|
resetVoteButtonInfo() {
|
|
let previousInfoMessage = document.getElementById("sponsorTimesVoteButtonInfoMessage" + this.idSuffix);
|
|
if (previousInfoMessage != null) {
|
|
//remove it
|
|
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).removeChild(previousInfoMessage);
|
|
}
|
|
|
|
//show button again
|
|
document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix).style.removeProperty("display");
|
|
}
|
|
}
|
|
|
|
export default SkipNoticeComponent; |