import { ref } from 'vue' import { ElMessage } from 'element-plus' import { guardRequestWithMessage } from '@/utils/sys/requestGuard' import { $t } from '@/locales' export function usePrintExportPage({ downloadFileName, requestExport, resolvePrintRecords, buildPreviewRows, buildPreviewMeta, timeoutMs }) { const previewVisible = ref(false) const previewRows = ref([]) const previewMeta = ref({}) const previewToken = ref(0) const activePrintToken = ref(0) const handlePreviewVisibleChange = (visible) => { previewVisible.value = Boolean(visible) if (!visible) { activePrintToken.value = 0 } } const handleExport = async (payload) => { try { const response = await guardRequestWithMessage(requestExport(payload), null, { timeoutMs, timeoutMessage: $t('message.exportTimeoutStopped') }) if (!response) { return } if (!response.ok) { throw new Error($t('crud.messages.exportFailedWithStatus', { status: response.status })) } const blob = await response.blob() const downloadUrl = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = downloadUrl link.download = downloadFileName document.body.appendChild(link) link.click() link.remove() window.URL.revokeObjectURL(downloadUrl) ElMessage.success($t('crud.messages.exportSuccess')) } catch (error) { ElMessage.error(error?.message || $t('crud.messages.exportFailed')) } } const handlePrint = async (payload) => { const token = previewToken.value + 1 previewToken.value = token activePrintToken.value = token previewVisible.value = false previewRows.value = [] previewMeta.value = {} try { const records = await guardRequestWithMessage(resolvePrintRecords(payload), null, { timeoutMs, timeoutMessage: $t('message.printTimeoutStopped') }) if (activePrintToken.value !== token) { return } if (!records) { return } const rows = buildPreviewRows(records) previewRows.value = rows previewMeta.value = buildPreviewMeta(rows) handlePreviewVisibleChange(true) } catch (error) { if (activePrintToken.value !== token) { return } ElMessage.error(error?.message || $t('crud.messages.printFailed')) } } return { previewVisible, previewRows, previewMeta, handlePreviewVisibleChange, handleExport, handlePrint } }