1- import React , { useState , useCallback } from 'react' ;
1+ import React , { useState , useCallback , useMemo } from 'react' ;
22import { useMergeChecks } from './hooks/useMergeChecks' ;
33import { ReviewerSection } from './ReviewerSection' ;
44import { ChecksSection } from './ChecksSection' ;
@@ -7,16 +7,39 @@ import { FeedMergedIcon } from "@primer/octicons-react";
77import { usePostMrMerge } from "@/hooks/usePostMrMerge" ;
88import { useGetMergeBox } from "@/components/MrBox/hooks/useGetMergeBox" ;
99import { LoadingSpinner } from "@gitmono/ui" ;
10-
11- const REQUIRED_REVIEWERS = 2 ; // 假设需要2个 reviewer
10+ import { usePostMrReviewerApprove } from "@/hooks/usePostMrReviewerApprove" ;
11+ import { useRouter } from "next/router" ;
12+ import { useGetMrReviewers } from "@/hooks/useGetMrReviewers" ;
13+ import { useQueryClient } from '@tanstack/react-query' ;
14+ import { legacyApiClient } from '@/utils/queryClient' ;
15+ import { useGetCurrentUser } from "@/hooks/useGetCurrentUser" ;
1216
1317export function MergeBox ( { prId } : { prId : string } ) {
1418 const { checks, refresh } = useMergeChecks ( prId ) ;
15- const [ isReviewerApproved , setIsReviewerApproved ] = useState ( false ) ;
1619 const [ hasCheckFailures , setHasCheckFailures ] = useState ( true ) ;
1720 const { mutate : approveMr , isPending : mrMergeIsPending } = usePostMrMerge ( prId )
21+ const { mutate : reviewApprove } = usePostMrReviewerApprove ( )
22+ const queryClient = useQueryClient ( ) ;
23+
24+ const route = useRouter ( ) ;
25+ const { link } = route . query ;
26+ const id = typeof link === 'string' ? link : '' ;
27+ const { reviewers, isLoading : isReviewerLoading } = useGetMrReviewers ( id )
28+
29+ const required : number = useMemo ( ( ) => reviewers . length , [ reviewers ] ) ;
30+ const actual : number = useMemo ( ( ) => reviewers . filter ( i => i . approved ) . length , [ reviewers ] ) ;
31+ const isAllReviewerApproved : boolean = useMemo ( ( ) => actual >= required , [ actual , required ] ) ;
32+
33+ let isNowUserApprove : boolean | undefined = undefined ;
34+ const { data } = useGetCurrentUser ( )
35+ const find_user = reviewers . find ( i => i . username === data ?. username )
36+
37+ if ( find_user ) {
38+ isNowUserApprove = find_user . approved
39+ }
40+
41+ const { mergeBoxData, isLoading : isAdditionLoading } = useGetMergeBox ( prId )
1842
19- const { mergeBoxData, isLoading } = useGetMergeBox ( prId )
2043
2144 // 定义最终的合并处理函数
2245 const handleMerge = useCallback ( async ( ) => {
@@ -38,30 +61,47 @@ export function MergeBox({ prId }: { prId: string }) {
3861 }
3962 } , [ approveMr , refresh ] ) ;
4063
64+ const handleApprove = useCallback ( async ( ) => {
65+ reviewApprove ( {
66+ link : id ,
67+ data : {
68+ approved : true
69+ }
70+ } , {
71+ onSuccess : ( ) => {
72+ queryClient . invalidateQueries ( {
73+ queryKey : legacyApiClient . v1 . getApiMrReviewers ( ) . requestKey ( id )
74+ } ) ;
75+ }
76+ } ) ;
77+ } , [ reviewApprove , id , queryClient ] ) ;
78+
4179 const additionalChecks = mergeBoxData ?. merge_requirements ?. conditions ?? [ ]
4280
4381 return (
4482 < div className = "flex" >
4583 < FeedMergedIcon size = { 24 } className = 'text-gray-500 ml-1' />
46- { isLoading ? (
84+ { isReviewerLoading && isAdditionLoading ? (
4785 < div className = 'flex h-[400px] items-center justify-center' >
4886 < LoadingSpinner />
4987 </ div >
5088 ) : (
5189 < div className = "border rounded-lg bg-white divide-y ml-3 w-full" >
5290 < ReviewerSection
53- required = { REQUIRED_REVIEWERS }
54- onStatusChange = { setIsReviewerApproved }
91+ required = { required }
92+ actual = { actual }
5593 />
5694 < ChecksSection
5795 checks = { checks }
5896 onStatusChange = { setHasCheckFailures }
5997 additionalChecks = { additionalChecks }
6098 />
6199 < MergeSection
62- isReviewerApproved = { isReviewerApproved }
100+ isNowUserApprove = { isNowUserApprove }
101+ isAllReviewerApproved = { isAllReviewerApproved }
63102 hasCheckFailures = { hasCheckFailures }
64103 onMerge = { handleMerge }
104+ onApprove = { handleApprove }
65105 isMerging = { mrMergeIsPending }
66106 />
67107 </ div >
0 commit comments