[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:
@@ -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}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user