From 2dc57a4ee7c94a04663bfcc3aaf82ee8943f8478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A4=80=EC=98=81?= Date: Tue, 24 Mar 2026 20:30:36 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=EA=B4=91=EA=B3=A0=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=20=EC=B8=A1=EC=A0=95=20=EC=8B=9C=EA=B8=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/hooks/useAdvertisementInterval.ts | 40 ++++++++++----------- src/utils/hooks/useAdvertisements.ts | 2 ++ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/utils/hooks/useAdvertisementInterval.ts b/src/utils/hooks/useAdvertisementInterval.ts index f2becfc..be73929 100644 --- a/src/utils/hooks/useAdvertisementInterval.ts +++ b/src/utils/hooks/useAdvertisementInterval.ts @@ -1,4 +1,4 @@ -import { startTransition, useEffectEvent, useLayoutEffect, useState, type RefObject } from 'react'; +import { useEffectEvent, useLayoutEffect, useState, type RefObject } from 'react'; import { useLayoutElementsContext } from '@/contexts/useLayoutElementsContext'; const DEFAULT_ITEMS_PER_ADVERTISEMENT = 4; @@ -26,7 +26,10 @@ export const useAdvertisementInterval = ({ enabled, }: UseAdvertisementIntervalParams) => { const { mainRef, bottomNavRef } = useLayoutElementsContext(); - const [itemsPerAdvertisement, setItemsPerAdvertisement] = useState(DEFAULT_ITEMS_PER_ADVERTISEMENT); + const [itemsPerAdvertisement, setItemsPerAdvertisement] = useState(null); + const resetAdvertisementInterval = useEffectEvent(() => { + setItemsPerAdvertisement((previous) => (previous === null ? previous : null)); + }); const measureAdvertisementInterval = useEffectEvent(() => { const scrollContainer = mainRef.current; @@ -44,28 +47,21 @@ export const useAdvertisementInterval = ({ ? Math.max(0, secondItemRect.top - firstItemRect.top - firstItemRect.height) : DEFAULT_ITEM_GAP; const slotHeight = firstItemRect.height + gap; - - if (availableHeight <= 0 || slotHeight <= 0) { - startTransition(() => { - setItemsPerAdvertisement((previous) => - previous === DEFAULT_ITEMS_PER_ADVERTISEMENT ? previous : DEFAULT_ITEMS_PER_ADVERTISEMENT - ); - }); - return; - } - - const visibleSlotCount = Math.max(2, Math.floor((availableHeight + gap) / slotHeight)); - const nextItemsPerAdvertisement = Math.max(1, visibleSlotCount - 1); - - startTransition(() => { - setItemsPerAdvertisement((previous) => - previous === nextItemsPerAdvertisement ? previous : nextItemsPerAdvertisement - ); - }); + const nextItemsPerAdvertisement = + availableHeight <= 0 || slotHeight <= 0 + ? DEFAULT_ITEMS_PER_ADVERTISEMENT + : Math.max(1, Math.max(2, Math.floor((availableHeight + gap) / slotHeight)) - 1); + + setItemsPerAdvertisement((previous) => + previous === nextItemsPerAdvertisement ? previous : nextItemsPerAdvertisement + ); }); useLayoutEffect(() => { - if (!enabled) return; + if (!enabled) { + resetAdvertisementInterval(); + return; + } let frameId = 0; const scheduleMeasurement = () => { @@ -73,7 +69,7 @@ export const useAdvertisementInterval = ({ frameId = window.requestAnimationFrame(measureAdvertisementInterval); }; - scheduleMeasurement(); + measureAdvertisementInterval(); const visualViewport = window.visualViewport; const resizeObserver = diff --git a/src/utils/hooks/useAdvertisements.ts b/src/utils/hooks/useAdvertisements.ts index 86b2a24..d562c4a 100644 --- a/src/utils/hooks/useAdvertisements.ts +++ b/src/utils/hooks/useAdvertisements.ts @@ -29,9 +29,11 @@ export const useAdvertisements = ({ advertisementCount, scope }: UseAdvertisemen const advertisements: Advertisement[] = advertisementQueries .flatMap((query) => query.data?.advertisements ?? []) .slice(0, advertisementCount); + const isLoadingAdvertisements = advertisementQueries.some((query) => query.isPending); return { advertisements, + isLoadingAdvertisements, trackAdvertisementClick, }; }; From 0d7246f4a1b556267960b184df2490b4b4ba2c6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A4=80=EC=98=81?= Date: Tue, 24 Mar 2026 20:30:56 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EC=8A=A4=EC=BC=88=EB=A0=88?= =?UTF-8?q?=ED=86=A4=20UI=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Chat/index.tsx | 33 +++++++++++++++++-- .../ClubList/components/AdvertisementCard.tsx | 15 +++++++++ src/pages/Club/ClubList/index.tsx | 12 ++++--- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/pages/Chat/index.tsx b/src/pages/Chat/index.tsx index a8959cc..670cc11 100644 --- a/src/pages/Chat/index.tsx +++ b/src/pages/Chat/index.tsx @@ -142,6 +142,27 @@ function ChatAdvertisementListItem({ advertisement, onClick }: ChatAdvertisement ); } +function ChatAdvertisementListItemSkeleton() { + return ( +