garage-erp/apps/dashboard/shared/hooks/use-document-print.ts
2026-04-15 04:59:05 +03:00

60 lines
1.7 KiB
TypeScript

"use client"
import { useState } from "react"
import { useAuthApi } from "../useApi"
import { toast } from "sonner"
import type { DocumentPrintMode, DocumentPrintType } from "@garage/api"
interface UseDocumentPrintOptions {
onSuccess?: (blob: Blob) => void
onError?: (error: Error) => void
}
export function useDocumentPrint(options?: UseDocumentPrintOptions) {
const api = useAuthApi()
const [isPrinting, setIsPrinting] = useState(false)
const print = async (
type: DocumentPrintType,
id: string | number,
mode: DocumentPrintMode = "print",
filename?: string,
) => {
setIsPrinting(true)
try {
const blob = await api.documentPrint.print(type, id, mode)
const url = URL.createObjectURL(blob)
if (mode === "print") {
const win = window.open(url, "_blank")
if (win) {
win.addEventListener("load", () => {
win.print()
URL.revokeObjectURL(url)
})
} else {
URL.revokeObjectURL(url)
}
} else {
const a = document.createElement("a")
a.href = url
a.download = filename ?? `${type}-${id}.pdf`
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
URL.revokeObjectURL(url)
}
options?.onSuccess?.(blob)
} catch (error) {
toast.error("Failed to print document")
options?.onError?.(error as Error)
} finally {
setIsPrinting(false)
}
}
return { print, isPrinting }
}