diff --git a/src/app/(main)/m/orders/new/page.tsx b/src/app/(main)/m/orders/new/page.tsx index c375e24..05d5bfd 100644 --- a/src/app/(main)/m/orders/new/page.tsx +++ b/src/app/(main)/m/orders/new/page.tsx @@ -107,21 +107,25 @@ function ItemsBrowse() { }).catch(() => {}); }, []); - const fetchItems = useCallback(async () => { - setLoading(true); - const res = await fetch("/api/m/items/list", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - keyword: keyword.trim() || undefined, - saleEndDateFrom: endFrom || undefined, - saleEndDateTo: endTo || undefined, - forSale: true, - }), - }); - const j = await res.json(); - setItems(j.RESULTLIST ?? []); - setLoading(false); + // silent=true 면 로딩 인디케이터를 건드리지 않음 (백그라운드 폴링/탭 복귀 재조회용) + const fetchItems = useCallback(async (silent = false) => { + if (!silent) setLoading(true); + try { + const res = await fetch("/api/m/items/list", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + keyword: keyword.trim() || undefined, + saleEndDateFrom: endFrom || undefined, + saleEndDateTo: endTo || undefined, + forSale: true, + }), + }); + const j = await res.json(); + setItems(j.RESULTLIST ?? []); + } finally { + if (!silent) setLoading(false); + } }, [keyword, endFrom, endTo]); // 검색조건 변경 시 즉시 자동 조회 (디바운스 250ms) @@ -130,6 +134,25 @@ function ItemsBrowse() { return () => clearTimeout(t); }, [fetchItems]); + // 30초마다 조용히 재조회 — 관리자가 품목을 숨김/노출 변경하거나 재고가 변경되면 + // 로그아웃/새로고침 없이도 다른 사용자 화면에 반영. 검색 인디케이터는 깜빡이지 않게 silent. + useEffect(() => { + const t = setInterval(() => { fetchItems(true); }, 30000); + return () => clearInterval(t); + }, [fetchItems]); + + // 탭이 백그라운드에서 복귀(visibilitychange) 하거나 창에 다시 포커스 되면 즉시 재조회. + // 모바일 PWA 에서 잠깐 다른 앱 갔다 오면 30초 안 기다리고 바로 최신 목록 보이게. + useEffect(() => { + const onVis = () => { if (document.visibilityState === "visible") fetchItems(true); }; + document.addEventListener("visibilitychange", onVis); + window.addEventListener("focus", onVis); + return () => { + document.removeEventListener("visibilitychange", onVis); + window.removeEventListener("focus", onVis); + }; + }, [fetchItems]); + // 카트에 택배전용 품목이 있는지 const cartNeedsDelivery = useMemo( () => cart.some((c) => c.item.REQUIRES_DELIVERY === "Y"),