Skip to content

Commit af95eac

Browse files
committed
Give Settings one guard and one set of section parts
Editors register with the shared dirty store and one dialog answers for all of them. The settings hooks move to hooks/, out of the seam's @/components exception. Modal gains a keep-open result and a named quiet action, Chip a status slot and SearchableSelect an open signal, replacing their workarounds. The canvas stores are read-only and throw on anything the chat hook does not read, read-block is cut by an edge, and a closure check proves the seam bundles no legacy view.
1 parent 88f58ec commit af95eac

107 files changed

Lines changed: 489 additions & 818 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.claude/rules/sim-settings-pages.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ rendered through `<SettingsActionChips actions={…} />` from
344344
is what keeps tone/icon/variant/tooltip handling from drifting between the two
345345
shells. Reach for it before hand-rolling a `Chip`.
346346
- **`useSettingsUnsavedGuard({ isDirty, navigationBlocked, onDiscard })`** from
347-
`@/components/settings/use-settings-unsaved-guard` registers one editor with the
347+
`@/hooks/use-settings-unsaved-guard` registers one editor with the
348348
shared settings store. Register every full-page draft, including inline creation
349349
forms. Dirty computation stays local and derived; fetched defaults stay clean.
350350
- **`onDiscard` resets the registered draft.** The root `SettingsNavigationGuard`

‎.cursor/rules/sim-settings-pages.mdc‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ rendered through `<SettingsActionChips actions={…} />` from
340340
is what keeps tone/icon/variant/tooltip handling from drifting between the two
341341
shells. Reach for it before hand-rolling a `Chip`.
342342
- **`useSettingsUnsavedGuard({ isDirty, navigationBlocked, onDiscard })`** from
343-
`@/components/settings/use-settings-unsaved-guard` registers one editor with the
343+
`@/hooks/use-settings-unsaved-guard` registers one editor with the
344344
shared settings store. Register every full-page draft, including inline creation
345345
forms. Dirty computation stays local and derived; fetched defaults stay clean.
346346
- **`onDiscard` resets the registered draft.** The root `SettingsNavigationGuard`

‎apps/sim/app/o/[organizationId]/benchmark/components/benchmark-detail.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
} from '@sim/emcn'
1212
import { Download, Trash } from '@sim/emcn/icons'
1313
import { useQueryStates } from 'nuqs'
14-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
1514
import type {
1615
BenchmarkCase,
1716
RunBenchmarkComparisonBody,
@@ -42,6 +41,7 @@ import {
4241
useRunBenchmarkStage,
4342
useUpdateBenchmark,
4443
} from '@/hooks/queries/benchmarks'
44+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
4545
import { useSettingsDirtyStore } from '@/stores/settings/dirty/store'
4646

4747
interface BenchmarkDetailProps {

‎apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { useRouter } from 'next/navigation'
77
import { saveDiscardActions } from '@/components/settings/save-discard-actions'
88
import type { SettingsAction, SettingsBackAction } from '@/components/settings/settings-header'
99
import { SettingsPanel } from '@/components/settings/settings-panel'
10-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
1110
import { isApiClientError } from '@/lib/api/client/errors'
1211
import type { ConnectorData, ConnectorDetailData } from '@/lib/api/contracts/knowledge/connectors'
1312
import type { ResourceScope } from '@/lib/core/resource-scope'
@@ -32,6 +31,7 @@ import {
3231
} from '@/hooks/queries/kb/connectors'
3332
import { useSearchIntegrations } from '@/hooks/queries/search-integrations'
3433
import { useOAuthReturnForKBConnectors } from '@/hooks/use-oauth-return'
34+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
3535

3636
interface OrganizationSourceDetailProps {
3737
connectorId: string

‎apps/sim/app/workspace/[workspaceId]/components/credential-detail/hooks/use-credential-detail-form.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { createLogger } from '@sim/logger'
66
import { getErrorMessage } from '@sim/utils/errors'
77
import { filterUndefined } from '@sim/utils/object'
88
import { useRouter } from 'next/navigation'
9-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
109
import { useUpdateWorkspaceCredential, type WorkspaceCredential } from '@/hooks/queries/credentials'
10+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
1111
import { useSettingsDirtyStore } from '@/stores/settings/dirty/store'
1212

1313
const logger = createLogger('CredentialDetailForm')

‎apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {
1919
} from '@sim/emcn'
2020
import { getErrorMessage } from '@sim/utils/errors'
2121
import { useQueryStates } from 'nuqs'
22-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
2322
import type { MothershipEnvironment } from '@/lib/api/contracts'
2423
import { useSession } from '@/lib/auth/client'
2524
import { APP_ENTRY_PATH } from '@/lib/navigation/paths'
@@ -46,6 +45,7 @@ import {
4645
import { useBenchmarkAvailability } from '@/hooks/queries/benchmarks'
4746
import { useGeneralSettings, useUpdateGeneralSetting } from '@/hooks/queries/general-settings'
4847
import { useImportWorkflow } from '@/hooks/queries/workflows'
48+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
4949
import { clearUserData } from '@/stores'
5050

5151
const PAGE_SIZE = 20 as const

‎apps/sim/app/workspace/[workspaceId]/settings/components/billing/components/usage-limit-field/usage-limit-field.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import { useEffect, useRef, useState } from 'react'
44
import { ChipInput, Info, toast } from '@sim/emcn'
55
import { getErrorMessage } from '@sim/utils/errors'
6-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
76
import { ON_DEMAND_UNLIMITED } from '@/lib/billing/constants'
87
import { dollarsToCredits } from '@/lib/billing/credits/conversion'
98
import { isUsageLimitDraftDirty, resolveUsageLimitDraft } from '@/lib/billing/usage-limit-draft'
109
import { SettingsSection } from '@/app/workspace/[workspaceId]/settings/components/settings-section/settings-section'
1110
import { useUpdateOrganizationUsageLimit } from '@/hooks/queries/organization'
1211
import { useUpdateUsageLimit } from '@/hooks/queries/subscription'
1312
import { useDebounce } from '@/hooks/use-debounce'
13+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
1414

1515
/** Delay before a usage-limit edit is auto-saved once the user stops typing. */
1616
const AUTOSAVE_DELAY_MS = 1000

‎apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/components/custom-tool-detail/custom-tool-detail.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { ArrowLeft } from '@sim/emcn/icons'
66
import { createLogger } from '@sim/logger'
77
import { getErrorMessage } from '@sim/utils/errors'
88
import { saveDiscardActions } from '@/components/settings/save-discard-actions'
9-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
109
import {
1110
CUSTOM_TOOL_DELETE_CONFIRM_TEXT,
1211
CustomToolCodeField,
@@ -28,6 +27,7 @@ import {
2827
useDeleteCustomTool,
2928
useUpdateCustomTool,
3029
} from '@/hooks/queries/custom-tools'
30+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
3131

3232
const logger = createLogger('CustomToolDetail')
3333

‎apps/sim/app/workspace/[workspaceId]/settings/components/mothership/mothership.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
import { formatDateTime } from '@sim/utils/formatting'
1616
import Link from 'next/link'
1717
import { useQueryStates } from 'nuqs'
18-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
1918
import {
2019
type MothershipTab,
2120
mothershipParsers,
@@ -30,6 +29,7 @@ import {
3029
useMothershipRequests,
3130
useMothershipUserBreakdown,
3231
} from '@/hooks/queries/mothership-admin'
32+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
3333
import { useSettingsDirtyStore } from '@/stores/settings/dirty/store'
3434

3535
const TABS: { id: MothershipTab; label: string }[] = [

‎apps/sim/app/workspace/[workspaceId]/settings/components/sandboxes/sandboxes.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { useQueryState } from 'nuqs'
99
import { CodeIcon } from '@/components/icons'
1010
import { canMutateWorkspaceSettingsSection } from '@/components/settings/navigation'
1111
import { saveDiscardActions } from '@/components/settings/save-discard-actions'
12-
import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard'
1312
import type { SandboxDependencyIssue } from '@/lib/api/contracts/sandboxes'
1413
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
1514
import {
@@ -46,6 +45,7 @@ import {
4645
useUpdateSandbox,
4746
} from '@/hooks/queries/sandboxes'
4847
import { useSettingsSearch } from '@/hooks/use-settings-search'
48+
import { useSettingsUnsavedGuard } from '@/hooks/use-settings-unsaved-guard'
4949

5050
export function Sandboxes() {
5151
const params = useParams()

0 commit comments

Comments
 (0)