Skip to content

Commit 3a5fd42

Browse files
authored
Merge pull request #191 from microsoft/add-collapsible-menu
Add collapsible menu
2 parents 20ea2f4 + 84c7785 commit 3a5fd42

File tree

7 files changed

+70
-13
lines changed

7 files changed

+70
-13
lines changed

images/architecture.png

-21.9 KB
Loading

src/app/chat/layout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ChatMenu } from "@/features/chat/chat-menu/chat-menu";
2+
import { ChatMenuContainer } from "@/features/chat/chat-menu/chat-menu-container";
23
import { MainMenu } from "@/features/menu/menu";
34
import { AI_NAME } from "@/features/theme/customise";
45

@@ -16,7 +17,10 @@ export default async function RootLayout({
1617
<>
1718
<MainMenu />
1819
<div className="flex-1 flex rounded-md overflow-hidden bg-card/70">
19-
<ChatMenu /> {children}
20+
<ChatMenuContainer>
21+
<ChatMenu />
22+
</ChatMenuContainer>
23+
{children}
2024
</div>
2125
</>
2226
);

src/app/chat/page.tsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
import { Card } from "@/components/ui/card";
2-
import { FindAllChatThreadForCurrentUser } from "@/features/chat/chat-services/chat-thread-service";
32
import { StartNewChat } from "@/features/chat/chat-ui/start-new-chat";
4-
import { redirect } from "next/navigation";
53

64
export default async function Home() {
7-
const chats = await FindAllChatThreadForCurrentUser();
8-
if (chats.length > 0) {
9-
redirect(`/chat/${chats[0].id}`);
10-
}
11-
125
return (
136
<Card className="h-full items-center flex justify-center flex-1">
147
<StartNewChat />
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"use client";
2+
3+
import { useMenuContext } from "@/features/menu/menu-context";
4+
5+
export const ChatMenuContainer = ({
6+
children,
7+
}: {
8+
children: React.ReactNode;
9+
}) => {
10+
const { isMenuOpen } = useMenuContext();
11+
return <>{isMenuOpen ? children : null}</>;
12+
};

src/features/menu/menu-context.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React, { createContext, useState } from "react";
2+
3+
interface MenuContextProps {
4+
isMenuOpen: boolean;
5+
toggleMenu: () => void;
6+
}
7+
8+
export const MenuContext = createContext<MenuContextProps>({
9+
isMenuOpen: true,
10+
toggleMenu: () => {},
11+
});
12+
13+
export const MenuProvider = ({ children }: { children: React.ReactNode }) => {
14+
const [isMenuOpen, setIsMenuOpen] = useState(true);
15+
16+
const toggleMenu = () => {
17+
setIsMenuOpen(!isMenuOpen);
18+
};
19+
20+
return (
21+
<MenuContext.Provider value={{ isMenuOpen, toggleMenu }}>
22+
{children}
23+
</MenuContext.Provider>
24+
);
25+
};
26+
27+
export const useMenuContext = () => React.useContext(MenuContext);

src/features/menu/menu.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,33 @@
11
"use client";
22

33
import { Button } from "@/components/ui/button";
4-
import { LayoutDashboard, MessageCircle } from "lucide-react";
4+
import {
5+
LayoutDashboard,
6+
MessageCircle,
7+
PanelLeftClose,
8+
PanelRightClose,
9+
} from "lucide-react";
510
import Link from "next/link";
611
import { ThemeToggle } from "../theme/theme-toggle";
712
import { UserProfile } from "../user-profile";
813

914
import { useSession } from "next-auth/react";
15+
import { useMenuContext } from "./menu-context";
1016

1117
export const MainMenu = () => {
1218
const { data: session } = useSession();
19+
const { isMenuOpen, toggleMenu } = useMenuContext();
1320
return (
1421
<div className="flex flex-col justify-between p-2">
15-
<div className="flex gap-2 flex-col items-center">
16-
<Button
22+
<div className="flex gap-2 flex-col items-center">
23+
<Button
24+
onClick={toggleMenu}
25+
className="rounded-full w-[40px] h-[40px] p-1 text-primary"
26+
variant={"outline"}
27+
>
28+
{isMenuOpen ? <PanelLeftClose /> : <PanelRightClose />}
29+
</Button>
30+
<Button
1731
asChild
1832
className="rounded-full w-[40px] h-[40px] p-1 text-primary"
1933
variant={"outline"}
@@ -41,7 +55,9 @@ export const MainMenu = () => {
4155
<LayoutDashboard />
4256
</Link>
4357
</Button>
44-
) : (<></>)}
58+
) : (
59+
<></>
60+
)}
4561
</div>
4662
<div className="flex flex-col gap-2">
4763
<ThemeToggle />

src/features/providers.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
"use client";
22

33
import { SessionProvider } from "next-auth/react";
4+
import { MenuProvider } from "./menu/menu-context";
45

56
export const Providers = ({ children }: { children: React.ReactNode }) => {
6-
return <SessionProvider>{children}</SessionProvider>;
7+
return (
8+
<SessionProvider>
9+
<MenuProvider>{children}</MenuProvider>
10+
</SessionProvider>
11+
);
712
};

0 commit comments

Comments
 (0)