diff --git a/packages/insomnia-app/app/ui/components/viewers/response-cookies-viewer.js b/packages/insomnia-app/app/ui/components/viewers/response-cookies-viewer.js
index 75323e002f..741418614a 100644
--- a/packages/insomnia-app/app/ui/components/viewers/response-cookies-viewer.js
+++ b/packages/insomnia-app/app/ui/components/viewers/response-cookies-viewer.js
@@ -51,7 +51,7 @@ class ResponseCookiesViewer extends PureComponent {
)}
-
+
| Name |
diff --git a/packages/insomnia-app/app/ui/components/viewers/response-csv-viewer.js b/packages/insomnia-app/app/ui/components/viewers/response-csv-viewer.js
new file mode 100644
index 0000000000..b57c5cb2c4
--- /dev/null
+++ b/packages/insomnia-app/app/ui/components/viewers/response-csv-viewer.js
@@ -0,0 +1,69 @@
+// @flow
+import * as React from 'react';
+import Papa from 'papaparse';
+import autobind from 'autobind-decorator';
+
+type Props = {
+ body: Buffer
+};
+
+type State = {
+ result: null | {data: Array>}
+};
+
+@autobind
+class ResponseCSVViewer extends React.PureComponent {
+ currentHash: string;
+
+ constructor (props: Props) {
+ super(props);
+ this.state = {
+ result: null
+ };
+ this.currentHash = '';
+ }
+
+ update (body: Buffer) {
+ const csv = body.toString('utf8');
+
+ Papa.parse(csv, {
+ skipEmptyLines: true,
+ complete: result => {
+ this.setState({result});
+ }
+ });
+ }
+
+ componentDidMount () {
+ this.update(this.props.body);
+ }
+
+ componentWillUpdate (nextProps: Props, nextState: State) {
+ if (this.props.body === nextProps.body) {
+ return;
+ }
+
+ this.update(nextProps.body);
+ }
+
+ render () {
+ const {result} = this.state;
+ if (!result) {
+ return 'Parsing CSV...';
+ }
+
+ return (
+
+
+
+ {result.data.map(row => (
+ {row.map(c => | {c} | )}
+ ))}
+
+
+
+ );
+ }
+}
+
+export default ResponseCSVViewer;
diff --git a/packages/insomnia-app/app/ui/components/viewers/response-headers-viewer.js b/packages/insomnia-app/app/ui/components/viewers/response-headers-viewer.js
index 22fdb79e37..0bad1cfffd 100644
--- a/packages/insomnia-app/app/ui/components/viewers/response-headers-viewer.js
+++ b/packages/insomnia-app/app/ui/components/viewers/response-headers-viewer.js
@@ -14,7 +14,7 @@ class ResponseHeadersViewer extends React.PureComponent {
const headersString = headers.map(h => `${h.name}: ${h.value}`).join('\n');
return [
-
+
| Name |
diff --git a/packages/insomnia-app/app/ui/components/pdf-viewer.js b/packages/insomnia-app/app/ui/components/viewers/response-pdf-viewer.js
similarity index 96%
rename from packages/insomnia-app/app/ui/components/pdf-viewer.js
rename to packages/insomnia-app/app/ui/components/viewers/response-pdf-viewer.js
index 817856fa2a..a1bc434d50 100644
--- a/packages/insomnia-app/app/ui/components/pdf-viewer.js
+++ b/packages/insomnia-app/app/ui/components/viewers/response-pdf-viewer.js
@@ -13,7 +13,7 @@ type State = {
};
@autobind
-class PDFViewer extends React.PureComponent {
+class ResponsePDFViewer extends React.PureComponent {
container: ?HTMLDivElement;
debounceTimeout: any;
@@ -109,4 +109,4 @@ class PDFViewer extends React.PureComponent {
}
}
-export default PDFViewer;
+export default ResponsePDFViewer;
diff --git a/packages/insomnia-app/app/ui/components/viewers/response-viewer.js b/packages/insomnia-app/app/ui/components/viewers/response-viewer.js
index 341b26a07d..99fe5e1aac 100644
--- a/packages/insomnia-app/app/ui/components/viewers/response-viewer.js
+++ b/packages/insomnia-app/app/ui/components/viewers/response-viewer.js
@@ -3,7 +3,8 @@ import * as React from 'react';
import iconv from 'iconv-lite';
import autobind from 'autobind-decorator';
import {shell} from 'electron';
-import PDFViewer from '../pdf-viewer';
+import PDFViewer from './response-pdf-viewer';
+import CSVViewer from './response-csv-viewer';
import CodeEditor from '../codemirror/code-editor';
import ResponseWebView from './response-webview';
import MultipartViewer from './response-multipart';
@@ -279,6 +280,12 @@ class ResponseViewer extends React.Component {
);
+ } else if (previewMode === PREVIEW_MODE_FRIENDLY && ct.indexOf('text/csv') === 0) {
+ return (
+
+
+
+ );
} else if (previewMode === PREVIEW_MODE_FRIENDLY && ct.indexOf('multipart/') === 0) {
return (