/// Unlock view — passphrase input with ENTER to submit. import { getState, setState, sendMessage, navigate, escapeHtml, openVaultTab } from '../../shared/state'; import type { ItemId, ManifestEntry } from '../../shared/types'; export function renderUnlock(app: HTMLElement): void { const state = getState(); app.innerHTML = `
Relicario

two-factor vault

unlock
${state.loading ? '
' : ''} ${state.error ? `
${escapeHtml(state.error)}
` : ''}
`; const input = document.getElementById('passphrase-input') as HTMLInputElement; const unlockBtn = document.getElementById('unlock-btn') as HTMLButtonElement | null; const submit = async () => { const passphrase = input.value; if (!passphrase) return; setState({ loading: true, error: null }); const resp = await sendMessage({ type: 'unlock', passphrase }); if (resp.ok) { const listResp = await sendMessage({ type: 'list_items' }); if (listResp.ok) { const data = listResp.data as { items: Array<[ItemId, ManifestEntry]> }; navigate('list', { entries: data.items }); } else { setState({ loading: false, error: listResp.error }); } } else { setState({ loading: false, error: resp.error }); } }; if (input && !state.loading) { input.focus(); input.addEventListener('keydown', (e) => { if (e.key === 'Enter') submit(); }); } unlockBtn?.addEventListener('click', submit); document.getElementById('vault-btn')?.addEventListener('click', () => openVaultTab()); document.getElementById('settings-btn')?.addEventListener('click', () => navigate('settings')); }