perf(renderer): defer member telemetry sparklines
This commit is contained in:
parent
21ef4e406e
commit
7de2da23d4
2 changed files with 36 additions and 2 deletions
|
|
@ -97,6 +97,7 @@ interface MemberCardProps {
|
||||||
spawnRuntimeAlive?: boolean;
|
spawnRuntimeAlive?: boolean;
|
||||||
isLaunchSettling?: boolean;
|
isLaunchSettling?: boolean;
|
||||||
runtimeTelemetryScale?: RuntimeTelemetryScale;
|
runtimeTelemetryScale?: RuntimeTelemetryScale;
|
||||||
|
renderRuntimeTelemetryStrip?: boolean;
|
||||||
onOpenTask?: () => void;
|
onOpenTask?: () => void;
|
||||||
onOpenReviewTask?: () => void;
|
onOpenReviewTask?: () => void;
|
||||||
onClick?: () => void;
|
onClick?: () => void;
|
||||||
|
|
@ -575,6 +576,7 @@ export const MemberCard = memo(function MemberCard({
|
||||||
runtimeSummary,
|
runtimeSummary,
|
||||||
runtimeEntry,
|
runtimeEntry,
|
||||||
runtimeRunId,
|
runtimeRunId,
|
||||||
|
renderRuntimeTelemetryStrip = true,
|
||||||
taskCounts,
|
taskCounts,
|
||||||
isTeamAlive,
|
isTeamAlive,
|
||||||
isTeamProvisioning,
|
isTeamProvisioning,
|
||||||
|
|
@ -1016,7 +1018,7 @@ export const MemberCard = memo(function MemberCard({
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{!isRemoved ? (
|
{!isRemoved && renderRuntimeTelemetryStrip ? (
|
||||||
<MemberRuntimeTelemetryStrip runtimeEntry={runtimeEntry} scale={runtimeTelemetryScale} />
|
<MemberRuntimeTelemetryStrip runtimeEntry={runtimeEntry} scale={runtimeTelemetryScale} />
|
||||||
) : null}
|
) : null}
|
||||||
<div className="pointer-events-none absolute inset-0 z-10 rounded transition-colors group-hover:bg-white/5" />
|
<div className="pointer-events-none absolute inset-0 z-10 rounded transition-colors group-hover:bg-white/5" />
|
||||||
|
|
|
||||||
|
|
@ -512,6 +512,7 @@ interface MemberCardRowProps {
|
||||||
leadActivity?: LeadActivityState;
|
leadActivity?: LeadActivityState;
|
||||||
isLaunchSettling?: boolean;
|
isLaunchSettling?: boolean;
|
||||||
runtimeTelemetryScale?: RuntimeTelemetryScale;
|
runtimeTelemetryScale?: RuntimeTelemetryScale;
|
||||||
|
renderRuntimeTelemetryStrip?: boolean;
|
||||||
onOpenTask?: (taskId: string) => void;
|
onOpenTask?: (taskId: string) => void;
|
||||||
onMemberClick?: (member: ResolvedTeamMember) => void;
|
onMemberClick?: (member: ResolvedTeamMember) => void;
|
||||||
onSendMessage?: (member: ResolvedTeamMember) => void;
|
onSendMessage?: (member: ResolvedTeamMember) => void;
|
||||||
|
|
@ -550,6 +551,7 @@ const MemberCardRow = memo(function MemberCardRow({
|
||||||
leadActivity,
|
leadActivity,
|
||||||
isLaunchSettling,
|
isLaunchSettling,
|
||||||
runtimeTelemetryScale,
|
runtimeTelemetryScale,
|
||||||
|
renderRuntimeTelemetryStrip,
|
||||||
onOpenTask,
|
onOpenTask,
|
||||||
onMemberClick,
|
onMemberClick,
|
||||||
onSendMessage,
|
onSendMessage,
|
||||||
|
|
@ -603,6 +605,7 @@ const MemberCardRow = memo(function MemberCardRow({
|
||||||
spawnRuntimeAlive={spawnRuntimeAlive}
|
spawnRuntimeAlive={spawnRuntimeAlive}
|
||||||
isLaunchSettling={isLaunchSettling}
|
isLaunchSettling={isLaunchSettling}
|
||||||
runtimeTelemetryScale={runtimeTelemetryScale}
|
runtimeTelemetryScale={runtimeTelemetryScale}
|
||||||
|
renderRuntimeTelemetryStrip={renderRuntimeTelemetryStrip}
|
||||||
onOpenTask={currentTask ? handleOpenTask : undefined}
|
onOpenTask={currentTask ? handleOpenTask : undefined}
|
||||||
onOpenReviewTask={reviewTask ? handleOpenReviewTask : undefined}
|
onOpenReviewTask={reviewTask ? handleOpenReviewTask : undefined}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
|
@ -736,6 +739,7 @@ export const MemberList = memo(function MemberList({
|
||||||
const { t } = useAppTranslation('team');
|
const { t } = useAppTranslation('team');
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
const [isWide, setIsWide] = useState(false);
|
const [isWide, setIsWide] = useState(false);
|
||||||
|
const [runtimeTelemetryPreviewActive, setRuntimeTelemetryPreviewActive] = useState(false);
|
||||||
|
|
||||||
const handleResize = useCallback((entries: ResizeObserverEntry[]) => {
|
const handleResize = useCallback((entries: ResizeObserverEntry[]) => {
|
||||||
const entry = entries[0];
|
const entry = entries[0];
|
||||||
|
|
@ -753,6 +757,25 @@ export const MemberList = memo(function MemberList({
|
||||||
return () => observer.disconnect();
|
return () => observer.disconnect();
|
||||||
}, [handleResize]);
|
}, [handleResize]);
|
||||||
|
|
||||||
|
const activateRuntimeTelemetryPreview = useCallback(() => {
|
||||||
|
setRuntimeTelemetryPreviewActive(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const deactivateRuntimeTelemetryPreview = useCallback(() => {
|
||||||
|
setRuntimeTelemetryPreviewActive(false);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handleRuntimeTelemetryPreviewBlur = useCallback(
|
||||||
|
(event: React.FocusEvent<HTMLDivElement>) => {
|
||||||
|
const nextTarget = event.relatedTarget;
|
||||||
|
if (nextTarget instanceof Node && event.currentTarget.contains(nextTarget)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
deactivateRuntimeTelemetryPreview();
|
||||||
|
},
|
||||||
|
[deactivateRuntimeTelemetryPreview]
|
||||||
|
);
|
||||||
|
|
||||||
const gridClass = isWide ? 'grid grid-cols-2 gap-1' : 'grid grid-cols-1 gap-1';
|
const gridClass = isWide ? 'grid grid-cols-2 gap-1' : 'grid grid-cols-1 gap-1';
|
||||||
const activeMembers = useMemo(
|
const activeMembers = useMemo(
|
||||||
() =>
|
() =>
|
||||||
|
|
@ -936,7 +959,14 @@ export const MemberList = memo(function MemberList({
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef} className="runtime-telemetry-list flex flex-col gap-1">
|
<div
|
||||||
|
ref={containerRef}
|
||||||
|
className="runtime-telemetry-list flex flex-col gap-1"
|
||||||
|
onPointerEnter={activateRuntimeTelemetryPreview}
|
||||||
|
onPointerLeave={deactivateRuntimeTelemetryPreview}
|
||||||
|
onFocusCapture={activateRuntimeTelemetryPreview}
|
||||||
|
onBlurCapture={handleRuntimeTelemetryPreviewBlur}
|
||||||
|
>
|
||||||
<div className={gridClass}>
|
<div className={gridClass}>
|
||||||
{activeMembers.map((member) => {
|
{activeMembers.map((member) => {
|
||||||
const spawnEntry = memberSpawnStatuses?.get(member.name);
|
const spawnEntry = memberSpawnStatuses?.get(member.name);
|
||||||
|
|
@ -1057,6 +1087,7 @@ export const MemberList = memo(function MemberList({
|
||||||
leadActivity={leadActivity}
|
leadActivity={leadActivity}
|
||||||
isLaunchSettling={isLaunchSettling}
|
isLaunchSettling={isLaunchSettling}
|
||||||
runtimeTelemetryScale={runtimeTelemetryScale}
|
runtimeTelemetryScale={runtimeTelemetryScale}
|
||||||
|
renderRuntimeTelemetryStrip={runtimeTelemetryPreviewActive}
|
||||||
onOpenTask={onOpenTask}
|
onOpenTask={onOpenTask}
|
||||||
onMemberClick={onMemberClick}
|
onMemberClick={onMemberClick}
|
||||||
onSendMessage={onSendMessage}
|
onSendMessage={onSendMessage}
|
||||||
|
|
@ -1105,6 +1136,7 @@ export const MemberList = memo(function MemberList({
|
||||||
leadActivity={leadActivity}
|
leadActivity={leadActivity}
|
||||||
isLaunchSettling={false}
|
isLaunchSettling={false}
|
||||||
runtimeTelemetryScale={runtimeTelemetryScale}
|
runtimeTelemetryScale={runtimeTelemetryScale}
|
||||||
|
renderRuntimeTelemetryStrip={runtimeTelemetryPreviewActive}
|
||||||
onOpenTask={onOpenTask}
|
onOpenTask={onOpenTask}
|
||||||
onMemberClick={onMemberClick}
|
onMemberClick={onMemberClick}
|
||||||
onSendMessage={onSendMessage}
|
onSendMessage={onSendMessage}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue