@@ -14,9 +14,12 @@ import { getFileClass, twClasses } from '../file-classes'
1414
1515import FileViewer from './file-viewer'
1616import FileTree from './file-tree'
17+ import WebContainerProvider from './web-container-provider'
18+ import { WebContainerPreview } from './webcontainer-preview'
1719
1820import { Label } from './ui/label'
1921import { Switch } from './ui/switch'
22+ import { Tabs , TabsList , TabsTrigger , TabsContent } from './ui/tabs'
2023
2124import type { FileTreeItem } from '../types'
2225
@@ -181,27 +184,69 @@ export default function FileNavigator() {
181184
182185 const ready = useReady ( )
183186
187+ // Prepare project files for WebContainer
188+ const webContainerFiles = useMemo ( ( ) => {
189+ console . log ( 'Preparing WebContainer files, tree:' , tree )
190+ if ( ! tree ) {
191+ console . log ( 'Tree is empty, returning empty array' )
192+ return [ ]
193+ }
194+ const files = Object . entries ( tree ) . map ( ( [ path , content ] ) => ( {
195+ path,
196+ content,
197+ } ) )
198+ console . log ( 'WebContainer files prepared:' , files . length , 'files' )
199+ return files
200+ } , [ tree ] )
201+
184202 if ( ! ready ) {
185203 return null
186204 }
187205
188206 return (
189- < div className = "bg-white dark:bg-black/50 rounded-lg p-2 sm:p-4" >
190- { mode === 'add' && < Filters /> }
191- < div className = "flex flex-row @container" >
192- < div className = "w-1/3 @6xl:w-1/4 bg-gray-500/10 rounded-l-lg" >
193- < FileTree selectedFile = { selectedFile } tree = { fileTree } />
194- </ div >
195- < div className = "w-2/3 @6xl:w-3/4" >
196- { selectedFile && modifiedFileContents ? (
197- < FileViewer
198- filePath = { selectedFile }
199- originalFile = { originalFileContents }
200- modifiedFile = { modifiedFileContents }
201- />
202- ) : null }
203- </ div >
207+ < WebContainerProvider projectFiles = { webContainerFiles } >
208+ < div className = "bg-white dark:bg-black/50 rounded-lg p-2 sm:p-4" >
209+ { mode === 'add' && < Filters /> }
210+ < Tabs defaultValue = "files" className = "w-full" >
211+ < TabsList className = "mb-1 h-7 p-0.5 bg-transparent border border-gray-300 dark:border-gray-700" >
212+ < TabsTrigger
213+ value = "files"
214+ className = "text-xs h-6 px-3 py-0 data-[state=active]:bg-gray-200 dark:data-[state=active]:bg-gray-800"
215+ >
216+ Files
217+ </ TabsTrigger >
218+ < TabsTrigger
219+ value = "preview"
220+ className = "text-xs h-6 px-3 py-0 data-[state=active]:bg-gray-200 dark:data-[state=active]:bg-gray-800"
221+ >
222+ Preview
223+ </ TabsTrigger >
224+ </ TabsList >
225+
226+ < TabsContent value = "files" className = "mt-0" >
227+ < div className = "flex flex-row @container" >
228+ < div className = "w-1/3 @6xl:w-1/4 bg-gray-500/10 rounded-l-lg" >
229+ < FileTree selectedFile = { selectedFile } tree = { fileTree } />
230+ </ div >
231+ < div className = "w-2/3 @6xl:w-3/4" >
232+ { selectedFile && modifiedFileContents ? (
233+ < FileViewer
234+ filePath = { selectedFile }
235+ originalFile = { originalFileContents }
236+ modifiedFile = { modifiedFileContents }
237+ />
238+ ) : null }
239+ </ div >
240+ </ div >
241+ </ TabsContent >
242+
243+ < TabsContent value = "preview" className = "mt-0" >
244+ < div className = "h-[800px]" >
245+ < WebContainerPreview />
246+ </ div >
247+ </ TabsContent >
248+ </ Tabs >
204249 </ div >
205- </ div >
250+ </ WebContainerProvider >
206251 )
207252}
0 commit comments