-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
126 lines (102 loc) · 2.95 KB
/
index.js
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
('use strict');
import './style.css';
// ^((\d+\.\d+)|(\d+))$
// function inputHandler(e) {
// if (!e.target.value) return;
// e.target.value = e.target.value
// .replaceAll(',', '.')
// .replaceAll(/[^0-9.]/gm, '')
// .replaceAll('.', (match, offset, str) =>
// offset > str.indexOf(match) ? '' : match
// );
// }
class ConverterModel {
#quoteAmount = 0;
#baseAmount = 0;
#basePrice = 0;
constructor(basePrice) {
this.#basePrice = basePrice;
}
setQuoteAmount(amount) {
this.#baseAmount = +(amount / this.#basePrice).toFixed(2);
this.#quoteAmount = +amount;
}
setBaseAmount(amount) {
this.#quoteAmount = +(amount * this.#basePrice).toFixed(2);
this.#baseAmount = +amount;
}
getQuoteAmount() {
return this.#quoteAmount;
}
getBaseAmount() {
return this.#baseAmount;
}
setBasePrice(price) {
this.#basePrice = +price;
}
}
class ConverterView {
#baseInput;
#quoteInput;
#totalInput;
constructor() {
this.#baseInput = document.createElement('input');
this.#baseInput.type = 'text';
this.#baseInput.inputMode = 'numeric';
this.#quoteInput = document.createElement('input');
this.#quoteInput.type = 'text';
this.#quoteInput.inputMode = 'numeric';
const baseInputlabel = document.createElement('label');
const quoteInputlabel = document.createElement('label');
baseInputlabel.innerHTML += 'EUR';
baseInputlabel.appendChild(this.#baseInput);
quoteInputlabel.innerHTML += 'RUB';
quoteInputlabel.appendChild(this.#quoteInput);
document.body.appendChild(baseInputlabel);
document.body.appendChild(quoteInputlabel);
}
setTotalInputValue(value) {
this.#totalInput.value = value || '';
}
setBaseInputValue(value) {
this.#baseInput.value = value || '';
}
setQuoteInputValue(value) {
if (!value) {
this.#quoteInput.value = '';
} else {
this.#quoteInput.value = value;
}
}
onBaseInputChange(callback) {
this.#baseInput.addEventListener('input', () => {
// validate
callback(this.#baseInput.value);
});
}
onQuoteInputChange(callback) {
this.#quoteInput.addEventListener('input', () => {
// validate
callback(this.#quoteInput.value);
});
}
}
class ConverterController {
#converter;
#converterView;
constructor(converter, converterView) {
this.#converter = converter;
this.#converterView = converterView;
this.#converterView.onBaseInputChange((inputValue) => {
this.#converter.setBaseAmount(inputValue);
this.#converterView.setQuoteInputValue(converter.getQuoteAmount());
});
this.#converterView.onQuoteInputChange((inputValue) => {
this.#converter.setQuoteAmount(inputValue);
this.#converterView.setBaseInputValue(converter.getBaseAmount());
});
}
}
const converterModel = new ConverterModel(62.68);
const converterView = new ConverterView();
const controller = new ConverterController(converterModel, converterView);