Skip to content

Commit 992a7ea

Browse files
committed
feat: Add ExcelParserContainer
1 parent 6e2f15c commit 992a7ea

File tree

5 files changed

+154
-62
lines changed

5 files changed

+154
-62
lines changed

package-lock.json

+77-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"axios": "^1.7.9",
3838
"express": "^4.21.2",
3939
"react": "^18.2.0",
40+
"react-chat-elements": "^12.0.17",
4041
"react-dom": "^18.2.0",
4142
"react-resize-detector": "^12.0.1",
4243
"react-toastify": "^11.0.2",

packages/taskpane/components/App.tsx

+4-54
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,18 @@
1-
import React, {useState, useEffect, useRef} from 'react';
1+
import React, { useState, useEffect, useRef } from 'react';
22
import { Box, Stack, Backdrop } from '@mui/material';
33
import MessageBox from './MessageBox';
44
import BoxHeader from './BoxHeader';
55
import InputField from './InputField';
66
import { testMessages } from '../utils/TestDatas';
77
import MessageParser from '../utils/MessageParser';
8-
import { ToastContainer, toast } from 'react-toastify';
9-
import { parseExcelTableToJson, getExcelTableNames } from '../utils/ExcelParser';
10-
import { toastOptins } from '../utils/ToastConfig';
8+
import { ToastContainer } from 'react-toastify';
119
import type { ExcelTableData } from './ExcelTable';
10+
import ExcelParserContainer from './ExcelParserContainer';
1211

1312
export default function App() {
1413
const [waitingResponse, setWaitingResponse] = useState(false);
1514
const [messages, setMessages] = useState(testMessages);
1615
const [excelTableData, setExcelTableData] = useState<ExcelTableData | null>(null);
17-
const [readable, setReadable] = useState(true);
18-
19-
const messageEndRef = useRef<HTMLDivElement>(null);
20-
const backDropOpen = !readable;
21-
22-
// Handle fisrt time loads and parse excel tables
23-
useEffect(() => {
24-
Office.onReady(() => {
25-
getExcelTableNames().then((tableNames) => {
26-
parseExcelTableToJson(tableNames[0]).then((excelTable) => {
27-
setExcelTableData(excelTable);
28-
}).catch(() => {
29-
setReadable(false);
30-
})
31-
})
32-
});
33-
}, []);
3416

3517
// Handle user input
3618
function handleSend(message: string) {
@@ -47,47 +29,15 @@ export default function App() {
4729
}, 1000);
4830
}
4931

50-
// Handle auto scroll of message box
51-
useEffect(() => {
52-
if (messageEndRef.current) {
53-
// The "block" property should be set to "end", while default value is "start" causing unexpected behavior
54-
messageEndRef.current.scrollIntoView({ behavior: 'smooth' , block: "end"});
55-
}
56-
}, [messages]);
57-
58-
// Handle notifying excel tables read result
59-
useEffect(() => {
60-
if (!readable){
61-
toast.error('Can not read the table, reopen one that available', {
62-
...toastOptins,
63-
position: 'top-center',
64-
autoClose: false,
65-
closeButton: false,
66-
hideProgressBar: true,
67-
draggable: false,
68-
theme: 'dark',
69-
closeOnClick: false,
70-
});
71-
}
72-
else{
73-
toast.success('Tables Finded', toastOptins);
74-
}
75-
}, [readable])
76-
7732
return (
7833
<Stack className='h-screen'>
7934
<BoxHeader waitingResponse={waitingResponse} />
8035
<Box className=' overflow-y-scroll flex-grow'>
8136
<MessageBox messages={messages} />
82-
<div ref={messageEndRef}></div>
8337
</Box>
8438
<InputField onSend={handleSend} waitingResponse={waitingResponse} />
8539
<ToastContainer />
86-
<Backdrop
87-
sx={(theme) => ({ color: '#fff', zIndex: theme.zIndex.drawer + 1 })}
88-
open={backDropOpen}
89-
>
90-
</Backdrop>
40+
<ExcelParserContainer setExcelTableData={setExcelTableData} />
9141
</Stack>
9242
);
9343
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { parseExcelTableToJson, getExcelTableNames } from '../utils/ExcelParser';
2+
import type { ExcelTableData } from './ExcelTable';
3+
import React, { useEffect, useState } from 'react';
4+
import { Backdrop } from '@mui/material';
5+
import { toastOptins } from '../utils/ToastConfig';
6+
import { toast } from 'react-toastify';
7+
8+
interface ExcelParserContainerProps {
9+
setExcelTableData: React.Dispatch<React.SetStateAction<ExcelTableData | null>>;
10+
}
11+
12+
export default function ExcelParserContainer({ setExcelTableData }: ExcelParserContainerProps) {
13+
const [readable, setReadable] = useState(true);
14+
const backDropOpen = !readable;
15+
16+
// Handle fisrt time loads and parse excel tables
17+
useEffect(() => {
18+
Office.onReady(() => {
19+
getExcelTableNames().then((tableNames) => {
20+
parseExcelTableToJson(tableNames[0]).then((excelTable) => {
21+
setExcelTableData(excelTable);
22+
}).catch(() => {
23+
setReadable(false);
24+
})
25+
})
26+
});
27+
}, []);
28+
29+
// Handle notifying excel tables read result
30+
useEffect(() => {
31+
if (!readable) {
32+
toast.error('Can not read the table, reopen one that available', {
33+
...toastOptins,
34+
position: 'top-center',
35+
autoClose: false,
36+
closeButton: false,
37+
hideProgressBar: true,
38+
draggable: false,
39+
theme: 'dark',
40+
closeOnClick: false,
41+
});
42+
}
43+
else {
44+
toast.success('Tables Finded', toastOptins);
45+
}
46+
}, [readable])
47+
48+
return (
49+
<Backdrop
50+
sx={(theme) => ({ color: '#fff', zIndex: theme.zIndex.drawer + 1 })}
51+
open={backDropOpen}
52+
>
53+
</Backdrop>
54+
)
55+
}

packages/taskpane/components/MessageBox.tsx

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from "react";
1+
import React, { useEffect, useRef } from "react";
22
import { Box, Stack, SxProps } from "@mui/system";
33
import ExcelTable from "./ExcelTable";
44
import { Message } from "../utils/MessageParser";
@@ -10,6 +10,15 @@ interface MessageBoxProps {
1010
}
1111

1212
export default function MessageBox({ messages }: MessageBoxProps) {
13+
// Handle auto scroll of message box
14+
const messageEndRef = useRef<HTMLDivElement>(null);
15+
16+
useEffect(() => {
17+
if (messageEndRef.current) {
18+
// The "block" property should be set to "end", while default value is "start" causing unexpected behavior
19+
messageEndRef.current.scrollIntoView({ behavior: 'smooth', block: "end" });
20+
}
21+
}, [messages]);
1322
const renderItems = messages.map((message, index) => {
1423
let wrapperAppend = message.role === "user" ? "justify-end" : "justify-start";
1524
let boxAppend = message.role === "user" ? "mr-3" : "ml-3";
@@ -22,7 +31,7 @@ export default function MessageBox({ messages }: MessageBoxProps) {
2231
maxWidth: "60%",
2332
wordWrap: "break-word",
2433
}
25-
if (message.scatter)
34+
if (message.scatter)
2635
sx.height = "fit-content";
2736

2837
// return the wrapper and contents
@@ -37,8 +46,11 @@ export default function MessageBox({ messages }: MessageBoxProps) {
3746
})
3847

3948
return (
40-
<Stack spacing={2}>
41-
{renderItems}
42-
</Stack>
49+
<>
50+
<Stack spacing={2}>
51+
{renderItems}
52+
</Stack>
53+
<div ref={messageEndRef}></div>
54+
</>
4355
)
4456
}

0 commit comments

Comments
 (0)