| 186 | * `isConnectableIntegration`). Empty while the catalog loads, which degrades to |
| 187 | * "connected only" rather than blocking the users table on a second request. */ |
| 188 | const useCatalogRows = (): readonly AdminCatalogRow[] => { |
| 189 | const catalog = useAtomValue(integrationsOptimisticAtom); |
| 190 | return Option.match(AsyncResult.value(catalog), { |
| 191 | onNone: (): readonly AdminCatalogRow[] => [], |
| 192 | onSome: (integrations: readonly Integration[]) => |
| 193 | integrations.map((row) => ({ slug: row.slug, kind: row.kind })), |
| 194 | }); |
| 195 | }; |
| 196 | |
| 197 | /** |
| 198 | * The connection summary: one slot per integration in the catalog, lit when |