feat: add download button

This commit is contained in:
omar rashed 2024-10-31 10:27:23 +03:00 committed by James Murdza
parent 95154af074
commit 60c5345753
3 changed files with 50 additions and 1 deletions

View File

@ -15,7 +15,7 @@ import { SecureGitClient } from "./SecureGitClient"
import { TerminalManager } from "./TerminalManager" import { TerminalManager } from "./TerminalManager"
import { TFile, TFolder } from "./types" import { TFile, TFolder } from "./types"
import { LockManager } from "./utils" import { LockManager } from "./utils"
import { TFileData } from "./types"
const lockManager = new LockManager() const lockManager = new LockManager()
// Define a type for SocketHandler functions // Define a type for SocketHandler functions
@ -218,9 +218,23 @@ export class Sandbox {
return this.aiWorker.generateCode(connection.userId, fileName, code, line, instructions) return this.aiWorker.generateCode(connection.userId, fileName, code, line, instructions)
} }
// Handle downloading files by download button
const handleDownloadFiles: SocketHandler = async () => {
if (!this.fileManager) throw Error("No file manager")
// Get all files with their data through fileManager
const files = this.fileManager.fileData.map((file: TFileData) => ({
path: file.id.startsWith('/') ? file.id.slice(1) : file.id,
content: file.data
}))
return { files }
}
return { return {
"heartbeat": handleHeartbeat, "heartbeat": handleHeartbeat,
"getFile": handleGetFile, "getFile": handleGetFile,
"downloadFiles": handleDownloadFiles,
"getFolder": handleGetFolder, "getFolder": handleGetFolder,
"saveFile": handleSaveFile, "saveFile": handleSaveFile,
"moveFile": handleMoveFile, "moveFile": handleMoveFile,

View File

@ -0,0 +1,33 @@
import JSZip from 'jszip'
import { useSocket } from "@/context/SocketContext"
import { Button } from "@/components/ui/button"
import { Download } from "lucide-react"
export default function DownloadButton() {
const { socket } = useSocket()
const handleDownload = async () => {
socket?.emit("downloadFiles", {}, async (response: {files: {path: string, content: string}[]}) => {
const zip = new JSZip()
response.files.forEach(file => {
zip.file(file.path, file.content)
})
const blob = await zip.generateAsync({type: "blob"})
const url = window.URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = 'sandbox-files.zip'
a.click()
window.URL.revokeObjectURL(url)
})
}
return (
<Button variant="outline" onClick={handleDownload}>
<Download className="w-4 h-4 mr-2" />
Download
</Button>
)
}

View File

@ -14,6 +14,7 @@ import DeployButtonModal from "./deploy"
import EditSandboxModal from "./edit" import EditSandboxModal from "./edit"
import RunButtonModal from "./run" import RunButtonModal from "./run"
import ShareSandboxModal from "./share" import ShareSandboxModal from "./share"
import DownloadButton from "./downloadButton"
export default function Navbar({ export default function Navbar({
userData, userData,
@ -78,6 +79,7 @@ export default function Navbar({
<Users className="w-4 h-4 mr-2" /> <Users className="w-4 h-4 mr-2" />
Share Share
</Button> </Button>
<DownloadButton />
</> </>
) : null} ) : null}
<ThemeSwitcher /> <ThemeSwitcher />