-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
264 lines (195 loc) · 7.25 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
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
const { select, input, checkbox } = require('@inquirer/prompts')
const fs = require("fs").promises
let mensagem = "Bem vindo(a) ao app de metas";
///abaixo é pra testar:
let metas
//verificar esta parte de carregar metas::
const carregarMetas = async () => {
try{
const dados = await fs.readFile("metas.json", "utf-8")
metas = JSON.parse(dados)
}
catch{erro} {
metas = []
}
}
const salvarMetas = async() => {
await fs.writeFile("metas.json", JSON.stringify(metas, null, 2))
}
const cadastrarMeta = async() => {
const meta = await input({ message: "Digite a meta:" })
//mesma coisa que o select, chamou na pasta, e espera agora o usuário colocar algo
//uso do legth fala se tem mais de um caractere! tipo, confirmar se o usuário colocou algo
if(meta.length == 0) {
mensagem = "A meta não pode ser vazia!"
return
}
//tendo algo, ele puxa pra metas (o array) o valor da meta, e lá depois, ele moctra as metas cadastradas.
metas.push(
{value: meta, checked: false}
)
mensagem = "Meta cadastrada com sucesso!"
}
const listarMetas = async() => {
if(metas.length == 0){
mensagem = "Não existem metas!"
return
}
const respostas = await checkbox({
message: "Use as setas para mudar de meta, o espaço para marcar ou desmarcar, e o enter para finalizar esta etapa.",
choices: [...metas], //cara isso é legal, ele meio que joga os valores da metas, com esses tres pontinhos, pois meio que fica mudando certo? por isso ele joga o que tem aqui!
instructions: false,
})
metas.forEach((m) =>{
m.checked = false
})
//para resolver o bug do metas, basicamente sõ coloquei o metas.foreath antes de verificar se há uma meta realizada!
if(respostas.length == 0) {
mensagem = "Nenhuma meta selecionada!"
return
}
//isso abaixo desmarca todas as metas, mas lembra que logfo abaixo colocou que as selecionadas "pemanecem selecionadas?" então ele desmarca as desmarcadsas em resumo, para não dar erro.
//para cada resposta:
respostas.forEach((resposta) => {
const meta = metas.find((m) => {
return m.value == resposta
})
//meio que ele ta fazendo assim, pra cada meta selecionada, ele guardou, e compara, tipo, tem duas medas, andar e correr, e selecionei correr, ele vai e compara a cada meta selecionada com as medas, tipo, correr é igual a andasr, não, volta pra la, andar é igual a andar, sim, dai ele troca o checked para veradeiro!
meta.checked = true
})
mensagem = "Meta(s) marcada(s) como concluída(s)!"
}
const metasRealizadas = async() => {
if(metas.length == 0){
mensagem = "Não existem metas!"
return
}
const realizadas = metas.filter((meta) => {
return meta.checked
})
if(realizadas.length == 0){
mensagem = "Não existem metas realizadas! D:"
return
}
await select({
message: "Metas realizadas: " + realizadas.length,
choices: [...realizadas]
})
//basicamente fazendo uma listinha das realizadas
// console.log(realizadas)
//esse filter é uma "HOF", ele sempre recebe uma função
}
const metasAbertas = async() => {
if(metas.length == 0){
mensagem = "Não existem metas!"
return
}
const abertas = metas.filter((meta) => {
return meta.checked != true
//lembra que etsa fun~]ao só recebe um valor que seja verdadeiro, ou seja, metaschecked é diferente de verdadeiiro? ou seja, ele vai ver cada meta, seu checked, se for verdadeiro, pula, se for falso, que é diferente de verdadeiro, ele retoma
})
if(abertas.length == 0){
mensagem = "Não existem metas abertas! :D"
return
}
await select ({
message: "Metas abertas: " + abertas.length,
choices: [...abertas]
})
}
const deletarMetas = async() => {
if(metas.length == 0){
mensagem = "Não existem metas!"
return
}
const metasDesmarcadas = metas.map((meta) => {
// o map altera de qualquer forma o array original!
return {value: meta.value, checked: false}
})
const itensADeletar = await checkbox({
message: "Selecione um item para deletar",
choices: [...metasDesmarcadas], //cara isso é legal, ele meio que joga os valores da metas, com esses tres pontinhos, pois meio que fica mudando certo? por isso ele joga o que tem aqui!
instructions: false,
})
if(itensADeletar.length == 0){
mensagem = "Nenhum item para deletar!"
return
}
itensADeletar.forEach((item) => {
metas = metas.filter((meta) => {
return meta.value != item
//só vai ficar na lista de metas aquilo não marcado
})
})
mensagem = "Meta(s) deletada(s) com sucesso!"
}
const mostrarMensagem = () => {
console.clear();
if(mensagem != ""){
console.log(mensagem)
console.log(" ")
mensagem = ""
}
}
const start = async() => {
await carregarMetas()
while(true){
mostrarMensagem()
await salvarMetas()
//esse await (pra funcionar, tenha o async na função) fala pro js, "espera, o usuário vai selecionar algo!"
const opcao = await select ({
message: "Menu >",
choices: [
//nome do value tem que ser identico com o do case!
{
name: "Cadastrar meta",
value: "cadastrar",
},
{
name: "Listar metas",
value: "listar"
},
{
name: "Metas realizadas",
value: "realizadas"
},
{
name: "Metas abertas",
value: "abertas"
},
{
name: "Deletar metas",
value: "deletar"
},
{
name: "Sair",
value: "sair"
}
]
})
///como está funcionando? Imagine o seguinte, a gente pegou o módulo do select, e esperou o usuário selecionar algo, se ele selecionou por exemplo cadastrar, opcao troca por cadastrar, e vai pro swith case, no cadastrar tem o caso de cadastrar, ele fasz o que tem, que fazer, terminando, volta no menu, e assim por diante.
// alterando a opcao com algum item abaixo, ele faz certa ação, mas toma cuidado que neste estado, se eu colocar em um, elke faz infinitamente:
switch(opcao){
case "cadastrar":
await cadastrarMeta()
///importante o uso este await!
break
case "listar":
await listarMetas()
break
case "realizadas":
await metasRealizadas()
break
case "abertas":
await metasAbertas()
break
case "deletar":
await deletarMetas()
break
case "sair":
console.log("Asta la vista, baby!")
return
}
}
}
start()