src/modules/display/infrastructure/display.ts   A
last analyzed

Complexity

Total Complexity 10
Complexity/F 1.43

Size

Lines of Code 71
Function Count 7

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 54
dl 0
loc 71
rs 10
c 0
b 0
f 0
wmc 10
mnd 3
bc 3
fnc 7
bpm 0.4285
cpm 1.4285
noi 0

7 Functions

Rating   Name   Duplication   Size   Complexity  
A display.ts ➔ updateDisplay 0 8 1
A display.ts ➔ announceToScreenReader 0 15 3
A display.ts ➔ updateBoxStates 0 16 1
A display.ts ➔ updateWordDisplay 0 4 1
A display.ts ➔ updateBinaryDisplay 0 3 1
A display.ts ➔ syncWordInputFromBoxes 0 4 2
A display.ts ➔ setSyncWordInputCallback 0 3 1
1
import { state } from '../../bip39';
2
import { elements } from '../../bip39';
3
import { getAllDisplayData } from '../application/displayService';
4
5
export function updateDisplay(): void {
6
  const displayData = getAllDisplayData(state.boxes);
7
8
  updateBoxStates(displayData.boxes);
9
  updateBinaryDisplay(displayData.binary);
10
  updateWordDisplay(displayData.word);
11
  syncWordInputFromBoxes();
12
}
13
14
// Callback for syncing word input (set by wordInput module to avoid circular dependency)
15
let syncWordInputCallback: (() => void) | null = null;
16
let announcementTimeout: NodeJS.Timeout | null = null;
17
18
export function setSyncWordInputCallback(callback: () => void): void {
19
  syncWordInputCallback = callback;
20
}
21
22
function syncWordInputFromBoxes(): void {
23
  if (syncWordInputCallback) {
24
    syncWordInputCallback();
25
  }
26
}
27
28
function updateBoxStates(boxesData: Array<{ isActive: boolean; isDisabled: boolean; ariaPressed: string }>): void {
29
  const boxElements = elements.grid.querySelectorAll('.box');
30
31
  boxElements.forEach((box, index) => {
32
    const htmlBox = box as HTMLButtonElement;
33
    const data = boxesData[index];
34
35
    // Update active state
36
    htmlBox.classList.toggle('active', data.isActive);
37
    htmlBox.setAttribute('aria-pressed', data.ariaPressed);
38
39
    // Update disabled state
40
    htmlBox.classList.toggle('disabled', data.isDisabled);
41
    htmlBox.dataset.isDisabled = data.isDisabled.toString();
42
    htmlBox.setAttribute('aria-disabled', data.isDisabled.toString());
43
  });
44
}
45
46
function updateBinaryDisplay(binaryData: { binaryString: string }): void {
47
  elements.binary.textContent = binaryData.binaryString;
48
}
49
50
function updateWordDisplay(wordData: { indexText: string; announcement: string }): void {
51
  elements.index.textContent = wordData.indexText;
52
  announceToScreenReader(wordData.announcement);
53
}
54
55
function announceToScreenReader(message: string): void {
56
  const announcer = document.getElementById('sr-announcements');
57
  if (announcer) {
58
    // Clear existing timeout
59
    if (announcementTimeout) {
60
      clearTimeout(announcementTimeout);
61
    }
62
63
    announcer.textContent = message;
64
65
    // Clear after a short delay to allow for new announcements
66
    announcementTimeout = setTimeout(() => {
67
      announcer.textContent = '';
68
    }, 1000);
69
  }
70
}
71