-> 서버시간을 굳이 가져올필요는 없는듯 그냥 로컬환경 시간을 참고해서 핸드폰시간이 잘 맞기를 바라는 수밖에...^^
const now = new Date();
const nextDayMidnight = new Date(now);
nextDayMidnight.setDate(now.getDate() + 1);
nextDayMidnight.setHours(0, 0, 0, 0);
const ms = nextDayMidnight.getTime() - now.getTime(); //자정까지 남은 ms
const getUser = setTimeout(async () => {
console.log('자정에 실행!');
try {
const response = await userApi(user.id);
setUser({...user, response});
} catch (e) {
console.log(e.toJSON());
}
}, ms);
import {useEffect, useContext, useState} from 'react';
import {UserContext} from '../contexts/UserContext';
import {userApi} from '../lib/user';
function useMidnightGetUser() {
const {user, setUser} = useContext(UserContext);
useEffect(() => {
const now = new Date();
const nextDayMidnight = new Date(now);
nextDayMidnight.setDate(now.getDate() + 1);
nextDayMidnight.setHours(0, 0, 0, 0);
const ms = nextDayMidnight.getTime() - now.getTime();
const getUser = setTimeout(async () => {
try {
const response = await userApi(user.id);
setUser({...user, response});
} catch (e) {
console.log(e.toJSON());
}
}, ms);
return () => {
clearTimeout(getUser);
};
}, [user]);
}
export default useMidnightGetUser;
-> 이 hook을 RootStack에 실행시켜줬다.
문제
위의 hook은 앱이 로딩되고 한번만 사용이 가능한것...만약 앱을 종료하지않고 백그라운드에서 켜져있을경우 함수가 실행되지 않는다...
참고
Headless JS <- 얘는 백그라운드에서도 동작하게 하는거...
const [isActive, setIsActive] = useState(true);
useEffect(() => {
const changeAppState = AppState.addEventListener('change', nextAppState => {
nextAppState === 'active' ? setIsActive(true): setIsActive(false);
}
});
return () => changeAppState.remove();
}, []);
useMidnightGetUser(isActive);
위와같이 코드를 작성할경우 백그라운드에서는 setTimeout이 제대로 실행되지 않음
자동으로 isActive가 변하는걸 참조하여 true일때만 자정까지 카운트다운하여 함수가 실행되게 됨
-> TODO : 실행감지 함수를 hook으로 만들기