42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
// React component for download button
|
|
import { Button } from "@/components/ui/button"
|
|
import { useSocket } from "@/context/SocketContext"
|
|
import { Download } from "lucide-react"
|
|
|
|
export default function DownloadButton({ name }: { name: string }) {
|
|
const { socket } = useSocket()
|
|
|
|
const handleDownload = async () => {
|
|
socket?.emit(
|
|
"downloadFiles",
|
|
{ timestamp: Date.now() },
|
|
async (response: { zipBlob: string }) => {
|
|
const { zipBlob } = response
|
|
|
|
// Decode Base64 back to binary data
|
|
const binary = atob(zipBlob)
|
|
const bytes = new Uint8Array(binary.length)
|
|
for (let i = 0; i < binary.length; i++) {
|
|
bytes[i] = binary.charCodeAt(i)
|
|
}
|
|
const blob = new Blob([bytes], { type: "application/zip" })
|
|
|
|
// Create URL and download
|
|
const url = window.URL.createObjectURL(blob)
|
|
const a = document.createElement("a")
|
|
a.href = url
|
|
a.download = `${name}.zip`
|
|
a.click()
|
|
window.URL.revokeObjectURL(url)
|
|
}
|
|
)
|
|
}
|
|
|
|
return (
|
|
<Button variant="outline" onClick={handleDownload}>
|
|
<Download className="w-4 h-4 mr-2" />
|
|
Download
|
|
</Button>
|
|
)
|
|
}
|