Criando um Sistema de Mensagens Reutilizáveis com Angular Material

Gabriel de Souza
4 min readSep 20, 2024

--

Vamos descobrir como criar um simples sistema de mensagem para exibir em suas aplicações Angular utilizando o Material Design. O objetivo é fornecer uma base sólida para a implementação de mensagens, aproveitando as facilidades oferecidas pelo Angular Material para uma experiência de usuário consistente, agradável e reutilizável em toda a aplicação.

Pré-requisitos

Antes de começar, é importante garantir que tenha as ferramentas necessárias instaladas no ambiente de desenvolvimento.

  • Node.js e NPM: Certifique-se de ter instalado o Node.js e do NPM em sua máquina. Neste artigo eu uso a versão 20.11.1 do Node.js e 10.2.4 do NPM.
  • Angular CLI: Utilizaremos o Angular CLI para gerar e gerenciar nosso projeto Angular. Instale-o globalmente utilizando o seguinte comando:
npm install -g @angular/cli

Criando o Projeto

Vamos começar criando um novo projeto Angular. Abra o terminal no diretório onde ficara o projeto e execute o seguinte comando:

ng new nome-do-projeto

OBS: Pode escolher qualquer opção durante a criação do projeto, pois não afetara a implementação do serviço de mensagem diretamente.

Adicionando o Pacote do Angular Material

O Angular possui um pacote chamado @angular/material, que fornece uma ampla gama de componentes e estilos baseados no Material Design do Google. Para adicionar este pacote ao nosso projeto, basta executar o seguinte comando:

ng add @angular/material

Criando os Arquivos

Agora que temos nosso projeto Angular configurado e o pacote do Angular Material adicionado, vamos criar os arquivos necessários para nosso serviço de mensagem. Usando o Angular CLI nós conseguimos gerar automaticamente os arquivos necessários.

1. Arquivo de Interface:

ng generate interface message/interface/message

2. Arquivo de Serviço:

ng generate service message/service/message

3. Arquivo de Componente:

ng generate component message/component/message

Implementação dos Arquivos

Neste ponto, temos os arquivos necessários gerados. Agora, vamos nos concentrar na implementação de cada um deles.

Interface

A interface de mensagem definirá a estrutura dos objetos de mensagem que nosso aplicativo utilizará. Isso nos ajudará a manter consistência e clareza em todo o código. No exemplo abaixo está uma interface bem simples, com apenas um valor que representa a mensagem a ser exibida, você pode alterar da forma que quiser para deixar mais completo.

export interface Message {
message: string;
}

Componente

Este componente será responsável por exibir as mensagens na interface do usuário. Podemos personalizá-lo de acordo com as necessidades do projeto e integrá-lo facilmente com o Material Design para obter um visual moderno e atraente.

  1. Arquivo: message.component.ts
import { Component, inject } from '@angular/core';
import {
MatSnackBarAction,
MatSnackBarActions,
MatSnackBarLabel,
MatSnackBarRef,
MAT_SNACK_BAR_DATA
} from '@angular/material/snack-bar';
import { MatButtonModule } from '@angular/material/button';
import { Message } from '../../interface/message';

@Component({
selector: 'app-message',
standalone: true,
imports: [
MatButtonModule,
MatSnackBarLabel,
MatSnackBarActions,
MatSnackBarAction,
],
templateUrl: './message.component.html',
styleUrl: './message.component.scss',
})
export class MessageComponent {
protected mensagemRef = inject(MatSnackBarRef);
protected message: Message = inject(MAT_SNACK_BAR_DATA);
}

2. Arquivo: message.component.html

<span class="message" matSnackBarLabel> {{ message.message }} </span>
<span matSnackBarActions>
<button
mat-button
matSnackBarAction
(click)="mensagemRef.dismissWithAction()">
Yes
</button>
<button
mat-button matSnackBarAction
(click)="mensagemRef.dismiss()">
No
</button>
</span>

3. Arquivo: message.component.scss

:host {
display: flex;
}
.message {
color: hotpink;
}

Service

Esta service será responsável por gerenciar a lógica relacionada às mensagens desta aplicação.

import { Injectable, inject } from '@angular/core';
import { Message } from '../interface/message';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MessageComponent } from '../component/message/message.component';

@Injectable({
providedIn: 'root',
})
export class MessageService {
protected messageBar = inject(MatSnackBar);
public openMessageBar(message: Message) {
const messageRef = this.messageBar.openFromComponent(
MessageComponent,
{
duration: 5000,
verticalPosition: 'bottom',
horizontalPosition: 'center',
data: message,
}
);
return messageRef;
}
}

Nesta service é criado uma função para exibir a mensagem. O método ‘openFromComponent’ do MatSnackBar possuí algumas configurações extras como duração da mensagem, posição na tela e dados que poderão ser usados no componente de mensagem.

Resultado

Para ver se está funcionando, implemente o MessageService e Message Interface no componente que deseja com um botão para exibir a mensagem:

import { Component, inject } from '@angular/core';
import { MessageService } from './message/service/message.service';
import { Message } from './message/interface/message';

@Component({
selector: 'app-root',
standalone: true,
imports: [],
template: `
<button (click)="openMessage(this.actionMessage)">Open Message</button>
`,
styles: ''
})
export class AppComponent {
protected messageService = inject(MessageService);

protected actionMessage: Message = {
message: 'Make an Action? '
}

openMessage(message: Message) {
const messageRef = this.messageService.openMessageBar(message);

messageRef.afterOpened().subscribe(() => {
console.log('The Message has Opened!');
});

messageRef.onAction().subscribe(() => {
console.log('An Action as Activated!');
});

messageRef.afterDismissed().subscribe(() => {
console.log('The Message has Closed!');
});
}

}

O método ‘afterOpened’ é acionado quando a mensagem é exibida na tela, ‘onAction’ é acionado quando o usuário pressiona o botão de ação do componente e o método ‘afterDismissed’ é disparado quando a mensagem para de ser exibida, seja por tempo ou por ação do usuário.

message component bar with ‘make an action?’ text
Show Message Component
message component actions printed on console
Message Component Actions

Conclusão

Seguindo os passos acima, você aprendeu como criar um serviço de mensagem no Angular, utilizando o Material Design para uma experiência visualmente agradável e reutilizável em qualquer parte do projeto.

Informações Adicionais

Quero deixar claro que não sou especialista no assunto. Se cometi algum erro ou passei informações incorretas, fique à vontade para corrigir. Também estou aberto a sugestões de melhoria ou qualquer feedback que me ajude a melhorar.

Minhas Redes

GitHub: https://github.com/sougabriel

LinkedIn: https://www.linkedin.com/in/sougabriels/

--

--

Gabriel de Souza
Gabriel de Souza

Written by Gabriel de Souza

Apenas escrevo algumas coisas que aprendi durante minha jornada como desenvolvedor, nada de mais! Eu sempre busco me aprimorar e seu feedback pode me ajudar.

No responses yet