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,
)
| 1136 | |
| 1137 | /** Render collapsed and hunk-header rows, including the optional add-note target. */ |
| 1138 | function 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> |
no test coverage detected