Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

React: Reutilizar Alertas

Boa tarde, Esto tentando deixar meus Alertas reutilizáveis hoje toda tela de exercício que faço que preciso mandar um Alerta para o usuário por exemplo: "ERRO: Campo nome do banco está em branco". Eu importo os componentes e faço os alertas no próprio arquivo, por exemplo.

//Banco.js

import React, { Component } from 'react';
import { ToastContainer, toast } from 'react-toastify';

export default class Banco extends Component {

//Outros metodos

    notify = (type, msg) => {
        if (!toast.isActive(this.toastId)) {
            switch (type) {
                case 'codigo':
                    this.toastId = toast.error('CODIGO está em BRANCO', {
                        position: toast.POSITION.TOP_RIGHT,
                        autoClose: 3000
                    });
                    break;
                default:
                // do nothing
            }
        }
}
validaCadastro = () => {
   if (this.state.banco.codigo.length === 0) {
            this.notify('codigo', '');
            return;
        }
}
//Mais codigo
  render() {
         return (
// Mais codigo
         <ToastContainer  
          hideProgressBar={true}
          newestOnTop={true}
                    />
   );
}

Não teria uma maneira de passar os atributos que preciso que tenha no alerta por meio de Props ? Pois fiz isso com um modal:

//Modal.js

import React from 'react';
import { Container, Modal, ModalBody, ModalHeader, ModalFooter } from 'mdbreact';
class MyModal extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            modal: false,
            selectedOption: '',
        };
    }
    render() {
        return (
            <Container>
                <Modal size={this.props.tamanho} isOpen={this.props.modal}>
                    <ModalHeader className="modalHeader" toggle={this.toggle}>{this.props.ModalHeader}</ModalHeader>
                    <ModalBody className="modalBody">
                        {this.props.children}
                    </ModalBody>
                    <ModalFooter className="modalFooter">
                        {this.props.primeiroButton}
                        {this.props.segundoButton}
                        {this.props.terceiroButton}
                    </ModalFooter>
                </Modal>
            </Container>
        );
    }
}

export default MyModal;

E venho utilizando a mesma logica com mais componentes que utilizo em outras telas:

import React, { Component } from 'react';
import './CSS/Switch.css';
export default class Switch extends Component {
    render() {
        return (
            <div>
                <div onChange={this.props.onChange} className="switch teal-switch">
                    <label>
                        {this.props.firstOption}
                        <input defaultChecked={this.props.checked} type="checkbox"/>
                        <span className="lever"></span>
                        {this.props.secondOption}
                    </label>
                </div>
            </div>
        );
    }
}

Porem fazendo com o Alerta não consigo passar os atributos, estou tentando algo como:

//Alerts.js

import React, { Component } from 'react';
import { ToastContainer, toast } from 'react-toastify';
class Alerts extends Component {
    constructor(){
        super();
        this.State = {
        color:'',
        mensagem:'',
        }
    }
    notify(type) {
        return () => {
            switch (type) {
                case 'info':
                    toast.info('Info message', {
                        autoClose: 3000
                    });
                    break;
                case 'success':
                    toast.success('Success message', {
                        position: toast.POSITION.TOP_RIGHT,
                    });
                    break;
                case 'warning':
                    toast.warn('Warning message');
                    break;
                case 'error':
                    toast.error('Error message');
                    break;
            }
        };
    };
    render() {
        return (
            <div>
                <ToastContainer
                    hideProgressBar={true}
                    newestOnTop={true}
                    autoClose={5000}
                />
            </div>
        );
    }
}
export default Alerts;

Mas não faço ideia de como passar os valores para ele, de outra classe.

2 respostas

Fala Denis, tudo bom?

Notei que no seu constructor:

você está com o this.State em maiusculo, isso poderia estar influenciando de alguma forma?

        super();
        this.State = {
        color:'',
        mensagem:'',
        }

Com relação aos valores, uma dica é tenta antes de pensar na lógica do componente pensa em como você vai utilizar ele na sua aplicação.

Ex:

<Alerts listaDeAlerts={['Alerta 1', 'Alerta 2', 'Alerta 3']}>

Dado isso, você internamente teria que pegar a propsListaDeAlerts e fazer aparecer um elemento para cada item.

Esses itens podem ser objetos e você poderia criar configurações específicas e assim por diante.

Fez sentido?

solução!

Bom dia Mario, Obrigado pela resposta, acredito que meu maior problema esta sendo em entender como posso passar alguma informação do arquivo Banco.js para Alerts.js