1+ import { useState } from 'react' ;
12import {
23 Sheet ,
34 SheetContent ,
@@ -6,8 +7,15 @@ import {
67 SheetTrigger ,
78} from '@/components/ui/sheet' ;
89import { url } from '@/components/utils/URLs' ;
9- import { GitHubLogoIcon } from '@radix-ui/react-icons' ;
10- import { Menu } from 'lucide-react' ;
10+ import {
11+ Menu ,
12+ Github ,
13+ LogOut ,
14+ Trash2 ,
15+ FileDown ,
16+ FileJson ,
17+ FileText ,
18+ } from 'lucide-react' ;
1119import { ModeToggle } from '../../utils/theme-mode-toggle' ;
1220import { buttonVariants } from '@/components/ui/button' ;
1321import {
@@ -16,73 +24,140 @@ import {
1624 handleLogout ,
1725 RouteProps ,
1826 Props ,
19- } from './navbar-utils' ;
27+ } from '@/components/HomeComponents/Navbar/navbar-utils' ;
28+ import {
29+ Dialog ,
30+ DialogContent ,
31+ DialogDescription ,
32+ DialogHeader ,
33+ DialogTitle ,
34+ DialogTrigger ,
35+ } from '@/components/ui/dialog' ;
36+ import { Button } from '@/components/ui/button' ;
37+ import { exportTasksAsJSON , exportTasksAsTXT } from '@/exports-tasks' ;
2038
2139export const NavbarMobile = (
2240 props : Props & { setIsOpen : ( isOpen : boolean ) => void ; isOpen : boolean } & {
2341 isLoading : boolean ;
2442 setIsLoading : ( val : boolean ) => void ;
2543 }
26- ) => (
27- < span className = "flex md:hidden" >
28- < ModeToggle />
44+ ) => {
45+ const [ isExportDialogOpen , setIsExportDialogOpen ] = useState ( false ) ;
2946
30- < Sheet open = { props . isOpen } onOpenChange = { props . setIsOpen } >
31- < SheetTrigger className = "px-2" >
32- < Menu
33- className = "flex md:hidden h-5 w-5"
34- onClick = { ( ) => props . setIsOpen ( true ) }
35- >
36- < span className = "sr-only" > Menu Icon</ span >
37- </ Menu >
38- </ SheetTrigger >
47+ const handleExportJSON = ( ) => {
48+ exportTasksAsJSON ( props . tasks || [ ] ) ;
49+ setIsExportDialogOpen ( false ) ;
50+ props . setIsOpen ( false ) ;
51+ } ;
3952
40- < SheetContent side = { 'left' } >
41- < SheetHeader >
42- < SheetTitle className = "font-bold text-xl" > CCSync</ SheetTitle >
43- </ SheetHeader >
53+ const handleExportTXT = ( ) => {
54+ exportTasksAsTXT ( props . tasks || [ ] ) ;
55+ setIsExportDialogOpen ( false ) ;
56+ props . setIsOpen ( false ) ;
57+ } ;
4458
45- < nav className = "flex flex-col justify-center items-center gap-2 mt-4" >
46- { routeList . map ( ( { href, label } : RouteProps ) => (
47- < a
48- rel = "noreferrer noopener"
49- key = { label }
50- href = { href }
51- onClick = { ( ) => props . setIsOpen ( false ) }
52- className = { buttonVariants ( { variant : 'ghost' } ) }
53- >
54- { label }
55- </ a >
56- ) ) }
57- < a
58- rel = "noreferrer noopener"
59- href = { url . githubRepoURL }
60- target = "_blank"
61- className = { `w-[110px] border ${ buttonVariants ( {
62- variant : 'secondary' ,
63- } ) } `}
64- >
65- < GitHubLogoIcon className = "mr-2 w-5 h-5" />
66- Github
67- </ a >
68- < div
69- onClick = { ( ) => deleteAllTasks ( props ) }
70- className = { `w-[110px] border ${ buttonVariants ( {
71- variant : 'destructive' ,
72- } ) } `}
59+ return (
60+ < span className = "flex md:hidden" >
61+ < ModeToggle />
62+
63+ < Sheet open = { props . isOpen } onOpenChange = { props . setIsOpen } >
64+ < SheetTrigger className = "px-2" >
65+ < Menu
66+ className = "flex md:hidden h-5 w-5"
67+ onClick = { ( ) => props . setIsOpen ( true ) }
7368 >
74- Delete All Tasks
75- </ div >
76- < div
77- onClick = { handleLogout }
78- className = { `w-[110px] border ${ buttonVariants ( {
79- variant : 'destructive' ,
80- } ) } `}
69+ < span className = "sr-only" > Menu Icon</ span >
70+ </ Menu >
71+ </ SheetTrigger >
72+ < SheetContent side = { 'left' } >
73+ < SheetHeader >
74+ < SheetTitle className = "font-bold text-xl" > CCSync</ SheetTitle >
75+ </ SheetHeader >
76+ < Dialog
77+ open = { isExportDialogOpen }
78+ onOpenChange = { setIsExportDialogOpen }
8179 >
82- Log out
83- </ div >
84- </ nav >
85- </ SheetContent >
86- </ Sheet >
87- </ span >
88- ) ;
80+ < nav className = "flex flex-col justify-center items-center gap-2 mt-4" >
81+ { routeList . map ( ( { href, label } : RouteProps ) => (
82+ < a
83+ rel = "noreferrer noopener"
84+ key = { label }
85+ href = { href }
86+ onClick = { ( ) => props . setIsOpen ( false ) }
87+ className = { buttonVariants ( { variant : 'ghost' } ) }
88+ >
89+ { label }
90+ </ a >
91+ ) ) }
92+ < a
93+ rel = "noreferrer noopener"
94+ href = { url . githubRepoURL }
95+ target = "_blank"
96+ className = { `w-[130px] border ${ buttonVariants ( {
97+ variant : 'secondary' ,
98+ } ) } `}
99+ >
100+ < Github className = "mr-2 w-5 h-5" />
101+ Github
102+ </ a >
103+
104+ < DialogTrigger asChild >
105+ < div
106+ className = { `w-[130px] cursor-pointer border ${ buttonVariants ( {
107+ variant : 'secondary' ,
108+ } ) } `}
109+ >
110+ < FileDown className = "mr-2 w-5 h-5" />
111+ Export Tasks
112+ </ div >
113+ </ DialogTrigger >
114+ < div
115+ onClick = { ( ) => deleteAllTasks ( props ) }
116+ className = { `w-[130px] border ${ buttonVariants ( {
117+ variant : 'destructive' ,
118+ } ) } `}
119+ >
120+ < Trash2 className = "mr-2 w-5 h-5" />
121+ Delete All Tasks
122+ </ div >
123+ < div
124+ onClick = { handleLogout }
125+ className = { `w-[130px] border ${ buttonVariants ( {
126+ variant : 'destructive' ,
127+ } ) } `}
128+ >
129+ < LogOut className = "mr-2 w-5 h-5" />
130+ Log out
131+ </ div >
132+ </ nav >
133+ < DialogContent >
134+ < DialogHeader >
135+ < DialogTitle > Choose Export Format</ DialogTitle >
136+ < DialogDescription >
137+ Would you like to download your tasks as a JSON file or a TXT
138+ file?
139+ </ DialogDescription >
140+ </ DialogHeader >
141+ < div className = "flex flex-col sm:flex-row justify-end gap-2 mt-4" >
142+ < Button
143+ onClick = { handleExportTXT }
144+ className = "w-full sm:w-auto hover:bg-white bg-[#3B82F6]"
145+ >
146+ < FileText className = "mr-2 h-4 w-4" />
147+ Download .txt
148+ </ Button >
149+ < Button
150+ onClick = { handleExportJSON }
151+ className = "w-full sm:w-auto hover:bg-white bg-[#3B82F6]"
152+ >
153+ < FileJson className = "mr-2 h-4 w-4" />
154+ Download .json
155+ </ Button >
156+ </ div >
157+ </ DialogContent >
158+ </ Dialog >
159+ </ SheetContent >
160+ </ Sheet >
161+ </ span >
162+ ) ;
163+ } ;
0 commit comments