From eae51a844709a5d945f9ad42f41d51dc3c0438cc Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Fri, 22 May 2026 12:52:15 +0200 Subject: [PATCH] perf(board): deduplicate board fetch with React cache() Wrap getInitialBoardAsync in React cache() so the same board data is fetched once per request instead of 3 times (layout, page, metadata). This is the same pattern used for auth() in the codebase. --- .../app/[locale]/boards/(content)/(home)/_definition.ts | 8 +++++--- .../boards/(content)/[name]/(board)/_definition.tsx | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/(home)/_definition.ts b/apps/nextjs/src/app/[locale]/boards/(content)/(home)/_definition.ts index 2357d7424..79e65883f 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/(home)/_definition.ts +++ b/apps/nextjs/src/app/[locale]/boards/(content)/(home)/_definition.ts @@ -1,9 +1,11 @@ +import { cache } from "react"; + import { api } from "@homarr/api/server"; import { createBoardContentPage } from "../_creator"; +const getHomeBoardAsync = cache(() => api.board.getHomeBoard()); + export default createBoardContentPage<{ locale: string }>({ - async getInitialBoardAsync() { - return await api.board.getHomeBoard(); - }, + getInitialBoardAsync: getHomeBoardAsync, }); diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/[name]/(board)/_definition.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/[name]/(board)/_definition.tsx index d3b65a5e9..5d7f60357 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/[name]/(board)/_definition.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/[name]/(board)/_definition.tsx @@ -1,9 +1,11 @@ +import { cache } from "react"; + import { api } from "@homarr/api/server"; import { createBoardContentPage } from "../../_creator"; +const getBoardByNameAsync = cache((name: string) => api.board.getBoardByName({ name })); + export default createBoardContentPage<{ locale: string; name: string }>({ - async getInitialBoardAsync({ name }) { - return await api.board.getBoardByName({ name }); - }, + getInitialBoardAsync: ({ name }) => getBoardByNameAsync(name), });