-
Notifications
You must be signed in to change notification settings - Fork 0
/
challenge-28.js
182 lines (145 loc) · 4.42 KB
/
challenge-28.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/*
No HTML:
- Crie um formulário com um input de texto que receberá um CEP e um botão
de submit;
- Crie uma estrutura HTML para receber informações de endereço:
"Logradouro, Bairro, Estado, Cidade e CEP." Essas informações serão
preenchidas com os dados da requisição feita no JS.
- Crie uma área que receberá mensagens com o status da requisição:
"Carregando, sucesso ou erro."
No JS:
- O CEP pode ser entrado pelo usuário com qualquer tipo de caractere, mas
deve ser limpo e enviado somente os números para a requisição abaixo;
- Ao submeter esse formulário, deve ser feito um request Ajax para a URL:
"https://viacep.com.br/ws/[CEP]/json/", onde [CEP] será o CEP passado
no input criado no HTML;
- Essa requisição trará dados de um CEP em JSON. Preencha campos na tela
com os dados recebidos.
- Enquanto os dados são buscados, na área de mensagens de status, deve mostrar
a mensagem: "Buscando informações para o CEP [CEP]..."
- Se não houver dados para o CEP entrado, mostrar a mensagem:
"Não encontramos o endereço para o CEP [CEP]."
- Se houver endereço para o CEP digitado, mostre a mensagem:
"Endereço referente ao CEP [CEP]:"
- Utilize a lib DOM criada anteriormente para facilitar a manipulação e
adicionar as informações em tela.
*/
(function( DOM ) {
'use strict';
// Variables
var CEP_TOTAL_CHARACTERS_VALID = 8;
var ajax = new XMLHttpRequest();
var $form = new DOM('[data-form="cep"]');
var Cache = {
CEP: '',
};
// Events
$form.on('submit', sendFormCEP);
// Methods
function sendFormCEP( event ) {
event.preventDefault();
var $formCEP = event.target;
var $input = $formCEP.querySelector('[data-field="cep"]');
var cep = cleanCEP( $input.value );
Cache.CEP = cep;
if ( !isCEPValid(cep) ) {
showCEPNotFound();
return;
}
requestCEP( cep );
}
function cleanCEP( cep ) {
var regex = /\D/g;
return cep.replace(regex, '');
}
function isCEPValid( cep ) {
return cep.length === CEP_TOTAL_CHARACTERS_VALID;
}
function requestCEP( cep ) {
var url = getUrl(cep);
ajax.open('GET', url);
ajax.send();
showCEPStatus('loading');
ajax.addEventListener('readystatechange' , readyStateChange);
}
function getUrl( cep ) {
return 'https://viacep.com.br/ws/' + cep + '/json/';
}
function readyStateChange() {
if ( isRequestSuccess() ) {
notifyUser( ajax.responseText );
}
}
function isRequestSuccess() {
return ajax.readyState === 4 && ajax.status === 200;
}
function notifyUser( response ) {
var data = parserResponse( response );
if( !isResponseValid(data) ) {
showCEPNotFound();
return;
}
showCEPStatus('success');
showCEPInfo( data );
}
function parserResponse( response ) {
var data;
try {
data = JSON.parse( response );
} catch (e) {
console.log( e );
}
return data;
}
function isResponseValid( data ) {
return data && !data.hasOwnProperty('erro');
}
function showCEPInfo( data ) {
var $fieldsAddress = new DOM('[data-address]');
var infoCEP = {
cep: 'cep',
estado: 'uf',
cidade: 'localidade',
bairro: 'bairro',
logradouro: 'logradouro'
};
$fieldsAddress.forEach(function($field) {
var type = $field.dataset.address;
if ( infoCEP[type] ) {
$field.textContent = data[ infoCEP[type] ];
}
});
showWrapperCEPInfo();
}
function showCEPNotFound() {
hideWrapperCEPInfo();
showCEPStatus('error');
}
function showWrapperCEPInfo() {
var $wrapperInfo = getWrapperCEPInfo();
$wrapperInfo.style.display = 'block';
}
function hideWrapperCEPInfo() {
var $wrapperInfo = getWrapperCEPInfo();
$wrapperInfo.style.display = 'none';
}
function getWrapperCEPInfo() {
return new DOM('[data-feedback="cep-info"]').get()[0];
}
function getMessage( type ) {
var message = {
loading: replaceCEP('Buscando informações para o CEP [CEP]...'),
error: replaceCEP('Não encontramos o endereço para o CEP [CEP].'),
success: replaceCEP('Endereço referente ao CEP [CEP]:')
}
return message[ type ];
}
function replaceCEP( message ) {
return message.replace('[CEP]', Cache.CEP);
}
function showCEPStatus( type ) {
var message = getMessage( type );
var $wrapperStatus = new DOM('[data-feedback="status"]');
$wrapperStatus.get()[0].textContent = message;
}
})( DOM );