fix: 20250626 선택약관 UI수정, 선택약관팝업 조건 수정

This commit is contained in:
djaco
2025-06-26 10:29:11 +09:00
parent 4fcb0729af
commit f6ac3f5884
17 changed files with 805 additions and 1022 deletions

View File

@@ -120,71 +120,70 @@ export const CLEAR_PLAYER_INFO = () => ({
type: types.CLEAR_PLAYER_INFO,
});
/* 🔽 [추가] 새로운 '플레이 제어 매니저' 액션들 */
/**
* 비디오 재생 제어권을 요청하는 액션.
* 컴포넌트가 비디오를 재생하고 싶을 때 이 액션을 호출합니다.
* 'playerControl' 상태를 확인하여 현재 다른 컴포넌트가 비디오를 제어하고 있지 않은 경우에만
* 비디오 플레이어를 활성화(PlayerPanel을 modal로 push)합니다.
*
* @param {string} ownerId - 비디오 제어권을 요청하는 컴포넌트의 고유 ID.
* @param {object} videoInfo - 'startVideoPlayer'에 필요한 비디오 정보.
* 비디오 재생 제어권을 요청합니다.
* 컴포넌트는 이 액션을 통해 중앙 매니저에게 재생을 '요청'합니다.
* @param {string} ownerId - 제어권을 요청하는 컴포넌트의 고유 ID (예: 'banner0_persistent')
* @param {object} videoInfo - 재생할 비디오 정보 (url, id 등)
*/
export const requestPlayControl =
(ownerId, videoInfo) => (dispatch, getState) => {
export const requestPlayControl = (ownerId, videoInfo) => (dispatch, getState) => {
const { playerControl } = getState().home;
const currentOwnerId = playerControl.ownerId;
const isPersistentOwner = currentOwnerId === 'banner0_persistent';
// 이미 같은 컴포넌트가 제어권을 가지고 있다면 아무것도 하지 않음
if (currentOwnerId === ownerId) {
return;
if (currentOwnerId === ownerId) return; // 이미 제어권 소유
if (currentOwnerId) {
// 현재 제어중인 컴포넌트가 영구재생 배너이면 '일시정지'
if (currentOwnerId === 'banner0_persistent') {
dispatch(pausePlayerControl());
} else {
// 다른 미리보기라면 완전히 숨김
dispatch(releasePlayControl(currentOwnerId, true));
}
}
// 다른 컴포넌트가 제어권을 가지고 있을 때의 처리 (선점 로직)
if (currentOwnerId && currentOwnerId !== ownerId) {
// 만약 현재 재생중인 비디오가 영구 재생 비디오라면, 종료하는 대신 '일시정지'
if (isPersistentOwner) {
dispatch(pausePlayerControl(currentOwnerId));
} else {
// 그 외의 경우는 기존처럼 완전히 종료
dispatch(releasePlayControl(currentOwnerId, true)); // fromPreemption = true
}
}
// 새로운 제어권을 설정하고 비디오를 재생
dispatch({
type: types.SET_PLAYER_CONTROL,
payload: { ownerId },
});
dispatch(startVideoPlayer({ ...videoInfo, modal: true }));
};
// 1. 매니저 상태 업데이트
dispatch({ type: types.SET_PLAYER_CONTROL, payload: { ownerId } });
// 2. 공유 PlayerPanel의 상태 업데이트
dispatch(updatePanel({
name: panel_names.PLAYER_PANEL,
panelInfo: {
isHidden: false,
modal: true,
...videoInfo
}
}));
};
/**
* 비디오 재생 제어권을 해제하는 액션.
* 컴포넌트가 비디오 재생을 중단할 때(예: 포커스 잃음, 언마운트) 호출합니다.
* 현재 제어권을 가진 컴포넌트가 자신일 경우에만 'playerControl' 상태를 초기화하고
* 비디오 플레이어를 종료(PlayerPanel을 pop)합니다.
*
* @param {string} ownerId - 비디오 제어권을 해제하려는 컴포넌트의 고유 ID.
* @param {boolean} fromPreemption - 다른 요청에 의해 강제로 해제되었는지 여부.
* 비디오 재생 제어권을 해제하고, 필요시 영구재생 비디오를 복원합니다.
* @param {string} ownerId - 제어권을 해제하는 컴포넌트의 고유 ID
* @param {boolean} fromPreemption - 다른 요청에 의해 강제로 중단되었는지 여부
*/
export const releasePlayControl = (ownerId, fromPreemption = false) => (dispatch, getState) => {
const { playerControl } = getState().home;
const isPersistentOwner = playerControl.ownerId === 'banner0_persistent';
const { playerControl } = getState().home;
// 제어권을 가진 컴포넌트가 자신일 경우에만 해제
// 단, 선점 로직에 의해 호출된 경우는 소유권 확인 없이 즉시 실행
if (fromPreemption || playerControl.ownerId === ownerId) {
dispatch({
type: types.CLEAR_PLAYER_CONTROL,
});
dispatch(finishVideoPreview());
if (fromPreemption || playerControl.ownerId === ownerId) {
// 1. 공유 PlayerPanel을 다시 숨김
dispatch(updatePanel({
name: panel_names.PLAYER_PANEL,
panelInfo: {
isHidden: true,
}
}));
// 제어권 해제 후, 만약 이전에 일시정지된 영구 비디오가 있었다면 다시 재생
if (isPersistentOwner && playerControl.isPaused) {
dispatch(resumePlayerControl('banner0_persistent'));
// 2. 매니저 상태 업데이트 (현재 소유주 없음)
dispatch({ type: types.CLEAR_PLAYER_CONTROL });
// 3. 만약 '일시정지'된 영구재생 비디오가 있었다면, 제어권을 되돌려주고 다시 재생
if (playerControl.isPaused && playerControl.ownerId === 'banner0_persistent') {
const persistentVideoInfo = { /* 영구 비디오 정보를 가져오는 로직 (필요시) */ };
dispatch(requestPlayControl('banner0_persistent', persistentVideoInfo));
}
}
}
};
/**
@@ -193,16 +192,16 @@ export const releasePlayControl = (ownerId, fromPreemption = false) => (dispatch
*
* @param {string} ownerId - 비디오 제어권을 가진 컴포넌트의 고유 ID.
*/
export const pausePlayerControl = (ownerId) => (dispatch, getState) => {
const { playerControl } = getState().home;
// export const pausePlayerControl = (ownerId) => (dispatch, getState) => {
// const { playerControl } = getState().home;
// 제어권을 가진 컴포넌트가 자신일 경우에만 일시정지
if (playerControl.ownerId === ownerId) {
dispatch({
type: types.PAUSE_PLAYER_CONTROL,
});
}
};
// // 제어권을 가진 컴포넌트가 자신일 경우에만 일시정지
// if (playerControl.ownerId === ownerId) {
// dispatch({
// type: types.PAUSE_PLAYER_CONTROL,
// });
// }
// };
/**
* '일시정지' 상태의 비디오를 다시 재생하는 액션.
@@ -219,3 +218,56 @@ export const resumePlayerControl = (ownerId) => (dispatch, getState) => {
});
}
};
/**
* 공유 PlayerPanel을 전체화면 모드로 전환합니다.
* 이 액션은 어떤 배너에서든 클릭 시 호출됩니다.
*/
export const goToFullScreen = () => (dispatch, getState) => {
// 공유 PlayerPanel의 'modal' 상태를 false로 변경하여 전체화면으로 전환
dispatch(updatePanel({
name: panel_names.PLAYER_PANEL,
panelInfo: {
modal: false,
isHidden: false, // 혹시 숨겨져 있었다면 보이도록
}
}));
};
/**
* 영구재생 비디오를 일시정지 상태로 만듭니다. (내부 사용)
*/
export const pausePlayerControl = () => ({
type: types.PAUSE_PLAYER_CONTROL
});
/**
* 전체화면 플레이어에서 미리보기 상태로 복귀할 때 호출됩니다.
* 중앙 'playerControl' 상태를 확인하여 올바른 위치와 비디오로 복원합니다.
*/
export const returnToPreview = () => (dispatch, getState) => {
const { playerControl } = getState().home;
let targetOwnerId;
let targetVideoInfo;
// 만약 '일시정지'된 영구재생 비디오가 있다면, 무조건 그 비디오로 복귀하는 것이 최우선
if (playerControl.isPaused) {
targetOwnerId = 'banner0_persistent';
// targetVideoInfo = ... (0번 배너의 비디오 정보를 가져오는 로직)
} else {
// 그렇지 않다면, 전체화면으로 가기 직전의 소유주(ownerId)에게로 복귀
targetOwnerId = playerControl.ownerId;
// targetVideoInfo = ... (해당 ownerId의 비디오 정보를 가져오는 로직)
}
// 매니저에게 해당 타겟으로 재생을 다시 요청
if (targetOwnerId) {
dispatch(requestPlayControl(targetOwnerId, targetVideoInfo));
} else {
// 돌아갈 곳이 없으면 그냥 플레이어를 닫음
dispatch(finishVideoPreview());
}
};