import { useFlag } from 'common'
import { AlertTriangle, ChevronRight, Inbox } from 'lucide-react'
import { Badge, Button, cn } from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
import type { AdvisorItem } from './AdvisorPanel.types'
import {
advisorCategoryIcons,
formatItemDate,
getAdvisorItemSecondaryText,
getAdvisorPanelItemDisplayTitle,
severityBadgeVariants,
severityColorClasses,
severityLabels,
} from './AdvisorPanel.utils'
import { EmptyAdvisor } from './EmptyAdvisor'
import type { Notification } from '@/data/notifications/notifications-v2-query'
import type { AdvisorCategory, AdvisorSeverity } from '@/state/advisor-state'
const NoProjectNotice = () => {
const isHealthAdvisorEnabled = useFlag('healthAdvisor')
return (
Project required
{isHealthAdvisorEnabled
? 'Select a project to view its security, performance and health advisories'
: 'Select a project to view its security and performance advisories'}
)
}
interface AdvisorPanelBodyProps {
isLoading: boolean
isError: boolean
filteredItems: AdvisorItem[]
categoryFilters: AdvisorCategory[]
severityFilters: AdvisorSeverity[]
onItemClick: (item: AdvisorItem) => void
onClearFilters: () => void
onShowHiddenItems: () => void
hiddenItemsCount: number
hasAnyFilters: boolean
hasProjectRef?: boolean
projectNameByRef?: ReadonlyMap
}
export const AdvisorPanelBody = ({
isLoading,
isError,
filteredItems,
categoryFilters,
severityFilters,
onItemClick,
onClearFilters,
onShowHiddenItems,
hiddenItemsCount,
hasAnyFilters,
hasProjectRef = true,
projectNameByRef,
}: AdvisorPanelBodyProps) => {
// Notifications are the only items that exist without a project, so the notice replaces
// the list whenever the user has narrowed to categories that need one.
const needsProject =
categoryFilters.length > 0 && categoryFilters.every((category) => category !== 'messages')
if (!hasProjectRef && needsProject) {
return
}
if (isLoading) {
return (