diff --git a/com.twin.app.shoptime/src/actions/playActions.js b/com.twin.app.shoptime/src/actions/playActions.js index 716fc317..5bcd54a0 100644 --- a/com.twin.app.shoptime/src/actions/playActions.js +++ b/com.twin.app.shoptime/src/actions/playActions.js @@ -112,16 +112,17 @@ export const startVideoPlayer = ); console.log('[startVideoPlayer] ✨ Panel action dispatched'); - if (modal && modalContainerId && !spotlightDisable) { - console.log('[startVideoPlayer] 🎯 Setting Spotlight focus - containerId:', modalContainerId); - Spotlight.setPointerMode(false); - startVideoFocusTimer = setTimeout(() => { - console.log('[startVideoPlayer] 🔍 Spotlight.focus called'); - Spotlight.focus(modalContainerId); - }, 0); - } else { - console.log('[startVideoPlayer] ⏭️ Spotlight focus skipped - modal:', modal, ', modalContainerId:', !!modalContainerId, ', spotlightDisable:', spotlightDisable); - } + // [COMMENTED OUT] 비디오 재생 시 강제 포커스 이동 비활성화 + // if (modal && modalContainerId && !spotlightDisable) { + // console.log('[startVideoPlayer] 🎯 Setting Spotlight focus - containerId:', modalContainerId); + // Spotlight.setPointerMode(false); + // startVideoFocusTimer = setTimeout(() => { + // console.log('[startVideoPlayer] 🔍 Spotlight.focus called'); + // Spotlight.focus(modalContainerId); + // }, 0); + // } else { + // console.log('[startVideoPlayer] ⏭️ Spotlight focus skipped - modal:', modal, ', modalContainerId:', !!modalContainerId, ', spotlightDisable:', spotlightDisable); + // } console.log('[startVideoPlayer] ✅ END'); }; @@ -229,16 +230,17 @@ export const startVideoPlayerNew = ); console.log('[startVideoPlayerNew] *** ✨ Panel action dispatched - action:', panelWorkingAction === updatePanel ? 'updatePanel' : 'pushPanel'); - if (modal && modalContainerId && !spotlightDisable) { - console.log('[startVideoPlayerNew] *** 🎯 Setting Spotlight focus - containerId:', modalContainerId); - Spotlight.setPointerMode(false); - startVideoFocusTimer = setTimeout(() => { - console.log('[startVideoPlayerNew] *** 🔍 Spotlight.focus called'); - Spotlight.focus(modalContainerId); - }, 0); - } else { - console.log('[startVideoPlayerNew] *** ⏭️ Spotlight focus skipped - modal:', modal, ', modalContainerId:', !!modalContainerId, ', spotlightDisable:', spotlightDisable); - } + // [COMMENTED OUT] 비디오 재생 시 강제 포커스 이동 비활성화 + // if (modal && modalContainerId && !spotlightDisable) { + // console.log('[startVideoPlayerNew] *** 🎯 Setting Spotlight focus - containerId:', modalContainerId); + // Spotlight.setPointerMode(false); + // startVideoFocusTimer = setTimeout(() => { + // console.log('[startVideoPlayerNew] *** 🔍 Spotlight.focus called'); + // Spotlight.focus(modalContainerId); + // }, 0); + // } else { + // console.log('[startVideoPlayerNew] *** ⏭️ Spotlight focus skipped - modal:', modal, ', modalContainerId:', !!modalContainerId, ', spotlightDisable:', spotlightDisable); + // } console.log('[startVideoPlayerNew] *** ✅ END'); }; diff --git a/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx b/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx index 7c753494..a873a105 100644 --- a/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx +++ b/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx @@ -108,6 +108,7 @@ const HomePanel = ({ isOnTop }) => { const webOSVersion = useSelector((state) => state.common.appStatus?.webOSVersion); const enterThroughGNB = useSelector((state) => state.home.enterThroughGNB); const defaultFocus = useSelector((state) => state.home.defaultFocus); + const bannerDataList = useSelector((state) => state.home.bannerData?.bannerInfos); // ✅ PlayerPanel의 shouldShrinkTo1px 상태 추적 const playerPanelShouldShrink = useSelector((state) => { @@ -763,7 +764,67 @@ const HomePanel = ({ isOnTop }) => { console.log('[HomePanel] *** videoPlayIntentRef.current:', videoPlayIntentRef.current); console.log('[HomePanel] *** lastPlayedBannerIdRef.current:', lastPlayedBannerIdRef.current); - // [TODO] DetailPanel 닫힘 후 비디오 자동 재생 복구 + // 🔽 videoPlayIntentRef가 null인 경우: 비디오 재생 가능한 첫 번째 배너 찾기 + if (!videoPlayIntentRef.current && bannerDataList) { + console.log('[HomePanel] *** videoPlayIntentRef가 null - 첫 번째 비디오 배너 검색'); + + // HomeBanner.jsx의 defaultFocus 계산 로직과 동일 + let targetIndex = 0; + let targetBannerData = null; + let videoData = null; + + for (let i = 0; i < bannerDataList.length; i++) { + const data = bannerDataList[i]; + const bannerDetailInfos = data.bannerDetailInfos; + + if (data.shptmDspyTpNm === 'Random') { + if ( + bannerDetailInfos[data.randomIndex].shptmBanrTpNm === 'LIVE' || + bannerDetailInfos[data.randomIndex].shptmBanrTpNm === 'VOD' + ) { + targetIndex = i; + targetBannerData = data; + videoData = bannerDetailInfos[data.randomIndex]; + break; + } + } else if ( + bannerDetailInfos.find((el) => el.shptmBanrTpNm === 'LIVE' || el.shptmBanrTpNm === 'VOD') + ) { + targetIndex = i; + targetBannerData = data; + videoData = bannerDetailInfos[0]; + break; + } + } + + if (targetBannerData && videoData) { + const bannerId = 'banner' + targetIndex; + console.log('[HomePanel] *** 찾은 비디오 배너:', bannerId, videoData); + + // videoPlayIntentRef에 값 할당 (HomeBanner.jsx의 초기 재생 로직과 동일) + videoPlayIntentRef.current = { + bannerId: bannerId, + videoProps: { + bannerId: bannerId, + showUrl: videoData.showUrl, + patnrId: videoData.patnrId, + showId: videoData.showId, + shptmBanrTpNm: videoData.shptmBanrTpNm, + lgCatCd: videoData.lgCatCd, + chanId: videoData.brdcChnlId, + modal: true, + modalContainerId: bannerId, + }, + }; + + lastPlayedBannerIdRef.current = bannerId; + console.log('[HomePanel] *** videoPlayIntentRef 설정 완료:', videoPlayIntentRef.current); + } else { + console.log('[HomePanel] *** ⚠️ 비디오 재생 가능한 배너를 찾지 못함'); + } + } + + // DetailPanel 닫힘 후 비디오 자동 재생 복구 if (videoPlayIntentRef.current && lastPlayedBannerIdRef.current) { // 🔽 videoPlayIntentRef는 videoProps에 비디오 정보를 담고 있으므로 풀어서 전달 // 혹시 videoProps에 없는 필드는 상위 레벨을 fallback으로 사용 @@ -772,7 +833,7 @@ const HomePanel = ({ isOnTop }) => { // 🔽 [251118] 현재 스크롤 위치 확인하여 비디오 크기 결정 const currentScrollTop = prevScrollTopRef.current; - const shouldShrink = currentScrollTop > 1; + const shouldShrink = currentScrollTop > 0; console.log('[HomePanel] *** 비디오 복구 - currentScrollTop:', currentScrollTop, ', shouldShrink:', shouldShrink); dispatch( @@ -812,7 +873,7 @@ const HomePanel = ({ isOnTop }) => { lastPlayedBannerIdRef.current = null; } } - }, [detailPanelClosedTime, isOnTop]); + }, [detailPanelClosedTime, isOnTop, bannerDataList, dispatch]); useEffect(() => { return () => {