perf: memo MemberHoverCard, ActiveTasksBlock, PendingRepliesBlock
This commit is contained in:
parent
5cd890dcdd
commit
4c8a093200
3 changed files with 14 additions and 10 deletions
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue