6
6
ArrowRightToLine ,
7
7
CircleEllipsis ,
8
8
Database as DbIcon ,
9
+ Download ,
9
10
Loader ,
10
11
LogOut ,
11
12
PackagePlus ,
@@ -26,6 +27,7 @@ import { useDatabasesQuery } from '~/data/databases/databases-query'
26
27
import { useDeployWaitlistCreateMutation } from '~/data/deploy-waitlist/deploy-waitlist-create-mutation'
27
28
import { useIsOnDeployWaitlistQuery } from '~/data/deploy-waitlist/deploy-waitlist-query'
28
29
import { Database } from '~/lib/db'
30
+ import { downloadFile , titleToKebabCase } from '~/lib/util'
29
31
import { cn } from '~/lib/utils'
30
32
import { useApp } from './app-provider'
31
33
import { CodeBlock } from './code-block'
@@ -208,7 +210,7 @@ type DatabaseMenuItemProps = {
208
210
209
211
function DatabaseMenuItem ( { database, isActive } : DatabaseMenuItemProps ) {
210
212
const router = useRouter ( )
211
- const { user } = useApp ( )
213
+ const { user, dbManager } = useApp ( )
212
214
const [ isPopoverOpen , setIsPopoverOpen ] = useState ( false )
213
215
const { mutateAsync : deleteDatabase } = useDatabaseDeleteMutation ( )
214
216
const { mutateAsync : updateDatabase } = useDatabaseUpdateMutation ( )
@@ -364,6 +366,28 @@ function DatabaseMenuItem({ database, isActive }: DatabaseMenuItemProps) {
364
366
onClick = { async ( e ) => {
365
367
e . preventDefault ( )
366
368
369
+ if ( ! dbManager ) {
370
+ throw new Error ( 'dbManager is not available' )
371
+ }
372
+
373
+ const db = await dbManager . getDbInstance ( database . id )
374
+ const dumpBlob = await db . dumpDataDir ( )
375
+
376
+ const fileName = `${ titleToKebabCase ( database . name ?? 'My Database' ) } -${ Date . now ( ) } `
377
+ const file = new File ( [ dumpBlob ] , fileName , { type : dumpBlob . type } )
378
+
379
+ downloadFile ( file )
380
+ } }
381
+ >
382
+ < Download size = { 16 } strokeWidth = { 2 } className = "flex-shrink-0" />
383
+
384
+ < span > Download</ span >
385
+ </ Button >
386
+ < Button
387
+ className = "bg-inherit justify-start hover:bg-neutral-200 flex gap-3"
388
+ onClick = { async ( e ) => {
389
+ e . preventDefault ( )
390
+
367
391
setIsDeployDialogOpen ( true )
368
392
setIsPopoverOpen ( false )
369
393
} }
0 commit comments