From 88ce573e6301766fed71dcc83be8b428938eea90 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 4 Oct 2026 21:22:01 +0900 Subject: [PATCH] =?UTF-8?q?fix(M02):=20=EC=B9=B4=EB=93=9C=20[=EC=95=8C?= =?UTF-8?q?=EC=95=BD]=20=EC=B7=A8=ED=96=A5=20=EA=B3=84=EC=A0=95=20?= =?UTF-8?q?=EB=94=B0=EB=A6=84=20=E2=80=94=20=EA=B3=84=EC=A0=95=20=EC=B7=A8?= =?UTF-8?q?=ED=96=A5=20=EB=B0=9B=EC=9D=80=20=EB=92=A4=EC=97=90=20=EC=98=AC?= =?UTF-8?q?=EB=A6=BC(=EB=B8=8C=EB=9D=BC=EC=9A=B0=EC=A0=80=20=EC=98=9B=20?= =?UTF-8?q?=EA=B0=92=EC=9D=B4=20=EB=8D=AE=EC=A7=80=20=EC=95=8A=EA=B2=8C)?= =?UTF-8?q?=20=C2=B7=20=EC=B9=B4=EB=93=9C=EB=8A=94=20=EC=97=B4=20=EB=95=8C?= =?UTF-8?q?=EB=A7=88=EB=8B=A4=20=EB=8B=A4=EC=8B=9C=20=EC=9D=BD=EC=9D=8C=20?= =?UTF-8?q?(PLAN=2039-8=20=E2=91=A2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01W4uKaV4ZBhsJN4GHG7yRj4 --- A00_Common/b_page_state.ts | 27 +++++++++++++------ .../M02_MasterTemplete_ItemCards.ts | 1 + 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/A00_Common/b_page_state.ts b/A00_Common/b_page_state.ts index 3e3f493ea..2c411ffe8 100644 --- a/A00_Common/b_page_state.ts +++ b/A00_Common/b_page_state.ts @@ -299,6 +299,8 @@ const PREFS_ENDPOINT = "/api/dashboard/me/ui-prefs"; const PREFS_PUSH_DELAY_MS = 1500; let applyingServerPrefs = false; let prefsPushTimer: ReturnType | null = null; +/** 계정 취향 받기 — 받기 전에 올리면 이 브라우저 옛 값이 계정 값을 덮으므로 올리기는 이것 뒤에 */ +let prefsPull: Promise | null = null; function localPrefs(): Record { const out: Record = {}; @@ -320,17 +322,26 @@ function pushUiPrefs(): void { if (prefsPushTimer) clearTimeout(prefsPushTimer); prefsPushTimer = setTimeout(() => { prefsPushTimer = null; - void fetch(PREFS_ENDPOINT, { - method: "PUT", - credentials: "include", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ prefs: localPrefs() }), - }).catch(() => undefined); + void (prefsPull ?? Promise.resolve()) + .then(() => + fetch(PREFS_ENDPOINT, { + method: "PUT", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ prefs: localPrefs() }), + }), + ) + .catch(() => undefined); }, PREFS_PUSH_DELAY_MS); } -/** 계정에 저장된 취향을 받아 로컬에 얹는다 — 로그인 뒤 한 번. */ -export async function syncUiPrefs(): Promise { +/** 계정에 저장된 취향을 받아 로컬에 얹는다 — 로그인 뒤 한 번(올리기는 받은 뒤로 미룸). */ +export function syncUiPrefs(): Promise { + prefsPull = pullUiPrefs(); + return prefsPull; +} + +async function pullUiPrefs(): Promise { let stored: Record = {}; try { const response = await fetch(PREFS_ENDPOINT, { credentials: "include" }); diff --git a/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts b/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts index 1a3faea5d..deb7368db 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts @@ -478,6 +478,7 @@ export function createItemCards(opts: ItemCardsOptions): ItemCardsHandle { return; } root.hidden = false; + paintPills(readStateRaw("m02-card-pills") === "true"); // 계정 취향을 늦게 받았어도 열 때마다 따름 if (col.id !== column) started.clear(); column = col.id; label = col.label;