1- import { Flex } from "@chakra-ui/react"
2- import { useState } from "react"
1+ import { Box , Flex , IconButton } from "@chakra-ui/react"
2+ import { PiX } from "@react-icons/all-files/pi/PiX"
3+ import { useEffect , useState } from "react"
34import { useAutoSaveTemplate } from "../../hooks/useAutoSaveTemplate"
45import { useSaveTemplate } from "../../hooks/useSaveTemplate"
56import { Header , type HeaderProps } from "../header"
@@ -18,9 +19,22 @@ interface Props {
1819export function EditorLayout ( { onAddImage, onClose, exportOptions } : Props ) {
1920 const [ viewMode , setViewMode ] = useState < "list" | "grid" > ( "list" )
2021 const [ gridImageSize , setGridImageSize ] = useState < number > ( 300 )
21- const [ layoutMode , setLayoutMode ] = useState < "editor" | "templates" > (
22- "templates" ,
23- )
22+ const [ isTemplatesOpen , setIsTemplatesOpen ] = useState ( false )
23+
24+ // Close templates modal on Escape while it's open
25+ useEffect ( ( ) => {
26+ if ( ! isTemplatesOpen ) return
27+ const handleKeyDown = ( event : KeyboardEvent ) => {
28+ if ( event . key === "Escape" ) {
29+ event . stopPropagation ( )
30+ setIsTemplatesOpen ( false )
31+ }
32+ }
33+ window . addEventListener ( "keydown" , handleKeyDown )
34+ return ( ) => {
35+ window . removeEventListener ( "keydown" , handleKeyDown )
36+ }
37+ } , [ isTemplatesOpen ] )
2438
2539 useAutoSaveTemplate ( )
2640 useSaveTemplate ( )
@@ -30,32 +44,74 @@ export function EditorLayout({ onAddImage, onClose, exportOptions }: Props) {
3044 < Header
3145 onClose = { onClose }
3246 exportOptions = { exportOptions }
33- onViewAllTemplates = { ( ) => setLayoutMode ( "templates" ) }
47+ onViewAllTemplates = { ( ) => setIsTemplatesOpen ( true ) }
3448 />
35- { layoutMode === "templates" ? (
36- < TemplatesLibraryView onBack = { ( ) => setLayoutMode ( "editor" ) } />
37- ) : (
38- < Flex flexDirection = "row" width = "full" height = "full" flexGrow = { 0 } >
39- < Sidebar />
40- < Flex
41- flex = "1 0 0"
42- background = "editorGray.200"
49+ < Flex flexDirection = "row" width = "full" height = "full" flexGrow = { 0 } >
50+ < Sidebar />
51+ < Flex
52+ flex = "1 0 0"
53+ background = "editorGray.200"
54+ flexDirection = "column"
55+ position = "relative"
56+ >
57+ < ActionBar
58+ viewMode = { viewMode }
59+ setViewMode = { setViewMode }
60+ gridImageSize = { gridImageSize }
61+ setGridImageSize = { setGridImageSize }
62+ />
63+ { viewMode === "list" && < ListView onAddImage = { onAddImage } /> }
64+ { viewMode === "grid" && (
65+ < GridView imageSize = { gridImageSize } onAddImage = { onAddImage } />
66+ ) }
67+ </ Flex >
68+ </ Flex >
69+ { isTemplatesOpen ? (
70+ < Box
71+ position = "fixed"
72+ inset = { 0 }
73+ bg = "blackAlpha.400"
74+ display = "flex"
75+ alignItems = "center"
76+ justifyContent = "center"
77+ zIndex = { 1400 }
78+ >
79+ < Box
80+ w = "80vw"
81+ h = "80vh"
82+ maxW = "80vw"
83+ maxH = "80vh"
84+ bg = "white"
85+ borderRadius = "xl"
86+ overflow = "hidden"
87+ boxShadow = "xl"
88+ display = "flex"
4389 flexDirection = "column"
4490 position = "relative"
4591 >
46- < ActionBar
47- viewMode = { viewMode }
48- setViewMode = { setViewMode }
49- gridImageSize = { gridImageSize }
50- setGridImageSize = { setGridImageSize }
92+ < IconButton
93+ aria-label = "Close templates"
94+ icon = { < PiX /> }
95+ size = "sm"
96+ variant = "ghost"
97+ position = "absolute"
98+ top = "3"
99+ right = "3"
100+ zIndex = { 1 }
101+ onClick = { ( ) => setIsTemplatesOpen ( false ) }
51102 />
52- { viewMode === "list" && < ListView onAddImage = { onAddImage } /> }
53- { viewMode === "grid" && (
54- < GridView imageSize = { gridImageSize } onAddImage = { onAddImage } />
55- ) }
56- </ Flex >
57- </ Flex >
58- ) }
103+ < Box
104+ flex = "1 1 0"
105+ minH = { 0 }
106+ display = "flex"
107+ flexDirection = "column"
108+ paddingY = "2"
109+ >
110+ < TemplatesLibraryView onClose = { ( ) => setIsTemplatesOpen ( false ) } />
111+ </ Box >
112+ </ Box >
113+ </ Box >
114+ ) : null }
59115 </ >
60116 )
61117}
0 commit comments