@@ -33,6 +33,8 @@ import {
3333 buildPatchReviewItems ,
3434 buildRemoteReviewItems ,
3535 buildUntrackedReviewItems ,
36+ changedFileSignature ,
37+ patchFileSignature ,
3638} from "./reviewItemBuilders" ;
3739
3840const EMPTY_CHANGED_FILES : ChangedFile [ ] = [ ] ;
@@ -138,7 +140,10 @@ export function ReviewPage({ task }: ReviewPageProps) {
138140 expandAll,
139141 collapseAll,
140142 uncollapseFile,
141- } = useReviewState ( changedFiles , allPaths ) ;
143+ collapseFiles,
144+ viewedRecord,
145+ toggleViewed,
146+ } = useReviewState ( changedFiles , allPaths , taskId ) ;
142147
143148 const stagedPathSet = useMemo (
144149 ( ) => new Set ( stagedParsedFiles . map ( ( f ) => f . name ?? f . prevName ?? "" ) ) ,
@@ -191,6 +196,9 @@ export function ReviewPage({ task }: ReviewPageProps) {
191196 expandAll = { expandAll }
192197 collapseAll = { collapseAll }
193198 uncollapseFile = { uncollapseFile }
199+ collapseFiles = { collapseFiles }
200+ viewedRecord = { viewedRecord }
201+ toggleViewed = { toggleViewed }
194202 refetch = { refetch }
195203 hasStagedFiles = { hasStagedFiles }
196204 stagedParsedFiles = { stagedParsedFiles }
@@ -224,6 +232,9 @@ function LocalReviewContent({
224232 expandAll,
225233 collapseAll,
226234 uncollapseFile,
235+ collapseFiles,
236+ viewedRecord,
237+ toggleViewed,
227238 refetch,
228239 hasStagedFiles,
229240 stagedParsedFiles,
@@ -253,6 +264,9 @@ function LocalReviewContent({
253264 expandAll : ( ) => void ;
254265 collapseAll : ( ) => void ;
255266 uncollapseFile : ( filePath : string ) => void ;
267+ collapseFiles : ( keys : string [ ] ) => void ;
268+ viewedRecord : Record < string , string > ;
269+ toggleViewed : ( key : string , sig : string | null ) => void ;
256270 refetch : ( ) => void ;
257271 hasStagedFiles : boolean ;
258272 stagedParsedFiles : ReturnType < typeof parsePatchFiles > [ number ] [ "files" ] ;
@@ -295,6 +309,27 @@ function LocalReviewContent({
295309 [ filesByKey , stageToggle ] ,
296310 ) ;
297311
312+ const currentSignatures = useMemo ( ( ) => {
313+ const map = new Map < string , string > ( ) ;
314+ for ( const f of stagedParsedFiles ) {
315+ map . set (
316+ makeFileKey ( true , f . name ?? f . prevName ?? "" ) ,
317+ patchFileSignature ( f ) ,
318+ ) ;
319+ }
320+ for ( const f of unstagedParsedFiles ) {
321+ map . set (
322+ makeFileKey ( false , f . name ?? f . prevName ?? "" ) ,
323+ patchFileSignature ( f ) ,
324+ ) ;
325+ }
326+ for ( const f of untrackedFiles ) {
327+ const signature = changedFileSignature ( f ) ;
328+ if ( signature ) map . set ( makeFileKey ( f . staged , f . path ) , signature ) ;
329+ }
330+ return map ;
331+ } , [ stagedParsedFiles , unstagedParsedFiles , untrackedFiles ] ) ;
332+
298333 const items = useMemo < ReviewListItem [ ] > ( ( ) => {
299334 const reviewItems : ReviewListItem [ ] = [ ] ;
300335
@@ -393,6 +428,7 @@ function LocalReviewContent({
393428 onExpandAll = { expandAll }
394429 onCollapseAll = { collapseAll }
395430 onUncollapseFile = { uncollapseFile }
431+ onCollapseFiles = { collapseFiles }
396432 onRefresh = { refetch }
397433 onDiscardAll = { totalFileCount > 0 ? discardAllChanges : undefined }
398434 effectiveSource = { effectiveSource }
@@ -401,6 +437,9 @@ function LocalReviewContent({
401437 defaultBranch = { defaultBranch }
402438 items = { items }
403439 itemIndexByFilePath = { itemIndexByFilePath }
440+ currentSignatures = { currentSignatures }
441+ viewedRecord = { viewedRecord }
442+ onToggleViewed = { toggleViewed }
404443 />
405444 ) ;
406445}
@@ -455,7 +494,16 @@ function RemoteReviewPage({
455494 : prLoading && files . length === 0 ;
456495
457496 const allPaths = useMemo ( ( ) => files . map ( ( f ) => f . path ) , [ files ] ) ;
458- const reviewState = useReviewState ( files , allPaths ) ;
497+ const reviewState = useReviewState ( files , allPaths , taskId ) ;
498+
499+ const currentSignatures = useMemo ( ( ) => {
500+ const map = new Map < string , string > ( ) ;
501+ for ( const f of files ) {
502+ const signature = changedFileSignature ( f ) ;
503+ if ( signature ) map . set ( f . path , signature ) ;
504+ }
505+ return map ;
506+ } , [ files ] ) ;
459507
460508 const items = useMemo (
461509 ( ) =>
@@ -492,13 +540,17 @@ function RemoteReviewPage({
492540 onExpandAll = { reviewState . expandAll }
493541 onCollapseAll = { reviewState . collapseAll }
494542 onUncollapseFile = { reviewState . uncollapseFile }
543+ onCollapseFiles = { reviewState . collapseFiles }
495544 onRefresh = { onRefresh }
496545 effectiveSource = { effectiveSource }
497546 branchSourceAvailable = { branchSourceAvailable }
498547 prSourceAvailable = { prSourceAvailable }
499548 defaultBranch = { defaultBranch }
500549 items = { items }
501550 itemIndexByFilePath = { itemIndexByFilePath }
551+ currentSignatures = { currentSignatures }
552+ viewedRecord = { reviewState . viewedRecord }
553+ onToggleViewed = { reviewState . toggleViewed }
502554 />
503555 ) ;
504556}
0 commit comments