Skip to content

Commit 392becf

Browse files
author
jan hof
committed
implemented websocket
1 parent 3bfd72e commit 392becf

File tree

6 files changed

+74
-21
lines changed

6 files changed

+74
-21
lines changed

package-lock.json

Lines changed: 12 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
"react-dom": "^16.13.1",
4545
"react-redux": "7.2.1",
4646
"react-router-dom": "^5.2.0",
47-
"redux": "4.0.5"
47+
"redux": "4.0.5",
48+
"ws": "^7.3.1"
4849
},
4950
"devDependencies": {
5051
"@typescript-eslint/eslint-plugin": "^4.6.0",

src/hooks/ServiceFetcher.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import axios from "axios";
22
import { useEffect, useState } from "react";
33
import { Service } from "../../src/types/ServiceTypes";
44

5-
export default function useServiceFetcher() {
6-
const [services, setServices] = useState<Service[]>([]);
5+
export default function useServiceFetcher(setter: any) {
76
useEffect(() => {
87
axios.get<Service[]>("/api/services").then((response) => {
9-
setServices(response.data);
8+
setter(response.data);
109
});
1110
}, []);
12-
return services;
1311
}

src/scss/_custom.scss

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
padding: 1.25rem;
44
}
55

6+
.pull-right {
7+
float: right;
8+
margin-left: auto;
9+
}
10+
611
.c-app.dark-theme.c-default-layout {
712
color: #e1e1e1 !important;
813
background-color: #0a0b18;
@@ -18,6 +23,10 @@
1823
color: #e1e1e1 !important;
1924
}
2025

26+
.dropdown-menu > .dropdown-item.disabled {
27+
color: hsla(0, 0%, 88.2%, 0.6) !important;
28+
}
29+
2130
.dropdown-menu > .dropdown-item:hover {
2231
color: #e1e1e1;
2332
background-color: hsla(0, 0%, 100%, 0.1);

src/types/ServiceTypes.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
interface Service {
2+
namespace: string;
23
name: string;
34
description: string;
45
version: string;
56
running: boolean;
7+
required: boolean;
68
}
79

8-
export type { Service };
10+
interface SocketMessage{
11+
channel: string;
12+
}
13+
14+
export type { Service, SocketMessage };

src/views/dashboard/Dashboard.tsx

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from "react";
1+
import React, { useEffect, useState } from "react";
22
import {
33
CCol,
44
CDropdown,
@@ -12,9 +12,31 @@ import useServiceFetcher from "../../hooks/ServiceFetcher";
1212
import { Service } from "../../types/ServiceTypes";
1313
import CIcon from "@coreui/icons-react";
1414

15+
const ws = new WebSocket("ws:/127.0.0.1:3000");
16+
17+
ws.onopen = () => {
18+
console.log("WebSocket Client Connected");
19+
};
20+
21+
function send(data: any) {
22+
ws.send(JSON.stringify(data));
23+
}
24+
1525
const Dashboard = () => {
16-
const services: Service[] = useServiceFetcher();
17-
console.log(services);
26+
const [services, setServices] = useState<Service[]>([]);
27+
28+
useServiceFetcher(setServices);
29+
30+
useEffect(() => {
31+
ws.onmessage = (message) => {
32+
let data = JSON.parse(message.data);
33+
console.log(data);
34+
if (data && data.channel === "service-update") {
35+
setServices(data.services);
36+
}
37+
};
38+
}, []);
39+
1840
return (
1941
<CRow>
2042
{services
@@ -26,21 +48,33 @@ const Dashboard = () => {
2648
color={service.running ? "gradient-success" : "gradient-danger"}
2749
header={service.name}
2850
text={"Version: " + service.version}
51+
key={service.namespace}
2952
footerSlot={
3053
<p className="add-padding">{service.description}</p>
3154
}
3255
>
3356
<CDropdown>
34-
<CDropdownToggle color="transparent">
57+
<CDropdownToggle caret={false} color="transparent">
3558
<CIcon name="cil-settings" />
3659
</CDropdownToggle>
3760
<CDropdownMenu className="pt-0 dark" placement="bottom-end">
38-
<CDropdownItem>
61+
<CDropdownItem
62+
disabled={service.required && service.running}
63+
onClick={() =>
64+
send({
65+
channel: "service-interact",
66+
namespace: service.namespace,
67+
activeState: service.running
68+
? "DEACTIVATE"
69+
: "ACTIVATE",
70+
})
71+
}
72+
>
3973
{service.running ? "Disable" : "Enable"}
74+
{service.required && service.running && (
75+
<CIcon name="cil-ban" className="pull-right" />
76+
)}
4077
</CDropdownItem>
41-
<CDropdownItem>Another action</CDropdownItem>
42-
<CDropdownItem>Something else here...</CDropdownItem>
43-
<CDropdownItem disabled>Disabled action</CDropdownItem>
4478
</CDropdownMenu>
4579
</CDropdown>
4680
</CWidgetDropdown>

0 commit comments

Comments
 (0)