-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Send downloaded mp4 as a streaming response instead of a file * Add download button to UI * Formatting * Fix CSS and text Co-authored-by: Josh Hawkins <[email protected]> * download video button component * use download button component in review detail dialog * better filename --------- Co-authored-by: Josh Hawkins <[email protected]>
- Loading branch information
1 parent
dd7a07b
commit 887433f
Showing
3 changed files
with
152 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
import { useState } from "react"; | ||
import { Button } from "@/components/ui/button"; | ||
import { toast } from "sonner"; | ||
import ActivityIndicator from "../indicators/activity-indicator"; | ||
import { FaDownload } from "react-icons/fa"; | ||
import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; | ||
|
||
type DownloadVideoButtonProps = { | ||
source: string; | ||
camera: string; | ||
startTime: number; | ||
}; | ||
|
||
export function DownloadVideoButton({ | ||
source, | ||
camera, | ||
startTime, | ||
}: DownloadVideoButtonProps) { | ||
const [isDownloading, setIsDownloading] = useState(false); | ||
|
||
const handleDownload = async () => { | ||
setIsDownloading(true); | ||
const formattedDate = formatUnixTimestampToDateTime(startTime, { | ||
strftime_fmt: "%D-%T", | ||
time_style: "medium", | ||
date_style: "medium", | ||
}); | ||
const filename = `${camera}_${formattedDate}.mp4`; | ||
|
||
try { | ||
const response = await fetch(source); | ||
const blob = await response.blob(); | ||
const url = window.URL.createObjectURL(blob); | ||
const a = document.createElement("a"); | ||
a.style.display = "none"; | ||
a.href = url; | ||
a.download = filename; | ||
document.body.appendChild(a); | ||
a.click(); | ||
window.URL.revokeObjectURL(url); | ||
toast.success( | ||
"Your review item video has been downloaded successfully.", | ||
{ | ||
position: "top-center", | ||
}, | ||
); | ||
} catch (error) { | ||
toast.error( | ||
"There was an error downloading the review item video. Please try again.", | ||
{ | ||
position: "top-center", | ||
}, | ||
); | ||
} finally { | ||
setIsDownloading(false); | ||
} | ||
}; | ||
|
||
return ( | ||
<div className="flex justify-center"> | ||
<Button | ||
onClick={handleDownload} | ||
disabled={isDownloading} | ||
className="flex items-center gap-2" | ||
size="sm" | ||
> | ||
{isDownloading ? ( | ||
<ActivityIndicator className="h-4 w-4" /> | ||
) : ( | ||
<FaDownload className="h-4 w-4" /> | ||
)} | ||
</Button> | ||
</div> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters