Use HashRouter, add NavbarContext
This commit is contained in:
Generated
+10
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
+42
-12
@@ -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 (
|
||||||
|
<NavbarContext.Provider value={{ fileId, setFileId }}>
|
||||||
<div class="app">
|
<div class="app">
|
||||||
<div class="navbar">
|
<div class="navbar">
|
||||||
<Show when={currentFile() !== null}>
|
<Show when={fileId() !== null}>
|
||||||
<button onclick={() => setCurrentFile(null)}>Back</button>
|
<button onclick={() => navigate('/')}>Back</button>
|
||||||
</Show>
|
</Show>
|
||||||
<div class="title">{currentFile() ?? 'Choose a file'}</div>
|
<div class="title">{fileId() ?? 'Choose a file'}</div>
|
||||||
</div>
|
</div>
|
||||||
<Show
|
{props.children}
|
||||||
when={currentFile()}
|
|
||||||
fallback={<Chooser file={currentFile} setFile={setCurrentFile} />}
|
|
||||||
>
|
|
||||||
<Editor file={currentFile()!} />
|
|
||||||
</Show>
|
|
||||||
</div>
|
</div>
|
||||||
|
</NavbarContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function App() {
|
||||||
|
return (
|
||||||
|
<HashRouter root={Layout}>
|
||||||
|
<Route path="" component={Chooser} />
|
||||||
|
<Route path="doc/:id" component={Editor} />
|
||||||
|
</HashRouter>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user