Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions frontend/src/pages/InboxPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useState } from "react"
import { useState, useCallback } from "react"
import { useNavigate } from "react-router"
import { useFrappeGetDocList } from "frappe-react-sdk"
import { HugeiconsIcon } from "@hugeicons/react"
Expand All @@ -18,6 +18,7 @@ import { UploadDialog } from "@/components/UploadDialog"
import { MoveAssetDialog } from "@/components/MoveAssetDialog"
import { DeleteAssetDialog } from "@/components/DeleteAssetDialog"
import { RenameAssetDialog } from "@/components/RenameAssetDialog"
import { MediaPlayerDialog } from "@/components/MediaPlayerDialog"
import { useDownload } from "@/hooks/useDownload"
import { UserAvatar } from "@/components/UserAvatar"
import type { VMSAsset } from "@/types"
Expand All @@ -35,6 +36,7 @@ export function InboxPage() {
const [moveOpen, setMoveOpen] = useState(false)
const [deleteOpen, setDeleteOpen] = useState(false)
const [renameOpen, setRenameOpen] = useState(false)
const [previewAsset, setPreviewAsset] = useState<VMSAsset | null>(null)
const [selected, setSelected] = useState<Set<string>>(new Set())
const [view, setView] = useState<"list" | "grid">("grid")
const { downloadOne, downloadMany, isDownloading } = useDownload()
Expand Down Expand Up @@ -90,6 +92,18 @@ export function InboxPage() {
mutate()
}

const handleAssetClick = useCallback(
(asset: VMSAsset) => {
if (asset.status !== "Ready") return
if (asset.file_type?.startsWith("video/")) {
navigate(`/review/${asset.name}`)
} else {
setPreviewAsset(asset)
}
},
[navigate],
)

const handleBulkDownload = () => {
if (!assets) return
const toDownload = assets.filter((a) => selected.has(a.name))
Expand Down Expand Up @@ -217,10 +231,7 @@ export function InboxPage() {
key={asset.name}
size="sm"
className="cursor-pointer transition-shadow hover:shadow-md"
onClick={() => {
if (asset.status === "Ready")
navigate(`/review/${asset.name}`)
}}
onClick={() => handleAssetClick(asset)}
>
<CardHeader>
<div className="flex items-center gap-3">
Expand Down Expand Up @@ -297,10 +308,7 @@ export function InboxPage() {
<Card
key={asset.name}
className="flex cursor-pointer flex-col overflow-hidden pt-0 transition-shadow hover:shadow-md"
onClick={() => {
if (asset.status === "Ready")
navigate(`/review/${asset.name}`)
}}
onClick={() => handleAssetClick(asset)}
>
<div className="aspect-video w-full bg-muted">
{asset.thumbnail_url ? (
Expand Down Expand Up @@ -407,6 +415,13 @@ export function InboxPage() {
) : null
})()}

<MediaPlayerDialog
open={!!previewAsset}
onOpenChange={(open) => { if (!open) setPreviewAsset(null) }}
assetName={previewAsset?.name ?? null}
fileName={previewAsset?.file_name}
fileType={previewAsset?.file_type}
/>
</div>
)
}
27 changes: 25 additions & 2 deletions frontend/src/pages/ProjectDetailPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { UploadDialog } from "@/components/UploadDialog"
import { DeleteAssetDialog } from "@/components/DeleteAssetDialog"
import { RenameAssetDialog } from "@/components/RenameAssetDialog"
import { MediaPlayerDialog } from "@/components/MediaPlayerDialog"
import { useDownload } from "@/hooks/useDownload"
import { UserAvatar } from "@/components/UserAvatar"
import { toast } from "sonner"
Expand All @@ -51,6 +52,7 @@ export function ProjectDetailPage() {
const [uploadOpen, setUploadOpen] = useState(false)
const [deleteOpen, setDeleteOpen] = useState(false)
const [renameOpen, setRenameOpen] = useState(false)
const [previewAsset, setPreviewAsset] = useState<VMSAsset | null>(null)
const [view, setView] = useState<"list" | "grid">("grid")
const [selected, setSelected] = useState<Set<string>>(new Set())
const { downloadOne, downloadMany, isDownloading } = useDownload()
Expand Down Expand Up @@ -134,6 +136,19 @@ export function ProjectDetailPage() {
downloadMany(toDownload)
}

const handleAssetClick = useCallback(
(assetName: string) => {
const asset = (assets ?? []).find((a) => a.name === assetName)
if (!asset || asset.status !== "Ready") return
if (asset.file_type?.startsWith("video/")) {
navigate(`/review/${assetName}`)
} else {
setPreviewAsset(asset)
}
},
[assets, navigate],
)

const handleDeleteComplete = () => {
setSelected(new Set())
mutateAssets()
Expand Down Expand Up @@ -259,7 +274,7 @@ export function ProjectDetailPage() {
toggleSelect={toggleSelect}
toggleSelectAll={() => toggleSelectAll(assetItems)}
downloadOne={downloadOne}
onPlay={(name) => navigate(`/review/${name}`)}
onPlay={handleAssetClick}
onTogglePublicReview={handleTogglePublicReview}
emptyMessage="No source or cut assets yet. Upload some files to get started."
/>
Expand All @@ -274,7 +289,7 @@ export function ProjectDetailPage() {
toggleSelect={toggleSelect}
toggleSelectAll={() => toggleSelectAll(exportItems)}
downloadOne={downloadOne}
onPlay={(name) => navigate(`/review/${name}`)}
onPlay={handleAssetClick}
onTogglePublicReview={handleTogglePublicReview}
emptyMessage="No review or final exports yet. Upload exports to share with your team."
/>
Expand Down Expand Up @@ -307,6 +322,14 @@ export function ProjectDetailPage() {
/>
) : null
})()}

<MediaPlayerDialog
open={!!previewAsset}
onOpenChange={(open) => { if (!open) setPreviewAsset(null) }}
assetName={previewAsset?.name ?? null}
fileName={previewAsset?.file_name}
fileType={previewAsset?.file_type}
/>
</div>
)
}
Expand Down
2 changes: 1 addition & 1 deletion vms/public/frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<link rel="icon" type="image/svg+xml" href="/assets/vms/frontend/vms-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BWH VMS</title>
<script type="module" crossorigin src="/assets/vms/frontend/assets/index-Du5eT9YR.js"></script>
<script type="module" crossorigin src="/assets/vms/frontend/assets/index-DHtWBIWK.js"></script>
<link rel="stylesheet" crossorigin href="/assets/vms/frontend/assets/index-VQ8vvVbA.css">
</head>
<body>
Expand Down
2 changes: 1 addition & 1 deletion vms/www/vms.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<link rel="icon" type="image/svg+xml" href="/assets/vms/frontend/vms-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BWH VMS</title>
<script type="module" crossorigin src="/assets/vms/frontend/assets/index-Du5eT9YR.js"></script>
<script type="module" crossorigin src="/assets/vms/frontend/assets/index-DHtWBIWK.js"></script>
<link rel="stylesheet" crossorigin href="/assets/vms/frontend/assets/index-VQ8vvVbA.css">
</head>
<body>
Expand Down
Loading