From 26814039e31a3cea90a58d49ac291ccc1c7479bd Mon Sep 17 00:00:00 2001 From: louzt Date: Wed, 22 Apr 2026 05:23:51 -0600 Subject: [PATCH 1/2] Auto-open Add Server on fresh installs --- src/App.tsx | 11 +++++++++-- src/utils/initialSetup.ts | 11 +++++++++++ tests/unit/utils/initialSetup.test.ts | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/utils/initialSetup.ts create mode 100644 tests/unit/utils/initialSetup.test.ts diff --git a/src/App.tsx b/src/App.tsx index f850267..0f3367a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,6 +7,7 @@ import { AppProvider } from './context/AppContext' import { createActionRegistry } from './actions/createActionRegistry' import { autoConnectServers } from './utils/autoConnect' import { copyToClipboard } from './utils/clipboard' +import { shouldOpenInitialConnectModal } from './utils/initialSetup' const registry = createActionRegistry() @@ -29,8 +30,14 @@ export function App() { migratePasswords() loadPersistedUIState() initializeIRC() - // --setup: open the connect modal so the user can fill in server details - if (globalThis.__SETUP_MODE__) { + // Fresh installs land in an empty shell otherwise, so reuse the setup modal + // when there are no configured servers after loading persisted state. + if ( + shouldOpenInitialConnectModal({ + setupMode: globalThis.__SETUP_MODE__, + configuredServerCount: useStore.getState().servers.length, + }) + ) { setTimeout(() => useStore.getState().openModal('connect'), 50) } }, [initializeIRC, loadPersistedServers, loadPersistedUIState, migratePasswords]) diff --git a/src/utils/initialSetup.ts b/src/utils/initialSetup.ts new file mode 100644 index 0000000..c0a5ace --- /dev/null +++ b/src/utils/initialSetup.ts @@ -0,0 +1,11 @@ +interface InitialSetupOptions { + setupMode: boolean | undefined + configuredServerCount: number +} + +export function shouldOpenInitialConnectModal({ + setupMode, + configuredServerCount, +}: InitialSetupOptions): boolean { + return Boolean(setupMode) || configuredServerCount === 0 +} \ No newline at end of file diff --git a/tests/unit/utils/initialSetup.test.ts b/tests/unit/utils/initialSetup.test.ts new file mode 100644 index 0000000..59ce68e --- /dev/null +++ b/tests/unit/utils/initialSetup.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest' +import { shouldOpenInitialConnectModal } from '@/utils/initialSetup' + +describe('shouldOpenInitialConnectModal', () => { + it('opens in explicit setup mode', () => { + expect(shouldOpenInitialConnectModal({ setupMode: true, configuredServerCount: 3 })).toBe( + true + ) + }) + + it('opens on a fresh install with no configured servers', () => { + expect(shouldOpenInitialConnectModal({ setupMode: false, configuredServerCount: 0 })).toBe( + true + ) + }) + + it('does not open when servers already exist and setup mode is off', () => { + expect(shouldOpenInitialConnectModal({ setupMode: false, configuredServerCount: 1 })).toBe( + false + ) + }) +}) \ No newline at end of file From 6cbbc26c73e4fdbc51667f5e4b9ab2e117e8183f Mon Sep 17 00:00:00 2001 From: louzt Date: Wed, 22 Apr 2026 05:35:12 -0600 Subject: [PATCH 2/2] Tighten initial setup helper contract --- src/utils/initialSetup.ts | 2 +- tests/unit/utils/initialSetup.test.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/utils/initialSetup.ts b/src/utils/initialSetup.ts index c0a5ace..ed5e186 100644 --- a/src/utils/initialSetup.ts +++ b/src/utils/initialSetup.ts @@ -1,4 +1,4 @@ -interface InitialSetupOptions { +export interface InitialSetupOptions { setupMode: boolean | undefined configuredServerCount: number } diff --git a/tests/unit/utils/initialSetup.test.ts b/tests/unit/utils/initialSetup.test.ts index 59ce68e..5027418 100644 --- a/tests/unit/utils/initialSetup.test.ts +++ b/tests/unit/utils/initialSetup.test.ts @@ -2,6 +2,12 @@ import { describe, expect, it } from 'vitest' import { shouldOpenInitialConnectModal } from '@/utils/initialSetup' describe('shouldOpenInitialConnectModal', () => { + it('treats undefined setup mode as false when servers already exist', () => { + expect(shouldOpenInitialConnectModal({ setupMode: undefined, configuredServerCount: 2 })).toBe( + false + ) + }) + it('opens in explicit setup mode', () => { expect(shouldOpenInitialConnectModal({ setupMode: true, configuredServerCount: 3 })).toBe( true