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 && (
)} ) }