diff --git a/web/src/routes/admin/+layout.svelte b/web/src/routes/admin/+layout.svelte index 586662e..a62f5bf 100644 --- a/web/src/routes/admin/+layout.svelte +++ b/web/src/routes/admin/+layout.svelte @@ -11,7 +11,8 @@ import SettingsIcon from '@lucide/svelte/icons/settings'; import '../../app.css'; import { getToasts } from '$lib/toast.svelte'; import { page } from '$app/state'; - import { checkSession, logout } from '$lib/api'; + import { checkSession, logout, listAccounts } from '$lib/api'; + import type { Account } from '$lib/types'; import { fetchTimezone, getTimezone } from '$lib/tz'; import { goto } from '$app/navigation'; @@ -22,6 +23,38 @@ import SettingsIcon from '@lucide/svelte/icons/settings'; let appVersion = $state(''); let tzLabel = $state(''); + // Global account switcher: akun aktif dipakai sebagai default filter + // di Schedules/Posts/Calendar (halaman tetap bisa override). + let accounts = $state([]); + let accountsLoaded = $state(false); + let activeAccountId = $state( + typeof localStorage !== 'undefined' + ? localStorage.getItem('titen.activeAccount') || 'all' + : 'all' + ); + + function setActiveAccount(id: string) { + activeAccountId = id; + try { + localStorage.setItem('titen.activeAccount', id); + } catch { + /* private mode — ignore */ + } + } + + $effect(() => { + if (!authed || accountsLoaded) return; + (async () => { + try { + accounts = (await listAccounts()) ?? []; + } catch { + /* non-fatal — switcher stays empty */ + } finally { + accountsLoaded = true; // guard against re-fetch loops + } + })(); + }); + $effect(() => { if (authed) return; (async () => { @@ -158,6 +191,28 @@ import SettingsIcon from '@lucide/svelte/icons/settings';