11import '../App.css'
2- import {
3- QueryCache ,
4- QueryClient ,
5- QueryClientProvider ,
6- useQueryClient ,
7- } from '@tanstack/react-query'
8- import { useApiModels } from '@/api'
9- import { useEventBus } from '@/hooks/eventBus'
10- import React , { useState } from 'react'
11- import type { VSCodeEvent } from '@bus/callbacks'
12- import { URI } from 'vscode-uri'
13- import type { Model } from '@/api/client'
14- import { useRpc } from '@/utils/rpc'
2+ import { QueryClient , QueryClientProvider } from '@tanstack/react-query'
153import { TableDiff } from '../components/tablediff/TableDiff'
164
175export function TableDiffPage ( ) {
18- const { emit } = useEventBus ( )
19-
20- // Handle messages from VSCode extension
21- React . useEffect ( ( ) => {
22- const handleMessage = ( event : MessageEvent ) => {
23- // Ensure the message is from VSCode
24- if ( event . data && event . data . key === 'vscode_send' ) {
25- const payload : VSCodeEvent = event . data . payload
26- switch ( payload . key ) {
27- case 'changeFocusOnFile' :
28- emit ( 'changeFocusedFile' , { fileUri : payload . payload . path } )
29- break
30- case 'savedFile' :
31- emit ( 'savedFile' , { fileUri : payload . payload . fileUri } )
32- break
33- default :
34- console . error (
35- 'Unhandled message type in table diff page:' ,
36- payload . key ,
37- )
38- }
39- }
40- }
41- window . addEventListener ( 'message' , handleMessage )
42- return ( ) => {
43- window . removeEventListener ( 'message' , handleMessage )
44- }
45- } , [ ] )
46-
476 const client = new QueryClient ( {
48- queryCache : new QueryCache ( { } ) ,
497 defaultOptions : {
508 queries : {
519 networkMode : 'always' ,
@@ -58,116 +16,9 @@ export function TableDiffPage() {
5816
5917 return (
6018 < QueryClientProvider client = { client } >
61- < TableDiffContent />
19+ < div className = "h-[100vh] w-[100vw]" >
20+ < TableDiff />
21+ </ div >
6222 </ QueryClientProvider >
6323 )
6424}
65-
66- function TableDiffContent ( ) {
67- const [ selectedModel , setSelectedModel ] = useState < string | undefined > (
68- undefined ,
69- )
70- const { on } = useEventBus ( )
71- const queryClient = useQueryClient ( )
72-
73- const {
74- data : models ,
75- isLoading : isLoadingModels ,
76- error : modelsError ,
77- } = useApiModels ( )
78- const rpc = useRpc ( )
79-
80- React . useEffect ( ( ) => {
81- const fetchFirstTimeModelIfNotSet = async (
82- models : Model [ ] ,
83- ) : Promise < string | undefined > => {
84- if ( ! Array . isArray ( models ) ) {
85- return undefined
86- }
87- const activeFile = await rpc ( 'get_active_file' , { } )
88- // @ts -ignore
89- if ( ! activeFile . fileUri ) {
90- return models [ 0 ] . name
91- }
92- // @ts -ignore
93- const fileUri : string = activeFile . fileUri
94- const filePath = URI . file ( fileUri ) . path
95- const model = models . find (
96- ( m : Model ) => URI . file ( m . full_path ) . path === filePath ,
97- )
98- if ( model ) {
99- return model . name
100- }
101- return undefined
102- }
103- if ( selectedModel === undefined && Array . isArray ( models ) ) {
104- fetchFirstTimeModelIfNotSet ( models ) . then ( modelName => {
105- if ( modelName && selectedModel === undefined ) {
106- setSelectedModel ( modelName )
107- } else {
108- setSelectedModel ( models [ 0 ] . name )
109- }
110- } )
111- }
112- } , [ models , selectedModel ] )
113-
114- const modelsRecord =
115- Array . isArray ( models ) &&
116- models . reduce (
117- ( acc , model ) => {
118- acc [ model . name ] = model
119- return acc
120- } ,
121- { } as Record < string , Model > ,
122- )
123-
124- React . useEffect ( ( ) => {
125- const handleChangeFocusedFile = ( fileUri : { fileUri : string } ) => {
126- const full_path = URI . parse ( fileUri . fileUri ) . path
127- const model = Object . values ( modelsRecord ) . find (
128- m => URI . file ( m . full_path ) . path === full_path ,
129- )
130- if ( model ) {
131- setSelectedModel ( model . name )
132- }
133- }
134-
135- const handleSavedFile = ( ) => {
136- queryClient . invalidateQueries ( )
137- }
138-
139- const offChangeFocusedFile = on (
140- 'changeFocusedFile' ,
141- handleChangeFocusedFile ,
142- )
143- const offSavedFile = on ( 'savedFile' , handleSavedFile )
144-
145- // If your event bus returns an "off" function, call it on cleanup
146- return ( ) => {
147- if ( offChangeFocusedFile ) offChangeFocusedFile ( )
148- if ( offSavedFile ) offSavedFile ( )
149- }
150- } , [ on , queryClient , modelsRecord ] )
151-
152- if ( modelsError ) {
153- return < div > Error: { modelsError . message } </ div >
154- }
155-
156- if (
157- isLoadingModels ||
158- models === undefined ||
159- modelsRecord === false ||
160- selectedModel === undefined
161- ) {
162- return < div > Loading models...</ div >
163- }
164- if ( ! Array . isArray ( models ) ) {
165- return < div > Error: Models data is not in the expected format</ div >
166- }
167-
168- return (
169- < div className = "h-[100vh] w-[100vw]" >
170- < TableDiff />
171- </ div >
172- )
173- }
0 commit comments