Files
supabase/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MergeRequestButton.tsx
Ivan Vasilov 43cc61818c chore: Migrate all isPending uses in react-query (#40642)
* Bump react-query. Minor type and logic fixes.

* Migrate all use of isLoading to isPending in mutations.

* Fix type errors.
2025-11-20 16:44:53 +01:00

96 lines
3.0 KiB
TypeScript

import { GitMerge } from 'lucide-react'
import { useRouter } from 'next/router'
import { toast } from 'sonner'
import { useParams } from 'common'
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation'
import { useBranchesQuery } from 'data/branches/branches-query'
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
export const MergeRequestButton = () => {
const { ref } = useParams()
const router = useRouter()
const { data: projectDetails } = useSelectedProjectQuery()
const { data: selectedOrg } = useSelectedOrganizationQuery()
const projectRef = projectDetails?.parent_project_ref || ref
const { data: branches } = useBranchesQuery({ projectRef }, { enabled: Boolean(projectDetails) })
const { mutate: sendEvent } = useSendEventMutation()
const { mutate: updateBranch, isPending: 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(
{
branchRef: selectedBranch.project_ref,
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