| gio | 3d0bf03 | 2025-06-05 06:57:26 +0000 | [diff] [blame^] | 1 | import React, { useMemo } from "react"; |
| 2 | import { useStateStore, ServiceNode } from "@/lib/state"; |
| 3 | import { NodeDetails } from "./components/node-details"; |
| 4 | import { Actions } from "./components/actions"; |
| 5 | import { Canvas } from "./components/canvas"; |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 6 | |
| 7 | export function Overview(): React.ReactNode { |
| gio | 3d0bf03 | 2025-06-05 06:57:26 +0000 | [diff] [blame^] | 8 | const store = useStateStore(); |
| 9 | const nodes = useMemo(() => store.nodes, [store.nodes]); |
| 10 | const isDeployMode = useMemo(() => store.mode === "deploy", [store.mode]); |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 11 | return ( |
| gio | 3d0bf03 | 2025-06-05 06:57:26 +0000 | [diff] [blame^] | 12 | <div className="h-full w-full overflow-auto bg-white p-2"> |
| 13 | <div className="w-full flex flex-row justify-end"> |
| 14 | <Actions /> |
| 15 | <Canvas className="hidden" /> |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 16 | </div> |
| gio | 3d0bf03 | 2025-06-05 06:57:26 +0000 | [diff] [blame^] | 17 | <div className="flex flex-wrap gap-4 pt-2"> |
| 18 | {nodes |
| 19 | .filter((n): n is ServiceNode => n.type === "app") |
| 20 | .map((n) => { |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 21 | return ( |
| gio | 3d0bf03 | 2025-06-05 06:57:26 +0000 | [diff] [blame^] | 22 | <div key={n.id} className="h-fit w-fit rounded-lg border-gray-200 border-2 p-2"> |
| 23 | <NodeDetails disabled={isDeployMode} {...n} /> |
| 24 | </div> |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 25 | ); |
| 26 | })} |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 27 | </div> |
| gio | 3d0bf03 | 2025-06-05 06:57:26 +0000 | [diff] [blame^] | 28 | </div> |
| gio | da12043 | 2025-06-02 09:42:26 +0000 | [diff] [blame] | 29 | ); |
| 30 | } |