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');