1 | 'use strict';
|
2 |
|
3 | const KEYBOARD_DID_OPEN = 'ionKeyboardDidShow';
|
4 | const KEYBOARD_DID_CLOSE = 'ionKeyboardDidHide';
|
5 | const KEYBOARD_THRESHOLD = 150;
|
6 | let previousVisualViewport = {};
|
7 | let currentVisualViewport = {};
|
8 | let keyboardOpen = false;
|
9 |
|
10 |
|
11 |
|
12 | const resetKeyboardAssist = () => {
|
13 | previousVisualViewport = {};
|
14 | currentVisualViewport = {};
|
15 | keyboardOpen = false;
|
16 | };
|
17 | const startKeyboardAssist = (win) => {
|
18 | startNativeListeners(win);
|
19 | if (!win.visualViewport) {
|
20 | return;
|
21 | }
|
22 | currentVisualViewport = copyVisualViewport(win.visualViewport);
|
23 | win.visualViewport.onresize = () => {
|
24 | trackViewportChanges(win);
|
25 | if (keyboardDidOpen() || keyboardDidResize(win)) {
|
26 | setKeyboardOpen(win);
|
27 | }
|
28 | else if (keyboardDidClose(win)) {
|
29 | setKeyboardClose(win);
|
30 | }
|
31 | };
|
32 | };
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | const startNativeListeners = (win) => {
|
39 | win.addEventListener('keyboardDidShow', ev => setKeyboardOpen(win, ev));
|
40 | win.addEventListener('keyboardDidHide', () => setKeyboardClose(win));
|
41 | };
|
42 | const setKeyboardOpen = (win, ev) => {
|
43 | fireKeyboardOpenEvent(win, ev);
|
44 | keyboardOpen = true;
|
45 | };
|
46 | const setKeyboardClose = (win) => {
|
47 | fireKeyboardCloseEvent(win);
|
48 | keyboardOpen = false;
|
49 | };
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 | const keyboardDidOpen = () => {
|
63 | const scaledHeightDifference = (previousVisualViewport.height - currentVisualViewport.height) * currentVisualViewport.scale;
|
64 | return (!keyboardOpen &&
|
65 | previousVisualViewport.width === currentVisualViewport.width &&
|
66 | scaledHeightDifference > KEYBOARD_THRESHOLD);
|
67 | };
|
68 |
|
69 |
|
70 |
|
71 |
|
72 | const keyboardDidResize = (win) => {
|
73 | return keyboardOpen && !keyboardDidClose(win);
|
74 | };
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 | const keyboardDidClose = (win) => {
|
82 | return keyboardOpen && currentVisualViewport.height === win.innerHeight;
|
83 | };
|
84 |
|
85 |
|
86 |
|
87 | const fireKeyboardOpenEvent = (win, nativeEv) => {
|
88 | const keyboardHeight = nativeEv ? nativeEv.keyboardHeight : win.innerHeight - currentVisualViewport.height;
|
89 | const ev = new CustomEvent(KEYBOARD_DID_OPEN, {
|
90 | detail: { keyboardHeight }
|
91 | });
|
92 | win.dispatchEvent(ev);
|
93 | };
|
94 |
|
95 |
|
96 |
|
97 | const fireKeyboardCloseEvent = (win) => {
|
98 | const ev = new CustomEvent(KEYBOARD_DID_CLOSE);
|
99 | win.dispatchEvent(ev);
|
100 | };
|
101 |
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 | const trackViewportChanges = (win) => {
|
108 | previousVisualViewport = Object.assign({}, currentVisualViewport);
|
109 | currentVisualViewport = copyVisualViewport(win.visualViewport);
|
110 | };
|
111 |
|
112 |
|
113 |
|
114 |
|
115 | const copyVisualViewport = (visualViewport) => {
|
116 | return {
|
117 | width: Math.round(visualViewport.width),
|
118 | height: Math.round(visualViewport.height),
|
119 | offsetTop: visualViewport.offsetTop,
|
120 | offsetLeft: visualViewport.offsetLeft,
|
121 | pageTop: visualViewport.pageTop,
|
122 | pageLeft: visualViewport.pageLeft,
|
123 | scale: visualViewport.scale
|
124 | };
|
125 | };
|
126 |
|
127 | exports.KEYBOARD_DID_CLOSE = KEYBOARD_DID_CLOSE;
|
128 | exports.KEYBOARD_DID_OPEN = KEYBOARD_DID_OPEN;
|
129 | exports.copyVisualViewport = copyVisualViewport;
|
130 | exports.keyboardDidClose = keyboardDidClose;
|
131 | exports.keyboardDidOpen = keyboardDidOpen;
|
132 | exports.keyboardDidResize = keyboardDidResize;
|
133 | exports.resetKeyboardAssist = resetKeyboardAssist;
|
134 | exports.setKeyboardClose = setKeyboardClose;
|
135 | exports.setKeyboardOpen = setKeyboardOpen;
|
136 | exports.startKeyboardAssist = startKeyboardAssist;
|
137 | exports.trackViewportChanges = trackViewportChanges;
|