|
1 | 1 | import { useState, useMemo, useEffect } from "react" |
2 | | -import { CircleChevronDown, CircleChevronUp, Dot } from "lucide-react" |
| 2 | +import { CircleChevronDown, CircleChevronUp, Dot, CircleQuestionMark } from "lucide-react" |
3 | 3 | import { formatMetricValue, type ValueType } from "@common/src/format-metric-value" |
| 4 | +import { TooltipProvider } from "@radix-ui/react-tooltip" |
| 5 | +import { CustomTooltip } from "./custom-tooltip" |
4 | 6 |
|
5 | 7 | interface AccordionProps { |
6 | 8 | accordionName?: string; |
7 | 9 | accordionItems?: Record<string, number | null>; |
8 | 10 | valueType?: ValueType; |
9 | 11 | searchQuery?: string; |
| 12 | + accordionDescription?: string; |
| 13 | + singleMetricDescriptions?: Record<string, { description: string; unit: string }>; |
10 | 14 | } |
11 | 15 |
|
12 | | -export default function Accordion({ accordionName, accordionItems, valueType = "number", searchQuery = "" }: AccordionProps) { |
| 16 | +export default function Accordion({ accordionName, accordionItems, valueType = "number", searchQuery = "", |
| 17 | + accordionDescription = "", singleMetricDescriptions = {} }: AccordionProps) { |
13 | 18 | const [isOpen, setIsOpen] = useState(false) |
14 | 19 |
|
15 | 20 | const ToggleIcon = isOpen ? CircleChevronUp : CircleChevronDown |
@@ -55,25 +60,38 @@ export default function Accordion({ accordionName, accordionItems, valueType = " |
55 | 60 |
|
56 | 61 | return ( |
57 | 62 | <div className="w-full mt-2"> |
58 | | - <div className="h-14 px-2 py-4 dark:border-tw-dark-border border rounded flex items-center gap-2 justify-between"> |
59 | | - <div className="flex flex-col gap-1"> |
60 | | - <span className="font-semibold text-sm">{accordionName}</span> |
61 | | - <span className="text-xs font-light text-tw-dark-border"> |
62 | | - {searchQuery.trim() && filteredItemCount !== itemCount ? ( |
63 | | - <>{filteredItemCount} of {itemCount} {itemCount === 1 ? "metric" : "metrics"}</> |
64 | | - ) : ( |
65 | | - <>{itemCount} {itemCount === 1 ? "metric" : "metrics"}</> |
66 | | - )}</span> |
| 63 | + <TooltipProvider> |
| 64 | + <div className="h-14 px-2 py-4 dark:border-tw-dark-border border rounded flex items-center gap-2 justify-between"> |
| 65 | + <div className="flex flex-col gap-1"> |
| 66 | + <span className="font-semibold text-sm flex items-center gap-1">{accordionName} |
| 67 | + <CustomTooltip description={accordionDescription}> |
| 68 | + <CircleQuestionMark className="bg-tw-primary/10 rounded-full text-tw-primary" size={16} /> |
| 69 | + </CustomTooltip> |
| 70 | + </span> |
| 71 | + <span className="text-xs font-light text-tw-dark-border"> |
| 72 | + {searchQuery.trim() && filteredItemCount !== itemCount ? ( |
| 73 | + <>{filteredItemCount} of {itemCount} {itemCount === 1 ? "metric" : "metrics"}</> |
| 74 | + ) : ( |
| 75 | + <>{itemCount} {itemCount === 1 ? "metric" : "metrics"}</> |
| 76 | + )}</span> |
| 77 | + </div> |
| 78 | + <button onClick={() => setIsOpen(!isOpen)}><ToggleIcon className="text-tw-primary cursor-pointer hover:text-tw-primary/80" /></button> |
67 | 79 | </div> |
68 | | - <button onClick={() => setIsOpen(!isOpen)}><ToggleIcon className="text-tw-primary cursor-pointer hover:text-tw-primary/80" /></button> |
69 | | - </div> |
| 80 | + </TooltipProvider> |
70 | 81 |
|
71 | 82 | {isOpen && ( |
72 | 83 | <div className="px-2 py-3 border bg-gray-50 dark:bg-gray-800 text-sm dark:border-tw-dark-border rounded-b"> |
73 | 84 | <ul className="space-y-2"> |
74 | 85 | {Object.entries(filteredItems).map(([key, value]) => ( |
75 | 86 | <li className="flex justify-between items-center hover:bg-tw-primary/20" key={key}> |
76 | | - <span className="font-normal flex items-center"><Dot className="text-tw-primary" size={30} />{formatKey(key)}</span> |
| 87 | + <div className="flex items-center gap-1"> |
| 88 | + <span className="font-normal flex items-center"><Dot className="text-tw-primary" size={30} />{formatKey(key)}</span> |
| 89 | + {singleMetricDescriptions[key] && ( |
| 90 | + <CustomTooltip description={singleMetricDescriptions[key].description} unit={singleMetricDescriptions[key].unit}> |
| 91 | + <CircleQuestionMark className="bg-tw-primary/10 rounded-full text-tw-primary" size={13} /> |
| 92 | + </CustomTooltip> |
| 93 | + )} |
| 94 | + </div> |
77 | 95 | <span className="font-light">{formatMetricValue(key, value, valueType)}</span> |
78 | 96 | </li> |
79 | 97 | ))} |
|
0 commit comments