fix: 20250626 선택약관 UI수정, 선택약관팝업 조건 수정
This commit is contained in:
@@ -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());
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user