- design_profile_save.ts 새 파일 — 한 본문 [저장] 조각 · [확정] 직전 저장 · 저장 뒤 서버 선형 넘김 - 높이 캐스케이드 설명을 B05_Profile_UI_Profile_Heights 머리로 옮김 - 팝아웃 시험 목록에 새 파일 · 저장 조각 시험(test_472_6_profile_save) 추가 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
2.1 KiB
TypeScript
53 lines
2.1 KiB
TypeScript
/* =============================================================================
|
|
* 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<void> {
|
|
const part = savePart();
|
|
if (!part) return;
|
|
const saved = await saveProfileAlignment(deps.projectId, deps.routeId()!, deps.edits());
|
|
await part.after?.(saved as unknown as Record<string, unknown>);
|
|
}
|
|
|
|
return { savePart, save };
|
|
}
|