feat: add download button
This commit is contained in:
parent
95154af074
commit
60c5345753
@ -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,
|
||||||
|
33
frontend/components/editor/navbar/downloadButton.tsx
Normal file
33
frontend/components/editor/navbar/downloadButton.tsx
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
@ -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 />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user