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("Username")}: {/* loading/errors */} {usernameSubmissionStatus}
{username}
{chrome.i18n.getMessage("Submissions")}:
{props.submissionCount}
{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 ( ); } /** * 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); }