perf: memo MemberHoverCard, ActiveTasksBlock, PendingRepliesBlock

This commit is contained in:
Mike 2026-05-02 22:29:00 +05:00
parent 5cd890dcdd
commit 4c8a093200
3 changed files with 14 additions and 10 deletions

View file

@ -1,4 +1,4 @@
import { type ReactNode, useState } from 'react';
import { memo, type ReactNode, useState } from 'react';
import { CARD_BG, CARD_BORDER_STYLE, CARD_ICON_MUTED } from '@renderer/constants/cssVariables';
import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors';
@ -32,14 +32,14 @@ interface ActivityEntry {
kind: 'working' | 'reviewing';
}
export const ActiveTasksBlock = ({
export const ActiveTasksBlock = memo(function ActiveTasksBlock({
members,
tasks,
defaultCollapsed = false,
headerRight,
onMemberClick,
onTaskClick,
}: ActiveTasksBlockProps): React.JSX.Element | null => {
}: ActiveTasksBlockProps): React.JSX.Element | null {
const { isLight } = useTheme();
const [collapsed, setCollapsed] = useState(defaultCollapsed);
const colorMap = buildMemberColorMap(members);
@ -188,4 +188,4 @@ export const ActiveTasksBlock = ({
})}
</div>
);
};
});

View file

@ -1,3 +1,5 @@
import { memo } from 'react';
import { CARD_BG, CARD_BORDER_STYLE, CARD_ICON_MUTED } from '@renderer/constants/cssVariables';
import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors';
import { useTheme } from '@renderer/hooks/useTheme';
@ -32,13 +34,13 @@ interface PendingRepliesBlockProps {
onMemberClick?: (member: ResolvedTeamMember) => void;
}
export const PendingRepliesBlock = ({
export const PendingRepliesBlock = memo(function PendingRepliesBlock({
members,
pendingRepliesByMember,
pendingCrossTeamReplies = [],
headerRight,
onMemberClick,
}: PendingRepliesBlockProps): React.JSX.Element | null => {
}: PendingRepliesBlockProps): React.JSX.Element | null {
const { isLight } = useTheme();
const pendingApprovals = useStore(useShallow((s) => s.pendingApprovals));
const colorMap = buildMemberColorMap(members);
@ -270,4 +272,4 @@ export const PendingRepliesBlock = ({
})}
</div>
);
};
});

View file

@ -1,3 +1,5 @@
import { memo } from 'react';
import { Badge } from '@renderer/components/ui/badge';
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@renderer/components/ui/hover-card';
import {
@ -57,13 +59,13 @@ interface MemberHoverCardProps {
* Reads member data from the team snapshot + resolved member selectors.
* Falls back to a simple wrapper when member data is unavailable.
*/
export const MemberHoverCard = ({
export const MemberHoverCard = memo(function MemberHoverCard({
name,
color,
teamName,
onOpenTask,
children,
}: MemberHoverCardProps): React.JSX.Element => {
}: MemberHoverCardProps): React.JSX.Element {
const { isLight } = useTheme();
const selectedTeamName = useStore((s) => s.selectedTeamName);
const effectiveTeamName = teamName ?? selectedTeamName;
@ -287,4 +289,4 @@ export const MemberHoverCard = ({
</HoverCardContent>
</HoverCard>
);
};
});