Source: surfaces/OpenToast.js

  1. import React, { useEffect, useState } from "react";
  2. import { connect } from "react-redux";
  3. import { appActions } from "../../redux";
  4. import { useToastContext } from "../../_core";
  5. import { Loading } from "../";
  6. import { Template } from "../templates";
  7. /**
  8. * Componente que muestra un Toast con un contenido sincrónico, mientras asincrónicamente se llama a una operación.
  9. * El Toast se mostrará durante un tiempo determinado o hasta recibir la respuesta.
  10. * Mientras se espera la respuesta se va a renderizar un Spinner.
  11. * @name Reactor.Components.Surfaces.Toast
  12. * @param {string} href Nombre de la operación que se va a llamar
  13. * @param {string} token Token si hay un flujo en ejecución
  14. * @param {number} [time = "4000"] Tiempo en ms que aparecerá el Toast
  15. * @class
  16. * @example
  17. * <toast href="MostrarResultadoDeposito" token="{{tokenOperacion}}" time="5000">
  18. * <div>Aguarde mientras procesamos la operación</div>
  19. * </toast>
  20. */
  21. const _OpenToast = ({getAsyncContent, token, href, children, time = 4000}) => {
  22. const { show, hide } = useToastContext();
  23. const [ data, setData ] = useState()
  24. useEffect(()=>{
  25. show({content: children});
  26. getAsyncContent(href, token, null).then(response => {
  27. setData(response.data.data);
  28. hide();
  29. })
  30. const timer = setTimeout(()=>hide(), time)
  31. return clearTimeout(timer);
  32. }, [])
  33. return <>{data ? <Template content={data}/> : <Loading/>}</>;
  34. }
  35. const mapStateToProps = (state) => {
  36. return state.app;
  37. }
  38. export const OpenToast = connect(mapStateToProps, appActions)(_OpenToast)