codexmobile-relay / client /src /hooks /useRelayOperationLocks.js
Codex
deploy: CodexMobile Relay
90f0300
Raw
History Blame Contribute Delete
1.28 kB
import { useEffect, useMemo, useState } from 'react';
import { rateLimitLockFromError, remainingLockSeconds } from '../api.js';
import { retryAfterLabel } from '../app-core-utils.js';
export function useRelayOperationLocks() {
const [locks, setLocks] = useState({});
const [now, setNow] = useState(Date.now());
useEffect(() => {
const hasActiveLock = Object.values(locks).some((lock) => remainingLockSeconds(lock) > 0);
if (!hasActiveLock) {
return undefined;
}
const timer = window.setInterval(() => setNow(Date.now()), 500);
return () => window.clearInterval(timer);
}, [locks]);
function rememberLock(scope, error) {
const lock = rateLimitLockFromError(error, scope);
if (!lock) {
return false;
}
setLocks((current) => {
if (current[scope]?.untilMs >= lock.untilMs) {
return current;
}
return { ...current, [scope]: lock };
});
setNow(Date.now());
return true;
}
const disabledReasons = useMemo(() => ({
send: retryAfterLabel(locks.send, now),
upload: retryAfterLabel(locks.upload, now),
voice: retryAfterLabel(locks.voice, now),
voiceDialog: retryAfterLabel(locks.voiceDialog, now)
}), [locks, now]);
return {
rememberLock,
disabledReasons
};
}