import { API_BASE_URL, CURRENT_PROJECT_ID_KEY, ROUTES, type RoutePath, } from "@config/config_frontend"; import type { WorkflowStage } from "@ui/ui_template_workflow_layout"; import { isProjectPreloaded, setPreloadTarget } from "./b_asset_cache"; import { navigateTo } from "./router"; export interface WorkflowState { project_id: string; current_stage: number; stages: WorkflowStage[]; } export const WORKFLOW_STEP_ROUTES: readonly RoutePath[] = [ ROUTES.B03_FILE_INPUT, ROUTES.B04_WF1_SURFACE, ROUTES.B05_WF2_ROUTE, ROUTES.B06_WF3_PROFILE_CROSS, ROUTES.B07_WF4_DESIGN_DETAIL, ROUTES.B08_WF5_QUANTITY, ROUTES.B09_WF6_ESTIMATION, ]; export async function fetchWorkflowState(projectId: string): Promise { const response = await fetch(`${API_BASE_URL}/projects/${projectId}/workflow-state`, { credentials: "include", }); if (!response.ok) { throw new Error(`Workflow state request failed: ${response.status}`); } const data = await response.json(); return data.workflow_state ?? data; } export function goToWorkflowStage(projectId: string, route: RoutePath): void { localStorage.setItem(CURRENT_PROJECT_ID_KEY, projectId); // 이 프로젝트를 아직 준비하지 않았으면 준비 화면(B11)을 먼저 거친다. 거기서 3D 지표면과 // 등고선을 브라우저에 담고 원래 가려던 화면으로 넘겨준다. 같은 프로젝트로 다시 들어오면 // 건너뛴다(2026-08-01 사용자 지시). if (!isProjectPreloaded(projectId)) { setPreloadTarget(route); navigateTo(ROUTES.B11_LOADING); return; } navigateTo(route); }