MergeRequestButton.tsx 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // @ts-nocheck
  2. import { useParams } from 'common'
  3. import { GitMerge } from 'lucide-react'
  4. import { useRouter } from 'next/router'
  5. import { toast } from 'sonner'
  6. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  7. import { useBranchUpdateMutation } from '@/data/branches/branch-update-mutation'
  8. import { useBranchesQuery } from '@/data/branches/branches-query'
  9. import { useSendEventMutation } from '@/data/telemetry/send-event-mutation'
  10. import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
  11. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  12. import { useTrack } from '@/lib/telemetry/track'
  13. export const MergeRequestButton = () => {
  14. const { ref } = useParams()
  15. const router = useRouter()
  16. const { data: projectDetails } = useSelectedProjectQuery()
  17. const { data: selectedOrg } = useSelectedOrganizationQuery()
  18. const projectRef = projectDetails?.parent_project_ref || ref
  19. const { data: branches } = useBranchesQuery({ projectRef }, { enabled: Boolean(projectDetails) })
  20. const { mutate: sendEvent } = useSendEventMutation()
  21. const track = useTrack()
  22. const { mutate: updateBranch, isPending: isUpdating } = useBranchUpdateMutation({
  23. onError: () => {
  24. toast.error(`Failed to open merge request`)
  25. },
  26. })
  27. const selectedBranch = branches?.find((branch) => branch.project_ref === ref)
  28. if (!projectRef || !selectedBranch || selectedBranch.is_default || selectedBranch.git_branch)
  29. return null
  30. const hasReviewRequested = !!selectedBranch.review_requested_at
  31. const buttonLabel = hasReviewRequested ? 'Review merge request' : 'Open merge request'
  32. const handleClick = () => {
  33. track('header_merge_request_button_clicked', { hasReviewRequested })
  34. if (hasReviewRequested) {
  35. router.push(`/project/${selectedBranch.project_ref}/merge`)
  36. } else {
  37. updateBranch(
  38. {
  39. branchRef: selectedBranch.project_ref,
  40. projectRef,
  41. requestReview: true,
  42. },
  43. {
  44. onSuccess: () => {
  45. toast.success('Merge request created')
  46. router.push(`/project/${selectedBranch.project_ref}/merge`)
  47. sendEvent({
  48. action: 'branch_create_merge_request_button_clicked',
  49. properties: {
  50. branchType: selectedBranch.persistent ? 'persistent' : 'preview',
  51. origin: 'header',
  52. },
  53. groups: {
  54. project: projectRef ?? 'Unknown',
  55. organization: selectedOrg?.slug ?? 'Unknown',
  56. },
  57. })
  58. },
  59. }
  60. )
  61. }
  62. }
  63. return (
  64. <ButtonTooltip
  65. type="default"
  66. className="rounded-full w-[26px] h-[26px]"
  67. onClick={handleClick}
  68. loading={isUpdating}
  69. tooltip={{
  70. content: {
  71. text: buttonLabel,
  72. side: 'bottom',
  73. align: 'center',
  74. },
  75. }}
  76. icon={
  77. <div className="relative">
  78. {hasReviewRequested && (
  79. <span className="w-1 h-1 absolute top-0 right-0 rounded-full bg-brand" />
  80. )}
  81. <GitMerge size={16} strokeWidth={1.5} />
  82. </div>
  83. }
  84. />
  85. )
  86. }