데스크톱 앱 리프레시 기능 추가
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
import { useEffect, useRef } from 'react';
|
||||
import type { MenuPage } from '../components/TopMenuBar';
|
||||
|
||||
export const PAGE_REFRESH_EVENT = 'gc_page_refresh';
|
||||
|
||||
export type PageRefreshDetail = {
|
||||
page: MenuPage;
|
||||
ts: number;
|
||||
};
|
||||
|
||||
export function dispatchPageRefresh(page: MenuPage): void {
|
||||
window.dispatchEvent(new CustomEvent<PageRefreshDetail>(PAGE_REFRESH_EVENT, {
|
||||
detail: { page, ts: Date.now() },
|
||||
}));
|
||||
}
|
||||
|
||||
/** 현재 메뉴(또는 지정 목록)에서 새로고침 이벤트 수신 */
|
||||
export function usePageRefresh(
|
||||
page: MenuPage | readonly MenuPage[],
|
||||
onRefresh: () => void | Promise<void>,
|
||||
): void {
|
||||
const handlerRef = useRef(onRefresh);
|
||||
handlerRef.current = onRefresh;
|
||||
|
||||
useEffect(() => {
|
||||
const pages = Array.isArray(page) ? page : [page];
|
||||
const listener = (e: Event) => {
|
||||
const detail = (e as CustomEvent<PageRefreshDetail>).detail;
|
||||
if (!detail || !pages.includes(detail.page)) return;
|
||||
void handlerRef.current();
|
||||
};
|
||||
window.addEventListener(PAGE_REFRESH_EVENT, listener);
|
||||
return () => window.removeEventListener(PAGE_REFRESH_EVENT, listener);
|
||||
}, [page]);
|
||||
}
|
||||
Reference in New Issue
Block a user