useAlert.jsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import React from "react";
  2. const AlertContext = React.createContext();
  3. export function AlertProvider(props) {
  4. const [open, setOpen] = React.useState(false);
  5. const [position, setPosition] = React.useState({
  6. vertical: "bottom",
  7. horizontal: "right",
  8. });
  9. const [severity, setSeverity] = React.useState("info");
  10. const [message, setMessage] = React.useState("");
  11. React.useEffect(() => {
  12. let mounted = true;
  13. if (mounted) {
  14. setTimeout(() => {
  15. setOpen(false);
  16. }, 5000);
  17. }
  18. return () => {
  19. mounted = false;
  20. };
  21. }, [open]);
  22. const showAlert = React.useCallback(
  23. ({ message, severity = "info", position = null }) => {
  24. setOpen(true);
  25. setMessage(message);
  26. setSeverity(severity);
  27. if (position) setPosition(position);
  28. },
  29. []
  30. );
  31. const memData = React.useMemo(() => {
  32. // const closeAlert = () => {
  33. // setOpen(false);
  34. // setTimeout(() => {
  35. // setPosition(defaultPlace);
  36. // setSeverity(defaultColor);
  37. // setIcon(defaultIcon);
  38. // setMessage(defaultMessage);
  39. // }, 2000);
  40. // };
  41. return {
  42. open,
  43. position,
  44. severity,
  45. message,
  46. showAlert,
  47. // closeAlert,
  48. };
  49. }, [open, position, severity, message, showAlert]);
  50. return <AlertContext.Provider value={memData} {...props} />;
  51. }
  52. export function useAlert() {
  53. const context = React.useContext(AlertContext);
  54. if (!context) {
  55. // eslint-disable-next-line no-throw-literal
  56. throw "error: alert context not defined.";
  57. }
  58. return context;
  59. }