1
1
"use client" ;
2
2
3
- import { v4 as uuidv4 } from "uuid" ;
4
3
import * as React from "react" ;
5
- import {
6
- Database ,
7
- Validator ,
8
- chainsMap ,
9
- type Schema ,
10
- helpers ,
11
- type Result ,
12
- } from "@tableland/sdk" ;
4
+ import { Database , helpers } from "@tableland/sdk" ;
13
5
import { studioAliases , getBaseUrl } from "@tableland/studio-client" ;
14
6
import { init } from "@tableland/sqlparser" ;
15
- import { api } from "@/trpc/react" ;
16
- import { cn , objectToTableData } from "@/lib/utils" ;
17
7
import { CodeEditor } from "./code-editor" ;
18
8
import { DataTable } from "./data-table" ;
19
- import { Table } from "./ui/table " ;
9
+ import { cn , objectToTableData } from "@/lib/utils " ;
20
10
21
11
init ( ) . catch ( ( err : any ) => {
22
12
console . log ( "could not init sqlparser:" , err ) ;
23
13
throw err ;
24
14
} ) ;
25
15
26
- export function Console ( { environmentId } : Props ) {
16
+ interface Tab {
17
+ tabId : number ;
18
+ name : string ;
19
+ query : string ;
20
+ columns ?: any [ ] ;
21
+ results : any [ ] ;
22
+ messages : string [ ]
23
+ error : any ;
24
+ queryType : string ;
25
+ committing : boolean ;
26
+ }
27
+
28
+ export function Console ( { environmentId } : { environmentId : string ; } ) {
27
29
const [ loading , setLoading ] = React . useState ( false ) ;
28
- const [ tabs , setTabs ] = React . useState ( [ ] ) ;
29
- const [ currentTab , setCurrentTab ] = React . useState ( ) ;
30
+ const [ tabs , setTabs ] = React . useState < Tab [ ] > ( [ ] ) ;
31
+ const [ currentTab , setCurrentTab ] = React . useState < number | undefined > ( ) ;
30
32
31
- const runQuery = async function ( { tabId, query : queryText } ) {
33
+ const runQuery = async function ( { tabId, query : queryText } : { tabId : number ; query : string ; } ) {
32
34
if ( loading ) return ;
33
35
setLoading ( true ) ;
34
36
35
37
try {
36
- const { statements, type , tables } = await sqlparser . normalize ( queryText ) ;
38
+ const { statements, tables } = await sqlparser . normalize ( queryText ) ;
37
39
if ( statements . length > 1 ) {
38
40
throw new Error ( "you may only run one statement at a time" ) ;
39
41
}
@@ -52,12 +54,11 @@ export function Console({ environmentId }: Props) {
52
54
if ( ! uuTableName ) throw new Error ( "invalid table name" ) ;
53
55
54
56
const chainId = parseInt ( uuTableName . split ( "_" ) . reverse ( ) [ 1 ] , 10 ) ;
55
- const chain = helpers . getChainInfo ( chainId ) ;
56
57
const baseUrl = helpers . getBaseUrl ( chainId ) ;
57
58
const db = new Database ( { baseUrl, aliases } ) ;
58
59
const data = await db . prepare ( statement ) . all ( ) ;
59
60
console . log ( data ) ;
60
- const columns : Array < ColumnDef < unknown > > | undefined = data
61
+ const columns = data
61
62
? data . results . length
62
63
? Object . keys ( data . results [ 0 ] as object ) . map ( ( col ) => ( {
63
64
accessorKey : col ,
@@ -67,7 +68,7 @@ export function Console({ environmentId }: Props) {
67
68
: undefined ;
68
69
69
70
setTabs (
70
- tabs . map ( ( tab ) => {
71
+ tabs . map ( ( tab : Tab ) => {
71
72
if ( tab . tabId !== tabId ) return tab ;
72
73
73
74
tab . error = null ;
@@ -76,16 +77,16 @@ export function Console({ environmentId }: Props) {
76
77
tab . columns = columns ;
77
78
tab . results = data . results ;
78
79
79
- if ( ! columns . length && data . success ) {
80
+ if ( ! columns ? .length && data . success ) {
80
81
tab . messages = [
81
82
"success: true" ,
82
83
`duration: ${ data . meta . duration } ` ,
83
- `tableIds: ${ data . meta . txn . tableIds . join ( ", " ) } ` ,
84
- `transactionHash: ${ data . meta . txn . transactionHash } ` ,
85
- `blockNumber: ${ data . meta . txn . blockNumber } ` ,
86
- `chainId: ${ data . meta . txn . chainId } ` ,
87
- `universalTableNames": ${ data . meta . txn . names . join ( ", " ) } ` ,
88
- `definitionNames: ${ data . meta . txn . prefixes . join ( ", " ) } ` ,
84
+ `tableIds: ${ data . meta . txn ? .tableIds . join ( ", " ) } ` ,
85
+ `transactionHash: ${ data . meta . txn ? .transactionHash } ` ,
86
+ `blockNumber: ${ data . meta . txn ? .blockNumber } ` ,
87
+ `chainId: ${ data . meta . txn ? .chainId } ` ,
88
+ `universalTableNames": ${ data . meta . txn ? .names . join ( ", " ) } ` ,
89
+ `definitionNames: ${ data . meta . txn ? .prefixes . join ( ", " ) } ` ,
89
90
] ;
90
91
}
91
92
@@ -122,8 +123,10 @@ export function Console({ environmentId }: Props) {
122
123
123
124
// TODO: this is the only way I can find to get an incrementing default tab
124
125
// name with a number that lives across re-renders.
126
+ // eslint-disable-next-line
125
127
const name = "Tab " + ( largestDefaultNum + 1 ) ;
126
128
const tab = {
129
+ // eslint-disable-next-line
127
130
tabId : tabs . length === 0 ? 1 : tabs [ tabs . length - 1 ] . tabId + 1 ,
128
131
name,
129
132
query : "" ,
@@ -146,14 +149,14 @@ export function Console({ environmentId }: Props) {
146
149
} ;
147
150
148
151
const openQueryTab = function ( id ?: number | string ) {
149
- if ( id ) return setCurrentTab ( parseInt ( id , 10 ) ) ;
152
+ if ( id ) return setCurrentTab ( parseInt ( id ?. toString ( ) || "0" , 10 ) ) ;
150
153
151
154
const tab = newQueryTab ( ) ;
152
155
setCurrentTab ( tab . tabId ) ;
153
156
} ;
154
157
155
158
const closeQueryTab = function ( id ?: number | string ) {
156
- const tabId = parseInt ( id , 10 ) ;
159
+ const tabId = parseInt ( id ?. toString ( ) || "0" , 10 ) ;
157
160
const isCurrent = currentTab === tabId ;
158
161
159
162
setTabs ( tabs . filter ( ( t ) => t . tabId !== tabId ) ) ;
@@ -164,6 +167,7 @@ export function Console({ environmentId }: Props) {
164
167
const firstTab = getNewTab ( ) ;
165
168
setTabs ( [ firstTab ] ) ;
166
169
setCurrentTab ( firstTab . tabId ) ;
170
+ // eslint-disable-next-line
167
171
} , [ ] ) ;
168
172
169
173
return (
@@ -176,7 +180,7 @@ export function Console({ environmentId }: Props) {
176
180
< TabLabel
177
181
key = { tab . tabId }
178
182
tab = { tab }
179
- currentTab = { currentTab }
183
+ currentTab = { currentTab || 0 }
180
184
loading = { loading }
181
185
openTab = { ( ) => openQueryTab ( tab . tabId ) }
182
186
closeTab = { ( ) => closeQueryTab ( tab . tabId ) }
@@ -219,7 +223,7 @@ function QueryPane(props: any): React.JSX.Element {
219
223
const { tabId, query : initialQuery , runQuery, loading } = props ;
220
224
221
225
const [ query , setQuery ] = React . useState ( initialQuery ) ;
222
- const updateQuery = function ( payload ) {
226
+ const updateQuery = function ( payload : any ) {
223
227
setQuery ( payload . query ) ;
224
228
} ;
225
229
@@ -247,12 +251,13 @@ function QueryPane(props: any): React.JSX.Element {
247
251
< button
248
252
disabled = { props . loading }
249
253
className = "my-4 mr-4 inline-flex h-8 items-center justify-center rounded-md border border-input bg-transparent px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"
254
+ // @ts -expect-error
250
255
onClick = { sendQuery }
251
256
>
252
257
Run Query
253
258
</ button >
254
259
255
- { /*<button
260
+ { /* <button
256
261
className="my-4 mr-4 inline-flex h-8 items-center justify-center rounded-md border border-input bg-transparent px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"
257
262
onClick={() => {
258
263
let savedQueries = JSON.parse(
@@ -270,7 +275,7 @@ function QueryPane(props: any): React.JSX.Element {
270
275
}}
271
276
>
272
277
Save
273
- </button>*/ }
278
+ </button> */ }
274
279
</ li >
275
280
</ ul >
276
281
</ div >
@@ -336,7 +341,7 @@ function TabLabel(props: {
336
341
}
337
342
338
343
function ResultSetPane ( props : any ) : React . JSX . Element {
339
- const { error , loading , message , tab } = props ;
344
+ const { tab } = props ;
340
345
const formattedData = objectToTableData ( tab . results ) ;
341
346
342
347
return (
@@ -349,7 +354,7 @@ function ResultSetPane(props: any): React.JSX.Element {
349
354
) }
350
355
{ ! ! tab . messages ?. length && (
351
356
< div className = "mt-4 rounded-md border p-4" >
352
- { tab . messages . map ( ( message , i ) => {
357
+ { tab . messages . map ( ( message : string , i : number ) => {
353
358
return < p key = { i } > { message } </ p > ;
354
359
} ) }
355
360
</ div >
0 commit comments