48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import { useState, useCallback } from 'react';
|
|
|
|
export function useExport() {
|
|
const [exporting, setExporting] = useState(false);
|
|
const [progress, setProgress] = useState(0);
|
|
const [exportUrl, setExportUrl] = useState(null);
|
|
const [error, setError] = useState(null);
|
|
|
|
const exportDesign = useCallback(async (elements, designName = 'design', template = null) => {
|
|
setExporting(true); setProgress(0); setError(null); setExportUrl(null);
|
|
|
|
try {
|
|
const progressInterval = setInterval(() => { setProgress((prev) => Math.min(prev + 10, 90)); }, 200);
|
|
|
|
const response = await fetch('/api/export', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ elements, designName, template }),
|
|
});
|
|
|
|
clearInterval(progressInterval);
|
|
setProgress(100);
|
|
|
|
if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Export failed'); }
|
|
|
|
const data = await response.json();
|
|
setExportUrl(data.export.url);
|
|
|
|
const link = document.createElement('a');
|
|
link.href = data.export.url;
|
|
link.download = data.export.filename;
|
|
link.click();
|
|
|
|
setExporting(false);
|
|
return data;
|
|
} catch (err) {
|
|
console.error('Export failed:', err);
|
|
setError(err.message);
|
|
setExporting(false);
|
|
throw err;
|
|
}
|
|
}, []);
|
|
|
|
const clearExport = useCallback(() => { setExportUrl(null); setError(null); }, []);
|
|
|
|
return { exporting, progress, exportUrl, error, exportDesign, clearExport };
|
|
}
|