import * as React from "react"; import Icon from "./icon"; import moment from "moment"; import {Popup} from "./popup"; import Alert from "./alert"; import {useEffect, useState} from "react"; import ReactTooltip from 'react-tooltip'; export function TokenList(props) { let api = props.api; let selectedFiles = props.selectedFiles || []; let directories = props.directories || {}; let [tokens, setTokens] = useState(null); let [alerts, setAlerts] = useState([]); let [hideRevoked, setHideRevoked] = useState(true); let [popup, setPopup] = useState({ tokenType: "download", maxFiles: 0, maxSize: 0, extensions: "", durability: 24 * 60 * 2, visible: false, directory: 0 }); useEffect(() => { setTimeout(() => { if (tokens) { let hasChanged = false; let newTokens = tokens.slice(); for (let token of newTokens) { if (token.tooltip) hasChanged = true; token.tooltip = false; } if (hasChanged) setTokens(newTokens); } }, 1500); }, [tokens]); function fetchTokens() { api.listTokens().then((res) => { if (res.success) { setTokens(res.tokens); } else { pushAlert(res, "Error fetching tokens"); setTokens([]); } }); } let rows = []; if (tokens === null) { fetchTokens(); } else { for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; const validUntil = token.valid_until; const revoked = validUntil !== null && moment(validUntil).isSameOrBefore(new Date()); if (revoked && hideRevoked) { continue; } const timeStr = (validUntil === null ? "Forever" : moment(validUntil).format("Do MMM YYYY, HH:mm")); const tooltipPropsRevoke = (revoked ? {} : { "data-tip": "Revoke", "data-place": "bottom", "data-type": "error", "data-effect": "solid", "data-for": "tooltip-token-" + token.uid, }); const tooltipPropsCopy = (revoked ? {} : { "data-tip": "", "data-place": "bottom", "data-type": "info", "data-effect": "solid", "data-for": "tooltip-token-" + token.uid, }); rows.push( {token.token} {token.type} {timeStr} { revoked ? <> : { if (x === "Revoke") return x; return (!!token.tooltip ? "Coped successfully!" : "Copy to Clipboard"); }} /> } (revoked ? null : onRevokeToken(token.token))} disabled={revoked} {...tooltipPropsRevoke} /> (revoked ? null : onCopyToken(i))} disabled={revoked} {...tooltipPropsCopy} /> ); } } let alertElements = []; for (let i = 0; i < alerts.length; i++) { const alert = alerts[i]; alertElements.push( removeAlert(i)}/> ); } let options = []; for (const [uid, dir] of Object.entries(directories)) { options.push( ); } return <>

Tokens

setHideRevoked(e.target.checked)}/>
{rows.length > 0 ? rows : }
Token Type Valid Until
No active tokens connected with this account
{alertElements}
onPopupChange(e, "durability")}/>
{popup.tokenType === "upload" ? <>
Upload Restrictions:
onPopupChange(e, "maxFiles")}/>
onPopupChange(e, "maxSize")}/>
onPopupChange(e, "extensions")}/>
: <> }
; function pushAlert(res, title) { let newAlerts = alerts.slice(); newAlerts.push({type: "danger", message: res.msg, title: title}); setAlerts(newAlerts); } function removeAlert(i) { if (i >= 0 && i < alerts.length) { let newAlerts = alerts.slice(); newAlerts.splice(i, 1); setAlerts(newAlerts); } } function onRevokeToken(token) { api.revokeToken(token).then((res) => { if (res.success) { let newTokens = tokens.slice(); for (const tokenObj of newTokens) { if (tokenObj.token === token) { tokenObj.valid_until = moment(); break; } } setTokens(newTokens); } else { pushAlert(res, "Error revoking token"); } }); } function onPopupOpen() { setPopup({...popup, visible: true}); } function onPopupClose() { setPopup({...popup, visible: false}); } function onPopupChange(e, key) { setPopup({...popup, [key]: e.target.value}); } function onPopupButton(btn) { if (btn === "Ok") { let durability = popup.durability; let validUntil = (durability === 0 ? null : moment().add(durability, "hours").format("YYYY-MM-DD HH:mm:ss")); if (popup.tokenType === "download") { api.createDownloadToken(durability, selectedFiles).then((res) => { if (!res.success) { pushAlert(res, "Error creating token"); } else { let newTokens = tokens.slice(); newTokens.push({token: res.token, valid_until: validUntil, type: "download"}); setTokens(newTokens); } }); } else if (popup.tokenType === "upload") { let parentId = popup.directory === 0 ? null : popup.directory; let maxSize = Math.round(popup.maxSize * 1024 * 1024); api.createUploadToken(durability, parentId, popup.maxFiles, maxSize, popup.extensions).then((res) => { if (!res.success) { pushAlert(res, "Error creating token"); } else { let newTokens = tokens.slice(); newTokens.push({uid: res.tokenId, token: res.token, valid_until: validUntil, type: "upload"}); setTokens(newTokens); } }); } } onPopupClose(); } function onCopyToken(index) { let newTokens = tokens.slice(); let token = newTokens[index].token; let url = window.location.href; if (!url.endsWith("/")) url += "/"; url += token; navigator.clipboard.writeText(url); newTokens[index].tooltip = true; setTokens(newTokens); } }