import * as React from "react"; import { getHash } from "../../maze-utils/src/hash"; import { getErrorMessage } from "../../maze-utils/src/formating"; import Config from "../config"; import { asyncRequestToServer } from "../utils/requests"; import PencilIcon from "../svg-icons/pencilIcon"; import ClipboardIcon from "../svg-icons/clipboardIcon"; import CheckIcon from "../svg-icons/checkIcon"; import { showDonationLink } from "../utils/configUtils"; export const YourWorkComponent = () => { const [isSettingUsername, setIsSettingUsername] = React.useState(false); const [username, setUsername] = React.useState(""); const [newUsername, setNewUsername] = React.useState(""); const [usernameSubmissionStatus, setUsernameSubmissionStatus] = React.useState(""); const [submissionCount, setSubmissionCount] = React.useState(""); const [viewCount, setViewCount] = React.useState(0); const [minutesSaved, setMinutesSaved] = React.useState(0); const [showDonateMessage, setShowDonateMessage] = React.useState(false); React.useEffect(() => { (async () => { const values = ["userName", "viewCount", "minutesSaved", "vip", "permissions", "segmentCount"]; const result = await asyncRequestToServer("GET", "/api/userInfo", { publicUserID: await getHash(Config.config!.userID!), values }); if (result.ok) { const userInfo = JSON.parse(result.responseText); setUsername(userInfo.userName); setSubmissionCount(Math.max(Config.config.sponsorTimesContributed ?? 0, userInfo.segmentCount).toLocaleString()); setViewCount(userInfo.viewCount); setMinutesSaved(userInfo.minutesSaved); Config.config!.isVip = userInfo.vip; Config.config!.permissions = userInfo.permissions; setShowDonateMessage(Config.config.showDonationLink && Config.config.donateClicked <= 0 && Config.config.showPopupDonationCount < 5 && viewCount < 50000 && !Config.config.isVip && Config.config.skipCount > 10 && showDonationLink()); } })(); }, []); return (

{chrome.i18n.getMessage("yourWork")}

{/* Username */}

{chrome.i18n.getMessage("Username")}: {/* loading/errors */} {usernameSubmissionStatus}

{username}

{ setNewUsername(e.target.value); }}/>
{showDonateMessage && { setShowDonateMessage(false); Config.config.showPopupDonationCount = 100; }} />}
); }; function SubmissionCounts(props: { isSettingUsername: boolean; submissionCount: string }): JSX.Element { return <>

{chrome.i18n.getMessage("Submissions")}:

{props.submissionCount}

} function TimeSavedMessage({ viewCount, minutesSaved }: { viewCount: number; minutesSaved: number }): JSX.Element { return ( <> { viewCount > 0 &&

{chrome.i18n.getMessage("savedPeopleFrom")} {viewCount.toLocaleString()}{" "} {viewCount !== 1 ? chrome.i18n.getMessage("Segments") : chrome.i18n.getMessage("Segment")}
{"("}{" "} {getFormattedHours(minutesSaved)}{" "} {minutesSaved !== 1 ? chrome.i18n.getMessage("minsLower") : chrome.i18n.getMessage("minLower")}{" "} {chrome.i18n.getMessage("youHaveSavedTimeEnd")}{" "} {" )"}

}

{chrome.i18n.getMessage("youHaveSkipped")} {Config.config.skipCount}{" "} {Config.config.skipCount > 1 ? chrome.i18n.getMessage("Segments") : chrome.i18n.getMessage("Segment")}{" "} {"("}{" "} {Config.config.minutesSaved}{" "} {Config.config.minutesSaved !== 1 ? chrome.i18n.getMessage("minsLower") : chrome.i18n.getMessage("minLower")}{" "} {")"}

); } function DonateMessage(props: { onClose: () => void }): JSX.Element { return (
Heart icon { Config.config.donateClicked = Config.config.donateClicked + 1; }}> {chrome.i18n.getMessage("considerDonating")} {chrome.i18n.getMessage("closeIcon")}
); } /** * Converts time in minutes to 2d 5h 25.1 * If less than 1 hour, just returns minutes * * @param {float} minutes * @returns {string} */ function getFormattedHours(minutes) { minutes = Math.round(minutes * 10) / 10; const years = Math.floor(minutes / 525600); // Assumes 365.0 days in a year const days = Math.floor(minutes / 1440) % 365; const hours = Math.floor(minutes / 60) % 24; return (years > 0 ? years + chrome.i18n.getMessage("yearAbbreviation") + " " : "") + (days > 0 ? days + chrome.i18n.getMessage("dayAbbreviation") + " " : "") + (hours > 0 ? hours + chrome.i18n.getMessage("hourAbbreviation") + " " : "") + (minutes % 60).toFixed(1); }