Use HashRouter, add NavbarContext

This commit is contained in:
2025-08-30 11:15:18 -07:00
parent d1574d60da
commit 097d06e53b
5 changed files with 82 additions and 32 deletions
+10
View File
@@ -9,6 +9,7 @@
"version": "0.1.0", "version": "0.1.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@solidjs/router": "^0.15.3",
"codemirror": "^6.0.2", "codemirror": "^6.0.2",
"idb": "^8.0.3", "idb": "^8.0.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
@@ -1177,6 +1178,15 @@
"win32" "win32"
] ]
}, },
"node_modules/@solidjs/router": {
"version": "0.15.3",
"resolved": "https://registry.npmjs.org/@solidjs/router/-/router-0.15.3.tgz",
"integrity": "sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==",
"license": "MIT",
"peerDependencies": {
"solid-js": "^1.8.6"
}
},
"node_modules/@types/babel__core": { "node_modules/@types/babel__core": {
"version": "7.20.5", "version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+1
View File
@@ -21,6 +21,7 @@
"vite-plugin-solid": "^2.10.2" "vite-plugin-solid": "^2.10.2"
}, },
"dependencies": { "dependencies": {
"@solidjs/router": "^0.15.3",
"codemirror": "^6.0.2", "codemirror": "^6.0.2",
"idb": "^8.0.3", "idb": "^8.0.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
+46 -16
View File
@@ -1,25 +1,55 @@
import { createSignal, Show } from 'solid-js'; import {
createContext,
createSignal,
Show,
useContext,
type Accessor,
type Setter,
} from 'solid-js';
import Chooser from './Chooser'; import Chooser from './Chooser';
import Editor from './Editor'; import Editor from './Editor';
import { HashRouter, Route, useNavigate } from '@solidjs/router';
function App() { interface NavbarProps {
const [currentFile, setCurrentFile] = createSignal<string | null>(null); fileId: Accessor<string | null>;
setFileId: Setter<string | null>;
}
const NavbarContext = createContext<NavbarProps>();
export function useNavbar(): NavbarProps {
const result = useContext(NavbarContext);
if (!result) {
throw new Error('NavbarContext not set');
}
return result;
}
function Layout(props: any) {
const navigate = useNavigate();
const [fileId, setFileId] = createSignal<string | null>(null);
return ( return (
<div class="app"> <NavbarContext.Provider value={{ fileId, setFileId }}>
<div class="navbar"> <div class="app">
<Show when={currentFile() !== null}> <div class="navbar">
<button onclick={() => setCurrentFile(null)}>Back</button> <Show when={fileId() !== null}>
</Show> <button onclick={() => navigate('/')}>Back</button>
<div class="title">{currentFile() ?? 'Choose a file'}</div> </Show>
<div class="title">{fileId() ?? 'Choose a file'}</div>
</div>
{props.children}
</div> </div>
<Show </NavbarContext.Provider>
when={currentFile()} );
fallback={<Chooser file={currentFile} setFile={setCurrentFile} />} }
>
<Editor file={currentFile()!} /> function App() {
</Show> return (
</div> <HashRouter root={Layout}>
<Route path="" component={Chooser} />
<Route path="doc/:id" component={Editor} />
</HashRouter>
); );
} }
+9 -8
View File
@@ -1,21 +1,22 @@
import { For, type Accessor, type Setter } from 'solid-js'; import { For, onMount } from 'solid-js';
import './Chooser.css'; import './Chooser.css';
import { useNavbar } from './App';
import { useNavigate } from '@solidjs/router';
interface ChooserProps { function Chooser() {
file: Accessor<string | null>; const navigate = useNavigate();
setFile: Setter<string | null>; const { setFileId } = useNavbar();
} onMount(() => setFileId(null));
function Chooser(props: ChooserProps) {
const files = ['foo', 'bar', 'baz']; const files = ['foo', 'bar', 'baz'];
return ( return (
<> <>
<For each={files}> <For each={files}>
{(availableFile) => ( {(availableFile) => (
<button class="file" onclick={() => props.setFile(availableFile)}> <button class="file" onclick={() => navigate(`doc/${availableFile}`)}>
{availableFile} {availableFile}
{availableFile === props.file() ? '(*)' : ''} {/* {availableFile === props.file() ? '(*)' : ''} */}
</button> </button>
)} )}
</For> </For>
+16 -8
View File
@@ -6,19 +6,27 @@ import {
syntaxHighlighting, syntaxHighlighting,
} from '@codemirror/language'; } from '@codemirror/language';
import { yCollab } from 'y-codemirror.next'; import { yCollab } from 'y-codemirror.next';
import { createEffect, createResource, onCleanup, Show } from 'solid-js'; import {
createEffect,
createResource,
onCleanup,
onMount,
Show,
} from 'solid-js';
import { LocalDocument } from '../sync'; import { LocalDocument } from '../sync';
import { useNavbar } from './App';
import { useParams } from '@solidjs/router';
interface EditorProps { function Editor() {
file: string; const { id: fileId } = useParams();
} const { setFileId } = useNavbar();
onMount(() => {
setFileId(fileId);
});
function Editor(props: EditorProps) {
let editorDiv; let editorDiv;
let editorView: EditorView; let editorView: EditorView;
const [syncedDoc] = createResource(async () => const [syncedDoc] = createResource(async () => LocalDocument.load(fileId));
LocalDocument.load(props.file)
);
createEffect(() => { createEffect(() => {
const doc = syncedDoc(); const doc = syncedDoc();