diff --git a/com.twin.app.shoptime/src/App/deepLinkHandler.js b/com.twin.app.shoptime/src/App/deepLinkHandler.js index 40c822d3..2c29c925 100644 --- a/com.twin.app.shoptime/src/App/deepLinkHandler.js +++ b/com.twin.app.shoptime/src/App/deepLinkHandler.js @@ -85,6 +85,7 @@ export const handleDeepLink = (contentTarget) => (dispatch, _getState) => { patnrId: patnrId, chanId: chanId, shptmBanrTpNm: "LIVE", + modal: false, // DeepLink 진입 시 fullscreen으로 재생 // expsOrd: expsOrd, }; break; @@ -101,6 +102,7 @@ export const handleDeepLink = (contentTarget) => (dispatch, _getState) => { patnrId: patnrId, showId: showId, shptmBanrTpNm: "VOD", + modal: false, // DeepLink 진입 시 fullscreen으로 재생 // expsOrd: expsOrd, }; break; @@ -274,6 +276,18 @@ export const handleDeepLink = (contentTarget) => (dispatch, _getState) => { const action = panelName === panel_names.HOME_PANEL ? updateHomeInfo : pushPanel; + // 🔽 LS(Live Show) 또는 VS(VOD Show)인 경우 DeepLink 진입 플래그 설정 + if ((type === 'LS' || type === 'VS') && action === pushPanel) { + dispatch( + updateHomeInfo({ + name: panel_names.HOME_PANEL, + panelInfo: { + isDeepLinkEntry: true, // DeepLink PlayerPanel 진입 플래그 + }, + }) + ); + } + dispatch( action({ name: panelName, diff --git a/com.twin.app.shoptime/src/views/HomePanel/HomeBanner/HomeBanner.jsx b/com.twin.app.shoptime/src/views/HomePanel/HomeBanner/HomeBanner.jsx index 40141919..b5be5288 100644 --- a/com.twin.app.shoptime/src/views/HomePanel/HomeBanner/HomeBanner.jsx +++ b/com.twin.app.shoptime/src/views/HomePanel/HomeBanner/HomeBanner.jsx @@ -54,6 +54,9 @@ export default function HomeBanner({ const popupVisible = useSelector((state) => state.common.popup.popupVisible); const panels = useSelector((state) => state.panels.panels); + const isDeepLinkEntry = useSelector( + (state) => state.home.homeInfo?.panelInfo?.isDeepLinkEntry + ); // 🔽 useFocusHistory - 경량화된 범용 포커스 히스토리 const focusHistory = useFocusHistory({ enableLogging: true, @@ -164,10 +167,11 @@ export default function HomeBanner({ videoData = targetBannerData.bannerDetailInfos?.[0]; } - // DetailPanel이 떠 있는 동안에는 배너 자동 재생을 스킵 (PlayerPanel 모달 재설정 방지) + // 🔽 [251221] DetailPanel이나 DeepLink PlayerPanel이 떠 있으면 배너 자동 재생 스킵 const hasDetailPanel = panels.some((p) => p.name === panel_names.DETAIL_PANEL); + const hasPlayerPanel = panels.some((p) => p.name === panel_names.PLAYER_PANEL); - if (!hasDetailPanel && videoData && (videoData.shptmBanrTpNm === 'LIVE' || videoData.shptmBanrTpNm === 'VOD')) { + if (!hasDetailPanel && !hasPlayerPanel && !isDeepLinkEntry && videoData && (videoData.shptmBanrTpNm === 'LIVE' || videoData.shptmBanrTpNm === 'VOD')) { console.log('[HomeBanner] 초기 비디오 자동 재생:', defaultFocus); dispatch( @@ -185,7 +189,7 @@ export default function HomeBanner({ }) ); } - }, [bannerDataList, defaultFocus, dispatch, panels]); + }, [bannerDataList, defaultFocus, dispatch, panels, isDeepLinkEntry]); const renderItem = useCallback( (index, isHorizontal) => { diff --git a/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx b/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx index 37af3f0c..9310985c 100644 --- a/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx +++ b/com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx @@ -1126,6 +1126,9 @@ const HomePanel = ({ isOnTop, showGradientBackground = false }) => { const detailPanelClosedTime = useSelector( (state) => state.home.homeInfo?.panelInfo?.detailPanelClosedAt ); + const isDeepLinkEntry = useSelector( + (state) => state.home.homeInfo?.panelInfo?.isDeepLinkEntry + ); useEffect(() => { if (detailPanelClosed && isOnTop) { @@ -1137,6 +1140,13 @@ const HomePanel = ({ isOnTop, showGradientBackground = false }) => { // console.log('[HomePanel] *** videoPlayIntentRef.current:', videoPlayIntentRef.current); // console.log('[HomePanel] *** lastPlayedBannerIdRef.current:', lastPlayedBannerIdRef.current); + // 🔽 [251221] DeepLink로 PlayerPanel이 진입한 경우 자동 재생 스킵 + // (플래그 리셋은 PlayerPanel cleanup에서 처리하므로 여기서는 스킵만) + if (isDeepLinkEntry) { + dlog('[HomePanel] *** [DeepLink] isDeepLinkEntry=true 감지 - 자동 재생 스킵'); + return; + } + // 🔽 videoPlayIntentRef가 null인 경우: 비디오 재생 가능한 첫 번째 배너 찾기 if (!videoPlayIntentRef.current && bannerDataList) { dlog( @@ -1280,7 +1290,7 @@ const HomePanel = ({ isOnTop, showGradientBackground = false }) => { ); } } - }, [detailPanelClosed, isOnTop, bannerDataList, dispatch]); + }, [detailPanelClosed, isOnTop, bannerDataList, isDeepLinkEntry, dispatch]); // ======= // const justCameBack = !prevIsOnTopRef.current && isOnTop; diff --git a/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx b/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx index 8577c61e..c2ec759d 100644 --- a/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx +++ b/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx @@ -30,6 +30,7 @@ import { getMainLiveShow, getMainLiveShowNowProduct, } from '../../actions/mainActions'; +import { updateHomeInfo } from '../../actions/homeActions'; import * as PanelActions from '../../actions/panelActions'; import { updatePanel } from '../../actions/panelActions'; import { @@ -1170,6 +1171,7 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props if (!panelInfo.modal) { console.log('[PlayerPanel] popPanel - closeButtonHandler'); dispatch(PanelActions.popPanel()); + // 🔽 [251221] cleanup useEffect에서 isDeepLinkEntry 리셋 처리 dispatch(changeAppStatus({ cursorVisible: false })); //딮링크로 플레이어 진입 후 이전버튼 클릭시 @@ -1206,6 +1208,17 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props topPanel: panels[panels.length - 1]?.name, stack: panels.map((p) => p.name), }); + + // 🔽 [251221] PlayerPanel unmount 시 DeepLink 플래그 리셋 + dispatch( + updateHomeInfo({ + name: panel_names.HOME_PANEL, + panelInfo: { + isDeepLinkEntry: false, + }, + }) + ); + const topPanelName = panels[panels.length - 1]?.name; if ( panelInfo.modal && @@ -1219,7 +1232,7 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props Spotlight.focus('tbody'); } }; - }, [panelInfo?.modal, isOnTop, panels]); + }, [panelInfo?.modal, isOnTop, panels, dispatch]); useEffect(() => { if (showNowInfos && panelInfo.shptmBanrTpNm === 'LIVE') {