Files
vigilcare-records/vigilcare-records-web/src/composables/usePresignedUrl.ts
T
Trent 5caf928787
CI / backend (push) Successful in 6m11s
CI / frontend (push) Failing after 1m7s
feature: Core Digitization Workstation (Entry, Verification, Approval)
2026-08-12 04:22:25 +08:00

65 lines
1.6 KiB
TypeScript

import { ref, watch, onUnmounted, type Ref } from 'vue'
import { getBlob } from '../api/client'
import { useBatchStore } from '../stores/batches'
export function usePresignedUrl(batchId: Ref<string | undefined>) {
const batchStore = useBatchStore()
const documentUrl = ref<string | null>(null)
const documentError = ref<string | null>(null)
const documentLoading = ref(false)
let currentBlobUrl: string | null = null
function revokeBlobUrl(): void {
if (currentBlobUrl) {
URL.revokeObjectURL(currentBlobUrl)
currentBlobUrl = null
}
}
async function refreshUrl(): Promise<void> {
revokeBlobUrl()
documentUrl.value = null
documentError.value = null
if (!batchId.value) {
documentLoading.value = false
return
}
documentLoading.value = true
try {
await batchStore.getBatch(batchId.value)
const blob = await getBlob(`digitization-batches/${batchId.value}/document`)
if (!blob.size) {
throw new Error('Document is empty')
}
currentBlobUrl = URL.createObjectURL(blob)
documentUrl.value = currentBlobUrl
} catch (e: unknown) {
documentError.value = e instanceof Error ? e.message : 'Failed to load document'
} finally {
documentLoading.value = false
}
}
watch(
batchId,
async (id) => {
if (id) {
await refreshUrl()
} else {
revokeBlobUrl()
documentUrl.value = null
documentError.value = null
documentLoading.value = false
}
},
{ immediate: true }
)
onUnmounted(revokeBlobUrl)
return { documentUrl, documentError, documentLoading, refreshUrl }
}