AdvisorPanelHeader.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { ChevronLeft, X } from 'lucide-react'
  2. import { Badge } from 'ui'
  3. import type { AdvisorItem } from './AdvisorPanel.types'
  4. import {
  5. formatItemDate,
  6. getAdvisorItemSecondaryText,
  7. getAdvisorPanelItemDisplayTitle,
  8. severityBadgeVariants,
  9. severityLabels,
  10. } from './AdvisorPanel.utils'
  11. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  12. interface AdvisorPanelHeaderProps {
  13. selectedItem: AdvisorItem | undefined
  14. onBack: () => void
  15. onClose: () => void
  16. }
  17. export const AdvisorPanelHeader = ({ selectedItem, onBack, onClose }: AdvisorPanelHeaderProps) => {
  18. const displayTitle = selectedItem ? getAdvisorPanelItemDisplayTitle(selectedItem) : undefined
  19. const secondaryText = selectedItem ? getAdvisorItemSecondaryText(selectedItem) : undefined
  20. const metadataText = selectedItem
  21. ? (secondaryText ??
  22. (selectedItem.createdAt ? formatItemDate(selectedItem.createdAt) : undefined))
  23. : undefined
  24. // Only capitalize date strings (e.g. "a few seconds ago"); entity strings
  25. // like "public.users" must not be case-altered.
  26. const metadataCapitalize =
  27. selectedItem !== undefined &&
  28. secondaryText === undefined &&
  29. selectedItem.createdAt !== undefined
  30. return (
  31. <div className="border-b px-4 py-3 flex items-center gap-3">
  32. <ButtonTooltip
  33. type="text"
  34. className="w-7 h-7 p-0 flex justify-center items-center"
  35. icon={<ChevronLeft size={16} strokeWidth={1.5} aria-hidden={true} />}
  36. onClick={onBack}
  37. tooltip={{ content: { side: 'bottom', text: 'Back to list' } }}
  38. />
  39. <div className="flex items-center gap-2 overflow-hidden flex-1">
  40. <div className="flex-1 flex flex-col">
  41. <span className="heading-default">{displayTitle}</span>
  42. {metadataText && (
  43. <span
  44. className={`text-xs text-foreground-light${metadataCapitalize ? ' capitalize-sentence' : ''}`}
  45. >
  46. {metadataText}
  47. </span>
  48. )}
  49. </div>
  50. {selectedItem && (
  51. <Badge variant={severityBadgeVariants[selectedItem.severity]}>
  52. {severityLabels[selectedItem.severity]}
  53. </Badge>
  54. )}
  55. </div>
  56. <ButtonTooltip
  57. type="text"
  58. className="w-7 h-7 p-0"
  59. icon={<X strokeWidth={1.5} />}
  60. onClick={onClose}
  61. tooltip={{ content: { side: 'bottom', text: 'Close Advisor Center' } }}
  62. />
  63. </div>
  64. )
  65. }