From aa278fb193c42bfcb4aba64f05db14cf823749ad Mon Sep 17 00:00:00 2001 From: Jeff Avallone Date: Mon, 19 Feb 2018 17:29:08 -0500 Subject: [PATCH] Adding URL handling --- package.json | 1 + src/components/App/__snapshots__/test.js.snap | 1 - src/components/App/index.js | 49 +++++++++++++++++-- .../Form/__snapshots__/test.js.snap | 24 +++++++-- src/components/Form/index.js | 44 ++++++++++++++--- src/components/Form/test.js | 6 +-- yarn.lock | 4 ++ 7 files changed, 111 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 805d8bf..0fe670f 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,7 @@ "style-loader": "^0.20.1", "svg-react-loader": "^0.4.5", "uglifyjs-webpack-plugin": "^1.1.8", + "url-search-params": "^0.10.0", "webpack": "^3.10.0", "webpack-merge": "^4.1.1", "webpack-node-externals": "^1.6.0", diff --git a/src/components/App/__snapshots__/test.js.snap b/src/components/App/__snapshots__/test.js.snap index c75a758..4759227 100644 --- a/src/components/App/__snapshots__/test.js.snap +++ b/src/components/App/__snapshots__/test.js.snap @@ -5,7 +5,6 @@ exports[`App rendering 1`] = ` { + if (expr) { + const params = new URLSearchParams({ syntax, expr }); + document.location.hash = params.toString(); + } + } + + handleHashChange = () => { + const query = document.location.hash.slice(1); + const params = new URLSearchParams(query); + const { expr, syntax } = (() => { + if (params.get('syntax')) { + return { + syntax: params.get('syntax'), + expr: params.get('expr') + }; + } else { + // Assuming old-style URL + return { + syntax: 'js', + expr: query + }; + } + })(); + + if (!expr) { + return; + } + console.log(syntax, expr); // eslint-disable-line no-console this.setState({ - image: demoImage + image: demoImage, + permalinkUrl: document.location.toString(), + syntax, + expr }, async () => { await this.image.doReflow(); this.setSvgUrl(this.image.svg); @@ -81,7 +122,7 @@ class App extends React.PureComponent { imageRef = image => this.image = image render() { - const { svgUrl, pngUrl, syntaxes, image } = this.state; + const { svgUrl, pngUrl, permalinkUrl, syntax, expr, syntaxes, image } = this.state; const downloadUrls = [ svgUrl, pngUrl @@ -91,7 +132,9 @@ class App extends React.PureComponent {

Sample error message

diff --git a/src/components/Form/__snapshots__/test.js.snap b/src/components/Form/__snapshots__/test.js.snap index 96f31ec..23e9087 100644 --- a/src/components/Form/__snapshots__/test.js.snap +++ b/src/components/Form/__snapshots__/test.js.snap @@ -9,6 +9,8 @@ exports[`Form rendering 1`] = ` >
- { Object.keys(syntaxes).map(id => ( )) } @@ -83,6 +109,8 @@ class Form extends React.Component { } Form.propTypes = { + expr: PropTypes.string, + syntax: PropTypes.string, syntaxes: PropTypes.object, onSubmit: PropTypes.func, permalinkUrl: PropTypes.string, diff --git a/src/components/Form/test.js b/src/components/Form/test.js index 89f245b..dd7e82c 100644 --- a/src/components/Form/test.js +++ b/src/components/Form/test.js @@ -50,13 +50,13 @@ describe('Form', () => { const onSubmit = jest.fn(); const component = build({ onSubmit }); const eventObj = { preventDefault: jest.fn() }; - component.find(Form).instance().textarea.value = 'Test textarea value'; + component.find(Form).instance().setState({ syntax: 'test', expr: 'Test expression' }); component.find('form').simulate('submit', eventObj); expect(eventObj.preventDefault).toHaveBeenCalled(); expect(onSubmit).toHaveBeenCalledWith({ - expr: 'Test textarea value', - syntax: 'js' + expr: 'Test expression', + syntax: 'test' }); }); diff --git a/yarn.lock b/yarn.lock index 335ce2e..cd30ee4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8132,6 +8132,10 @@ url-regex@^3.0.0: dependencies: ip-regex "^1.0.1" +url-search-params@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/url-search-params/-/url-search-params-0.10.0.tgz#d428c1fa9d78d5c5a3feb634147873890f4adcf0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"