import { Lint } from 'data/lint/lint-query'
import { Notification } from 'data/notifications/notifications-v2-query'
import { AlertTriangle, ChevronRight, Inbox } from 'lucide-react'
import { AdvisorSeverity, AdvisorTab } from 'state/advisor-state'
import { Badge, Button, cn } from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns'
import type { AdvisorItem } from './AdvisorPanel.types'
import {
formatItemDate,
getAdvisorItemDisplayTitle,
getLintEntityString,
severityBadgeVariants,
severityColorClasses,
severityLabels,
tabIconMap,
} from './AdvisorPanel.utils'
import { EmptyAdvisor } from './EmptyAdvisor'
const NoProjectNotice = () => {
return (
Project required
Select a project to view security and performance advisories
)
}
interface AdvisorPanelBodyProps {
isLoading: boolean
isError: boolean
filteredItems: AdvisorItem[]
activeTab: AdvisorTab
severityFilters: AdvisorSeverity[]
onItemClick: (item: AdvisorItem) => void
onClearFilters: () => void
hiddenItemsCount: number
hasAnyFilters: boolean
hasProjectRef?: boolean
}
export const AdvisorPanelBody = ({
isLoading,
isError,
filteredItems,
activeTab,
severityFilters,
onItemClick,
onClearFilters,
hiddenItemsCount,
hasAnyFilters,
hasProjectRef = true,
}: AdvisorPanelBodyProps) => {
// Show notice if no project ref and trying to view project-specific tabs
if (!hasProjectRef && activeTab !== 'messages' && activeTab !== 'all') {
return
}
if (isLoading) {
return (
)
}
if (isError) {
return (
Error loading advisories
Please try again later.
)
}
if (filteredItems.length === 0) {
return (
)
}
return (
<>
{filteredItems.map((item) => {
const SeverityIcon = tabIconMap[item.tab as Exclude
]
const severityClass = severityColorClasses[item.severity]
const isNotification = item.source === 'notification'
const notification = isNotification ? (item.original as Notification) : null
const isUnread = notification?.status === 'new'
const lint = !isNotification ? (item.original as Lint) : null
// Primary text: issue type for lint items, title for notifications
const primaryText = getAdvisorItemDisplayTitle(item)
// Secondary text: entity for lint items when no date, date for notifications
const hasDate = !!item.createdAt
const entityString = getLintEntityString(lint)
return (
)
})}
{severityFilters.length > 0 && hiddenItemsCount > 0 && (
)}
>
)
}