| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 1 | import { useState, useEffect } from "react"; |
| gio | 8e74dc0 | 2025-06-13 10:19:26 +0000 | [diff] [blame] | 2 | import { nodeLabel, useStateStore } from "@/lib/state"; |
| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 3 | import { Icon } from "./icon"; |
| 4 | import { Input } from "./ui/input"; |
| gio | 6914832 | 2025-06-19 23:16:12 +0400 | [diff] [blame] | 5 | import { AppNode } from "config"; |
| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 6 | |
| 7 | export function Name({ |
| 8 | node, |
| 9 | disabled, |
| 10 | editing, |
| 11 | }: { |
| 12 | node: AppNode; |
| 13 | disabled?: boolean; |
| 14 | editing?: boolean; |
| 15 | }): React.ReactNode { |
| 16 | const { id, data } = node; |
| 17 | const store = useStateStore(); |
| 18 | const [isEditing, setIsEditing] = useState(false); |
| 19 | useEffect(() => { |
| 20 | if (data.label === "") { |
| 21 | setIsEditing(true); |
| 22 | } |
| 23 | }, [data.label, disabled]); |
| gio | 8e74dc0 | 2025-06-13 10:19:26 +0000 | [diff] [blame] | 24 | if (node.type === "github" || node.type === "gateway-https" || node.type === "gateway-tcp") { |
| 25 | return ( |
| 26 | <div className="w-full flex flex-row gap-1 items-center"> |
| gio | 6914832 | 2025-06-19 23:16:12 +0400 | [diff] [blame] | 27 | <Icon node={node} /> |
| gio | efc9a4a | 2025-07-06 16:22:10 +0000 | [diff] [blame^] | 28 | <h4 className="w-full cursor-text select-none hover:outline-solid hover:outline-2 hover:outline-gray-200"> |
| gio | 8e74dc0 | 2025-06-13 10:19:26 +0000 | [diff] [blame] | 29 | {nodeLabel(node)} |
| gio | efc9a4a | 2025-07-06 16:22:10 +0000 | [diff] [blame^] | 30 | </h4> |
| gio | 8e74dc0 | 2025-06-13 10:19:26 +0000 | [diff] [blame] | 31 | </div> |
| 32 | ); |
| 33 | } |
| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 34 | return ( |
| 35 | <div className="w-full flex flex-row gap-1 items-center"> |
| gio | 6914832 | 2025-06-19 23:16:12 +0400 | [diff] [blame] | 36 | <Icon node={node} /> |
| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 37 | {isEditing || editing ? ( |
| 38 | <Input |
| 39 | placeholder="Name" |
| 40 | className="w-full" |
| 41 | value={data.label} |
| 42 | onChange={(e) => store.updateNodeData(id, { label: e.target.value })} |
| 43 | onBlur={() => { |
| 44 | if (data.label !== "") { |
| 45 | setIsEditing(false); |
| 46 | } |
| 47 | }} |
| 48 | disabled={disabled} |
| 49 | /> |
| 50 | ) : ( |
| gio | efc9a4a | 2025-07-06 16:22:10 +0000 | [diff] [blame^] | 51 | <h4 |
| 52 | className="w-full cursor-text select-none hover:outline-solid hover:outline-2 hover:outline-gray-200" |
| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 53 | onClick={() => setIsEditing(true)} |
| 54 | > |
| 55 | {data.label} |
| gio | efc9a4a | 2025-07-06 16:22:10 +0000 | [diff] [blame^] | 56 | </h4> |
| gio | 3fb133d | 2025-06-13 07:20:24 +0000 | [diff] [blame] | 57 | )} |
| 58 | </div> |
| 59 | ); |
| 60 | } |