Files
supabase/apps/studio/components/ui/OrganizationProjectSelector/ProjectCommandItem.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

71 lines
1.8 KiB
TypeScript

import { CheckIcon } from 'lucide-react'
import { ReactNode } from 'react'
import { cn, CommandItem } from 'ui'
import { CommandItemLink } from '@/components/ui/CommandItemLink'
import type { OrgProject } from '@/data/projects/org-projects-infinite-query'
export interface ProjectCommandItemProps {
project: OrgProject
selectedRef: string | undefined
onSelect?: (project: OrgProject) => void
onClose: () => void
href?: string
renderRow?: (project: OrgProject) => ReactNode
checkPosition?: 'right' | 'left'
isOptionDisabled?: (project: OrgProject) => boolean
}
export function ProjectCommandItem({
project,
selectedRef,
onSelect,
onClose,
href,
renderRow,
checkPosition = 'right',
isOptionDisabled,
}: ProjectCommandItemProps) {
const handleSelect = () => {
onSelect?.(project)
onClose()
}
const disabled = isOptionDisabled?.(project) ?? false
const content = (
<>
{renderRow ? (
renderRow(project)
) : (
<div
className={cn(
'w-full flex items-center',
checkPosition === 'left' ? 'gap-x-2' : 'justify-between',
project.ref !== selectedRef && checkPosition === 'left' && 'ml-6'
)}
>
{checkPosition === 'left' && project.ref === selectedRef && <CheckIcon size={16} />}
{project.name}
{checkPosition === 'right' && project.ref === selectedRef && <CheckIcon size={16} />}
</div>
)}
</>
)
const commandItemProps = {
value: `${project.name.replaceAll('"', '')}-${project.ref}`,
className: 'cursor-pointer w-full',
onSelect: handleSelect,
disabled,
}
return href ? (
<CommandItemLink href={href} {...commandItemProps}>
{content}
</CommandItemLink>
) : (
<CommandItem {...commandItemProps}>{content}</CommandItem>
)
}