@@ -6,14 +6,13 @@ import {
6
6
Portal ,
7
7
Stack ,
8
8
} from '@chakra-ui/react'
9
+ import { useClearTableMutation , useDeleteRowMutation } from '@renderer/hooks/useTableMutations'
9
10
import { useCurrentDatabaseSelection , useCurrentDeviceSelection , useTableData } from '@renderer/store'
10
11
import { useRowEditingStore } from '@renderer/store/useRowEditingStore'
11
12
import { useColorMode } from '@renderer/ui/color-mode'
12
- import { toaster } from '@renderer/ui/toaster'
13
- import { buildUniqueCondition } from '@renderer/utils'
14
- import { useQueryClient } from '@tanstack/react-query'
15
13
import { useCallback , useState } from 'react'
16
14
import { LuX } from 'react-icons/lu'
15
+ import { ClearTableDialog } from './ClearTableDialog'
17
16
import { DeleteRowDialog } from './DeleteRowDialog'
18
17
import { FieldItem } from './Field'
19
18
import { RowEditor } from './RowEditor'
@@ -24,117 +23,65 @@ export function SidePanel() {
24
23
const { selectedRow, setSelectedRow } = useRowEditingStore ( )
25
24
const isOpen = ! ! selectedRow
26
25
const { selectedDevice, selectedApplication } = useCurrentDeviceSelection ( )
27
- const { selectedDatabaseFile, selectedDatabaseTable, pulledDatabaseFilePath } = useCurrentDatabaseSelection ( )
26
+ const { selectedDatabaseFile, selectedDatabaseTable } = useCurrentDatabaseSelection ( )
28
27
const tableData = useTableData ( state => state . tableData )
29
- const setTableData = useTableData ( state => state . setTableData )
30
- const queryClient = useQueryClient ( )
31
28
const [ isLoading , setIsLoading ] = useState ( false )
32
29
const [ isEditing , setIsEditing ] = useState ( false )
33
30
const [ editedData , setEditedData ] = useState < Record < string , any > > ( { } )
34
31
const [ isDeleteDialogOpen , setIsDeleteDialogOpen ] = useState ( false )
32
+ const [ isClearTableDialogOpen , setIsClearTableDialogOpen ] = useState ( false )
35
33
36
34
const closePanel = useCallback ( ( ) => {
37
35
setSelectedRow ( null )
38
36
setIsEditing ( false )
39
37
} , [ setSelectedRow ] )
40
38
41
- const handleDeleteRow = useCallback ( async ( ) => {
42
- if ( ! selectedRow || ! selectedDatabaseTable )
43
- return
39
+ const clearTableMutation = useClearTableMutation ( )
44
40
45
- try {
46
- const condition = buildUniqueCondition (
47
- tableData ?. columns ,
48
- selectedRow ?. originalData || selectedRow ?. rowData ,
49
- )
50
- const result = await window . api . deleteTableRow (
51
- selectedDatabaseTable ?. name || '' ,
52
- condition ,
53
- )
41
+ const handleClearTable = useCallback ( async ( ) => {
42
+ if ( ! selectedDatabaseTable )
43
+ return
54
44
55
- if ( ! result . success ) {
56
- throw new Error ( result . error || 'Failed to delete row' )
57
- }
45
+ await clearTableMutation . mutateAsync ( {
46
+ selectedDatabaseTable,
47
+ selectedDatabaseFile,
48
+ selectedDevice,
49
+ selectedApplication,
50
+ } )
58
51
59
- console . log ( 'Row deleted successfully:' , selectedDatabaseFile )
60
- // Push changes back to device if needed
61
- if (
62
- selectedDatabaseFile
63
- && selectedDevice
64
- && selectedDatabaseFile . packageName
65
- && selectedDatabaseFile . path // Ensure we have the local file path
66
- && ( selectedDatabaseFile ?. deviceType === 'android'
67
- || selectedDatabaseFile ?. deviceType === 'iphone'
68
- || selectedDatabaseFile ?. deviceType === 'iphone-device'
69
- || selectedDatabaseFile ?. deviceType === 'simulator' )
70
- ) {
71
- // Use the correct paths: local temp file and remote path on device
72
- const localPath = selectedDatabaseFile . path // This is the local temp file path
73
- const remotePath = selectedDatabaseFile . remotePath || `/${ selectedDatabaseFile . location } /${ selectedDatabaseFile . filename } `
74
-
75
- console . log ( 'Pushing database file:' , {
76
- deviceId : selectedDevice . id ,
77
- localPath,
78
- packageName : selectedDatabaseFile . packageName ,
79
- remotePath,
80
- deviceType : selectedDatabaseFile . deviceType ,
81
- } )
82
-
83
- await window . api . pushDatabaseFile (
84
- selectedDevice . id ,
85
- localPath ,
86
- selectedDatabaseFile . packageName ,
87
- remotePath ,
88
- selectedDatabaseFile . deviceType ,
89
- )
90
-
91
- // Invalidate and refetch database files to get updated data
92
- await queryClient . invalidateQueries ( {
93
- queryKey : [ 'databaseFiles' , selectedDevice . id , selectedApplication ?. bundleId ] ,
94
- } )
95
- }
52
+ setIsClearTableDialogOpen ( false )
53
+ } , [
54
+ selectedDatabaseTable ,
55
+ selectedDatabaseFile ,
56
+ selectedDevice ,
57
+ selectedApplication ,
58
+ clearTableMutation ,
59
+ ] )
96
60
97
- setIsDeleteDialogOpen ( false )
61
+ const deleteRowMutation = useDeleteRowMutation ( )
98
62
99
- // Show success message
100
- toaster . create ( {
101
- title : 'Row deleted' ,
102
- description : 'The row has been successfully deleted' ,
103
- type : 'success' ,
104
- duration : 3000 ,
105
- } )
63
+ const handleDeleteRow = useCallback ( async ( ) => {
64
+ if ( ! selectedRow || ! selectedDatabaseTable )
65
+ return
106
66
107
- // Close the panel
108
- closePanel ( )
67
+ await deleteRowMutation . mutateAsync ( {
68
+ selectedRow,
69
+ selectedDatabaseTable,
70
+ selectedDatabaseFile,
71
+ selectedDevice,
72
+ selectedApplication,
73
+ tableColumns : tableData ?. columns ,
74
+ } )
109
75
110
- // Refresh table data to reflect deletion
111
- if ( selectedDatabaseTable ?. name ) {
112
- const response = await window . api . getTableInfo ( selectedDatabaseTable . name )
113
- if ( response . success && response . columns && response . rows ) {
114
- setTableData ( {
115
- columns : response . columns ,
116
- rows : response . rows ,
117
- } )
118
- }
119
- }
120
- }
121
- catch ( error ) {
122
- console . error ( 'Error deleting row:' , error )
123
- toaster . create ( {
124
- title : 'Delete failed' ,
125
- description : error instanceof Error ? error . message : 'Failed to delete row' ,
126
- type : 'error' ,
127
- duration : 5000 ,
128
- } )
129
- }
76
+ setIsDeleteDialogOpen ( false )
130
77
} , [
131
78
selectedRow ,
132
79
selectedDatabaseTable ,
133
- tableData ?. columns ,
134
80
selectedDatabaseFile ,
135
81
selectedDevice ,
136
- pulledDatabaseFilePath ,
137
- closePanel ,
82
+ selectedApplication ,
83
+ tableData ?. columns ,
84
+ deleteRowMutation ,
138
85
] )
139
86
140
87
return (
@@ -202,17 +149,36 @@ export function SidePanel() {
202
149
size = "md"
203
150
width = "full"
204
151
mt = { 8 }
205
- mb = { 4 }
152
+ mb = { 2 }
206
153
_hover = { { bg : 'red.50' , _dark : { bg : 'red.900' } } }
207
154
>
208
155
Remove Row
209
156
</ Button >
157
+ < Button
158
+ colorScheme = "orange"
159
+ variant = "outline"
160
+ onClick = { ( ) => {
161
+ setIsClearTableDialogOpen ( true )
162
+ } }
163
+ size = "md"
164
+ width = "full"
165
+ mb = { 4 }
166
+ _hover = { { bg : 'orange.50' , _dark : { bg : 'orange.900' } } }
167
+ >
168
+ Clear Whole Table
169
+ </ Button >
210
170
< DeleteRowDialog
211
171
isOpen = { isDeleteDialogOpen }
212
172
onClose = { ( ) => setIsDeleteDialogOpen ( false ) }
213
173
onDelete = { handleDeleteRow }
214
174
isLoading = { isLoading }
215
175
/>
176
+ < ClearTableDialog
177
+ isOpen = { isClearTableDialogOpen }
178
+ onClose = { ( ) => setIsClearTableDialogOpen ( false ) }
179
+ onClear = { handleClearTable }
180
+ isLoading = { isLoading }
181
+ />
216
182
</ Stack >
217
183
) }
218
184
</ Drawer . Body >
0 commit comments