From 9077260a3e97cecd16e312971ec0d5d054c9ae04 Mon Sep 17 00:00:00 2001 From: Michael Fix Date: Wed, 6 Mar 2019 17:36:48 -0800 Subject: [PATCH] Read config from gist (optional) (#692) * read config from gist * Update api.js --- components/Editor.js | 132 ++++++++++++++++++++++--------------------- lib/api.js | 25 +++++++- 2 files changed, 91 insertions(+), 66 deletions(-) diff --git a/components/Editor.js b/components/Editor.js index b56b86f..cefd8e7 100644 --- a/components/Editor.js +++ b/components/Editor.js @@ -64,15 +64,21 @@ class Editor extends React.Component { const { query, pathname } = url.parse(asPath, true) const path = escapeHtml(pathname.split('/').pop()) const queryParams = getQueryStringState(query) - const initialState = Object.keys(queryParams).length ? queryParams : {} + let initialState = Object.keys(queryParams).length ? queryParams : {} try { // TODO fix this hack - if (this.context.gist && path.length >= 19 && path.indexOf('.') === -1) { - const { content, language } = await this.context.gist.get(path) + if (path.length >= 19 && path.indexOf('.') === -1 && this.context.gist) { + const { code, language, config } = await await this.context.gist.get(path) + + if (typeof config === 'object') { + initialState = config + } + if (language) { initialState.language = language.toLowerCase() } - initialState.code = content + + initialState.code = code } } catch (e) { // eslint-disable-next-line @@ -293,68 +299,66 @@ class Editor extends React.Component { const config = omit(this.state, ['code', 'aspectRatio']) return ( - <> -
- - - - - + + + + + +
+ + -
- - -
- - - - {({ canDrop }) => ( - + + + + {({ canDrop }) => ( + + {/*key ensures Carbon's internal language state is updated when it's changed by Dropdown*/} + - {/*key ensures Carbon's internal language state is updated when it's changed by Dropdown*/} - - {code != null ? code : DEFAULT_CODE} - - - )} - -
+ {code != null ? code : DEFAULT_CODE} + + + )} + - +
) } } diff --git a/lib/api.js b/lib/api.js index d836288..4e73a7d 100644 --- a/lib/api.js +++ b/lib/api.js @@ -40,12 +40,33 @@ function image(state) { return client.post('/image', { state }).then(res => res.data) } +// ~ makes the file come later alphabetically, which is how gists are sorted +const CARBON_STORAGE_KEY = '~carbon.json' function getGist(uid) { return gistClient .get(`/gists/${uid}`) .then(res => res.data) - .then(gist => gist.files) - .then(files => files[Object.keys(files)[0]]) + .then(({ owner, files }) => { + let config + if (files[CARBON_STORAGE_KEY]) { + try { + config = JSON.parse(files[CARBON_STORAGE_KEY].content) + } catch (error) { + // pass + } + } + + const otherFiles = Object.keys(files).filter(key => key !== CARBON_STORAGE_KEY) + + const snippet = files[otherFiles[0]] + + return { + code: snippet.content, + language: snippet.language, + owner, + config + } + }) } // private