diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index d2609b49..0a2dbada 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -1,6 +1,6 @@
{
"name": "@edgeever/desktop",
- "version": "1.6.39",
+ "version": "1.6.40",
"desktopName": "EdgeEver",
"private": true,
"description": "Native EdgeEver desktop client",
diff --git a/apps/web/src/components/LoginScreen.tsx b/apps/web/src/components/LoginScreen.tsx
index f5029452..2ac689b1 100644
--- a/apps/web/src/components/LoginScreen.tsx
+++ b/apps/web/src/components/LoginScreen.tsx
@@ -106,6 +106,11 @@ export const LoginScreen = ({ configurationError, error, isSubmitting, onChangeI
{isSubmitting ? t("login.submitting") : t("login.submit")}
+ {onChangeInstance ? (
+
+ ) : null}
}
diff --git a/apps/web/src/lib/api.test.mjs b/apps/web/src/lib/api.test.mjs
index 3f41611f..779c4d3c 100644
--- a/apps/web/src/lib/api.test.mjs
+++ b/apps/web/src/lib/api.test.mjs
@@ -11,6 +11,10 @@ globalThis.window = {
apiBaseUrl: "",
setApiBaseUrl: async (value) => {
calls.push(["bridge:start", value]);
+ if (!value) {
+ calls.push(["bridge:complete", value]);
+ return value;
+ }
await new Promise((resolve) => {
completeSave = resolve;
});
@@ -39,6 +43,7 @@ const {
api,
cacheDesktopSession,
getCachedDesktopSession,
+ resetDesktopApiBaseUrl,
saveDesktopApiBaseUrl,
} = await import("./api.ts");
@@ -61,9 +66,32 @@ describe("desktop instance setup", () => {
expect(storage.get(DESKTOP_API_BASE_URL_STORAGE_KEY)).toBe("https://notes.example.com");
});
+ test("clears the saved instance and cached session before switching", async () => {
+ calls.length = 0;
+ storage.set(DESKTOP_API_BASE_URL_STORAGE_KEY, "https://notes.example.com");
+ cacheDesktopSession({
+ authRequired: true,
+ authenticated: true,
+ demoMode: false,
+ sessionToken: "old-instance-session",
+ user: { id: "user-1", username: "admin", displayName: null, role: "owner" },
+ });
+
+ resetDesktopApiBaseUrl();
+ await Promise.resolve();
+
+ expect(storage.has(DESKTOP_API_BASE_URL_STORAGE_KEY)).toBe(false);
+ expect(getCachedDesktopSession()).toBeNull();
+ expect(calls.slice(-2)).toEqual([
+ ["bridge:start", ""],
+ ["bridge:complete", ""],
+ ]);
+ });
+
test("uses the desktop session token and stops network retries after a 401", async () => {
calls.length = 0;
events.length = 0;
+ storage.set(DESKTOP_API_BASE_URL_STORAGE_KEY, "https://notes.example.com");
cacheDesktopSession({
authRequired: true,
authenticated: true,
diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts
index 8a1782c5..916dbbe7 100644
--- a/apps/web/src/lib/api.ts
+++ b/apps/web/src/lib/api.ts
@@ -123,6 +123,7 @@ export const saveDesktopApiBaseUrl = async (value: string) => {
export const resetDesktopApiBaseUrl = () => {
if (typeof window === "undefined" || !window.edgeeverDesktop?.isAvailable) return;
+ clearCachedDesktopSession();
window.localStorage.removeItem(DESKTOP_API_BASE_URL_STORAGE_KEY);
void window.edgeeverDesktop.setApiBaseUrl("");
};
diff --git a/package.json b/package.json
index f3b574a6..d520ab3b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "edgeever",
- "version": "1.6.39",
+ "version": "1.6.40",
"private": true,
"type": "module",
"workspaces": [