({ graphVersion }: Props)
| 102 | } |
| 103 | |
| 104 | export default function IndexMetadataPanel({ graphVersion }: Props) { |
| 105 | const { store } = useStore(); |
| 106 | const [entries, setEntries] = useState<IndexMetadata[]>([]); |
| 107 | const [collapsed, setCollapsed] = useState(false); |
| 108 | |
| 109 | useEffect(() => { |
| 110 | let cancelled = false; |
| 111 | store.fetchMetadata().then((result) => { |
| 112 | if (!cancelled) setEntries(result); |
| 113 | }); |
| 114 | return () => { |
| 115 | cancelled = true; |
| 116 | }; |
| 117 | }, [store, graphVersion]); |
| 118 | |
| 119 | if (entries.length === 0) return null; |
| 120 | |
| 121 | return ( |
| 122 | <div className="index-metadata"> |
| 123 | <div className="index-metadata-header"> |
| 124 | <button |
| 125 | className="filter-section-collapse-btn" |
| 126 | onClick={() => setCollapsed((c) => !c)} |
| 127 | aria-expanded={!collapsed} |
| 128 | > |
| 129 | <svg |
| 130 | width="10" |
| 131 | height="10" |
| 132 | viewBox="0 0 10 10" |
| 133 | className={`filter-expand-icon ${collapsed ? '' : 'filter-expand-icon--open'}`} |
| 134 | > |
| 135 | <path |
| 136 | d="M3 2 L7 5 L3 8" |
| 137 | fill="none" |
| 138 | stroke="currentColor" |
| 139 | strokeWidth="1.5" |
| 140 | /> |
| 141 | </svg> |
| 142 | </button> |
| 143 | <span |
| 144 | className="filter-section-title" |
| 145 | onClick={() => setCollapsed((c) => !c)} |
| 146 | > |
| 147 | Index Info |
| 148 | </span> |
| 149 | </div> |
| 150 | {!collapsed && ( |
| 151 | <div className="index-metadata-entries"> |
| 152 | {entries.map((meta, i) => ( |
| 153 | <MetadataEntry key={meta.repoId ?? i} meta={meta} /> |
| 154 | ))} |
| 155 | </div> |
| 156 | )} |
| 157 | </div> |
| 158 | ); |
| 159 | } |
nothing calls this directly
no test coverage detected