aboutsummaryrefslogtreecommitdiff
path: root/src/content/presenters/FocusPresenter.ts
blob: 4cef5bfc4e674b8cd99f4c3d4294f52bb4e1a144 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import * as doms from '../../shared/utils/dom';

export default interface FocusPresenter {
  focusFirstElement(): boolean;

  // eslint-disable-next-line semi
}

export class FocusPresenterImpl implements FocusPresenter {
  focusFirstElement(): boolean {
    let inputTypes = ['email', 'number', 'search', 'tel', 'text', 'url'];
    let inputSelector = inputTypes.map(type => `input[type=${type}]`).join(',');
    let targets = window.document.querySelectorAll(inputSelector + ',textarea');
    let target = Array.from(targets).find(doms.isVisible);
    if (target instanceof HTMLInputElement) {
      target.focus();
      return true;
    } else if (target instanceof HTMLTextAreaElement) {
      target.focus();
      return true;
    }
    return false;
  }
}