export const downloadFile = async ( response, defaultFilename = 'download', defaultExtension = 'bin', ) => { try { if (response.status < 200 || response.status >= 300) { throw new Error(`HTTP error ${response.status}`); } if (defaultExtension !== 'csv' && !(response.data instanceof Blob)) { throw new Error('Неверный формат ответа'); } const blob = response.data; const contentType = response.headers['content-type'] || ''; // Функция для определения расширения по Content-Type const getExtensionFromContentType = (type) => { const typeMap = { zip: ['application/zip', 'application/x-zip-compressed'], xlsx: [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ], xls: ['application/vnd.ms-excel'], csv: ['text/csv', 'text/comma-separated-values'], pdf: ['application/pdf'], docx: [ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', ], doc: ['application/msword'], json: ['application/json'], txt: ['text/plain'], xml: ['application/xml', 'text/xml'], }; for (const [ext, types] of Object.entries(typeMap)) { if (types.some((t) => type.includes(t))) { return ext; } } return null; }; const date = new Date().toISOString().split('T')[0]; const ext = getExtensionFromContentType(contentType) || defaultExtension; const filename = `${defaultFilename}_${date}.${ext}`; // Создаем URL для blob с правильным типом const blobWithType = new Blob([blob], { type: contentType || blob.type || 'application/octet-stream', }); const url = window.URL.createObjectURL(blobWithType); // Создаем и кликаем по ссылке const link = document.createElement('a'); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); setTimeout(() => { document.body.removeChild(link); window.URL.revokeObjectURL(url); }, 100); return true; } catch (error) { console.error('Error downloading file:', error); throw error; } };