/* ============================================================================= * A00_Common/design/design_profile_save.ts * 종단도 계획고 편집 저장 — 한 본문 [저장] 조각(472-6) · [확정] 직전 따로 저장. * 편집 없음 · 노선 초안 미리보기면 안 보냄 · 저장 뒤 서버 선형은 `adopt` 로 종단도에 넘김. * `design_profile.ts` 에서 떼어 냄(700줄 한계). * ========================================================================== */ import { saveProfileAlignment, type ProfileAlignmentSaveResponse, } from "../../B05_Profile/B05_Profile_Api_Fetch"; import type { AlignmentEdits, ProfileAlignment, } from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment"; import type { SavePart } from "./design_save_api"; import { noticeDroppedEdits } from "./design_save"; export function createProfileSave(deps: { projectId: string; routeId: () => number | null; edits: () => AlignmentEdits; dirty: () => boolean; /** 노선 초안 미리보기 편집 중 — 안 보냄. */ previewing: () => boolean; /** 서버가 돌려준 선형(없을 수 있음) — 기준 갈아끼움 · 저장 표시 · 다시 그림. */ adopt: (saved: ProfileAlignment | undefined) => void; }) { /** 한 본문 [저장] 조각 — 편집 없음 · 노선 초안 미리보기면 null. */ function savePart(): SavePart | null { const routeId = deps.routeId(); if (!routeId || !deps.dirty() || deps.previewing()) return null; return { body: { route_id: routeId, ...deps.edits() }, after: (response) => { const saved = response as unknown as ProfileAlignmentSaveResponse; noticeDroppedEdits(saved); deps.adopt(saved.profile_alignment as ProfileAlignment | undefined); }, }; } /** [확정] 직전에 호출한다. 편집이 없으면 아무 것도 하지 않는다. */ async function save(): Promise { const part = savePart(); if (!part) return; const saved = await saveProfileAlignment(deps.projectId, deps.routeId()!, deps.edits()); await part.after?.(saved as unknown as Record); } return { savePart, save }; }