Estoy creando una función de cierre de sesión automático (que debe cerrarse todos los días a las 9 a. m.) en mi aplicación nativa de reacción, por lo que se me ocurrió la lógica:
Entonces, lo que estoy haciendo es, digamos que tengo mi componente de pila principal, dentro de useEffect, supongamos que la aplicación se acaba de abrir, verificaré si tengo lastRunTime guardado en async-storage , si es cierto, entonces crearé un nuevo objeto de fecha que apunta a la fecha actual de hoy, luego, si las 9:00 a.m. se encuentran entre estas 2 horas, cerraré la sesión y estableceré lastRunTime como Date.now().toString() en async-storage .
// auto-logout at 9 am everyday useEffect(() => { const lastRunTime = AsynStorage.getItem('lastRunTime'); if (lastRunTime) { const justOpened = new Date(); const lastOpened = new Date(lastRunTime); if (9 <= justOpened.getHours() && 9 >= lastOpened.getHours()) { logout(); AsynStorage.setItem('lastRunTime', now.toString()); } } else { console.log('9 am not in time range'); AsynStorage.setItem('lastRunTime', new Date().toString()); } }, []); Pero no da el resultado correcto, siempre imprime console.log('9 am not in time range'); aunque proporcioné la fecha de ayer y Date.now() .
const lastOpened = new Date(2022, 1, 21, 18, 0); // yesterday's 6 pm const justOpened = new Date(); // right now // now obviously today's 9 am was in between the 2 time intervals, but still it logs: console.log('9 am not in time range');¿Puede alguien ayudarme aquí?
En primer lugar, solo para aclarar, useEffect(() => {...}, []) solo se ejecuta una vez, cuando crea el componente. Se puede considerar como un equivalente del componentDidMount de la terminología más antigua.
Por lo tanto, si desea cerrar la sesión del usuario a las 9, si el usuario abre su aplicación a las 8:59 y espera hasta las 9:01, no se cerrará la sesión, porque useEffect se ejecutó a las 8:59 . Puede resolver este problema con cualquier tipo de intervalo y verificar periódicamente si la hora es más de las 9:00.
La solución más ideal sería manejar esta función de cierre de sesión en el backend, si tiene control sobre el backend, ya que eso tiene la mayor certeza de que si el backend está en línea y la lógica es correcta, su usuario será desconectado.
La segunda solución más ideal sería tener algún tipo de tarea en segundo plano programada en su aplicación, que asegure que el usuario cierre la sesión, independientemente de si su aplicación está abierta.
La tercera solución más ideal es usar algún tipo de intervalo como expliqué anteriormente, pero eso solo funciona si la aplicación está abierta.
if (9 <= justOpened.getHours() && 9 >= lastOpened.getHours()) { Esto si es incorrecto, porque digamos, lastOpened.getHours es 17 (abrí la aplicación ayer a las 17:00), no me desconectaré, porque 9 >= 17 es false . Puede usar alguna biblioteca de manejo de fechas como date-fns o moment (menos recomendado debido a que no usa objetos de fecha simples) para facilitar el manejo de fechas, verifique si su fecha actual es posterior a las 9:00 de hoy y si su lastRunTime es anterior a su fecha actual .