main
alex 2023-05-23 00:43:45 +02:00
parent 100e2c36cc
commit 81412ef340
5 changed files with 82 additions and 37 deletions

View File

@ -31,7 +31,10 @@ export default function App() {
setUserSession={setUserSession} setUserSession={setUserSession}
notificationApi={notificationApi} notificationApi={notificationApi}
> >
<SideMenu setUserSession={setUserSession}></SideMenu> <SideMenu
userSession={userSession}
setUserSession={setUserSession}
></SideMenu>
<PageContent></PageContent> <PageContent></PageContent>
</WebSocketProvider> </WebSocketProvider>
</Layout> </Layout>

View File

@ -9,15 +9,9 @@ import Sider from "antd/es/layout/Sider";
import { useContext, useEffect, useState } from "react"; import { useContext, useEffect, useState } from "react";
import { useLocation, useNavigate } from "react-router-dom"; import { useLocation, useNavigate } from "react-router-dom";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { import { Constants, MyAvatar, WebSocketContext } from "../../utils";
Constants,
MyAvatar,
UseUserSession,
WebSocketContext,
} from "../../utils";
export default function SideMenu({ setUserSession }) { export default function SideMenu({ userSession, setUserSession }) {
const { userSession } = UseUserSession();
const location = useLocation(); const location = useLocation();
const [selectedKeys, setSelectedKeys] = useState("/"); const [selectedKeys, setSelectedKeys] = useState("/");
const webSocketContext = useContext(WebSocketContext); const webSocketContext = useContext(WebSocketContext);

View File

@ -1,6 +1,7 @@
import { Button, Popover, QRCode, Space, Table } from "antd"; import { Space, Table } from "antd";
import { MyAvatar } from "../../utils"; import { FormatDatetime, WebSocketContext } from "../../utils";
import { PlusOutlined } from "@ant-design/icons"; import { useContext } from "react";
import { Link } from "react-router-dom";
const columns = [ const columns = [
{ {
@ -23,27 +24,65 @@ const columns = [
dataIndex: "registeredAt", dataIndex: "registeredAt",
key: "registeredAt", key: "registeredAt",
}, },
];
const data = [
{ {
key: "1", title: "User-Agent",
name: "Alex", dataIndex: "userAgent",
usedBy: <MyAvatar avatar={"8c9f6287-5de3-413a-aec4-a89a7e55fcd4.jpeg"} />, key: "userAgent",
lastUsed: new Date().toLocaleString(), },
registeredAt: new Date().toLocaleString(), {
title: "Action",
dataIndex: "action",
key: "action",
render: (_, record) => (
<Space size="middle">
<Link to="#">Use scanner</Link>
</Space>
),
}, },
]; ];
export default function Scanners() { export default function Scanners() {
const webSocketContext = useContext(WebSocketContext);
const getTableItems = () => {
if (webSocketContext.Scanners === null) return [];
let items = [];
webSocketContext.Scanners.forEach((scanner) => {
items.push({
key: scanner.Id,
name: scanner.Name,
usedBy: scanner.UsedByUserId,
lastUsed: scanner.LastUsed,
registeredAt: FormatDatetime(scanner.RegisteredAt),
userAgent: scanner.UserAgent,
});
});
return items;
};
return ( return (
<> <>
<h1 style={{ fontWeight: "bold", float: "left" }}>Scanners (0)</h1> <h1 style={{ fontWeight: "bold", float: "left" }}>
Scanners (
{webSocketContext.Scanners === null
? "0"
: webSocketContext.Scanners.length}
)
</h1>
<Popover <Table columns={columns} dataSource={getTableItems()} />
</>
);
}
/*
<Popover
title="Scan this on mobile" title="Scan this on mobile"
content={<QRCode value={"test"} bordered={false} />} content={<QRCode value={"test"} bordered={false} />}
> >
<Button <Button
style={{ float: "right" }} style={{ float: "right" }}
type="primary" type="primary"
@ -51,9 +90,5 @@ export default function Scanners() {
> >
Add scanner Add scanner
</Button> </Button>
</Popover> </Popover>
*/
<Table columns={columns} dataSource={data} />
</>
);
}

View File

@ -8,6 +8,7 @@ import {
getConnectionStatusItem, getConnectionStatusItem,
getUserSessionFromLocalStorage, getUserSessionFromLocalStorage,
} from "../../utils"; } from "../../utils";
import { Link } from "react-router-dom";
const columns = [ const columns = [
{ {
@ -37,7 +38,7 @@ const columns = [
render: (_, record) => { render: (_, record) => {
return ( return (
<Space size="middle"> <Space size="middle">
<a <Link
href="#" href="#"
onClick={() => { onClick={() => {
fetch(`${Constants.API_ADDRESS}/user/session/${record.key}`, { fetch(`${Constants.API_ADDRESS}/user/session/${record.key}`, {
@ -52,7 +53,7 @@ const columns = [
}} }}
> >
Sign out Sign out
</a> </Link>
</Space> </Space>
); );
}, },

View File

@ -85,6 +85,7 @@ let webSocketContextPreview = {
CategoryGroups: [], CategoryGroups: [],
GroupTasks: [], GroupTasks: [],
GroupTasksSteps: [], GroupTasksSteps: [],
Scanners: [],
}; };
export const WebSocketContext = createContext(webSocketContextPreview); export const WebSocketContext = createContext(webSocketContextPreview);
@ -101,6 +102,8 @@ const ReceivedMessagesCommands = {
GroupTasksReloaded: 8, GroupTasksReloaded: 8,
UpdateUserSessions: 9, UpdateUserSessions: 9,
UpdateAllUsersUserAvatar: 10, UpdateAllUsersUserAvatar: 10,
NewScanner: 11,
DeleteScanner: 12,
}; };
// commands sent to the backend server // commands sent to the backend server
@ -131,6 +134,7 @@ export function WebSocketProvider({
// these are all group tasks that are then filtered and displayed in the respective tables for the category // these are all group tasks that are then filtered and displayed in the respective tables for the category
const [groupTasks, setGroupTasks] = useState([]); const [groupTasks, setGroupTasks] = useState([]);
const [groupTasksSteps, setGroupTasksSteps] = useState([]); const [groupTasksSteps, setGroupTasksSteps] = useState([]);
const [scanners, setScanners] = useState([]);
const navigate = useNavigate(); const navigate = useNavigate();
const StartGroupTasksOpenModalRememberIdRef = useRef(null); const StartGroupTasksOpenModalRememberIdRef = useRef(null);
@ -162,6 +166,7 @@ export function WebSocketProvider({
setCategoryGroups(body.CategoryGroups); setCategoryGroups(body.CategoryGroups);
setGroupTasks(body.GroupTasks); setGroupTasks(body.GroupTasks);
setGroupTasksSteps(body.GroupTasksSteps); setGroupTasksSteps(body.GroupTasksSteps);
if (body.Scanners !== null) setScanners(body.Scanners);
break; break;
case ReceivedMessagesCommands.UpdateConnectedUsers: case ReceivedMessagesCommands.UpdateConnectedUsers:
setConnectedWebSocketUsersCount(body.WebSocketUsersCount); setConnectedWebSocketUsersCount(body.WebSocketUsersCount);
@ -240,6 +245,12 @@ export function WebSocketProvider({
return newArr; return newArr;
}); });
break; break;
case ReceivedMessagesCommands.NewScanner:
setScanners((arr) => [...arr, body]);
break;
case ReceivedMessagesCommands.DeleteScanner:
setScanners((arr) => arr.filter((arr) => arr.Id !== body.Id));
break;
default: default:
console.error("unknown command", cmd); console.error("unknown command", cmd);
break; break;
@ -291,6 +302,7 @@ export function WebSocketProvider({
GroupTasks: groupTasks, GroupTasks: groupTasks,
User: user, User: user,
AllUsers: allUsers, AllUsers: allUsers,
Scanners: scanners,
SendSocketMessage: SendSocketMessage, SendSocketMessage: SendSocketMessage,
GroupTasksSteps: groupTasksSteps, GroupTasksSteps: groupTasksSteps,
setGroupTasksSteps: setGroupTasksSteps, setGroupTasksSteps: setGroupTasksSteps,