Skip to content

Window Focus Refetching

설명

브라우저의 focus 상태가 변경될 때 상태를 다시 조회하는 로직을 구현해봅시다.

요구사항

  • 브라우저의 focus 상태가 변경될 때 Query의 fetch 메소드가 호출됩니다.

해결방안

QueryCache

QueryCache는 Query 목록을 관리하고 있습니다. 다음과 같이 Query 목록을 조회 후 fetch 발생시키는 onFocus 메소드를 구현해봅시다.

jsx
class QueryCache {
  // ...
  getAll = () => {
    const queries = this.queries.values();

    return [...queries];
  };

  onFocus = () => {
    const queries = this.getAll();

    queries.forEach((query) => {
      query.fetch();
    });
  };
}

QueryClientProvider

focus 상태 변경에 대한 감지는 document 객체의 visibilitychange 이벤트를 기반으로 감지할 수 있습니다.

visibilitychange 이벤트가 발생할 때 document.visibilityState !== hidden 인 경우, 브라우저의 focus가 다시 활성화된 상태로 판단할 수 있습니다. 브라우저의 focus가 다시 활성화된 경우, QueryCache의 focus 메소드를 호출하여 활성화 된 Query들에게 fetch를 발생시킬 수 있다.

jsx
export const QueryClientProvider = ({ children, client }) => {
  useEffect(() => {
    const cache = client.getQueryCache();

    const onFocus = () => {
      const isFocused = document.visibilityState !== "hidden";

      if (isFocused) {
        cache.onFocus();
      }
    };

    window.addEventListener("visibilitychange", onFocus, false);
    window.addEventListener("focus", onFocus, false);

    return () => {
      window.removeEventListener("visibilitychange", onFocus, false);
      window.removeEventListener("focus", onFocus, false);
    };
  }, [client]);

  return <QueryClientContext.Provider value={client}>{children}</QueryClientContext.Provider>;
};