diff --git a/package-lock.json b/package-lock.json index bdf9458..7de8672 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "license": "ISC", "dependencies": { + "@solidjs/router": "^0.15.3", "codemirror": "^6.0.2", "idb": "^8.0.3", "lodash": "^4.17.21", @@ -1177,6 +1178,15 @@ "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": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", diff --git a/package.json b/package.json index f868602..dc8340a 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "vite-plugin-solid": "^2.10.2" }, "dependencies": { + "@solidjs/router": "^0.15.3", "codemirror": "^6.0.2", "idb": "^8.0.3", "lodash": "^4.17.21", diff --git a/src/components/App.tsx b/src/components/App.tsx index 37ab455..886b280 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -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 Editor from './Editor'; +import { HashRouter, Route, useNavigate } from '@solidjs/router'; -function App() { - const [currentFile, setCurrentFile] = createSignal(null); +interface NavbarProps { + fileId: Accessor; + setFileId: Setter; +} + +const NavbarContext = createContext(); + +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(null); return ( -
- + + ); +} + +function App() { + return ( + + + + ); } diff --git a/src/components/Chooser.tsx b/src/components/Chooser.tsx index cda9c00..8f3ebc2 100644 --- a/src/components/Chooser.tsx +++ b/src/components/Chooser.tsx @@ -1,21 +1,22 @@ -import { For, type Accessor, type Setter } from 'solid-js'; +import { For, onMount } from 'solid-js'; import './Chooser.css'; +import { useNavbar } from './App'; +import { useNavigate } from '@solidjs/router'; -interface ChooserProps { - file: Accessor; - setFile: Setter; -} +function Chooser() { + const navigate = useNavigate(); + const { setFileId } = useNavbar(); + onMount(() => setFileId(null)); -function Chooser(props: ChooserProps) { const files = ['foo', 'bar', 'baz']; return ( <> {(availableFile) => ( - )} diff --git a/src/components/Editor.tsx b/src/components/Editor.tsx index cf6a3a3..bb138a1 100644 --- a/src/components/Editor.tsx +++ b/src/components/Editor.tsx @@ -6,19 +6,27 @@ import { syntaxHighlighting, } from '@codemirror/language'; 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 { useNavbar } from './App'; +import { useParams } from '@solidjs/router'; -interface EditorProps { - file: string; -} +function Editor() { + const { id: fileId } = useParams(); + const { setFileId } = useNavbar(); + onMount(() => { + setFileId(fileId); + }); -function Editor(props: EditorProps) { let editorDiv; let editorView: EditorView; - const [syncedDoc] = createResource(async () => - LocalDocument.load(props.file) - ); + const [syncedDoc] = createResource(async () => LocalDocument.load(fileId)); createEffect(() => { const doc = syncedDoc();