xyzcode
xyzcode

Reputation: 219

useEffect with setTimeout/setInterval to dismiss alerts

I'm trying to get each alert dismissed after some time passes but when I try calling setTimeout/Interval in useEffect, my alerts dont display or dismiss properly. As it stands now, theres always one alert that doesnt get dismissed because allAlerts isnt consistently updated. How can I add setTimeout or setInterval to run my checkAlertTimes function after useEffect has stopped updating?

const [filteredAlerts, setFilteredAlerts] = useState()
const checkAlertTimes = () => {
    const currentTime = new Date().getTime()
    setFilteredAlerts(alertsToday.filter(alert => {
      const alertTime = alert.date.getTime()
      const secondsPassed = (currentTime - alertTime) /1000
      if (secondsPassed < 30){return alert}
    }))
  }

  useEffect(() => {
      checkAlertTimes()
  },[allAlerts])

  return (
    <div>{//map through and show alerts}</div>
  )

Upvotes: 2

Views: 278

Answers (1)

Taghi Khavari
Taghi Khavari

Reputation: 6582

From where I see you need something like this:

const [filteredAlerts, setFilteredAlerts] = useState();
const checkAlertTimes = () => {
  const currentTime = new Date().getTime();
  setFilteredAlerts(
    alertsToday.filter((alert) => {
      const alertTime = alert.date.getTime();
      const secondsPassed = (currentTime - alertTime) / 1000;
      if (secondsPassed < 30) {
        return alert;
      }
    })
  );
};

useEffect(() => {
  const interval = setInterval(() => {
    checkAlertTimes();
  }, 1000);
  return () => clearInterval(interval);
}, [allAlerts, alertsToday]);

return (
  <div>
    {
      //map through and show alerts
    }
  </div>
);

Upvotes: 1

Related Questions