Skip to content

Commit bf6c4ef

Browse files
chore: move state handling to usePlayground hook (#58)
Co-authored-by: Stephan Meijer <[email protected]>
1 parent 62325ff commit bf6c4ef

File tree

4 files changed

+57
-37
lines changed

4 files changed

+57
-37
lines changed

.lintstagedrc.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
module.exports = {
2-
'**/*.js': (files) => [`eslint --quiet --fix ${files.join(' ')}`,`jest --passWithNoTests`],
2+
'**/*.js': (files) => [
3+
`eslint --quiet --fix ${files.join(' ')}`,
4+
`jest --passWithNoTests`,
5+
],
36
'**/*.{md,js}': (files) => [`prettier --write ${files.join(' ')}`],
47
};

src/components/Embedded.js

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import React, { useState, useEffect } from 'react';
1+
import React, { useEffect } from 'react';
22
import { useLocation } from 'react-router-dom';
33
import queryString from 'query-string';
44

5+
import usePlayground from '../hooks/usePlayground';
56
import { initialValues } from '../constants';
6-
import parser from '../parser';
77
import state from '../lib/state';
88

9-
import { useAppContext } from './Context';
109
import Preview from './Preview';
1110
import Query from './Query';
1211
import Result from './Result';
@@ -23,9 +22,15 @@ const SUPPORTED_PANES = {
2322

2423
// TODO: we should support readonly mode
2524
function Embedded() {
26-
const [html, setHtml] = useState(savedState.markup || initialValues.html);
27-
const [js, setJs] = useState(savedState.query || initialValues.js);
28-
const { setParsed } = useAppContext();
25+
const [query, setQuery, markup, setMarkup, parsed] = usePlayground({
26+
initialMarkup: initialValues.html || savedState.markup,
27+
initialQuery: initialValues.js || savedState.js,
28+
});
29+
30+
useEffect(() => {
31+
state.save({ markup, query });
32+
state.updateTitle(parsed?.expression?.expression);
33+
}, [markup, query]);
2934

3035
const location = useLocation();
3136
const params = queryString.parse(location.search);
@@ -49,14 +54,6 @@ function Embedded() {
4954
? 'grid-cols-2'
5055
: 'grid-cols-1';
5156

52-
useEffect(() => {
53-
const parsed = parser.parse({ markup: html, query: js });
54-
setParsed(parsed);
55-
56-
state.save({ markup: html, query: js });
57-
state.updateTitle(parsed.expression?.expression);
58-
}, [html, js]);
59-
6057
useEffect(() => {
6158
document.body.classList.add('embedded');
6259
return () => document.body.classList.remove('embedded');
@@ -69,13 +66,19 @@ function Embedded() {
6966
{panes.map((area) => {
7067
switch (area) {
7168
case 'preview':
72-
return <Preview key={area} html={html} />;
69+
return <Preview key={area} html={markup} />;
7370
case 'markup':
7471
return (
75-
<MarkupEditor key={area} onChange={setHtml} initialValue={html} />
72+
<MarkupEditor
73+
key={area}
74+
onChange={setMarkup}
75+
initialValue={markup}
76+
/>
7677
);
7778
case 'query':
78-
return <Query key={area} initialValue={js} onChange={setJs} />;
79+
return (
80+
<Query key={area} initialValue={query} onChange={setQuery} />
81+
);
7982
case 'result':
8083
return <Result key={area} />;
8184
default:

src/components/Playground.js

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,44 @@
1-
import React, { useState, useEffect } from 'react';
2-
import parser from '../parser';
1+
import React, { useEffect } from 'react';
2+
3+
import usePlayground from '../hooks/usePlayground';
4+
import state from '../lib/state';
5+
import { initialValues } from '../constants';
36

4-
import { useAppContext } from './Context';
57
import Preview from './Preview';
68
import MarkupEditor from './MarkupEditor';
79
import Result from './Result';
8-
9-
import { initialValues } from '../constants';
10-
import state from '../lib/state';
1110
import Query from './Query';
1211

1312
const savedState = state.load();
1413

1514
function Playground() {
16-
const [html, setHtml] = useState(savedState.markup || initialValues.html);
17-
const [js, setJs] = useState(savedState.query || initialValues.js);
18-
19-
const { setParsed } = useAppContext();
15+
const [query, setQuery, markup, setMarkup, parsed] = usePlayground({
16+
initialMarkup: initialValues.html || savedState.markup,
17+
initialQuery: initialValues.js || savedState.js,
18+
});
2019

2120
useEffect(() => {
22-
const parsed = parser.parse({ markup: html, query: js });
23-
setParsed(parsed);
24-
25-
state.save({ markup: html, query: js });
26-
state.updateTitle(parsed.expression?.expression);
27-
}, [html, js]);
21+
state.save({ markup, query });
22+
state.updateTitle(parsed?.expression?.expression);
23+
}, [markup, query]);
2824

2925
return (
3026
<div className="flex flex-col h-auto md:h-full w-full">
3127
<div className="editor markup-editor gap-4 md:gap-8 md:h-56 flex-auto grid-cols-1 md:grid-cols-2">
3228
<div className="flex-auto relative h-56 md:h-full">
33-
<MarkupEditor onChange={setHtml} initialValue={html} />
29+
<MarkupEditor onChange={setMarkup} initialValue={markup} />
3430
</div>
3531

3632
<div className="flex-auto h-56 md:h-full">
37-
<Preview html={html} />
33+
<Preview html={markup} />
3834
</div>
3935
</div>
4036

4137
<div className="flex-none h-8" />
4238

4339
<div className="editor gap-4 md:gap-8 md:h-56 flex-auto grid-cols-1 md:grid-cols-2 overflow-hidden">
4440
<div className="flex-auto relative h-56 md:h-full">
45-
<Query onChange={setJs} initialValue={js} />
41+
<Query onChange={setQuery} initialValue={query} />
4642
</div>
4743

4844
<div className="flex-auto h-56 md:h-full overflow-hidden">

src/hooks/usePlayground.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { useEffect, useState } from 'react';
2+
import { useAppContext } from '../components/Context';
3+
import parser from '../parser';
4+
5+
function usePlayground({ initialMarkup, initialQuery }) {
6+
const [markup, setMarkup] = useState(initialMarkup);
7+
const [query, setQuery] = useState(initialQuery);
8+
const { setParsed } = useAppContext();
9+
10+
useEffect(() => {
11+
const parsed = parser.parse({ markup, query });
12+
setParsed(parsed);
13+
}, [markup, query]);
14+
15+
return [query, setQuery, markup, setMarkup];
16+
}
17+
18+
export default usePlayground;

0 commit comments

Comments
 (0)