/* ============================================================================= * 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 { 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(); }; }