From a7989994405645954ada798e7b1b31438395a40f Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Fri, 17 Jul 2026 22:36:10 +0200 Subject: [PATCH] Refresh Suggest hotel label from live CMS setting. Avoid stale SSR/Redis cache keeping Suggest IT after habbo_gamedata_hotel changes. Co-authored-by: Cursor --- src/actions/admin-settings.ts | 8 ++--- .../catalog/[id]/catalog-translate-tab.tsx | 33 +++++++++++++++++++ src/app/admin/catalog/[id]/page.tsx | 2 ++ src/lib/services/site-settings.test.ts | 6 ++-- src/lib/services/site-settings.ts | 10 ++++-- 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/actions/admin-settings.ts b/src/actions/admin-settings.ts index 1e8f2fbb..c8a78245 100644 --- a/src/actions/admin-settings.ts +++ b/src/actions/admin-settings.ts @@ -55,7 +55,7 @@ export const saveManagedSettings = adminAction( }), ), ); - siteSettings.reload(); + await siteSettings.reload(); if (entries.some(([key]) => key === HABBO_GAMEDATA_HOTEL_SETTING_KEY)) { clearHabboItCache(); clearBadgeCache(); @@ -77,7 +77,7 @@ export async function updateSetting(formData: FormData): Promise { ); if (!key) return; await prisma.websiteSetting.update({ where: { key }, data: { value } }); - siteSettings.reload(); + await siteSettings.reload(); bustGamedataCachesIfNeeded(key); revalidatePath("/admin/settings"); } @@ -102,7 +102,7 @@ export async function createSetting(formData: FormData): Promise { update: { value }, create: { key, value, comment: comment || null }, }); - siteSettings.reload(); + await siteSettings.reload(); bustGamedataCachesIfNeeded(key); revalidatePath("/admin/settings"); } @@ -114,7 +114,7 @@ export async function deleteSetting(formData: FormData): Promise { .trim(); if (!key) return; await prisma.websiteSetting.delete({ where: { key } }); - siteSettings.reload(); + await siteSettings.reload(); bustGamedataCachesIfNeeded(key); revalidatePath("/admin/settings"); } diff --git a/src/app/admin/catalog/[id]/catalog-translate-tab.tsx b/src/app/admin/catalog/[id]/catalog-translate-tab.tsx index 468ab6e4..573dee13 100644 --- a/src/app/admin/catalog/[id]/catalog-translate-tab.tsx +++ b/src/app/admin/catalog/[id]/catalog-translate-tab.tsx @@ -83,6 +83,39 @@ export function CatalogTranslateTab({ useEffect(() => { setActiveHotel(normalizeHabboGamedataHotel(gamedataHotel)); }, [gamedataHotel]); + + // Always refresh from CMS settings so the button label tracks hotel changes + // without requiring a full page remount after saving Settings. + useEffect(() => { + let cancelled = false; + async function refreshHotel() { + try { + const res = await fetch("/api/admin/catalog/suggest", { + cache: "no-store", + }); + if (!res.ok) return; + const data = (await res.json()) as { hotel?: string }; + if (!cancelled && typeof data.hotel === "string") { + setActiveHotel(normalizeHabboGamedataHotel(data.hotel)); + } + } catch { + // keep prop/default + } + } + void refreshHotel(); + const onFocus = () => void refreshHotel(); + const onVisibility = () => { + if (document.visibilityState === "visible") void refreshHotel(); + }; + window.addEventListener("focus", onFocus); + document.addEventListener("visibilitychange", onVisibility); + return () => { + cancelled = true; + window.removeEventListener("focus", onFocus); + document.removeEventListener("visibilitychange", onVisibility); + }; + }, []); + const hotelShort = habboGamedataHotelShort(activeHotel); const hotelLabel = habboGamedataHotelLabel(activeHotel); diff --git a/src/app/admin/catalog/[id]/page.tsx b/src/app/admin/catalog/[id]/page.tsx index fb8dc805..0788aae9 100644 --- a/src/app/admin/catalog/[id]/page.tsx +++ b/src/app/admin/catalog/[id]/page.tsx @@ -8,6 +8,8 @@ import { loadCatalogItemsData } from "@/lib/services/catalog-items-loader"; import { getAncestors } from "@/lib/services/catalog-tree"; import { CatalogDetailTabs } from "./catalog-detail-tabs"; +export const dynamic = "force-dynamic"; + export default async function CatalogEditPage({ params, }: { diff --git a/src/lib/services/site-settings.test.ts b/src/lib/services/site-settings.test.ts index 0bf54643..f9c59c6d 100644 --- a/src/lib/services/site-settings.test.ts +++ b/src/lib/services/site-settings.test.ts @@ -7,9 +7,9 @@ vi.mock("@/lib/prisma", () => ({ import { siteSettings } from "./site-settings"; -beforeEach(() => { +beforeEach(async () => { findMany.mockReset(); - siteSettings.reload(); + await siteSettings.reload(); }); describe("siteSettings", () => { @@ -39,7 +39,7 @@ describe("siteSettings", () => { await siteSettings.get("hotel_name"); await siteSettings.getBool("hotel_name"); expect(findMany).toHaveBeenCalledTimes(1); - siteSettings.reload(); + await siteSettings.reload(); await siteSettings.get("hotel_name"); expect(findMany).toHaveBeenCalledTimes(2); }); diff --git a/src/lib/services/site-settings.ts b/src/lib/services/site-settings.ts index 17090e57..a46682ba 100644 --- a/src/lib/services/site-settings.ts +++ b/src/lib/services/site-settings.ts @@ -84,13 +84,17 @@ class SiteSettings { create: { key, value }, update: { value }, }); - this.reload(); + await this.reload(); } - reload(): void { + async reload(): Promise { this.cache = null; if (redis) { - redis.del(REDIS_CACHE_KEY).catch(() => {}); + try { + await redis.del(REDIS_CACHE_KEY); + } catch { + // non-critical + } } } }