Files
supabase/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MergeRequestButton.tsx
Pamela Chia f9e330f3ca Chore/track branching 2 (#37350)
* add review branch w ai

* track create branch

* track update push branch event

* track create merge request

* track create and close merge request

* track merge attempts and results

* add delete branch event

* combine handle update

* fix lint
2025-07-22 20:51:08 +08:00

95 lines
2.9 KiB
TypeScript

import { ButtonTooltip } from 'components/ui/ButtonTooltip'
import { GitMerge } from 'lucide-react'
import { useBranchesQuery } from 'data/branches/branches-query'
import { useParams } from 'common'
import { useSelectedProject } from 'hooks/misc/useSelectedProject'
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
import { useRouter } from 'next/router'
import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation'
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
import { toast } from 'sonner'
export const MergeRequestButton = () => {
const { ref } = useParams()
const router = useRouter()
const projectDetails = useSelectedProject()
const selectedOrg = useSelectedOrganization()
const projectRef = projectDetails?.parent_project_ref || ref
const { data: branches } = useBranchesQuery({ projectRef }, { enabled: Boolean(projectDetails) })
const { mutate: sendEvent } = useSendEventMutation()
const { mutate: updateBranch, isLoading: isUpdating } = useBranchUpdateMutation({
onError: () => {
toast.error(`Failed to open merge request`)
},
})
const selectedBranch = branches?.find((branch) => branch.project_ref === ref)
if (!projectRef || !selectedBranch || selectedBranch.is_default || selectedBranch.git_branch)
return null
const hasReviewRequested = !!selectedBranch?.review_requested_at
const buttonLabel = hasReviewRequested ? 'Review merge request' : 'Open merge request'
const handleClick = () => {
if (hasReviewRequested) {
router.push(`/project/${selectedBranch.project_ref}/merge`)
} else {
updateBranch(
{
id: selectedBranch.id,
projectRef,
requestReview: true,
},
{
onSuccess: () => {
toast.success('Merge request created')
router.push(`/project/${selectedBranch.project_ref}/merge`)
sendEvent({
action: 'branch_create_merge_request_button_clicked',
properties: {
branchType: selectedBranch.persistent ? 'persistent' : 'preview',
origin: 'header',
},
groups: {
project: projectRef ?? 'Unknown',
organization: selectedOrg?.slug ?? 'Unknown',
},
})
},
}
)
}
}
return (
<ButtonTooltip
type="default"
className="rounded-full w-[26px] h-[26px]"
onClick={handleClick}
loading={isUpdating}
tooltip={{
content: {
text: buttonLabel,
side: 'bottom',
align: 'center',
},
}}
icon={
<div className="relative">
{hasReviewRequested && (
<span className="w-1 h-1 absolute top-0 right-0 rounded-full bg-brand" />
)}
<GitMerge size={16} strokeWidth={1.5} />
</div>
}
/>
)
}
export default MergeRequestButton