From d699dd4c0c3fc9cb1cf8016601127ddd6039e2cc Mon Sep 17 00:00:00 2001 From: orfelorfel23 Date: Fri, 28 Aug 2026 22:11:58 +0200 Subject: [PATCH] feat: add details and countdown for MiniMax and Antigravity --- public/app.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/public/app.js b/public/app.js index 19fbcb9..251a1c3 100644 --- a/public/app.js +++ b/public/app.js @@ -64,10 +64,51 @@ function updateRow(providerId, quota) { // Detail text if (quota.provider.toLowerCase() === 'minimax' && quota.meta) { - const reset5h = new Date(quota.meta.intervalReset).toLocaleTimeString(); - statusText.innerHTML = `5h: ${quota.meta.intervalUsed}% (Resets: ${reset5h})`; + const { intervalUsed, weeklyUsed, intervalReset, weeklyReset } = quota.meta; + statusText.innerText = `${Math.round(quota.used)}% / 100%`; + + const detailsEl = document.getElementById(`details-minimax`); + if (detailsEl) { + const parseDate = (val) => { + if (!val) return '--'; + // If it's a number and less than 10 billion, it's likely seconds, multiply by 1000 + const ts = (typeof val === 'number' && val < 9999999999) ? val * 1000 : val; + return new Date(ts).toLocaleString(); + }; + + const reset5hStr = parseDate(intervalReset); + const resetWeeklyStr = parseDate(weeklyReset); + + detailsEl.innerHTML = ` +
5h Limit: ${intervalUsed}% verbraucht
+
Weekly Limit: ${weeklyUsed}% verbraucht
+
5h Reset in: --:--:--
+
+ Weekly Reset: ${resetWeeklyStr} +
+ `; + + const targetTs = (typeof intervalReset === 'number' && intervalReset < 9999999999) ? intervalReset * 1000 : intervalReset; + if (targetTs) startMinimaxCountdown(targetTs); + } } else if (quota.provider.toLowerCase() === 'antigravity' && quota.meta) { - statusText.innerHTML = `5h: ${quota.meta.intervalUsed}% (Resets: ${quota.meta.intervalResetStr})`; + const { intervalUsed, weeklyUsed, intervalResetStr, weeklyResetStr } = quota.meta; + statusText.innerText = `${Math.round(quota.used)}% / 100%`; + + const detailsEl = document.getElementById(`details-antigravity`); + if (detailsEl) { + const reset5h = intervalResetStr && intervalResetStr !== 'Unknown' ? new Date(intervalResetStr).toLocaleString() : '--'; + const resetWeekly = weeklyResetStr && weeklyResetStr !== 'Unknown' ? new Date(weeklyResetStr).toLocaleString() : '--'; + + detailsEl.innerHTML = ` +
5h Limit: ${intervalUsed}% verbraucht
+
Weekly Limit: ${weeklyUsed}% verbraucht
+
5h Reset: ${reset5h}
+
+ Weekly Reset: ${resetWeekly} +
+ `; + } } else if (quota.provider.toLowerCase() === 'poe' && quota.meta) { statusText.innerText = `${(quota.used).toLocaleString()} / ${(quota.total).toLocaleString()}`; @@ -127,6 +168,35 @@ function startPoeCountdown() { poeCountdownInterval = setInterval(updateCountdown, 1000); } +let minimaxCountdownInterval = null; +function startMinimaxCountdown(targetTs) { + if (minimaxCountdownInterval) clearInterval(minimaxCountdownInterval); + + const targetDate = new Date(targetTs); + + const updateCountdown = () => { + const now = new Date(); + let diffMs = targetDate.getTime() - now.getTime(); + + if (diffMs < 0) { + // Already passed, show 00:00:00 or let the UI handle refresh + diffMs = 0; + } + + const h = Math.floor(diffMs / (1000 * 60 * 60)); + const m = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60)); + const s = Math.floor((diffMs % (1000 * 60)) / 1000); + + const el = document.getElementById('minimax-countdown'); + if (el) { + el.innerText = `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`; + } + }; + + updateCountdown(); + minimaxCountdownInterval = setInterval(updateCountdown, 1000); +} + async function fetchHistory() { try { const response = await fetch('/api/history');