From 3f3523b80f3131e1e0f7280755fec712c87a1516 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 14 Mar 2021 11:47:23 +0100 Subject: [PATCH] Extracted helper function to generate a Csv file --- src/servers/services/ServersExporter.ts | 28 ++----------------- src/utils/helpers/csv.ts | 12 ++++++++ test/servers/services/ServersExporter.test.ts | 19 ++----------- 3 files changed, 17 insertions(+), 42 deletions(-) create mode 100644 src/utils/helpers/csv.ts diff --git a/src/servers/services/ServersExporter.ts b/src/servers/services/ServersExporter.ts index 114275ae..fb68c8b9 100644 --- a/src/servers/services/ServersExporter.ts +++ b/src/servers/services/ServersExporter.ts @@ -2,30 +2,9 @@ import { dissoc, head, keys, values } from 'ramda'; import { CsvJson } from 'csvjson'; import LocalStorage from '../../utils/services/LocalStorage'; import { ServersMap } from '../data'; +import { saveCsv } from '../../utils/helpers/csv'; -const saveCsv = (window: Window, csv: string) => { - const { navigator, document } = window; - const filename = 'shlink-servers.csv'; - const blob = new Blob([ csv ], { type: 'text/csv;charset=utf-8;' }); - - // IE10 and IE11 - if (navigator.msSaveBlob) { - navigator.msSaveBlob(blob, filename); - - return; - } - - // Modern browsers - const link = document.createElement('a'); - const url = URL.createObjectURL(blob); - - link.setAttribute('href', url); - link.setAttribute('download', filename); - link.style.visibility = 'hidden'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); -}; +const SERVERS_FILENAME = 'shlink-servers.csv'; export default class ServersExporter { public constructor( @@ -42,10 +21,9 @@ export default class ServersExporter { headers: keys(head(servers)).join(','), }); - saveCsv(this.window, csv); + saveCsv(this.window, csv, SERVERS_FILENAME); } catch (e) { // FIXME Handle error - /* eslint no-console: "off" */ console.error(e); } }; diff --git a/src/utils/helpers/csv.ts b/src/utils/helpers/csv.ts new file mode 100644 index 00000000..08c895a0 --- /dev/null +++ b/src/utils/helpers/csv.ts @@ -0,0 +1,12 @@ +export const saveCsv = ({ document }: Window, csv: string, filename: string) => { + const link = document.createElement('a'); + const blob = new Blob([ csv ], { type: 'text/csv;charset=utf-8;' }); + const url = URL.createObjectURL(blob); + + link.setAttribute('href', url); + link.setAttribute('download', filename); + link.style.visibility = 'hidden'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +}; diff --git a/test/servers/services/ServersExporter.test.ts b/test/servers/services/ServersExporter.test.ts index 713c843f..a695373e 100644 --- a/test/servers/services/ServersExporter.test.ts +++ b/test/servers/services/ServersExporter.test.ts @@ -11,10 +11,7 @@ describe('ServersExporter', () => { }); const appendChild = jest.fn(); const removeChild = jest.fn(); - const createWindowMock = (isIe10 = true) => Mock.of({ - navigator: { - msSaveBlob: isIe10 ? jest.fn() : undefined, - }, + const createWindowMock = () => Mock.of({ document: { createElement: jest.fn(() => createLinkMock()), body: { appendChild, removeChild }, @@ -66,21 +63,9 @@ describe('ServersExporter', () => { expect(erroneousToCsv).toHaveBeenCalledTimes(1); }); - it('makes use of msSaveBlob API when available', () => { + it('makes use of download link API', () => { const windowMock = createWindowMock(); const exporter = new ServersExporter(storageMock, windowMock, createCsvjsonMock()); - const { navigator: { msSaveBlob }, document: { createElement } } = windowMock; - - exporter.exportServers(); - - expect(storageMock.get).toHaveBeenCalledTimes(1); - expect(msSaveBlob).toHaveBeenCalledTimes(1); - expect(createElement).not.toHaveBeenCalled(); - }); - - it('makes use of download link API when available', () => { - const windowMock = createWindowMock(false); - const exporter = new ServersExporter(storageMock, windowMock, createCsvjsonMock()); const { document: { createElement } } = windowMock; exporter.exportServers();