Web Developer Work - I
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
1.1 KiB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. import React, { useEffect } from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './StatusPortal.css';
  4. interface StatusPortalProps {
  5. status: 'success' | 'warning' | 'failed';
  6. message: string;
  7. onClose?: () => void;
  8. }
  9. const StatusPortal: React.FC<StatusPortalProps> = ({ status, message, onClose }) => {
  10. const portalRoot = document.getElementById('portal-root') || document.body;
  11. useEffect(() => {
  12. const timer = setTimeout(() => {
  13. if (onClose) onClose();
  14. }, 3000);
  15. return () => clearTimeout(timer);
  16. }, [onClose]);
  17. const getIcon = () => {
  18. switch (status) {
  19. case 'success':
  20. return '✔️';
  21. case 'warning':
  22. return '⚠️';
  23. case 'failed':
  24. return '❌';
  25. default:
  26. return '';
  27. }
  28. };
  29. return ReactDOM.createPortal(
  30. <div className={`status-container ${status}`}>
  31. <div className="icon">{getIcon()}</div>
  32. <div className="title">{status.charAt(0).toUpperCase() + status.slice(1)}</div>
  33. <div className="message">{message}</div>
  34. </div>,
  35. portalRoot
  36. );
  37. };
  38. export default StatusPortal;