diff --git a/src/features/vault/ui/VaultIndicator.test.tsx b/src/features/vault/ui/VaultIndicator.test.tsx
index d86ccc3..792c95c 100644
--- a/src/features/vault/ui/VaultIndicator.test.tsx
+++ b/src/features/vault/ui/VaultIndicator.test.tsx
@@ -33,10 +33,10 @@ describe('VaultIndicator', () => {
it('opens unlock dialog when clicked while locked', async () => {
useCryptoStore.setState({ isVaultLocked: true })
- useVaultDialogStore.setState({ isUnlockDialogOpen: false })
+ useVaultDialogStore.setState({ isOpen: false })
const user = userEvent.setup()
render(
)
await user.click(screen.getByRole('button', { name: /unlock vault/i }))
- expect(useVaultDialogStore.getState().isUnlockDialogOpen).toBe(true)
+ expect(useVaultDialogStore.getState().isOpen).toBe(true)
})
})
diff --git a/src/features/vault/ui/VaultIndicator.tsx b/src/features/vault/ui/VaultIndicator.tsx
index d9d7b6f..cc9ba94 100644
--- a/src/features/vault/ui/VaultIndicator.tsx
+++ b/src/features/vault/ui/VaultIndicator.tsx
@@ -8,7 +8,7 @@ import { cn } from '@/shared/lib/utils'
function VaultIndicator() {
const { t } = useTranslation('vault')
const isVaultLocked = useCryptoStore((s) => s.isVaultLocked)
- const openUnlockDialog = useVaultDialogStore((s) => s.openUnlockDialog)
+ const openUnlockDialog = useVaultDialogStore((s) => s.open)
if (isVaultLocked) {
return (
diff --git a/src/features/vault/ui/VaultUnlockDialog.test.tsx b/src/features/vault/ui/VaultUnlockDialog.test.tsx
index 81a9aa6..1eff66d 100644
--- a/src/features/vault/ui/VaultUnlockDialog.test.tsx
+++ b/src/features/vault/ui/VaultUnlockDialog.test.tsx
@@ -34,7 +34,7 @@ describe('VaultUnlockDialog', () => {
vi.clearAllMocks()
useCryptoStore.getState().clearVault()
useCryptoStore.setState({ isVaultLocked: true })
- useVaultDialogStore.setState({ isUnlockDialogOpen: true })
+ useVaultDialogStore.setState({ isOpen: true })
vi.mocked(useAuth).mockReturnValue({
isAuthenticated: true,
user: mockUser,
@@ -44,13 +44,13 @@ describe('VaultUnlockDialog', () => {
})
})
- it('renders dialog when isUnlockDialogOpen is true', () => {
+ it('renders dialog when isOpen is true', () => {
render(
)
expect(screen.getByText('Vault Locked')).toBeInTheDocument()
})
- it('does not render dialog content when isUnlockDialogOpen is false', () => {
- useVaultDialogStore.setState({ isUnlockDialogOpen: false })
+ it('does not render dialog content when isOpen is false', () => {
+ useVaultDialogStore.setState({ isOpen: false })
render(
)
expect(screen.queryByText('Vault Locked')).not.toBeInTheDocument()
})
diff --git a/src/features/vault/ui/VaultUnlockDialog.tsx b/src/features/vault/ui/VaultUnlockDialog.tsx
index 3b91ed5..fe5d16f 100644
--- a/src/features/vault/ui/VaultUnlockDialog.tsx
+++ b/src/features/vault/ui/VaultUnlockDialog.tsx
@@ -9,13 +9,13 @@ import { PasswordConfirmDialog } from '@/shared/ui/PasswordConfirmDialog'
function VaultUnlockDialog() {
const { t } = useTranslation('vault')
const { user } = useAuth()
- const isUnlockDialogOpen = useVaultDialogStore((s) => s.isUnlockDialogOpen)
- const closeUnlockDialog = useVaultDialogStore((s) => s.closeUnlockDialog)
+ const isOpen = useVaultDialogStore((s) => s.isOpen)
+ const close = useVaultDialogStore((s) => s.close)
async function unlockVault(password: string) {
if (!user) throw new Error('No authenticated user')
await keyVault.unlockVault(user.id, password)
- closeUnlockDialog()
+ close()
}
function mapError(error: unknown) {
@@ -24,8 +24,8 @@ function VaultUnlockDialog() {
return (
{
- beforeEach(() => {
- useChangePasswordDialogStore.setState({ isChangePasswordDialogOpen: false })
- })
-
- it('initializes with dialog closed', () => {
- expect(useChangePasswordDialogStore.getState().isChangePasswordDialogOpen).toBe(false)
- })
-
- it('openChangePasswordDialog sets isChangePasswordDialogOpen to true', () => {
- useChangePasswordDialogStore.getState().openChangePasswordDialog()
- expect(useChangePasswordDialogStore.getState().isChangePasswordDialogOpen).toBe(true)
- })
-
- it('closeChangePasswordDialog sets isChangePasswordDialogOpen to false', () => {
- useChangePasswordDialogStore.getState().openChangePasswordDialog()
- useChangePasswordDialogStore.getState().closeChangePasswordDialog()
- expect(useChangePasswordDialogStore.getState().isChangePasswordDialogOpen).toBe(false)
- })
-})
diff --git a/src/shared/auth/change-password-dialog-store.ts b/src/shared/auth/change-password-dialog-store.ts
deleted file mode 100644
index e7d33c3..0000000
--- a/src/shared/auth/change-password-dialog-store.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { create } from 'zustand'
-import { devtools } from 'zustand/middleware'
-
-interface ChangePasswordDialogStore {
- isChangePasswordDialogOpen: boolean
- openChangePasswordDialog: () => void
- closeChangePasswordDialog: () => void
-}
-
-const useChangePasswordDialogStore = create()(
- devtools(
- (set) => ({
- isChangePasswordDialogOpen: false,
- openChangePasswordDialog: () => set({ isChangePasswordDialogOpen: true }, false, 'changePasswordDialog/open'),
- closeChangePasswordDialog: () => set({ isChangePasswordDialogOpen: false }, false, 'changePasswordDialog/close'),
- }),
- { name: 'ChangePasswordDialogStore' },
- ),
-)
-
-export { useChangePasswordDialogStore }
diff --git a/src/shared/auth/regenerate-mnemonic-dialog-store.test.ts b/src/shared/auth/regenerate-mnemonic-dialog-store.test.ts
deleted file mode 100644
index c860230..0000000
--- a/src/shared/auth/regenerate-mnemonic-dialog-store.test.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { describe, it, expect, beforeEach } from 'vitest'
-import { useRegenerateMnemonicDialogStore } from './regenerate-mnemonic-dialog-store'
-
-describe('regenerate-mnemonic-dialog-store', () => {
- beforeEach(() => {
- useRegenerateMnemonicDialogStore.setState({ isRegenerateMnemonicDialogOpen: false })
- })
-
- it('initializes with dialog closed', () => {
- expect(useRegenerateMnemonicDialogStore.getState().isRegenerateMnemonicDialogOpen).toBe(false)
- })
-
- it('openRegenerateMnemonicDialog sets isRegenerateMnemonicDialogOpen to true', () => {
- useRegenerateMnemonicDialogStore.getState().openRegenerateMnemonicDialog()
- expect(useRegenerateMnemonicDialogStore.getState().isRegenerateMnemonicDialogOpen).toBe(true)
- })
-
- it('closeRegenerateMnemonicDialog sets isRegenerateMnemonicDialogOpen to false', () => {
- useRegenerateMnemonicDialogStore.getState().openRegenerateMnemonicDialog()
- useRegenerateMnemonicDialogStore.getState().closeRegenerateMnemonicDialog()
- expect(useRegenerateMnemonicDialogStore.getState().isRegenerateMnemonicDialogOpen).toBe(false)
- })
-})
diff --git a/src/shared/auth/regenerate-mnemonic-dialog-store.ts b/src/shared/auth/regenerate-mnemonic-dialog-store.ts
deleted file mode 100644
index 74a91ce..0000000
--- a/src/shared/auth/regenerate-mnemonic-dialog-store.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { create } from 'zustand'
-import { devtools } from 'zustand/middleware'
-
-interface RegenerateMnemonicDialogStore {
- isRegenerateMnemonicDialogOpen: boolean
- openRegenerateMnemonicDialog: () => void
- closeRegenerateMnemonicDialog: () => void
-}
-
-const useRegenerateMnemonicDialogStore = create()(
- devtools(
- (set) => ({
- isRegenerateMnemonicDialogOpen: false,
- openRegenerateMnemonicDialog: () =>
- set({ isRegenerateMnemonicDialogOpen: true }, false, 'regenerateMnemonicDialog/open'),
- closeRegenerateMnemonicDialog: () =>
- set({ isRegenerateMnemonicDialogOpen: false }, false, 'regenerateMnemonicDialog/close'),
- }),
- { name: 'RegenerateMnemonicDialogStore' },
- ),
-)
-
-export { useRegenerateMnemonicDialogStore }
diff --git a/src/shared/i18n/locales/cs/settings.json b/src/shared/i18n/locales/cs/settings.json
index dc38393..1c60367 100644
--- a/src/shared/i18n/locales/cs/settings.json
+++ b/src/shared/i18n/locales/cs/settings.json
@@ -5,6 +5,7 @@
"description": "Správa hesla a nastavení zabezpečení.",
"changePassword": "Změnit heslo",
"seedPhrase": "Znovu vygenerovat seed frázi",
+ "verifySeedPhrase": "Ověřit seed frázi",
"keyVersions": "Verze klíčů"
},
"preferences": {
diff --git a/src/shared/i18n/locales/en/settings.json b/src/shared/i18n/locales/en/settings.json
index 2f8db4c..436a043 100644
--- a/src/shared/i18n/locales/en/settings.json
+++ b/src/shared/i18n/locales/en/settings.json
@@ -5,6 +5,7 @@
"description": "Manage your password and security settings.",
"changePassword": "Change password",
"seedPhrase": "Regenerate seed phrase",
+ "verifySeedPhrase": "Verify seed phrase",
"keyVersions": "Key versions"
},
"preferences": {
diff --git a/src/shared/ui/create-dialog-store.ts b/src/shared/ui/create-dialog-store.ts
new file mode 100644
index 0000000..95f261c
--- /dev/null
+++ b/src/shared/ui/create-dialog-store.ts
@@ -0,0 +1,25 @@
+import { create } from 'zustand'
+import { devtools } from 'zustand/middleware'
+
+interface DialogStore {
+ isOpen: boolean
+ open: () => void
+ close: () => void
+}
+
+/**
+ * Creates a Zustand store for a simple open/close dialog.
+ * The store has `isOpen`, `open()`, and `close()`. No domain-specific state.
+ */
+export function createDialogStore(name: string) {
+ return create()(
+ devtools(
+ (set) => ({
+ isOpen: false,
+ open: () => set({ isOpen: true }, false, `${name}/open`),
+ close: () => set({ isOpen: false }, false, `${name}/close`),
+ }),
+ { name },
+ ),
+ )
+}