mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-06-10 03:13:32 -07:00
feat(notifications): add notification history panel and overlay UX fixes
- New toggleNotificationHistory (Ctrl+N) session-scoped history panel; slides in from same edge as notification stack - Overlay error/recovery toast follows notifications.overlayPosition; stack and history side seeded at startup - Cold managed background startup initializes tray and visible overlay shell before tokenization warmups finish - Add Update button to overlay update-available notifications - Fix Ctrl+S sentence-card flow: only Anki progress notification, no duplicate status toast - Fix overlay notification close/actions clickability above subtitle bars on Linux - Increase pause-until-ready default timeout from 15s to 30s
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
|
||||
import { DEFAULT_CONFIG, DEFAULT_KEYBINDINGS } from '../../config/definitions';
|
||||
import { compileSessionBindings } from '../../core/services/session-bindings';
|
||||
import { resolveConfiguredShortcuts } from '../../core/utils/shortcut-config';
|
||||
import { parseSessionActionDispatchRequest } from './validators';
|
||||
|
||||
// Regression guard: SESSION_ACTION_IDS in validators.ts is a hand-maintained mirror of the
|
||||
// SessionActionId union. If a new shortcut-backed action is added to the union/defaults but not to
|
||||
// the validator allow-list, the renderer's dispatchSessionAction IPC is rejected at runtime (which
|
||||
// surfaces as a "Renderer error recovered" toast). Compile every default binding and assert the
|
||||
// validator accepts each one so the two lists can't silently drift apart.
|
||||
test('every default session-action binding is accepted by parseSessionActionDispatchRequest', () => {
|
||||
const { bindings } = compileSessionBindings({
|
||||
shortcuts: resolveConfiguredShortcuts(DEFAULT_CONFIG, DEFAULT_CONFIG),
|
||||
keybindings: DEFAULT_KEYBINDINGS,
|
||||
statsToggleKey: DEFAULT_CONFIG.stats.toggleKey,
|
||||
statsMarkWatchedKey: DEFAULT_CONFIG.stats.markWatchedKey,
|
||||
platform: 'linux',
|
||||
rawConfig: DEFAULT_CONFIG,
|
||||
});
|
||||
|
||||
const sessionActions = bindings.filter((binding) => binding.actionType === 'session-action');
|
||||
assert.ok(sessionActions.length > 0, 'expected default session-action bindings to exist');
|
||||
|
||||
for (const binding of sessionActions) {
|
||||
if (binding.actionType !== 'session-action') continue;
|
||||
const request =
|
||||
binding.payload === undefined
|
||||
? { actionId: binding.actionId }
|
||||
: { actionId: binding.actionId, payload: binding.payload };
|
||||
assert.ok(
|
||||
parseSessionActionDispatchRequest(request) !== null,
|
||||
`validator rejected session action: ${binding.actionId}`,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('toggleNotificationHistory dispatch request is accepted', () => {
|
||||
assert.deepEqual(parseSessionActionDispatchRequest({ actionId: 'toggleNotificationHistory' }), {
|
||||
actionId: 'toggleNotificationHistory',
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user