11"use client" ;
22
3- import { Button } from "@heroui/react" ;
3+ import {
4+ Button ,
5+ Dropdown ,
6+ DropdownItem ,
7+ DropdownMenu ,
8+ DropdownTrigger ,
9+ Select ,
10+ SelectItem ,
11+ } from "@heroui/react" ;
412import Icon from "../misc/icon" ;
513import { useContext , useEffect , useState } from "react" ;
6- import PasswordScreen from "../modals/password-modal" ;
14+ import PasswordModal from "../modals/password-modal" ;
715import { useTheme } from "next-themes" ;
816import NavMenu from "./nav-menu" ;
917import { EditorContext } from "../providers/editor-context-provider" ;
@@ -12,23 +20,31 @@ import { PlatformEnum } from "@/lib/types";
1220import Loading from "./loading" ;
1321import VoiceIndicator from "./voice-indicator" ;
1422import ProjectIndicator from "./project-indicator" ;
23+ import LoginModal from "../modals/login-modal" ;
24+ import { useAuth } from "@/lib/hooks/use-auth" ;
25+ import WorkspaceSettingsModal from "../modals/workspace-settings-model" ;
26+ import { useWorkspace } from "@/lib/hooks/use-workspace" ;
1527
1628export default function Nav ( { children } : { children : React . ReactNode } ) {
1729 const [ mounted , setMounted ] = useState ( false ) ;
1830
1931 const editorContext = useContext ( EditorContext ) ;
2032 const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
21- const [ isPasswordScreenOpen , setIsPasswordScreenOpen ] = useState ( false ) ;
33+ const [ isPasswordModalOpen , setIsPasswordModalOpen ] = useState ( false ) ;
34+ const [ isShowNavbar , setIsShowNavbar ] = useState ( true ) ;
35+ const [ isWorkspaceSettingsModalOpen , setIsWorkspaceSettingsModalOpen ] =
36+ useState ( false ) ;
2237
2338 const { theme, setTheme } = useTheme ( ) ;
39+ const { session, isLoading : isLoadingSession , signIn, signOut } = useAuth ( ) ;
2440
25- const [ isShowNavbar , setIsShowNavbar ] = useState ( true ) ;
41+ const workspaceHook = useWorkspace ( ) ;
2642
2743 useEffect ( ( ) => {
2844 const platform = getPlatform ( ) ;
2945 // Hide NavMenu if opened in VSCode Extension,
3046 // rely on VSCode's native navigation instead.
31- console . log ( "Platform :" , platform ) ;
47+ console . log ( "Current platform :" , platform ) ;
3248 if ( platform === PlatformEnum . VSCode ) {
3349 setIsShowNavbar ( false ) ;
3450
@@ -43,10 +59,8 @@ export default function Nav({ children }: { children: React.ReactNode }) {
4359
4460 // Open PasswordScreen if password is used
4561 useEffect ( ( ) => {
46- if (
47- editorContext ?. persistSettings ?. isUsePassword
48- ) {
49- setIsPasswordScreenOpen ( true ) ;
62+ if ( editorContext ?. persistSettings ?. isUsePassword ) {
63+ setIsPasswordModalOpen ( true ) ;
5064 }
5165 } , [ editorContext ?. persistSettings ] ) ;
5266
@@ -55,22 +69,29 @@ export default function Nav({ children }: { children: React.ReactNode }) {
5569 return < Loading /> ;
5670 }
5771
58-
5972 return (
60- < div className = "grid grid-rows-[max-content_auto] h-full w-full flex-col overflow-x-hidden" >
61- < PasswordScreen
62- isOpen = { isPasswordScreenOpen }
63- setIsOpen = { setIsPasswordScreenOpen }
73+ < div className = "grid h-full w-full grid-rows-[max-content_auto] flex-col overflow-x-hidden" >
74+ < PasswordModal
75+ isOpen = { isPasswordModalOpen }
76+ setIsOpen = { setIsPasswordModalOpen }
77+ />
78+
79+ { ! isLoadingSession && ! session && < LoginModal signIn = { signIn } /> }
80+
81+ < WorkspaceSettingsModal
82+ isOpen = { isWorkspaceSettingsModalOpen }
83+ setIsOpen = { setIsWorkspaceSettingsModalOpen }
84+ workspaceHook = { workspaceHook }
6485 />
6586
6687 { isShowNavbar && (
6788 < div className = "z-40 h-12 w-full" >
6889 < div
6990 className = {
70- "grid h-12 w-full grid-cols-3 grid-rows-1 px-2 py-1 text-default-foreground "
91+ "text-default-foreground grid h-12 w-full grid-cols-3 grid-rows-1 px-2 py-1"
7192 }
7293 >
73- < div className = "col-start-1" >
94+ < div className = "col-start-1 flex gap-x-2 " >
7495 < Button
7596 isIconOnly
7697 onPress = { ( ) => {
@@ -85,17 +106,72 @@ export default function Nav({ children }: { children: React.ReactNode }) {
85106 < Icon name = "menu" variant = "round" />
86107 ) }
87108 </ Button >
109+ < Select
110+ className = "max-w-50"
111+ classNames = { {
112+ mainWrapper : "h-10" ,
113+ trigger : "py-0.5 min-h-10" ,
114+ } }
115+ label = "Workspace"
116+ placeholder = "Select Workspace"
117+ isLoading = { ! workspaceHook . cloudWorkspaces }
118+ selectedKeys = {
119+ workspaceHook . workspace ? [ workspaceHook . workspace . id ] : [ ]
120+ }
121+ size = "sm"
122+ disabledKeys = { workspaceHook . workspace ? [ ] : [ "settings" ] }
123+ >
124+ < >
125+ { workspaceHook . cloudWorkspaces ?. map ( ( workspace ) => (
126+ < SelectItem
127+ key = { workspace . id }
128+ onPress = { ( ) => {
129+ workspaceHook . selectWorkspace ( workspace . id ) ;
130+ } }
131+ >
132+ { workspace . name }
133+ </ SelectItem >
134+ ) ) ?? [ ] }
135+ < SelectItem
136+ className = "bg-primary text-primary-foreground"
137+ color = "primary"
138+ onPress = { ( ) => {
139+ setIsWorkspaceSettingsModalOpen ( true ) ;
140+ } }
141+ startContent = {
142+ < div className = "text-primary-foreground h-4 w-4" >
143+ < Icon name = "add" variant = "round" />
144+ </ div >
145+ }
146+ >
147+ Create New
148+ </ SelectItem >
149+ < SelectItem
150+ key = { "settings" }
151+ className = "bg-default"
152+ onPress = { ( ) => {
153+ setIsWorkspaceSettingsModalOpen ( true ) ;
154+ } }
155+ startContent = {
156+ < div className = "h-4 w-4" >
157+ < Icon name = "settings" variant = "round" />
158+ </ div >
159+ }
160+ >
161+ Settings
162+ </ SelectItem >
163+ </ >
164+ </ Select >
88165 </ div >
89166 < div className = "col-start-2 flex flex-col items-center justify-center" >
90167 { editorContext ?. editorStates . project && < ProjectIndicator /> }
91168 < VoiceIndicator />
92169 </ div >
93- < div className = "col-start-3 flex justify-end" >
170+ < div className = "col-start-3 flex justify-end gap-x-1 " >
94171 < Button
95172 // Disable on hover background
96173 className = "data-[hover=true]:bg-transparent"
97174 isIconOnly
98- disableRipple
99175 variant = "light"
100176 onPress = { ( ) => {
101177 setTheme ( theme === "dark" ? "light" : "dark" ) ;
@@ -107,14 +183,44 @@ export default function Nav({ children }: { children: React.ReactNode }) {
107183 < Icon name = "light_mode" variant = "round" />
108184 ) }
109185 </ Button >
186+ { session && (
187+ < Dropdown >
188+ < DropdownTrigger >
189+ < Button
190+ isIconOnly
191+ className = "text-md-on-secondary-container bg-md-secondary-container rounded-full"
192+ variant = "light"
193+ >
194+ < Icon name = "account_circle" variant = "round" />
195+ </ Button >
196+ </ DropdownTrigger >
197+ < DropdownMenu
198+ topContent = {
199+ < p className = "text-medium w-full px-2" >
200+ Welcome,{ " " }
201+ < span className = "font-semibold" >
202+ { session . user . name }
203+ </ span >
204+ </ p >
205+ }
206+ >
207+ < DropdownItem
208+ key = { "sign-out" }
209+ onPress = { ( ) => {
210+ signOut ( ) ;
211+ } }
212+ >
213+ Sign out
214+ </ DropdownItem >
215+ </ DropdownMenu >
216+ </ Dropdown >
217+ ) }
110218 </ div >
111219 </ div >
112220 </ div >
113221 ) }
114222
115- < div
116- className = { `flex h-full w-full overflow-hidden` }
117- >
223+ < div className = { `flex h-full w-full overflow-hidden` } >
118224 { isShowNavbar && (
119225 < NavMenu isMenuOpen = { isMenuOpen } setIsMenuOpen = { setIsMenuOpen } />
120226 ) }
0 commit comments