import * as React from "react"; import { createRoot, Root } from 'react-dom/client'; import NoticeComponent from "../components/NoticeComponent"; import Utils from "../utils"; const utils = new Utils(); import { ContentContainer } from "../types"; import NoticeTextSelectionComponent from "../components/NoticeTextSectionComponent"; import { ButtonListener } from "../../maze-utils/src/components/component-types"; export interface TextBox { icon: string; text: string; } export interface NoticeOptions { title: string; referenceNode?: HTMLElement; textBoxes?: TextBox[]; buttons?: ButtonListener[]; fadeIn?: boolean; timed?: boolean; style?: React.CSSProperties; extraClass?: string; maxCountdownTime?: () => number; dontPauseCountdown?: boolean; hideLogo?: boolean; hideRightInfo?: boolean; } export default class GenericNotice { // Contains functions and variables from the content script needed by the skip notice contentContainer: ContentContainer; noticeElement: HTMLDivElement; noticeRef: React.MutableRefObject; idSuffix: string; root: Root; constructor(contentContainer: ContentContainer, idSuffix: string, options: NoticeOptions) { this.noticeRef = React.createRef(); this.idSuffix = idSuffix; this.contentContainer = contentContainer; const referenceNode = options.referenceNode ?? utils.findReferenceNode(); this.noticeElement = document.createElement("div"); this.noticeElement.className = "sponsorSkipNoticeContainer"; this.noticeElement.id = "sponsorSkipNoticeContainer" + idSuffix; referenceNode.prepend(this.noticeElement); this.root = createRoot(this.noticeElement); this.update(options); } update(options: NoticeOptions): void { this.root.render( this.close()} > {options.textBoxes?.length > 0 ? {this.getMessageBoxes(this.idSuffix, options.textBoxes)} : null} {!options.hideLogo ? <> {this.getButtons(options.buttons)} : null} ); } getMessageBoxes(idSuffix: string, textBoxes: TextBox[]): JSX.Element[] { if (textBoxes) { const result = []; for (let i = 0; i < textBoxes.length; i++) { result.push( ) } return result; } else { return null; } } getButtons(buttons?: ButtonListener[]): JSX.Element[] { if (buttons) { const result: JSX.Element[] = []; for (const button of buttons) { result.push( ) } return result; } else { return null; } } close(): void { this.root.unmount(); this.noticeElement.remove(); } }