fix(front): clean localStorage on user change

- fix issue with selected drive and user logout/login via another user
    (was raising a "404 not found")
    - normalize all localStorage to "oxi-" prefix
    - add a specific frontend/AGENTS.md for frontend part (stop increasing the global AGENTS.md)
This commit is contained in:
Edouard Vanbelle
2026-07-07 20:47:51 +02:00
parent 4fb2acf160
commit 3108fed228
14 changed files with 188 additions and 33 deletions
+3 -3
View File
@@ -107,7 +107,7 @@
);
return;
}
session.user = data.user;
session.setUser(data.user);
await goto(resolve(redirectTarget), { replaceState: true });
} catch (err) {
error = err instanceof Error ? err.message : t('auth.login_error', 'Error logging in');
@@ -203,7 +203,7 @@
if (oidcCode) {
const user = await exchangeOidcCode(oidcCode);
if (user) {
session.user = user;
session.setUser(user);
await goto(resolve(redirectTarget), { replaceState: true });
return;
}
@@ -214,7 +214,7 @@
try {
const me = await fetchMe();
if (me) {
session.user = me;
session.setUser(me);
await goto(resolve(redirectTarget), { replaceState: true });
return;
}
+16 -5
View File
@@ -1,11 +1,22 @@
import { it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent, waitFor } from '@testing-library/svelte';
const { goto, pageState, session } = vi.hoisted(() => ({
goto: vi.fn(),
pageState: { url: new URL('http://localhost/login') } as { url: URL },
session: { user: null } as { user: unknown }
}));
const { goto, pageState, session } = vi.hoisted(() => {
// `setUser` mirrors the real SessionStore method: sets the user and
// runs `ensureActiveUser` (localStorage cleanup on account switch).
// Tests don't care about the cleanup; the mock just assigns.
const store: { user: unknown; setUser: (u: unknown) => void } = {
user: null,
setUser(u) {
store.user = u;
}
};
return {
goto: vi.fn(),
pageState: { url: new URL('http://localhost/login') } as { url: URL },
session: store
};
});
vi.mock('$app/navigation', () => ({ goto }));
vi.mock('$app/state', () => ({ page: pageState }));
vi.mock('$lib/stores/session.svelte', () => ({ session }));
+2 -2
View File
@@ -37,8 +37,8 @@
type GroupMode = 'day' | 'month' | 'year';
type LayoutMode = 'square' | 'justified';
const GROUP_KEY = 'oxicloud-photos-group';
const LAYOUT_KEY = 'oxicloud-photos-layout';
const GROUP_KEY = 'oxi-photos-group';
const LAYOUT_KEY = 'oxi-photos-layout';
let groupMode = $state<GroupMode>('month');
let layoutMode = $state<LayoutMode>('square');
const selected = useSelection();
+1 -1
View File
@@ -18,7 +18,7 @@
type Crumb = { id?: string; name: string };
type ViewMode = 'grid' | 'list';
const VIEW_KEY = 'oxicloud_share_view';
const VIEW_KEY = 'oxi-share-view';
const token = $derived(page.params.token ?? '');
let view = $state<State>('loading');