({ relatedPaths }: InfoHeaderProps)
| 20 | }; |
| 21 | |
| 22 | export function InfoHeader({ relatedPaths }: InfoHeaderProps) { |
| 23 | const { selectedNodeId, highlightedNodeId, selectedNodes } = |
| 24 | useJsonColumnViewState(); |
| 25 | const { goToNodeId } = useJsonColumnViewAPI(); |
| 26 | |
| 27 | if (!selectedNodeId || !highlightedNodeId || selectedNodes.length === 0) { |
| 28 | return <EmptyState />; |
| 29 | } |
| 30 | |
| 31 | const selectedNode = selectedNodes[selectedNodes.length - 1]; |
| 32 | |
| 33 | const [json] = useJson(); |
| 34 | |
| 35 | const selectedHeroPath = new JSONHeroPath(selectedNodeId); |
| 36 | const selectedJson = selectedHeroPath.first(json); |
| 37 | const selectedInfo = inferType(selectedJson); |
| 38 | const formattedSelectedInfo = formatRawValue(selectedInfo); |
| 39 | const selectedName = selectedNode.longTitle ?? selectedNode.title; |
| 40 | |
| 41 | const isSelectedLeafNode = |
| 42 | selectedInfo.name !== "object" && selectedInfo.name !== "array"; |
| 43 | |
| 44 | const canBeNull = useMemo(() => { |
| 45 | return isNullable(relatedPaths, json); |
| 46 | }, [relatedPaths, json]); |
| 47 | |
| 48 | const [hovering, setHovering] = useState(false); |
| 49 | console.warn(selectedInfo); |
| 50 | |
| 51 | const newPath = formattedSelectedInfo.replace(/^#/, "$").replace(/\//g, "."); |
| 52 | |
| 53 | const handleClick = useCallback(() => { |
| 54 | goToNodeId(newPath, "pathBar"); |
| 55 | }, [newPath, goToNodeId]); |
| 56 | |
| 57 | return ( |
| 58 | <div className="mb-4 pb-4"> |
| 59 | <div className="flex items-center"> |
| 60 | <Title className="flex-1 mr-2 overflow-hidden overflow-ellipsis break-words text-slate-700 transition dark:text-slate-200"> |
| 61 | { selectedName ?? "nothing" } |
| 62 | </Title> |
| 63 | <div> |
| 64 | <ValueIcon |
| 65 | monochrome |
| 66 | type={selectedInfo} |
| 67 | size={ValueIconSize.Medium} |
| 68 | /> |
| 69 | </div> |
| 70 | </div> |
| 71 | <div |
| 72 | className="relative w-full h-full" |
| 73 | onMouseEnter={() => setHovering(true)} |
| 74 | onMouseLeave={() => setHovering(false)} |
| 75 | > |
| 76 | {isSelectedLeafNode && ( |
| 77 | <LargeMono |
| 78 | className={`z-10 py-1 mb-1 text-slate-800 overflow-ellipsis break-words transition rounded-sm dark:text-slate-300 ${ |
| 79 | hovering ? "bg-slate-100 dark:bg-slate-700" : "bg-transparent" |
nothing calls this directly
no test coverage detected