Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FE] feat: 새로고침 및 창을 닫는 동작에 대해 경고 alert 띄우기 #851

Merged
merged 5 commits into from
Oct 21, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,17 @@ const CardForm = () => {
useUpdateDefaultAnswers();

// 모달
const { handleOpenModal, closeModal, isOpen, isOpenModalDisablingBlocker } = useCardFormModal();
const { handleOpenModal, closeModal, isOpen, isUnblocked } = useCardFormModal();

const handleNavigateConfirmButtonClick = () => {
closeModal(CARD_FORM_MODAL_KEY.navigateConfirm);

if (blocker.proceed) {
blocker.proceed();
}
if (blocker.proceed) blocker.proceed();
};

// 작성 중인 답변이 있는 경우 페이지 이동을 막는 기능
const { blocker } = useNavigateBlocker({
isOpenModalDisablingBlocker,
isUnblocked,
openNavigateConfirmModal: () => handleOpenModal('navigateConfirm'),
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@ import { useRecoilValue } from 'recoil';
import { answerMapAtom } from '@/recoil';

interface UseNavigateBlockerProps {
isOpenModalDisablingBlocker: boolean;
isUnblocked: boolean;
openNavigateConfirmModal: () => void;
}



/**
* @param isOpenModalDisablingBlocker : 이동 확인 모달과 리뷰 제출 확인 모달 모달들이 열려있는 지 여부 (모달의 이동/제출 버튼 클릭 시 페이지 이동해야하기 때문에 필요)
* @param isUnblocked : useBlocker로 라우팅을 막지 않는(다른 페이지로 이동 가능한) 상태인지를 의미함
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

라우팅 가능한 상태인지를 좀 더 직관적으로 알 수 있도록 isNavigationEnabled와 같은 이름은 어떤가요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아까 바다와 얘기 나눴을 때 변수명에 Navigation~만 사용하면 useBlocker와 연관된 변수라는 느낌이 덜해서 block을 담아서 네이밍했던 것 같아요. 그런데 지금 보니 nav가 더 나을 것 같기도 하고... @바다

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

절충안으로 isNavigationUnblocked로 변경했습니다!

* 작성한 답변이 있는 상태에서 작성한 페이지에서 다른 페이지로 이동하려할때 이동을 막거나, 이동을 진행하는 blocker를 반환하는 훅
*/
const useNavigateBlocker = ({ isOpenModalDisablingBlocker, openNavigateConfirmModal }: UseNavigateBlockerProps) => {
const useNavigateBlocker = ({ isUnblocked, openNavigateConfirmModal }: UseNavigateBlockerProps) => {
const answerMap = useRecoilValue(answerMapAtom);

const isAnswerInProgress = () => {
Expand All @@ -23,14 +25,14 @@ const useNavigateBlocker = ({ isOpenModalDisablingBlocker, openNavigateConfirmMo

// 페이지 새로고침 및 닫기에 대한 처리 by BeforeUnloadEvent
const handleNavigationBlock = (event: BeforeUnloadEvent) => {
if (isAnswerInProgress() && !isOpenModalDisablingBlocker) {
if (isAnswerInProgress() && !isUnblocked) {
event.preventDefault();
}
};

// 페이지 히스토리에 영향을 주는 페이지 이동은 useBlocker가 처리
const blocker = useBlocker(({ currentLocation, nextLocation }) => {
if (isOpenModalDisablingBlocker) return false;
if (isUnblocked) return false;
const isLeavingPage = currentLocation.pathname !== nextLocation.pathname;
return isAnswerInProgress() && isLeavingPage;
});
Expand All @@ -47,7 +49,7 @@ const useNavigateBlocker = ({ isOpenModalDisablingBlocker, openNavigateConfirmMo
return () => {
window.removeEventListener('beforeunload', handleNavigationBlock);
};
}, [answerMap, isOpenModalDisablingBlocker]);
}, [answerMap, isUnblocked]);

return {
blocker,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ const useCardFormModal = () => {
handleOpenModal,
closeModal,
isOpen,
isOpenModalDisablingBlocker:
isOpen(CARD_FORM_MODAL_KEY.recheck) || isOpen(CARD_FORM_MODAL_KEY.submitConfirm),
isUnblocked: isOpen(CARD_FORM_MODAL_KEY.submitConfirm),
};
};

Expand Down