E ai Matheus, tranquilo e vc?
import { logarTempoDeExecucao } from '../decorators/logar-tempo-de-execucao.js';
import { DiasDaSemana } from '../enums/dias-da-semana.js';
import { Negociacao } from '../models/negociacao.js';
import { Negociacoes } from '../models/negociacoes.js';
import { MensagemView } from '../views/mensagem-view.js';
import { NegociacoesView } from '../views/negociacoes-view.js';
export class NegociacaoController {
private inputData: HTMLInputElement;
private inputQuantidade: HTMLInputElement;
private inputValor: HTMLInputElement;
private negociacoes = new Negociacoes();
private negociacoesView = new NegociacoesView('#negociacoesView', true);
private mensagemView = new MensagemView('#mensagemView');
constructor() {
this.inputData = <HTMLInputElement>document.querySelector('#data');
this.inputQuantidade = document.querySelector('#quantidade') as HTMLInputElement;
this.inputValor = document.querySelector('#valor') as HTMLInputElement;
this.negociacoesView.update(this.negociacoes);
}
@logarTempoDeExecucao()
public adiciona(): void {
/*
Zé, você já viu isso?
*/
const negociacao = Negociacao.criaDe(
this.inputData.value,
this.inputQuantidade.value,
this.inputValor.value
);
if (!this.ehDiaUtil(negociacao.data)) {
this.mensagemView
.update('Apenas negociações em dias úteis são aceitas');
return ;
}
this.negociacoes.adiciona(negociacao);
this.limparFormulario();
this.atualizaView();
}
private ehDiaUtil(data: Date) {
return data.getDay() > DiasDaSemana.DOMINGO
&& data.getDay() < DiasDaSemana.SABADO;
}
private limparFormulario(): void {
this.inputData.value = '';
this.inputQuantidade.value = '';
this.inputValor.value = '';
this.inputData.focus();
}
private atualizaView(): void {
this.negociacoesView.update(this.negociacoes);
this.mensagemView.update('Negociação adicionada com sucesso');
}
}
import { logarTempoDeExecucao } from "../decorators/logar-tempo-de-execucao.js";
export abstract class View<T> {
protected elemento: HTMLElement;
private escapar = false;
constructor(seletor: string, escapar?: boolean) {
const elemento = document.querySelector(seletor);
if (elemento) {
this.elemento = elemento as HTMLElement;
} else {
throw Error(`Seletor ${seletor} não existe no DOM. Verifique`);
}
if (escapar) {
this.escapar = escapar;
}
}
@logarTempoDeExecucao()
public update(model: T): void {
let template = this.template(model);
if (this.escapar) {
template = template
.replace(/<script>[\s\S]*?<\/script>/, '');
}
this.elemento.innerHTML = template;
}
protected abstract template(model: T): string;
}
export function logarTempoDeExecucao() {
return function name( target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const metodoOriginal = descriptor.value;
descriptor.value = function(...args: any[]) {
const t1 = performance.now();
const retorno = metodoOriginal.apply(this, args);
const t2 = performance.now();
console.log(`O tempo de execução do método ${propertyKey.toLocaleUpperCase()} foi de: ${(t2-t1)/100} segundos`);
retorno;
}
}
}