refactor(ext/shared): typed StateHost + sweep as-any casts (Plan C Phase 1)
Replaces the previously any-typed StateHost contract with a typed interface. Adds double-registration guard and __resetHostForTests for vitest. sendMessage wrapper is currently a pass-through; Phase 4 will fill its body with the vault_locked intercept lifted from vault.ts. Widens PopupState/View on shared/popup-state.ts to cover vault-tab-only views (history, backup, import) and vault-tab-only fields (unlocked, drawerOpen, typePanelOpen) so VaultState satisfies StateHost.getState() without a cast. The popup surface ignores the new optional fields. Drops the `any` annotations on vault.ts's registerHost callbacks now that the typed StateHost contract infers them from PopupState. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -20,7 +20,12 @@ export type View =
|
||||
| 'settings-vault'
|
||||
| 'trash'
|
||||
| 'devices'
|
||||
| 'field-history';
|
||||
| 'field-history'
|
||||
// Vault-tab-only views; popup never navigates to these. Kept in the union so
|
||||
// a single typed StateHost contract serves both surfaces (popup + vault).
|
||||
| 'history'
|
||||
| 'backup'
|
||||
| 'import';
|
||||
|
||||
export interface PopupState {
|
||||
view: View;
|
||||
@@ -42,4 +47,11 @@ export interface PopupState {
|
||||
vaultSettings: VaultSettings | null;
|
||||
generatorDefaults: GeneratorRequest | null;
|
||||
historyItemId: ItemId | null;
|
||||
// Vault-tab-only fields. The popup surface leaves these at their defaults
|
||||
// (unlocked=false implicit via separate lock-screen view, drawer/panel false).
|
||||
// Kept on the shared shape so VaultState satisfies StateHost.getState()
|
||||
// without a cast.
|
||||
unlocked?: boolean;
|
||||
drawerOpen?: boolean;
|
||||
typePanelOpen?: boolean;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user