@@ -11,10 +11,11 @@ import {EmailList} from "./email-list"
1111import { EmailViewer } from "./email-viewer"
1212import { DashboardHeader } from "./dashboard-header"
1313import { Alert , AlertDescription } from "@/components/ui/alert"
14- import { AlertCircle } from "lucide-react"
14+ import { AlertCircle , ArrowLeft , FileText , Folder , Mail } from "lucide-react"
1515import { Account } from "@/types" ;
1616import { Cache } from "@/lib/cache"
1717import { UISettings } from "@/lib/settings"
18+ import { Button } from "@/components/ui/button"
1819
1920export function DashboardClient ( ) {
2021 const [ accounts , setAccounts ] = useState < Account [ ] > ( [ ] )
@@ -25,6 +26,8 @@ export function DashboardClient() {
2526 const [ error , setError ] = useState < string | null > ( null )
2627 const [ switchingAccount , setSwitchingAccount ] = useState ( false )
2728 const [ foldersLoaded , setFoldersLoaded ] = useState ( false )
29+ // Mobile view state: 'folders' | 'emails' | 'viewer'
30+ const [ mobileView , setMobileView ] = useState < 'folders' | 'emails' | 'viewer' > ( 'folders' )
2831
2932 // Handle account change with loading state
3033 const handleAccountChange = ( accountId : string ) => {
@@ -152,9 +155,47 @@ export function DashboardClient() {
152155 disabled = { switchingAccount }
153156 />
154157
155- < div className = "flex h-[calc(100vh-4rem)]" >
158+ { /* Mobile Navigation */ }
159+ < div className = "md:hidden border-b bg-background" >
160+ < div className = "flex items-center" >
161+ < button
162+ className = { `flex-1 flex items-center justify-center gap-2 py-3 border-r transition-colors ${
163+ mobileView === 'folders' ? 'bg-muted text-foreground' : 'text-muted-foreground'
164+ } `}
165+ onClick = { ( ) => setMobileView ( 'folders' ) }
166+ >
167+ < Folder className = "h-4 w-4" />
168+ < span className = "text-sm font-medium" > Folders</ span >
169+ </ button >
170+ < button
171+ className = { `flex-1 flex items-center justify-center gap-2 py-3 border-r transition-colors ${
172+ mobileView === 'emails' ? 'bg-muted text-foreground' : 'text-muted-foreground'
173+ } `}
174+ onClick = { ( ) => setMobileView ( 'emails' ) }
175+ disabled = { ! selectedFolder }
176+ >
177+ < Mail className = "h-4 w-4" />
178+ < span className = "text-sm font-medium" > Emails</ span >
179+ </ button >
180+ < button
181+ className = { `flex-1 flex items-center justify-center gap-2 py-3 transition-colors ${
182+ mobileView === 'viewer' ? 'bg-muted text-foreground' : 'text-muted-foreground'
183+ } `}
184+ onClick = { ( ) => setMobileView ( 'viewer' ) }
185+ disabled = { ! selectedEmail }
186+ >
187+ < FileText className = "h-4 w-4" />
188+ < span className = "text-sm font-medium" > View</ span >
189+ </ button >
190+ </ div >
191+ </ div >
192+
193+ { /* Desktop: 3-column layout, Mobile: single column based on mobileView */ }
194+ < div className = "flex h-[calc(100vh-4rem)] md:h-[calc(100vh-4rem)]" >
156195 { /* Folder sidebar */ }
157- < div className = "border-r bg-muted/30 overflow-y-auto" style = { { width : `${ UISettings . sidebarWidth } px` } } >
196+ < div className = { `border-r bg-muted/30 overflow-y-auto ${
197+ mobileView === 'folders' ? 'w-full md:w-auto' : 'hidden md:block'
198+ } `} style = { { width : mobileView === 'folders' ? '100%' : `${ UISettings . sidebarWidth } px` } } >
158199 { selectedAccount && (
159200 < FolderList
160201 accountId = { selectedAccount }
@@ -166,30 +207,56 @@ export function DashboardClient() {
166207 }
167208 setSelectedFolder ( folder )
168209 setSelectedEmail ( null )
210+ setMobileView ( 'emails' ) // Switch to emails view on mobile
169211 } }
170212 onLoadingComplete = { ( ) => setFoldersLoaded ( true ) }
171213 />
172214 ) }
173215 </ div >
174216
175217 { /* Email list */ }
176- < div className = "border-r bg-background overflow-y-auto"
177- style = { { width : `${ UISettings . emailListWidth } px` } } >
218+ < div className = { `border-r bg-background overflow-y-auto ${
219+ mobileView === 'emails' ? 'w-full md:w-auto' : 'hidden md:block'
220+ } `} style = { { width : mobileView === 'emails' ? '100%' : `${ UISettings . emailListWidth } px` } } >
178221 { selectedAccount && selectedFolder && (
179- < EmailList
180- accountId = { selectedAccount }
181- folder = { selectedFolder }
182- selectedUid = { selectedEmail ?. uid }
183- onEmailSelect = { ( uid ) => setSelectedEmail ( { uid, folder : selectedFolder } ) }
184- />
222+ < >
223+ { /* Mobile back button */ }
224+ < div className = "md:hidden border-b p-2 flex items-center gap-2" >
225+ < Button variant = "ghost" size = "sm" onClick = { ( ) => setMobileView ( 'folders' ) } >
226+ < ArrowLeft className = "h-4 w-4 mr-2" />
227+ Back to Folders
228+ </ Button >
229+ </ div >
230+ < EmailList
231+ accountId = { selectedAccount }
232+ folder = { selectedFolder }
233+ selectedUid = { selectedEmail ?. uid }
234+ onEmailSelect = { ( uid ) => {
235+ setSelectedEmail ( { uid, folder : selectedFolder } )
236+ setMobileView ( 'viewer' ) // Switch to viewer on mobile
237+ } }
238+ />
239+ </ >
185240 ) }
186241 </ div >
187242
188243 { /* Email viewer */ }
189- < div className = "flex-1 overflow-y-auto bg-background" >
244+ < div className = { `flex-1 overflow-y-auto bg-background ${
245+ mobileView === 'viewer' ? 'w-full' : 'hidden md:block'
246+ } `} >
190247 { selectedEmail ? (
191- < EmailViewer accountId = { selectedAccount ! } folder = { selectedEmail . folder }
192- uid = { selectedEmail . uid } />
248+ < >
249+ { /* Mobile back button */ }
250+ < div
251+ className = "md:hidden border-b p-2 flex items-center gap-2 sticky top-0 bg-background z-10" >
252+ < Button variant = "ghost" size = "sm" onClick = { ( ) => setMobileView ( 'emails' ) } >
253+ < ArrowLeft className = "h-4 w-4 mr-2" />
254+ Back to Emails
255+ </ Button >
256+ </ div >
257+ < EmailViewer accountId = { selectedAccount ! } folder = { selectedEmail . folder }
258+ uid = { selectedEmail . uid } />
259+ </ >
193260 ) : (
194261 < div className = "h-full flex items-center justify-center text-muted-foreground" >
195262 < p > Select an email to view</ p >
0 commit comments