/* ============================================================================= * b_missing_data_guard.ts * "불러올 자료가 없으면 대시보드로" — B04 이후 화면 공용 규칙. * * 새 입력 자료를 올리면 서버가 옛 계산 결과를 통째로 지우고 B06까지 다시 계산한다. * 그래서 사용자가 열어 둔 뒷단계 화면은 근거 자료가 사라진 상태가 된다. 그 화면에서 * 빈 그래프를 보여주거나 오류만 띄우면 사용자는 무엇이 잘못됐는지 알 수 없다. * * 이 화면들은 자료를 못 찾으면 **한 줄 안내 후 대시보드로 돌려보낸다**(2026-08-08 사용자 * 지시). 사용자는 대시보드에서 그 프로젝트가 다시 계산 중임을 보고 기다리면 된다. * ========================================================================== */ import { ROUTES } from "@config/config_frontend"; import { showToast } from "@ui/ui_template_elements"; import { navigateTo } from "./router"; const DEFAULT_MESSAGE = "입력 자료가 새로 올라와 이 화면의 자료가 없습니다. 대시보드로 돌아갑니다."; let redirecting = false; /** * 자료가 없어 화면을 세울 수 없을 때 호출한다. 안내를 띄우고 대시보드로 보낸다. * 여러 곳에서 동시에 불려도 이동은 한 번만 한다. */ export function leaveForDashboard(message: string = DEFAULT_MESSAGE): void { if (redirecting) return; redirecting = true; showToast(message, "warning"); // 토스트를 읽을 시간을 조금 준다. window.setTimeout(() => { redirecting = false; navigateTo(ROUTES.B01_ACCOUNT); }, 1200); } /** * 필수 자료가 비었으면 대시보드로 보내고 `true`를 돌려준다. * 호출부는 `if (missingDataLeaves(x)) return;` 형태로 바로 빠져나가면 된다. */ export function missingDataLeaves(value: unknown, message?: string): boolean { const empty = value === null || value === undefined || (Array.isArray(value) && value.length === 0) || value === false; if (empty) leaveForDashboard(message); return empty; }