drawDB/src/components/sidebar.jsx

178 lines
5.0 KiB
React
Raw Normal View History

2023-09-19 20:51:02 +08:00
import React, { useContext, useEffect, useState } from "react";
2023-09-19 20:50:52 +08:00
import chatIcon from "../assets/chat.png";
import botIcon from "../assets/bot.png";
import teamIcon from "../assets/group.png";
import timeLine from "../assets/process.png";
2023-09-19 20:51:08 +08:00
import timeLineDark from "../assets/process_dark.png";
2023-09-19 20:50:52 +08:00
import todo from "../assets/calendar.png";
2023-09-19 20:51:02 +08:00
import { Tooltip, SideSheet, List, Badge } from "@douyinfe/semi-ui";
2023-09-19 20:51:08 +08:00
import {
MessageContext,
SettingsContext,
UndoRedoContext,
} from "../pages/editor";
2023-09-19 20:50:53 +08:00
import Todo from "./todo";
2023-09-19 20:50:57 +08:00
import Chat from "./chat";
2023-09-19 20:46:48 +08:00
export default function Sidebar() {
2023-09-19 20:50:52 +08:00
const SidesheetType = {
NONE: 0,
CHAT: 1,
TEAM: 2,
TODO: 3,
TIMELINE: 4,
BOT: 5,
};
const { undoStack } = useContext(UndoRedoContext);
2023-09-19 20:51:02 +08:00
const { messages } = useContext(MessageContext);
2023-09-19 20:51:08 +08:00
const { settings } = useContext(SettingsContext);
2023-09-19 20:50:53 +08:00
const [sidesheet, setSidesheet] = useState(SidesheetType.NONE);
2023-09-19 20:51:08 +08:00
const [seen, setSeen] = useState(0);
const [count, setCount] = useState(messages.length - seen);
2023-09-19 20:50:52 +08:00
const getTitle = (type) => {
switch (type) {
case SidesheetType.TIMELINE:
return (
<div className="flex items-center">
2023-09-19 20:51:08 +08:00
<img
src={settings.mode === "light" ? timeLine : timeLineDark}
className="w-7"
alt="chat icon"
/>
2023-09-19 20:50:52 +08:00
<div className="ms-3">Timeline</div>
</div>
);
case SidesheetType.CHAT:
return (
<div className="flex items-center">
<img src={chatIcon} className="w-7" alt="chat icon" />
<div className="ms-3">Chat</div>
</div>
);
2023-09-19 20:50:53 +08:00
case SidesheetType.TODO:
2023-09-19 20:50:52 +08:00
return (
<div className="flex items-center">
2023-09-19 20:50:53 +08:00
<img src={todo} className="w-7" alt="todo icon" />
<div className="ms-3">To-do list</div>
2023-09-19 20:50:52 +08:00
</div>
);
default:
break;
}
};
const getContent = (type) => {
switch (type) {
case SidesheetType.TIMELINE:
2023-09-19 20:50:53 +08:00
return renderTimeline();
case SidesheetType.TODO:
return <Todo />;
2023-09-19 20:50:57 +08:00
case SidesheetType.CHAT:
return <Chat />;
2023-09-19 20:50:52 +08:00
default:
break;
}
};
2023-09-19 20:51:02 +08:00
useEffect(() => {
if (sidesheet !== SidesheetType.CHAT) {
setCount((c) => messages.length - seen);
}
}, [messages.length, seen, sidesheet, SidesheetType.CHAT]);
2023-09-19 20:46:48 +08:00
return (
2023-09-19 20:50:52 +08:00
<>
2023-09-19 20:51:08 +08:00
<div className="ps-3 pe-4 py-4 shadow-lg h-full select-none border-l border-color">
2023-09-19 20:50:52 +08:00
<Tooltip content="Chat">
2023-09-19 20:51:02 +08:00
<Badge
count={count === 0 ? null : count}
overflowCount={99}
type="danger"
2023-09-19 20:50:52 +08:00
>
2023-09-19 20:51:02 +08:00
<button
className="block"
onClick={() => {
setSidesheet(SidesheetType.CHAT);
setSeen(messages.length);
}}
>
<img src={chatIcon} className="w-8 mb-5" alt="chat icon" />
</button>
</Badge>
2023-09-19 20:50:52 +08:00
</Tooltip>
<Tooltip content="Team">
<button className="block">
<img src={teamIcon} className="w-8 mb-5" alt="chat icon" />
</button>
</Tooltip>
<Tooltip content="To-do">
2023-09-19 20:50:53 +08:00
<button
className="block"
onClick={() => setSidesheet(SidesheetType.TODO)}
>
<img src={todo} className="w-8 mb-5" alt="todo icon" />
2023-09-19 20:50:52 +08:00
</button>
</Tooltip>
<Tooltip content="Timeline">
<button
className="block"
onClick={() => setSidesheet(SidesheetType.TIMELINE)}
>
2023-09-19 20:51:08 +08:00
<img
src={settings.mode === "light" ? timeLine : timeLineDark}
className="w-8 mb-5"
alt="chat icon"
/>
2023-09-19 20:50:52 +08:00
</button>
</Tooltip>
<Tooltip content="Botle">
<button className="block">
<img src={botIcon} className="w-8 mb-5" alt="chat icon" />
</button>
</Tooltip>
</div>
<SideSheet
visible={sidesheet !== SidesheetType.NONE}
2023-09-19 20:50:53 +08:00
onCancel={() => {
setSidesheet(SidesheetType.NONE);
2023-09-19 20:51:02 +08:00
setSeen(messages.length);
2023-09-19 20:50:53 +08:00
}}
2023-09-19 20:50:52 +08:00
width={340}
title={getTitle(sidesheet)}
style={{ paddingBottom: "16px" }}
2023-09-19 20:50:53 +08:00
bodyStyle={{ padding: "0px" }}
2023-09-19 20:50:52 +08:00
>
{getContent(sidesheet)}
</SideSheet>
</>
2023-09-19 20:46:48 +08:00
);
2023-09-19 20:50:52 +08:00
2023-09-19 20:50:53 +08:00
function renderTimeline() {
2023-09-19 20:50:52 +08:00
if (undoStack.length > 0) {
return (
2023-09-19 20:51:08 +08:00
<List className="sidesheet-theme">
2023-09-19 20:50:52 +08:00
{[...undoStack].reverse().map((e) => (
2023-09-19 20:50:57 +08:00
<List.Item
style={{ padding: "4px 18px 4px 18px" }}
2023-09-19 20:51:08 +08:00
className="hover-1"
2023-09-19 20:50:57 +08:00
>
2023-09-19 20:50:55 +08:00
<div className="flex items-center py-1 w-full">
2023-09-19 20:50:52 +08:00
<i className="block fa-regular fa-circle fa-xs"></i>
<div className="ms-2">{e.message}</div>
</div>
2023-09-19 20:50:55 +08:00
</List.Item>
2023-09-19 20:50:52 +08:00
))}
2023-09-19 20:50:55 +08:00
</List>
2023-09-19 20:50:52 +08:00
);
} else {
return (
2023-09-19 20:51:08 +08:00
<div className="m-5 sidesheet-theme">
No activity was recorded. You have not added anything to your diagram
yet.
2023-09-19 20:50:52 +08:00
</div>
);
}
}
2023-09-19 20:46:48 +08:00
}