Skip to content

Commit 2acbe51

Browse files
committed
legacy build
fixes
1 parent 0a55525 commit 2acbe51

File tree

6 files changed

+63
-452
lines changed

6 files changed

+63
-452
lines changed

packages/playground/src/app.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import { eventBus, setEventBus } from './utils/serviceWorker';
44
import { Update } from './components/update';
55
import { useZoom } from 'solid-repl/src/hooks/useZoom';
66
import { Edit } from './pages/edit';
7-
import { Home } from './pages/home';
8-
import { Login } from './pages/login';
97
import { AppContextProvider } from './context';
108

119
export const App = (): JSX.Element => {
@@ -38,10 +36,7 @@ export const App = (): JSX.Element => {
3836
</AppContextProvider>
3937
)}
4038
>
41-
<Route path={['/:user/:repl', '/scratchpad']} component={Edit} />
42-
<Route path="/:user" component={Home} />
43-
<Route path="/" component={Home} />
44-
<Route path="/login" component={Login} />
39+
<Route path={['/:user/:repl', '/']} component={Edit} />
4540
</Router>
4641

4742
<Show when={eventBus()} children={<Update onDismiss={() => setEventBus(false)} />} />

packages/playground/src/components/header.tsx

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { onCleanup, createSignal, Show, ParentComponent } from 'solid-js';
66
import { share, link, arrowDownTray, xCircle, bars_3, moon, sun } from 'solid-heroicons/outline';
77
import { exportToZip } from '../utils/exportFiles';
88
import { ZoomDropdown } from './zoomDropdown';
9-
import { API, useAppContext } from '../context';
9+
import { useAppContext } from '../context';
1010

1111
import logo from '../assets/logo.svg?url';
1212

@@ -18,9 +18,7 @@ export const Header: ParentComponent<{
1818
const [copy, setCopy] = createSignal(false);
1919
const context = useAppContext()!;
2020
const [showMenu, setShowMenu] = createSignal(false);
21-
const [showProfile, setShowProfile] = createSignal(false);
2221
let menuBtnEl!: HTMLButtonElement;
23-
let profileBtn!: HTMLButtonElement;
2422

2523
function shareLink() {
2624
props.share().then((url) => {
@@ -149,37 +147,6 @@ export const Header: ParentComponent<{
149147
</Show>
150148
<span class="sr-only">Show menu</span>
151149
</button>
152-
<div class="relative h-8 cursor-pointer leading-snug">
153-
<Show
154-
when={context.user()?.avatar}
155-
fallback={
156-
<a
157-
class="bg-solid-default mx-1 rounded px-3 py-2 text-lg text-slate-50"
158-
href={`${API}/auth/login?redirect=${window.location.origin}/login?auth=success`}
159-
rel="external"
160-
>
161-
Login
162-
</a>
163-
}
164-
>
165-
<button ref={profileBtn}>
166-
<img crossOrigin="anonymous" src={context.user()?.avatar} class="h-8 w-8 rounded-full" />
167-
</button>
168-
<Dismiss menuButton={() => profileBtn} open={showProfile} setOpen={setShowProfile}>
169-
<div class="dark:bg-solid-darkbg absolute right-0 flex flex-col items-center justify-center bg-white shadow-md">
170-
<a class="px-2 py-2 hover:bg-gray-300 dark:hover:bg-gray-800" href="/">
171-
{context.user()?.display}
172-
</a>
173-
<button
174-
onClick={() => (context.token = '')}
175-
class="w-full px-2 py-2 text-left text-xs hover:bg-gray-300 dark:hover:bg-gray-800"
176-
>
177-
Sign Out
178-
</button>
179-
</div>
180-
</Dismiss>
181-
</Show>
182-
</div>
183150
</header>
184151
);
185152
};

packages/playground/src/context.tsx

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import { Accessor, createContext, createResource, createSignal, ParentComponent, Resource, useContext } from 'solid-js';
1+
import { Accessor, createContext, createSignal, ParentComponent, useContext } from 'solid-js';
22
import type { Tab } from 'solid-repl';
33
import { isDarkTheme } from './utils/isDarkTheme';
44

55
interface AppContextType {
6-
token: string;
7-
user: Resource<{ display: string; avatar: string } | undefined>;
86
tabs: Accessor<Tab[] | undefined>;
97
setTabs: (x: Accessor<Tab[] | undefined> | undefined) => void;
108
dark: Accessor<boolean>;
@@ -18,40 +16,13 @@ const AppContext = createContext<AppContextType>();
1816
export const API = 'https://api.solidjs.com';
1917

2018
export const AppContextProvider: ParentComponent = (props) => {
21-
const [token, setToken] = createSignal(localStorage.getItem('token') || '');
22-
const [user] = createResource(token, async (token) => {
23-
if (!token)
24-
return {
25-
display: '',
26-
avatar: '',
27-
};
28-
const result = await fetch(`${API}/profile`, {
29-
headers: {
30-
authorization: `Bearer ${token}`,
31-
},
32-
});
33-
const body = await result.json();
34-
return {
35-
display: body.display,
36-
avatar: body.avatar,
37-
};
38-
});
39-
4019
const [dark, setDark] = createSignal(isDarkTheme());
4120
document.body.classList.toggle('dark', dark());
4221

4322
let [tabsGetter, setTabs] = createSignal<Accessor<Tab[] | undefined>>();
4423
return (
4524
<AppContext.Provider
4625
value={{
47-
get token() {
48-
return token();
49-
},
50-
set token(x) {
51-
setToken(x);
52-
localStorage.setItem('token', x);
53-
},
54-
user,
5526
tabs() {
5627
const tabs = tabsGetter();
5728
if (!tabs) return undefined;

packages/playground/src/pages/edit.tsx

Lines changed: 60 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,29 @@ import FormatterWorker from 'solid-repl/repl/formatter?worker';
77
import LinterWorker from 'solid-repl/repl/linter?worker';
88
import onigasm from 'onigasm/lib/onigasm.wasm?url';
99
import { batch, createResource, createSignal, lazy, onCleanup, Show, Suspense } from 'solid-js';
10-
import { useMatch, useNavigate, useParams, useSearchParams } from '@solidjs/router';
10+
import { useNavigate, useParams, useSearchParams } from '@solidjs/router';
1111
import { API, useAppContext } from '../context';
1212
import { debounce } from '@solid-primitives/scheduled';
1313
import { defaultTabs } from 'solid-repl/src';
1414
import type { Tab } from 'solid-repl';
15-
import type { APIRepl } from './home';
1615
import { Header } from '../components/header';
1716

17+
export interface ReplFile {
18+
name: string;
19+
content: string;
20+
}
21+
export interface APIRepl {
22+
id: string;
23+
title: string;
24+
labels: string[];
25+
files: ReplFile[];
26+
version: string;
27+
public: boolean;
28+
size: number;
29+
created_at: string;
30+
updated_at?: string;
31+
}
32+
1833
const Repl = lazy(() => import('../components/setupSolid'));
1934

2035
window.MonacoEnvironment = {
@@ -40,7 +55,6 @@ interface InternalTab extends Tab {
4055
}
4156
export const Edit = () => {
4257
const [searchParams] = useSearchParams();
43-
const scratchpad = useMatch(() => '/scratchpad');
4458
const compiler = new CompilerWorker();
4559
const formatter = new FormatterWorker();
4660
const linter = new LinterWorker();
@@ -51,8 +65,6 @@ export const Edit = () => {
5165

5266
let disableFetch: true | undefined;
5367

54-
let readonly = () => !scratchpad() && context.user()?.display != params.user && !localStorage.getItem(params.repl);
55-
5668
const mapTabs = (toMap: (Tab | InternalTab)[]): InternalTab[] =>
5769
toMap.map((tab) => {
5870
if ('_source' in tab) return tab;
@@ -82,16 +94,19 @@ export const Edit = () => {
8294
onCleanup(() => context.setTabs(undefined));
8395

8496
const [current, setCurrent] = createSignal<string | undefined>(undefined, { equals: false });
85-
const [resource, { mutate }] = createResource<APIRepl, { repl: string; scratchpad: boolean }>(
86-
() => ({ repl: params.repl, scratchpad: !!scratchpad() }),
87-
async ({ repl, scratchpad }): Promise<APIRepl> => {
97+
const [resource, { mutate }] = createResource<APIRepl, { repl: string }>(
98+
() => ({ repl: params.repl }),
99+
async ({ repl }): Promise<APIRepl> => {
88100
if (disableFetch) {
89101
disableFetch = undefined;
90102
if (resource.latest) return resource.latest;
91103
}
92104

93105
let output: APIRepl;
94-
if (scratchpad) {
106+
107+
if (repl) {
108+
output = await fetch(`${API}/repl/${repl}`).then((r) => r.json());
109+
} else {
95110
const myScratchpad = localStorage.getItem('scratchpad');
96111
if (!myScratchpad) {
97112
output = {
@@ -104,10 +119,6 @@ export const Edit = () => {
104119
} else {
105120
output = JSON.parse(myScratchpad);
106121
}
107-
} else {
108-
output = await fetch(`${API}/repl/${repl}`, {
109-
headers: { authorization: context.token ? `Bearer ${context.token}` : '' },
110-
}).then((r) => r.json());
111122
}
112123

113124
batch(() => {
@@ -129,109 +140,51 @@ export const Edit = () => {
129140
setCurrent(defaultTabs[0].name);
130141
});
131142
};
143+
const updateRepl = debounce(() => {
144+
const files = tabs().map((x) => ({ name: x.name, content: x.source }));
132145

133-
const updateRepl = debounce(
134-
() => {
135-
const files = tabs().map((x) => ({ name: x.name, content: x.source }));
136-
137-
if (readonly()) {
138-
localStorage.setItem('scratchpad', JSON.stringify({ files }));
139-
disableFetch = true;
140-
navigate('/scratchpad');
141-
return;
142-
} else if (scratchpad()) {
143-
localStorage.setItem('scratchpad', JSON.stringify({ files }));
144-
}
145-
146-
const repl = resource.latest;
147-
if (!repl) return;
148-
149-
if ((context.token && context.user()?.display == params.user) || localStorage.getItem(params.repl)) {
150-
fetch(`${API}/repl/${params.repl}`, {
151-
method: 'PUT',
152-
headers: {
153-
'authorization': context.token ? `Bearer ${context.token}` : '',
154-
'Content-Type': 'application/json',
155-
},
156-
body: JSON.stringify({
157-
...(localStorage.getItem(params.repl) ? { write_token: localStorage.getItem(params.repl) } : {}),
158-
title: repl.title,
159-
version: repl.version,
160-
public: repl.public,
161-
labels: repl.labels,
162-
files,
163-
}),
164-
});
165-
}
166-
},
167-
!!scratchpad() ? 10 : 1000,
168-
);
169-
146+
localStorage.setItem('scratchpad', JSON.stringify({ files }));
147+
}, 10);
170148
return (
171149
<>
172150
<Header
173151
compiler={compiler}
174152
fork={() => {}}
175153
share={async () => {
176-
if (scratchpad()) {
177-
const newRepl = {
178-
title: context.user()?.display ? `${context.user()!.display}'s Scratchpad` : 'Anonymous Scratchpad',
179-
public: true,
180-
labels: [],
181-
version: '1.0',
182-
files: tabs().map((x) => ({ name: x.name, content: x.source })),
183-
};
184-
const response = await fetch(`${API}/repl`, {
185-
method: 'POST',
186-
headers: {
187-
'authorization': context.token ? `Bearer ${context.token}` : '',
188-
'Content-Type': 'application/json',
189-
},
190-
body: JSON.stringify(newRepl),
191-
});
192-
if (response.status >= 400) {
193-
throw new Error(response.statusText);
194-
}
195-
const { id, write_token } = await response.json();
196-
if (write_token) {
197-
localStorage.setItem(id, write_token);
198-
const repls = localStorage.getItem('repls');
199-
if (repls) {
200-
localStorage.setItem('repls', JSON.stringify([...JSON.parse(repls), id]));
201-
} else {
202-
localStorage.setItem('repls', JSON.stringify([id]));
203-
}
204-
}
205-
mutate(() => ({
206-
id,
207-
title: newRepl.title,
208-
labels: newRepl.labels,
209-
files: newRepl.files,
210-
version: newRepl.version,
211-
public: newRepl.public,
212-
size: 0,
213-
created_at: '',
214-
}));
215-
const url = `/${context.user()?.display || 'anonymous'}/${id}`;
216-
disableFetch = true;
217-
navigate(url);
218-
return `${window.location.origin}${url}`;
219-
} else {
220-
return location.href;
154+
const newRepl = {
155+
title: 'Anonymous Scratchpad',
156+
public: true,
157+
labels: [],
158+
version: '1.0',
159+
files: tabs().map((x) => ({ name: x.name, content: x.source })),
160+
};
161+
const response = await fetch(`${API}/repl`, {
162+
method: 'POST',
163+
headers: {
164+
'Content-Type': 'application/json',
165+
},
166+
body: JSON.stringify(newRepl),
167+
});
168+
if (response.status >= 400) {
169+
throw new Error(response.statusText);
221170
}
171+
const { id } = await response.json();
172+
mutate(() => ({
173+
id,
174+
title: newRepl.title,
175+
labels: newRepl.labels,
176+
files: newRepl.files,
177+
version: newRepl.version,
178+
public: newRepl.public,
179+
size: 0,
180+
created_at: '',
181+
}));
182+
const url = `/anonymous/${id}`;
183+
disableFetch = true;
184+
navigate(url);
185+
return `${window.location.origin}${url}`;
222186
}}
223-
>
224-
{resource()?.title && (
225-
<input
226-
class="w-96 shrink rounded border border-solid border-transparent bg-transparent px-3 py-1.5 transition focus:border-blue-600 focus:outline-none"
227-
value={resource()?.title}
228-
onChange={(e) => {
229-
mutate((x) => x && { ...x, title: e.currentTarget.value });
230-
updateRepl();
231-
}}
232-
/>
233-
)}
234-
</Header>
187+
/>
235188
<Suspense
236189
fallback={
237190
<svg

0 commit comments

Comments
 (0)