fix focus on windows windows

This commit is contained in:
Eduard Gert
2026-06-16 15:03:51 +02:00
parent e4918e0277
commit 44709983f7
4 changed files with 155 additions and 150 deletions
@@ -11,6 +11,7 @@ import { DialogHeading } from "@/components/dialog/DialogHeading";
import { SquareIcon } from "@/components/SquareIcon";
import { Connection, Profiles as ProfilesSvc, Session, WindowManager } from "@bindings/services";
import { useAutoSizeWindow } from "@/hooks/useAutoSizeWindow";
import { EVENT_BROWSER_LOGIN_CANCEL } from "@/lib/connection";
import { errorDialog, formatErrorMessage } from "@/lib/errors.ts";
import { formatRemaining } from "@/lib/formatters";
@@ -53,9 +54,7 @@ export default function SessionExpirationDialog() {
return () => globalThis.clearInterval(id);
}, [initialSeconds]);
// Suppressed while `busy` or once expired: the tunnel stays up so Connected re-fires for
// unrelated reasons (peer/route changes); closing would abort our own WaitExtend, or — at
// the moment the countdown hits 0 — hide the "session expired" state before the user sees it.
// Don't auto-close while busy (aborts our WaitExtend) or expired (hides the state).
useEffect(() => {
const off = Events.On("netbird:status", (ev: { data: { status?: string } }) => {
if (busyRef.current || expiredRef.current) return;
@@ -71,25 +70,50 @@ export default function SessionExpirationDialog() {
const stay = useCallback(async () => {
if (busy) return;
setBusy(true);
let offCancel: (() => void) | undefined;
try {
const start = await Session.RequestExtend({ hint: "" });
const uri = start.verificationUriComplete || start.verificationUri;
// The popup opens the URL and (Go-side) hides this window, restoring it on close.
if (uri) {
try {
await Connection.OpenURL(uri);
await WindowManager.OpenBrowserLogin(uri);
} catch (e) {
console.debug("OpenURL failed during extend", e);
console.error(e);
}
}
const result = await Session.WaitExtend({
const cancelPromise = new Promise<void>((resolve) => {
offCancel = Events.On(EVENT_BROWSER_LOGIN_CANCEL, () => {
resolve();
});
});
const waitPromise = Session.WaitExtend({
deviceCode: start.deviceCode,
userCode: start.userCode,
});
if (result.preempted) {
// Another surface took over this deadline's flow; keep the dialog
// open to retry. A successful extend elsewhere auto-closes this window.
const outcome = await Promise.race([
waitPromise.then((r) => ({ kind: "done" as const, result: r })),
cancelPromise.then(() => ({ kind: "cancel" as const })),
]);
if (outcome.kind === "cancel") {
waitPromise.cancel?.();
waitPromise.catch(() => {});
return;
}
// Another surface owns this flow; keep the dialog open to retry.
if (outcome.result.preempted) {
return;
}
// Close before the popup so the restore can't flash this window back.
WindowManager.CloseSessionExpiration().catch(console.error);
} catch (e) {
await errorDialog({
@@ -97,6 +121,8 @@ export default function SessionExpirationDialog() {
Message: formatErrorMessage(e),
});
} finally {
offCancel?.();
WindowManager.CloseBrowserLogin().catch(console.error);
setBusy(false);
}
}, [busy, t]);