MCPcopy Create free account
hub / github.com/modem-dev/hunk / renderHeaderRow

Function renderHeaderRow

src/ui/diff/renderRows.tsx:1138–1243  ·  view source on GitHub ↗

Render collapsed and hunk-header rows, including the optional add-note target.

(
  row: Extract<DiffRow, { type: "collapsed" | "hunk-header" }>,
  width: number,
  theme: AppTheme,
  selected: boolean,
  anchorId?: string,
  showAddNoteBadge = false,
  onHoverRow?: (rowKey: string) => void,
  onStartUserNoteAtHunk?: (hunkIndex: number, target?: UserNoteLineTarget) => void,
  onToggleGap?: (gapKey: string) => void,
)

Source from the content-addressed store, hash-verified

1136
1137/** Render collapsed and hunk-header rows, including the optional add-note target. */
1138function renderHeaderRow(
1139 row: Extract<DiffRow, { type: "collapsed" | "hunk-header" }>,
1140 width: number,
1141 theme: AppTheme,
1142 selected: boolean,
1143 anchorId?: string,
1144 showAddNoteBadge = false,
1145 onHoverRow?: (rowKey: string) => void,
1146 onStartUserNoteAtHunk?: (hunkIndex: number, target?: UserNoteLineTarget) => void,
1147 onToggleGap?: (gapKey: string) => void,
1148) {
1149 const badges = [
1150 showAddNoteBadge
1151 ? {
1152 key: "user-note",
1153 text: "[+]",
1154 onClick: () => onStartUserNoteAtHunk?.(row.hunkIndex),
1155 }
1156 : null,
1157 ].filter((badge): badge is { key: string; text: string; onClick: () => void } => Boolean(badge));
1158 const badgeWidth = badges.reduce((total, badge) => total + badge.text.length + 1, 0);
1159 const collapsedExpandable = row.type === "collapsed" && Boolean(onToggleGap);
1160 const labelText =
1161 row.type === "collapsed" ? collapsedRowLabel(row.text, collapsedExpandable) : row.text;
1162 const label = fitText(labelText, Math.max(0, width - 1 - badgeWidth));
1163 const handleCollapsedClick =
1164 row.type === "collapsed" && onToggleGap
1165 ? () => onToggleGap(gapKey(row.position, row.hunkIndex))
1166 : undefined;
1167
1168 if (badges.length === 0) {
1169 return (
1170 <box
1171 key={row.key}
1172 id={anchorId}
1173 style={{
1174 width,
1175 height: 1,
1176 backgroundColor: theme.panelAlt,
1177 }}
1178 onMouseMove={() => onHoverRow?.(row.key)}
1179 onMouseOver={() => onHoverRow?.(row.key)}
1180 onMouseUp={handleCollapsedClick}
1181 >
1182 <text>
1183 <span
1184 fg={selected ? neutralRailColor(theme) : dimRailColor(neutralRailColor(theme), theme)}
1185 bg={theme.panelAlt}
1186 >
1187 {marker()}
1188 </span>
1189 <span
1190 fg={row.type === "collapsed" ? theme.muted : theme.badgeNeutral}
1191 bg={theme.panelAlt}
1192 >
1193 {label}
1194 </span>
1195 </text>

Callers 1

renderRowFunction · 0.85

Calls 5

gapKeyFunction · 0.90
neutralRailColorFunction · 0.90
dimRailColorFunction · 0.90
collapsedRowLabelFunction · 0.85
fitTextFunction · 0.70

Tested by

no test coverage detected