Skip to content

Commit 23ecd2a

Browse files
committed
finish logloader section
1 parent 85a568e commit 23ecd2a

10 files changed

Lines changed: 95 additions & 47 deletions

File tree

ethernet-view/package-lock.json

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

ethernet-view/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
"vite-plugin-svgr": "^2.4.0",
3333
"vite-tsconfig-paths": "^4.0.5",
3434
"zustand": "^4.4.6",
35-
"zustymiddleware": "^1.2.0"
35+
"zustymiddleware": "^1.2.0",
36+
"zustymiddlewarets": "^1.4.2"
3637
},
3738
"devDependencies": {
3839
"@testing-library/jest-dom": "^5.16.5",
Lines changed: 3 additions & 0 deletions
Loading

ethernet-view/src/pages/LoggerPage/LogsColumn/LogLoader/Dropzone/Dropzone.tsx

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,39 @@
11
import { useState } from "react";
2-
import { LogSession, UploadInformation, UploadState } from "../LogLoader";
2+
import { UploadInformation, UploadState } from "../LogLoader";
33
import styles from "./Dropzone.module.scss"
44
import { extractLoggerSession } from "../LogsProcessor";
55
import { Controls } from "./Controls/Controls";
66
import { useDropzone } from "./useDropzone";
7+
import { LogSession, useLogStore } from "pages/LoggerPage/useLogStore";
78

8-
interface Props {
9-
uploadInformation: UploadInformation;
10-
setUploadInformation: (newUploadInformation: UploadInformation) => void;
11-
addLogSession: (logSession: LogSession) => void;
12-
}
13-
14-
export const Dropzone = ({uploadInformation, setUploadInformation, addLogSession}: Props) => {
9+
export const Dropzone = () => {
1510

11+
const [uploadInformation, setUploadInformation] = useState<UploadInformation>({state: UploadState.IDLE});
1612
const [isDraggingOver, setIsDraggingOver] = useState<boolean>(false);
1713
const {dropZoneText, draftSession, setDraftSession} = useDropzone({uploadInformation});
14+
const addLogSession = useLogStore(state => state.addLogSession);
1815

19-
const uploadSession = (directory: FileSystemDirectoryEntry) => {
16+
const uploadSession = async (directory: FileSystemDirectoryEntry) => {
2017
setUploadInformation({state: UploadState.UPLOADING});
21-
const loggerSession = extractLoggerSession(directory as FileSystemDirectoryEntry);
22-
loggerSession.then((session) => {
23-
console.log(session);
24-
setDraftSession({name: directory.name, measurementLogs: session} as LogSession);
18+
try {
19+
const loggerSession = await extractLoggerSession(directory as FileSystemDirectoryEntry);
20+
setDraftSession({name: directory.name, measurementLogs: loggerSession} as LogSession);
2521
setUploadInformation({state: UploadState.SUCCESS});
26-
}).catch((error) => {
27-
if(error instanceof Error) {
28-
setUploadInformation({state: UploadState.ERROR, errorMessage: error.message});
22+
} catch(err) {
23+
if(err instanceof Error) {
24+
setUploadInformation({state: UploadState.ERROR, errorMessage: err.message});
2925
} else {
3026
setUploadInformation({state: UploadState.ERROR, errorMessage: "An unexpected error occurred"});
3127
}
32-
});
28+
}
3329
};
3430

35-
const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {
31+
const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {
3632
e.preventDefault();
3733
try {
3834
validateEntry(e.dataTransfer.items);
3935
const directory = e.dataTransfer.items[0].webkitGetAsEntry();
40-
uploadSession(directory as FileSystemDirectoryEntry);
36+
await uploadSession(directory as FileSystemDirectoryEntry);
4137
} catch(err) {
4238
if (err instanceof Error){
4339
setUploadInformation({state: UploadState.ERROR, errorMessage: err.cause as string});

ethernet-view/src/pages/LoggerPage/LogsColumn/LogLoader/Dropzone/useDropzone.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useEffect, useState } from "react";
2-
import { LogSession, UploadInformation, UploadState } from "../LogLoader";
2+
import { UploadInformation, UploadState } from "../LogLoader";
3+
import { LogSession } from "pages/LoggerPage/useLogStore";
34

45
interface Props {
56
uploadInformation: UploadInformation;

ethernet-view/src/pages/LoggerPage/LogsColumn/LogLoader/LogList/LogItem/LogItem.module.scss

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
}
1313

1414
.icon {
15-
width: 1.8rem;
15+
width: 1.6rem;
1616

1717
img {
1818
width: 100%;
@@ -24,4 +24,8 @@
2424
font-size: 1.6rem;
2525
font-family: styles.$code-font;
2626
font-style: italic;
27+
}
28+
29+
.active {
30+
color: styles.$orange;
2731
}

ethernet-view/src/pages/LoggerPage/LogsColumn/LogLoader/LogList/LogItem/LogItem.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1+
import { useLogStore } from "pages/LoggerPage/useLogStore";
12
import styles from "./LogItem.module.scss"
23
import folderClosed from "assets/svg/folder-closed.svg"
4+
import folderOpen from "assets/svg/folder-open.svg"
35

46
interface Props {
57
logName: string;
68
}
79

810
export const LogItem = ({logName}: Props) => {
11+
12+
const openLogSession = useLogStore(state => state.openLogSession);
13+
const setOpenLogSession = useLogStore(state => state.setOpenLogSession);
14+
const isOpen = openLogSession === logName;
15+
916
return (
10-
<div className={styles.logItemWrapper}>
17+
<div className={styles.logItemWrapper} onClick={() => setOpenLogSession(logName)}>
1118
<div className={styles.icon}>
12-
<img src={folderClosed} alt="log-icon" />
19+
<img src={`${isOpen ? folderOpen : folderClosed}`} alt="log-icon" />
1320
</div>
14-
<div className={styles.title}>
21+
<div className={`${styles.title} ${isOpen ? styles.active : ""}`}>
1522
<p>
1623
{logName}
1724
</p>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.logListWrapper {
22
display: flex;
33
flex-direction: column;
4+
align-items: center;
45
}

ethernet-view/src/pages/LoggerPage/LogsColumn/LogLoader/LogLoader.tsx

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { useState } from "react"
21
import { Dropzone } from "./Dropzone/Dropzone"
32
import styles from "./LogLoader.module.scss"
43
import { LogList } from "./LogList/LogList";
4+
import { useLogStore } from "pages/LoggerPage/useLogStore";
55

66
export enum UploadState {
77
IDLE = "idle",
@@ -15,27 +15,16 @@ export interface UploadInformation {
1515
errorMessage?: string;
1616
}
1717

18-
export interface LogSession {
19-
name: string;
20-
measurementLogs: Map<string, {time: Date, value: number}[]>;
21-
}
22-
export type LogSessionCollection = LogSession[];
23-
2418
export const LogLoader = () => {
2519

26-
const [uploadInformation, setUploadInformation] = useState<UploadInformation>({state: UploadState.IDLE});
27-
const [logSessions, setLogSessions] = useState<LogSessionCollection>([]);
20+
const logSessions = useLogStore(state => state.logSessions);
2821

2922
return (
3023
<div className={styles.logLoaderWrapper}>
3124

3225
<LogList logNames={logSessions.map((logSession) => logSession.name)} />
3326

34-
<Dropzone
35-
uploadInformation={uploadInformation}
36-
setUploadInformation={setUploadInformation}
37-
addLogSession={(logSession: LogSession) => setLogSessions([...logSessions, logSession])}
38-
/>
27+
<Dropzone />
3928

4029
</div>
4130
)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { create } from "zustand";
2+
import zustymiddlewarets from "zustymiddlewarets";
3+
4+
export interface LogSession {
5+
name: string;
6+
measurementLogs: Map<string, { time: Date; value: number }[]>;
7+
}
8+
export type LogSessionCollection = LogSession[];
9+
10+
type LogStore = {
11+
logSessions: LogSessionCollection;
12+
openLogSession: string;
13+
setOpenLogSession: (logSession: string) => void;
14+
addLogSession: (log: LogSession) => void;
15+
clearLogSessions: () => void;
16+
};
17+
18+
export const useLogStore = create<LogStore>((set, get) => ({
19+
logSessions: [],
20+
openLogSession: "",
21+
setOpenLogSession: (logSession: string) => {
22+
set((state) => ({ ...state, openLogSession: logSession }));
23+
},
24+
addLogSession: (log: LogSession) => {
25+
if (get().logSessions.find((logSession) => logSession.name === log.name)) return;
26+
set((state) => ({ logSessions: [...state.logSessions, log] }));
27+
},
28+
clearLogSessions: () => set({ logSessions: [] }),
29+
}));

0 commit comments

Comments
 (0)