From 400a35d7af6284251d097efdc6bd3cb31ff248ca Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 12 Feb 2026 16:30:43 -0800 Subject: [PATCH] Prevent unnecessary chart and board component re-renders --- .../boards/[boardId]/BoardColumn.module.css | 17 ++++++ .../(main)/boards/[boardId]/BoardColumn.tsx | 37 ++++++++--- .../[boardId]/BoardComponentRenderer.tsx | 11 +++- src/components/charts/BarChart.tsx | 61 +++++++++++++++---- 4 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 src/app/(main)/boards/[boardId]/BoardColumn.module.css diff --git a/src/app/(main)/boards/[boardId]/BoardColumn.module.css b/src/app/(main)/boards/[boardId]/BoardColumn.module.css new file mode 100644 index 000000000..895e62058 --- /dev/null +++ b/src/app/(main)/boards/[boardId]/BoardColumn.module.css @@ -0,0 +1,17 @@ +.column { + position: relative; +} + +.columnAction { + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: opacity 120ms ease; +} + +.column:hover .columnAction, +.column:focus-within .columnAction { + opacity: 1; + visibility: visible; + pointer-events: auto; +} diff --git a/src/app/(main)/boards/[boardId]/BoardColumn.tsx b/src/app/(main)/boards/[boardId]/BoardColumn.tsx index 8be9c02da..0db07b2cc 100644 --- a/src/app/(main)/boards/[boardId]/BoardColumn.tsx +++ b/src/app/(main)/boards/[boardId]/BoardColumn.tsx @@ -8,10 +8,11 @@ import { Tooltip, TooltipTrigger, } from '@umami/react-zen'; -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import { useBoard, useMessages } from '@/components/hooks'; import { Pencil, Plus, X } from '@/components/icons'; import type { BoardComponentConfig } from '@/lib/types'; +import styles from './BoardColumn.module.css'; import { BoardComponentRenderer } from './BoardComponentRenderer'; import { BoardComponentSelect } from './BoardComponentSelect'; @@ -34,6 +35,13 @@ export function BoardColumn({ const { board } = useBoard(); const { t, labels } = useMessages(); const websiteId = board?.parameters?.websiteId; + const renderedComponent = useMemo(() => { + if (!component || !websiteId) { + return null; + } + + return ; + }, [component, websiteId]); const handleSelect = (config: BoardComponentConfig) => { onSetComponent?.(id, config); @@ -50,11 +58,18 @@ export function BoardColumn({ justifyContent="center" backgroundColor="surface-sunken" position="relative" + className={styles.column} > {editing && canRemove && ( - + -