Files
supabase/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx
T
Joshen Lim 09a1f431bc Mass update for all lucide icon imports to use the component with Icon suffix (#51659)
## Context

This is largely just a mechanical change here:
Opting to use lucide icons with the `Icon` suffix across all icon
imports within `studio`
- so that it’s clearer which components are icons + reduces the
possibility of name collision with our own components
- e.g <User /> vs <UserIcon />

Also added a eslint rule for this:
<img width="1069" height="167" alt="image"
src="https://github.com/user-attachments/assets/7f36f443-5ca2-4bf6-8d22-86e774513bfc"
/>

And updated `AGENTS.md` as such:
```
Icons come from `lucide-react`, always imported with the `Icon` suffix (`import { CheckIcon, Trash2Icon } from 'lucide-react'`) — never the bare names (`Check`) or `Check as CheckIcon` aliases (lint-enforced).
```
2026-10-14 12:56:55 +02:00

84 lines
2.6 KiB
TypeScript

import { useParams } from 'common'
import { GitMergeIcon } from 'lucide-react'
import { useRouter } from 'next/router'
import { toast } from 'sonner'
import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
import { useBranchUpdateMutation } from '@/data/branches/branch-update-mutation'
import { useBranchesQuery } from '@/data/branches/branches-query'
import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
import { useTrack } from '@/lib/telemetry/track'
export const MergeRequestButton = () => {
const { ref } = useParams()
const router = useRouter()
const { data: projectDetails } = useSelectedProjectQuery()
const track = useTrack()
const projectRef = projectDetails?.parent_project_ref || ref
const { data: branches } = useBranchesQuery({ projectRef }, { enabled: Boolean(projectDetails) })
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 = () => {
track('header_merge_request_button_clicked', { hasReviewRequested })
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`)
track('branch_create_merge_request_button_clicked', {
branchType: selectedBranch.persistent ? 'persistent' : 'preview',
origin: 'header',
})
},
}
)
}
}
return (
<ButtonTooltip
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-primary-bright" />
)}
<GitMergeIcon size={16} strokeWidth={1.5} />
</div>
}
/>
)
}