Skip to content

Commit d48f47b

Browse files
committed
fix: Loading from ?code query, stale query closure
1 parent 7665714 commit d48f47b

3 files changed

Lines changed: 18 additions & 32 deletions

File tree

src/components/controllers/repl-page.jsx

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useLocation, useRoute } from 'preact-iso';
22
import { Repl } from './repl';
3-
import { useExample } from './repl/examples';
3+
import { fetchExample } from './repl/examples';
44
import { useContent, useResource } from '../../lib/use-resource';
55
import { useTitle, useDescription } from './utils';
66
import { useLanguage } from '../../lib/i18n';
@@ -15,7 +15,7 @@ export default function ReplPage() {
1515
useTitle(meta.title);
1616
useDescription(meta.description);
1717

18-
const [code] = initialCode(query);
18+
const code = useResource(() => getInitialCode(query), [query]);
1919

2020
return (
2121
<div class={style.repl}>
@@ -38,35 +38,31 @@ export default function ReplPage() {
3838
*
3939
* ?code -> ?example -> localStorage -> simple counter example
4040
*/
41-
function initialCode(query) {
41+
async function getInitialCode(query) {
4242
const { route } = useLocation();
43-
let code, slug;
43+
let code;
4444
if (query.code) {
45-
try {
46-
code = useResource(() => querySafetyCheck(atob(query.code)), [query.code]);
47-
} catch (e) {}
45+
code = querySafetyCheck(atob(query.code));
4846
} else if (query.example) {
49-
code = useExample([query.example]);
50-
if (code) {
51-
slug = query.example;
52-
route(`/repl?example=${encodeURIComponent(slug)}`, true);
47+
code = await fetchExample(query.example);
48+
if (!code) {
49+
route('/repl', true);
5350
}
54-
else route('/repl', true);
5551
}
5652

5753
if (!code) {
5854
if (typeof window !== 'undefined' && localStorage.getItem('preact-www-repl-code')) {
5955
code = localStorage.getItem('preact-www-repl-code');
6056
} else {
61-
slug = 'counter';
57+
const slug = 'counter';
6258
if (typeof window !== 'undefined') {
6359
route(`/repl?example=${encodeURIComponent(slug)}`, true);
6460
}
65-
code = useExample([slug]);
61+
code = await fetchExample(slug);
6662
}
6763
}
6864

69-
return [code, slug];
65+
return code;
7066
}
7167

7268
async function querySafetyCheck(code) {

src/components/controllers/repl/examples.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { useResource } from '../../../lib/use-resource';
2-
31
import simpleCounterExample from './examples/simple-counter.txt?url';
42
import counterWithHtmExample from './examples/counter-with-htm.txt?url';
53
import todoExample from './examples/todo-list.txt?url';
@@ -68,16 +66,8 @@ export function getExample(slug, list = EXAMPLES) {
6866
}
6967
}
7068

71-
/**
72-
* @param {[ slug: string ]} args
73-
* @returns {string | undefined}
74-
*/
75-
export function useExample([slug]) {
69+
export async function fetchExample(slug) {
7670
const example = getExample(slug);
7771
if (!example) return;
78-
return useResource(() => loadExample(example.url), ['example', slug]);
79-
}
80-
81-
export async function loadExample(exampleUrl) {
82-
return await fetch(exampleUrl).then(r => r.text());
72+
return await fetch(example.url).then(r => r.text());
8373
}

src/components/controllers/repl/index.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { useState } from 'preact/hooks';
1+
import { useState, useCallback } from 'preact/hooks';
22
import { useLocation, useRoute } from 'preact-iso';
33
import { Splitter } from '../../splitter';
44
import { ErrorOverlay } from './error-overlay';
5-
import { EXAMPLES, getExample, loadExample } from './examples';
5+
import { EXAMPLES, fetchExample } from './examples';
66
import { useStoredValue } from '../../../lib/localstorage';
77
import { useResource } from '../../../lib/use-resource';
88
import { parseStackTrace } from './errors';
@@ -33,22 +33,22 @@ export function Repl({ code }) {
3333
]).then(([CodeEditor, Runner]) => ({ CodeEditor: CodeEditor.default, Runner: Runner.default })), ['repl']);
3434

3535
const applyExample = (slug) => {
36-
loadExample(getExample(slug).url)
36+
fetchExample(slug)
3737
.then(code => {
3838
setEditorCode(code);
3939
route(`/repl?example=${encodeURIComponent(slug)}`, true);
4040
});
4141
};
4242

43-
const onEditorInput = (value) => {
43+
const onEditorInput = useCallback((value) => {
4444
setEditorCode(value);
4545

4646
// Clears the example & code query params when a user
4747
// begins to modify the code
4848
if (query.example || query.code) {
4949
route('/repl', true);
5050
}
51-
};
51+
}, [query]);
5252

5353
const share = () => {
5454
// No reason to share semi-sketchy btoa'd code if there's

0 commit comments

Comments
 (0)