Add org switcher with create, switch, and delete

The sidebar org button was inert: clicking it did nothing. Add a real
dropdown menu listing every organization, a "New organization" entry
that re-enters onboarding without resetting the database, and a per-org
delete affordance with inline confirmation. Active org is now persisted
in a single-row app_state table so the snapshot keeps a stable
selection across restarts and the renderer drives switching via two new
IPC channels (setActiveOrganization, deleteOrganization).

- migration 006 adds app_state(id=1, active_org_id, updated_at)
- snapshot resolves active org from app_state with the first-org fallback
- OrganizationService gains setActive + delete + bootstrap upsert
- new OrgSwitcher renderer component keeps Shell.tsx lean
This commit is contained in:
ZacharyZhang-NY committed 2026-05-21 21:30:00 -04:00
1 parent 060fddf852
commit f2ac1be5de
14 files changed
+385 -16

No files matched your search

@@ -0,0 +1,14 @@
export const appStateSchema = `
create table if not exists app_state (
id integer primary key check (id = 1),
active_org_id text references organizations(id) on delete set null,
updated_at text not null
);
insert into app_state(id, active_org_id, updated_at)
select 1, (select id from organizations order by created_at asc limit 1), datetime('now')
where not exists (select 1 from app_state where id = 1);
insert into schema_migrations(version, name, applied_at)
values (6, 'app_state', datetime('now'));
`;
@@ -4,6 +4,7 @@ import { collaborationProviderPolicySchema } from "./migrations/002-collaboratio
import { onboardingExecutionSchema } from "./migrations/003-onboarding";
import { filesPinnedAndScheduledPosts } from "./migrations/004-files-posts";
import { chatReadState } from "./migrations/005-chat-read-state";
import { appStateSchema } from "./migrations/006-app-state";
const MIGRATIONS: Array<{ version: number; sql: string }> = [
{ version: 1, sql: initialEnterpriseSchema },
@@ -11,6 +12,7 @@ const MIGRATIONS: Array<{ version: number; sql: string }> = [
{ version: 3, sql: onboardingExecutionSchema },
{ version: 4, sql: filesPinnedAndScheduledPosts },
{ version: 5, sql: chatReadState },
{ version: 6, sql: appStateSchema },
];
const SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1].version;