Files
Aislo/B06_Section/B06_Section_UI_Page_Station_Swap.ts
T
eomsangdonandClaude Opus 5.5 25eea13ab2 perf(계산묶음): 349-0s 끌기 한 걸음 = 종단도 한 번 그림 — 다시 그림 한 틀 모음 · 초안 동안 저장 횡단 다시 셈 없음 · 그리기 몫 기록
- 묶음 기록 runs[].work — 알림 받는 쪽 이름별 ms(가게 · 관 · 구조물 · 새 상세 · 종단도 · 다시 셈 대기 · 횡단 카드) · 그리기 몫(종단도 · 유토곡선) · 쉼(profile 뒤 쉬는 동안)
- 종단도 다시 그림 = 다음 틀 한 번(drawSoon) — 갈아끼움 render · 정책 · 이어 공사 기준 · 비정규 측점 · 새 상세 알림 · 다시 셈 뒤가 각각 바로 그리던 것(끌기 한 걸음 6~8 번 → 1 번 · 되돌리기 5 → 1)
- 노선 초안 동안 종단도 횡단 다시 셈(crossPreview)이 갈아끼운 초안 상세를 안 셈(첫 끌기 한 번 통째 다시 셈 없앰)
- 시험 test_349_0s_draw_work 4(다섯 걸음 · 걸음마다 그리기 1 · work 칸 · 되돌리기 그대로 · 다시 셈 0) · 230-2 도움이 drawSoon 도 읽음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TteK8mfYZetk5P3bEZkyVZ
2026-10-16 17:42:54 +09:00

72 lines
3.5 KiB
TypeScript

/* =============================================================================
* B06_Section_UI_Page_Station_Swap.ts
* 횡단 보기가 계산 묶음 측점을 따라감(PLAN 346-2 4파) — 가게 `stations` 가 측점 목록을 바꾸면(늘고 줄면)
* 상세 객체를 갈아끼우고(`swapSectionStations` · 조정창 값 · 암 경계 · 암 경사 옮김은 `onAnySwap` 이 맡음) 보일 때
* 카드 · 종단도를 다시(카드는 보이는 것 먼저 · 다시 셈은 그 길이 맡음 · 안 보이면 다시 보일 때 그림).
* 종단 보기도 같은 가게를 듣고 같은 함수를 부름 — 먼저 부른 쪽이 갈아끼우고 다음 쪽은 「같은 목록」.
* 노선 초안 동안(346-2 덧 3) 카드 = 묶음 새 노선 상세(`pipelineDetail` · cross 단계 결과) — 새 상세가 오면
* 같은 길로 다시 그림 · 초안을 버리면(상세 null) 저장 노선 카드로.
* ========================================================================== */
import { useDesignStore } from "../A00_Common/design/design_store";
import type { DesignPipeline } from "../A00_Common/design/logic/design_pipeline";
import { pagePipeline, pipelineDetail } from "../A00_Common/design/design_pipeline_page";
import type { SectionDetailResponse } from "./B06_Section_Api_Types";
import { onAnySwap, swapSectionStations } from "./B06_Section_Section_Store";
/** 카드가 그릴 상세 — 노선 초안 동안 묶음 새 노선 상세 · 아니면 저장 노선(캐시). */
export const shownDetail = (
projectId: string | null,
saved: SectionDetailResponse,
): SectionDetailResponse => (projectId && pipelineDetail(projectId)) || saved;
/** 묶음 측점을 따라감 — 돌려준 함수로 끊음. `redraw` = 캐시에서 상세를 다시 읽어 카드 · 그림 다시. */
export function followSwaps(
projectId: string | null,
routeId: () => number | null,
host: { visible: () => boolean },
redraw: () => Promise<void>,
): () => void {
if (!projectId) return () => undefined;
// 누가 갈아끼웠든(종단 보기가 먼저 불렀어도) 보이면 다시 그림 — 한 페이지 한 노선
const stopRedraw = onAnySwap(() => void (host.visible() && redraw()));
const stopStore = useDesignStore(projectId, null).subscribe("stations", (stations) => {
const route = routeId();
if (route !== null && stations?.length) void swapSectionStations(projectId, route, stations);
});
const stopDraft = followDraftDetail(projectId, () => void (host.visible() && redraw()));
return () => {
stopRedraw();
stopStore();
stopDraft();
};
}
/** 묶음 새 노선 상세가 바뀌면(profile · cross 단계 뒤) 부름 — 묶음은 종단 보기가 세우므로 차례 번호가 날 때 붙음. */
function followDraftDetail(projectId: string, changed: () => void): () => void {
let pipe: DesignPipeline | null = null;
let stopPipe = (): void => undefined;
let drawn = pipelineDetail(projectId);
const attach = (): void => {
const now = pagePipeline(projectId);
if (now === pipe) return;
stopPipe();
pipe = now;
stopPipe =
now?.subscribe((event) => {
if (event.kind !== "stage" || (event.stage !== "profile" && event.stage !== "cross"))
return;
const next = pipelineDetail(projectId);
if (next === drawn) return;
drawn = next;
changed();
}, "횡단 카드") ?? ((): void => undefined);
};
attach();
const stopStore = useDesignStore(projectId, null).subscribe("generation", attach);
return () => {
stopStore();
stopPipe();
};
}