[251122] fix: PlayerPanel 비디오 선택시 tabIndexV2 타이머 초기화

🕐 커밋 시간: 2025. 11. 22. 05:04:30

📊 변경 통계:
  • 총 파일: 1개
  • 추가: +14줄
  • 삭제: -5줄

📝 수정된 파일:
  ~ com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx
This commit is contained in:
2025-11-22 05:04:30 +09:00
parent 8cce06bcc3
commit cf2cc57d95

View File

@@ -63,10 +63,7 @@ import TabContainerV2 from './PlayerTabContents/v2/TabContainer.v2';
// import ShopNowContainer from './PlayerTabContents/v2/ShopNowContainer'; // import ShopNowContainer from './PlayerTabContents/v2/ShopNowContainer';
// import ShopNowButton from './PlayerTabContents/v2/ShopNowButton'; // import ShopNowButton from './PlayerTabContents/v2/ShopNowButton';
const Container = SpotlightContainerDecorator( const Container = SpotlightContainerDecorator({ enterTo: 'last-focused', preserveId: true }, 'div');
{ enterTo: 'last-focused', preserveId: true },
'div'
);
const findSelector = (selector, maxAttempts = 5, currentAttempts = 0) => { const findSelector = (selector, maxAttempts = 5, currentAttempts = 0) => {
try { try {
@@ -394,10 +391,16 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
// 포커스 복원 로직 추가 (1000ms 지연) // 포커스 복원 로직 추가 (1000ms 지연)
if (panelInfo.lastFocusedTargetId) { if (panelInfo.lastFocusedTargetId) {
console.log('[PlayerPanel] 🎯 DetailPanel 복귀 후 1000ms 지연 포커스 복원 예약:', panelInfo.lastFocusedTargetId); console.log(
'[PlayerPanel] 🎯 DetailPanel 복귀 후 1000ms 지연 포커스 복원 예약:',
panelInfo.lastFocusedTargetId
);
const focusTimeoutId = setTimeout(() => { const focusTimeoutId = setTimeout(() => {
console.log('[PlayerPanel] 🔍 DetailPanel 복귀 후 포커스 복원 실행:', panelInfo.lastFocusedTargetId); console.log(
'[PlayerPanel] 🔍 DetailPanel 복귀 후 포커스 복원 실행:',
panelInfo.lastFocusedTargetId
);
Spotlight.focus(panelInfo.lastFocusedTargetId); Spotlight.focus(panelInfo.lastFocusedTargetId);
}, 1000); }, 1000);
@@ -453,13 +456,16 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
prevModalState, prevModalState,
currentModalState, currentModalState,
shouldExecuteTrueToFalse: prevModalState === true && currentModalState === false, shouldExecuteTrueToFalse: prevModalState === true && currentModalState === false,
shouldExecuteFalseToTrue: prevModalState === false && currentModalState === true shouldExecuteFalseToTrue: prevModalState === false && currentModalState === true,
}); });
// true → false 변화 감지 // true → false 변화 감지
if (prevModalState === true && currentModalState === false) { if (prevModalState === true && currentModalState === false) {
console.log('[PlayerPanel] ▶️ Modal 상태 변화: true → false (전체화면 모드로 복귀)'); console.log('[PlayerPanel] ▶️ Modal 상태 변화: true → false (전체화면 모드로 복귀)');
console.log('[PlayerPanel] 🎯 포커스 복원 준비 - lastFocusedTargetId:', panelInfo?.lastFocusedTargetId); console.log(
'[PlayerPanel] 🎯 포커스 복원 준비 - lastFocusedTargetId:',
panelInfo?.lastFocusedTargetId
);
setIsModalClosed(true); // 모달이 닫혔음을 표시 setIsModalClosed(true); // 모달이 닫혔음을 표시
// DetailPanel에서 복귀 시 포커스 복원 // DetailPanel에서 복귀 시 포커스 복원
@@ -1217,7 +1223,13 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
setShopNowInfo(null); setShopNowInfo(null);
} }
} }
}, [showDetailInfo, panelInfo.showId, panelInfo.shptmBanrTpNm, fullVideolgCatCd, featuredShowsInfos]); }, [
showDetailInfo,
panelInfo.showId,
panelInfo.shptmBanrTpNm,
fullVideolgCatCd,
featuredShowsInfos,
]);
//LIVE //LIVE
useEffect(() => { useEffect(() => {
@@ -1515,6 +1527,10 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
const mediaId = videoPlayer.current?.video?.media?.mediaId; const mediaId = videoPlayer.current?.video?.media?.mediaId;
setMediaId(mediaId); setMediaId(mediaId);
setVideoLoaded(true); setVideoLoaded(true);
console.log(
'[PlayerPanel] 🎬 Video Loaded - shptmBanrTpNm:',
panelInfoRef.current?.shptmBanrTpNm
);
} }
} }
}, },
@@ -1714,6 +1730,14 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
setVideoLoaded(false); setVideoLoaded(false);
}, [currentPlayingUrl]); }, [currentPlayingUrl]);
// 비디오가 새로 선택될 때 타이머 초기화
useEffect(() => {
if (currentPlayingUrl) {
console.log('[PlayerPanel] 🎬 비디오 선택됨 - tabIndexV2 타이머 초기화');
resetTimerTabAutoAdvance(10000);
}
}, [selectedIndex, resetTimerTabAutoAdvance]);
const handlePopupClose = useCallback(() => { const handlePopupClose = useCallback(() => {
dispatch(setHidePopup()); dispatch(setHidePopup());
setTimeout(() => Spotlight.focus(SpotlightIds.PLAYER_SUBTITLE_BUTTON)); setTimeout(() => Spotlight.focus(SpotlightIds.PLAYER_SUBTITLE_BUTTON));
@@ -2161,7 +2185,8 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
// 정확한 복귀 종류 구분: // 정확한 복귀 종류 구분:
// 1. HomePanel 복귀: modalPrevRef.current === true && prevIsTopPanelDetailFromPlayerRef.current === false // 1. HomePanel 복귀: modalPrevRef.current === true && prevIsTopPanelDetailFromPlayerRef.current === false
// 2. DetailPanel 복귀: prevIsTopPanelDetailFromPlayerRef.current === true // 2. DetailPanel 복귀: prevIsTopPanelDetailFromPlayerRef.current === true
const isHomePanelReturn = modalPrevRef.current === true && prevIsTopPanelDetailFromPlayerRef.current === false; const isHomePanelReturn =
modalPrevRef.current === true && prevIsTopPanelDetailFromPlayerRef.current === false;
const isDetailPanelReturn = prevIsTopPanelDetailFromPlayerRef.current === true; const isDetailPanelReturn = prevIsTopPanelDetailFromPlayerRef.current === true;
if (isDetailPanelReturn) { if (isDetailPanelReturn) {
@@ -2191,7 +2216,10 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
// PlayerPanel 내부 DetailPanel에서 복귀 시에만 포커스 복원 시도 // PlayerPanel 내부 DetailPanel에서 복귀 시에만 포커스 복원 시도
if (isDetailPanelReturn) { if (isDetailPanelReturn) {
const lastFocusedTargetId = panelInfo?.lastFocusedTargetId; const lastFocusedTargetId = panelInfo?.lastFocusedTargetId;
console.log('[PlayerPanel] 🎯 PlayerPanel DetailPanel 복귀 - lastFocusedTargetId:', lastFocusedTargetId); console.log(
'[PlayerPanel] 🎯 PlayerPanel DetailPanel 복귀 - lastFocusedTargetId:',
lastFocusedTargetId
);
if (lastFocusedTargetId) { if (lastFocusedTargetId) {
// ShopNowContents가 렌더링될 때까지 잠시 대기 후 포커스 복원 // ShopNowContents가 렌더링될 때까지 잠시 대기 후 포커스 복원
@@ -2202,12 +2230,22 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
} }
} }
} }
}, [isOnTop, panelInfo.modal, videoVerticalVisible, panelInfo?.lastFocusedTargetId, tabContainerVersion, setTabIndexV2]); }, [
isOnTop,
panelInfo.modal,
videoVerticalVisible,
panelInfo?.lastFocusedTargetId,
tabContainerVersion,
setTabIndexV2,
]);
// PopularShow에서 처음 호출할 때처럼 modal이 false인 상태에서 VOD/LIVE 구분 // PopularShow에서 처음 호출할 때처럼 modal이 false인 상태에서 VOD/LIVE 구분
useEffect(() => { useEffect(() => {
if (isOnTop && !panelInfo.modal && !videoVerticalVisible && tabContainerVersion === 2) { if (isOnTop && !panelInfo.modal && !videoVerticalVisible && tabContainerVersion === 2) {
console.log('[PlayerPanel] 📺 Modal false 상태 - shptmBanrTpNm:', panelInfoRef.current?.shptmBanrTpNm); console.log(
'[PlayerPanel] 📺 Modal false 상태 - shptmBanrTpNm:',
panelInfoRef.current?.shptmBanrTpNm
);
if (panelInfoRef.current?.shptmBanrTpNm === 'VOD') { if (panelInfoRef.current?.shptmBanrTpNm === 'VOD') {
setTabIndexV2(2); setTabIndexV2(2);
@@ -2295,7 +2333,9 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
console.log('[TabContainerV2] tabIndex 1 → 2 감지, 타이머 시작'); console.log('[TabContainerV2] tabIndex 1 → 2 감지, 타이머 시작');
if (!belowContentsVisible || videoVerticalVisible) { if (!belowContentsVisible || videoVerticalVisible) {
console.log('[TabContainerV2] early return - belowContentsVisible 또는 videoVerticalVisible 조건 불만족'); console.log(
'[TabContainerV2] early return - belowContentsVisible 또는 videoVerticalVisible 조건 불만족'
);
return; return;
} }
@@ -2338,7 +2378,13 @@ const PlayerPanel = ({ isTabActivated, panelInfo, isOnTop, spotlightId, ...props
clearTimerTabAutoAdvance(); clearTimerTabAutoAdvance();
} }
}; };
}, [tabIndexV2, belowContentsVisible, videoVerticalVisible, resetTimerTabAutoAdvance, clearTimerTabAutoAdvance]); }, [
tabIndexV2,
belowContentsVisible,
videoVerticalVisible,
resetTimerTabAutoAdvance,
clearTimerTabAutoAdvance,
]);
useLayoutEffect(() => { useLayoutEffect(() => {
const videoContainer = document.querySelector(`.${css.videoContainer}`); const videoContainer = document.querySelector(`.${css.videoContainer}`);