blob: d6de75b91361d7a32f0930058d29f41e5425f54f [file] [log] [blame]
giocc5ce582025-06-25 07:45:21 +04001import { useEnv } from "./lib/state";
gio48679462025-05-21 04:27:27 +00002import { Copy, Check } from "lucide-react";
giob77cb932025-05-19 09:37:14 +00003import { Button } from "./components/ui/button";
4import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./components/ui/tooltip";
5import { useCallback, useState } from "react";
gio48679462025-05-21 04:27:27 +00006import { AccessType } from "./components/icon";
giocc5ce582025-06-25 07:45:21 +04007import { Access } from "config";
giob77cb932025-05-19 09:37:14 +00008
9export function Gateways() {
10 const env = useEnv();
11 const groupedAccess = env.access.reduce((acc, curr) => {
12 if (!acc.has(curr.name)) {
13 acc.set(curr.name, []);
14 }
15 acc.get(curr.name)!.push(curr);
16 return acc;
17 }, new Map<string, typeof env.access>());
18 return (
19 <ul>
20 {Array.from(groupedAccess.entries()).map(([name, access]) => (
gio40370782025-05-19 11:04:52 +000021 <>
giob77cb932025-05-19 09:37:14 +000022 {access.map((a) => (
gio40370782025-05-19 11:04:52 +000023 <li key={name}>
24 <Gateway g={a} />
25 </li>
giob77cb932025-05-19 09:37:14 +000026 ))}
gio40370782025-05-19 11:04:52 +000027 </>
giob77cb932025-05-19 09:37:14 +000028 ))}
29 </ul>
30 );
31}
32
gio9f3d4f52025-07-04 08:42:34 +000033export function Gateway({ g }: { g: Access }) {
giocc5ce582025-06-25 07:45:21 +040034 const [hidden, content] = ((): [string, string] => {
giob77cb932025-05-19 09:37:14 +000035 switch (g.type) {
36 case "https":
37 return [g.address, g.address];
38 case "ssh":
39 case "tcp":
40 case "udp":
41 return [`${g.host}:${g.port}`, `${g.host}:${g.port}`];
42 case "postgresql":
43 return [
44 `postgresql://${g.username}:*****@${g.host}:${g.port}/${g.database}`,
45 `postgresql://${g.username}:${g.password}@${g.host}:${g.port}/${g.database}`,
46 ];
47 case "mongodb":
48 return [
49 `mongodb://${g.username}:*****@${g.host}:${g.port}/${g.database}`,
50 `mongodb://${g.username}:${g.password}@${g.host}:${g.port}/${g.database}`,
51 ];
giocc5ce582025-06-25 07:45:21 +040052 default:
53 throw new Error(`Unknown gateway type: ${g.type}`);
giob77cb932025-05-19 09:37:14 +000054 }
55 })();
56 const [clicked, setClicked] = useState(false);
57 const [open, setOpen] = useState(false);
58 const copy = useCallback(() => {
59 navigator.clipboard.writeText(content);
60 setClicked(true);
61 setOpen(true);
62 setTimeout(() => {
63 setClicked(false);
64 setOpen(false);
65 }, 1000);
66 }, [content, setClicked, setOpen]);
67 return (
68 <TooltipProvider>
69 <Tooltip delayDuration={100} open={open} onOpenChange={setOpen}>
70 <TooltipTrigger asChild>
gio6d8b71c2025-05-19 12:57:35 +000071 <Button
72 variant="ghost"
73 onClick={g.type === "https" ? () => window.open(content, "_blank") : copy}
74 className="!gap-1 !p-0 !h-fit"
75 >
giocc5ce582025-06-25 07:45:21 +040076 <AccessType access={g} className="w-4 h-4" />
giob77cb932025-05-19 09:37:14 +000077 <div className="hover:bg-gray-200 p-x-1">{hidden}</div>
78 </Button>
79 </TooltipTrigger>
gio05a993c2025-05-19 11:51:33 +000080 <TooltipContent side="right" className="!bg-transparent cursor-pointer !p-0" sideOffset={10}>
giob77cb932025-05-19 09:37:14 +000081 {!clicked && <Copy className="w-4 h-4 !bg-transparent" color="black" />}
82 {clicked && <Check className="w-4 h-4 !bg-transparent" color="black" />}
83 </TooltipContent>
84 </Tooltip>
85 </TooltipProvider>
86 );
87}