matrix-art

An image gallery for Matrix
git clone git://archive.git.mtrnord.blog/MTRNord/matrix-art.git
Log | Files | Refs | README | LICENSE

commit 301c65e417a12605ee2be8da7ac935c6da8b4699
parent 52283c2e11203ffcc94f900624dc6873811fe73d
Author: MTRNord <mtrnord1@gmail.com>
Date:   Tue, 19 Apr 2022 19:50:16 +0200

Move to react-router to make it easier to set the basepath

Diffstat:
Mindex.html | 1+
Mpackage-lock.json | 178++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Mpackage.json | 4++--
Msrc/app.tsx | 42++++++++++++++++++++++--------------------
Msrc/components/header.tsx | 8++++----
Asrc/components/hookHelpers.tsx | 10++++++++++
Msrc/main.tsx | 10++++++++--
Msrc/pages/Join.tsx | 20+++++++++++++-------
8 files changed, 204 insertions(+), 69 deletions(-)

diff --git a/index.html b/index.html @@ -14,6 +14,7 @@ </head> <body> + <noscript>You need to enable JavaScript to run this app.</noscript> <div id="app"></div> <script type="module" src="/src/main.tsx"></script> </body> diff --git a/package-lock.json b/package-lock.json @@ -14,10 +14,9 @@ "inquirer": "^8.2.2", "matrix-events-sdk": "^0.0.1-beta.7", "matrix-js-sdk": "^16.0.1", - "photoswipe": "^5.2.2", "preact": "^10.5.15", - "preact-router": "^4.0.1", - "react-plock": "^1.2.0" + "react-plock": "^1.2.0", + "react-router-dom": "^6.3.0" }, "devDependencies": { "@preact/preset-vite": "^2.1.5", @@ -2754,6 +2753,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -3068,8 +3075,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -3301,6 +3307,18 @@ "url": "https://tidelift.com/funding/github/npm/loglevel" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3770,14 +3788,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "node_modules/photoswipe": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.2.2.tgz", - "integrity": "sha512-es0AEX4zgzzcrr8ztdPWRODSARCLqCm/5H/aSwFtZwovokGtzBf/y/HXJxHMnNx6h4650DkKVIVFYILXJhmMhw==", - "engines": { - "node": ">= 0.12.0" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3924,14 +3934,6 @@ "url": "https://opencollective.com/preact" } }, - "node_modules/preact-router": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-4.0.1.tgz", - "integrity": "sha512-xPyHVLouc5oKIlKu9iEElplNygJYkOn/vfXfZhcoOFqzfAZHZMmT3FsQb0yyPkdt1rwTLFAxek6/5CFkofocSQ==", - "peerDependencies": { - "preact": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4000,11 +4002,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/react": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.0.0.tgz", + "integrity": "sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.0.0.tgz", + "integrity": "sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/react-plock": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/react-plock/-/react-plock-1.2.0.tgz", "integrity": "sha512-bBlyAj8LM/1DSSl98yQ+7QN2xjs/JZ8QOlvF93Jbs/Yys6tMzSFf+oLE/R/iReL9N0acgAI/0MFdmjC0Vke1Nw==" }, + "node_modules/react-router": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "dependencies": { + "history": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "dependencies": { + "history": "^5.2.0", + "react-router": "6.3.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -4294,6 +4345,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -6789,6 +6849,14 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "requires": { + "@babel/runtime": "^7.7.6" + } + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -7015,8 +7083,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.1.0", @@ -7189,6 +7256,15 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7539,11 +7615,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "photoswipe": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.2.2.tgz", - "integrity": "sha512-es0AEX4zgzzcrr8ztdPWRODSARCLqCm/5H/aSwFtZwovokGtzBf/y/HXJxHMnNx6h4650DkKVIVFYILXJhmMhw==" - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -7622,12 +7693,6 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.0.tgz", "integrity": "sha512-9MEURwzNMKpAil/t6+wabDIJI6oG6GnwypYxiJDvQnW+fHDTt51PYuLZ1QUM31hFr7sDaj9qTaShAF9VIxuxGQ==" }, - "preact-router": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-4.0.1.tgz", - "integrity": "sha512-xPyHVLouc5oKIlKu9iEElplNygJYkOn/vfXfZhcoOFqzfAZHZMmT3FsQb0yyPkdt1rwTLFAxek6/5CFkofocSQ==", - "requires": {} - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7664,11 +7729,47 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, + "react": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.0.0.tgz", + "integrity": "sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.0.0.tgz", + "integrity": "sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + } + }, "react-plock": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/react-plock/-/react-plock-1.2.0.tgz", "integrity": "sha512-bBlyAj8LM/1DSSl98yQ+7QN2xjs/JZ8QOlvF93Jbs/Yys6tMzSFf+oLE/R/iReL9N0acgAI/0MFdmjC0Vke1Nw==" }, + "react-router": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "requires": { + "history": "^5.2.0" + } + }, + "react-router-dom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "requires": { + "history": "^5.2.0", + "react-router": "6.3.0" + } + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -7881,6 +7982,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", diff --git a/package.json b/package.json @@ -16,8 +16,8 @@ "matrix-events-sdk": "^0.0.1-beta.7", "matrix-js-sdk": "^16.0.1", "preact": "^10.5.15", - "preact-router": "^4.0.1", - "react-plock": "^1.2.0" + "react-plock": "^1.2.0", + "react-router-dom": "^6.3.0" }, "devDependencies": { "@preact/preset-vite": "^2.1.5", diff --git a/src/app.tsx b/src/app.tsx @@ -1,4 +1,3 @@ -import Router from 'preact-router'; import { lazy, PureComponent, Suspense } from 'preact/compat'; import { Home } from './pages/Home'; import { Client } from './context'; @@ -10,6 +9,7 @@ import { MatrixClient } from './matrix/client'; import olmWasmPath from "@matrix-org/olm/olm.wasm?url"; import OlmLegacy from '@matrix-org/olm/olm_legacy.js?url'; import Olm from '@matrix-org/olm'; +import { Route, Routes } from 'react-router-dom'; const Join = lazy(() => import("./pages/Join")); @@ -73,26 +73,28 @@ export class App extends PureComponent<any, State> { render() { return ( - <Suspense fallback={ - <div class="flex flex-col"> - <header> - <Header /> - </header> - <main class="m-12 mt-6 flex items-center justify-center"> - <p class="text-lg text-data font-bold">Loading...</p> - </main> - </div> - }> - <Client.Provider value={ - this.state.client - }> - <Router> - <Home path={`${import.meta.env.BASE_URL}/`} /> - <Join path={`${import.meta.env.BASE_URL}/join`} /> - </Router> - </Client.Provider> - </Suspense> + <Client.Provider value={ + this.state.client + }> + <Routes> + <Route path="/" element={<Home />} /> + <Route path="join" element={ + <Suspense fallback={ + <div class="flex flex-col"> + <header> + <Header /> + </header> + <main class="m-12 mt-6 flex items-center justify-center"> + <p class="text-lg text-data font-bold">Loading...</p> + </main> + </div> + }> + <Join /> + </Suspense> + } /> + </Routes> + </Client.Provider> ); } } \ No newline at end of file diff --git a/src/components/header.tsx b/src/components/header.tsx @@ -1,4 +1,4 @@ -import { Link } from "preact-router"; +import { Link } from "react-router-dom"; import { PureComponent } from "preact/compat"; import { Client } from "../context"; import { MatrixClient } from "../matrix/client"; @@ -8,7 +8,7 @@ export class Header extends PureComponent { const client: MatrixClient | undefined = this.context; return ( <div class="m-12 flex flex-col lg:flex-row items-center justify-between"> - <Link href="/"><img alt="Matrix Art" src="Logo_colored.svg" class="ease-in-out hover:scale-105 trandform transition-transform duration-300" /></Link> + <Link to="/"><img alt="Matrix Art" src="Logo_colored.svg" class="ease-in-out hover:scale-105 trandform transition-transform duration-300" /></Link> <div class="flex items-center mt-8 lg:mt-0 flex-col sm:flex-row"> <div class="flex items-center justify-between w-80 max-w-80 mx-6 ease-in-out hover:scale-105 trandform transition-transform duration-300"> <div class="absolute ml-4"> @@ -21,8 +21,8 @@ export class Header extends PureComponent { </div> { - !client?.isLoggedIn() ? <Link href={`${import.meta.env.BASE_URL}/join`} class="text-white font-bold text-1xl logo-bg rounded-2xl py-3 px-12 shadow mt-4 sm:mt-0 transform transition-transform ease-in-out duration-300 hover:scale-105">Join</Link> : - <Link class="text-white font-bold text-1xl logo-bg rounded-2xl py-3 px-12 shadow mt-4 sm:mt-0 transform transition-transform ease-in-out duration-300 hover:scale-105">Post</Link> + !client?.isLoggedIn() ? <Link to="/join" class="text-white font-bold text-1xl logo-bg rounded-2xl py-3 px-12 shadow mt-4 sm:mt-0 transform transition-transform ease-in-out duration-300 hover:scale-105">Join</Link> : + <Link to="/" class="text-white font-bold text-1xl logo-bg rounded-2xl py-3 px-12 shadow mt-4 sm:mt-0 transform transition-transform ease-in-out duration-300 hover:scale-105">Post</Link> } </div> diff --git a/src/components/hookHelpers.tsx b/src/components/hookHelpers.tsx @@ -0,0 +1,9 @@ +import { useNavigate } from "react-router-dom"; + +export const withNavigateHOC = (Component: any) => { + return (props: any) => { + const navigate = useNavigate(); + + return <Component navigate={navigate} {...props} />; + }; +}; +\ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx @@ -1,4 +1,5 @@ import { render } from 'preact'; +import { BrowserRouter } from 'react-router-dom'; import { App } from './app'; import './index.css'; @@ -10,4 +11,9 @@ if (import.meta.env.DEV) { import("preact/debug"); } -render(<App />, document.querySelector('#app')!); -\ No newline at end of file +render( + <BrowserRouter basename={`${import.meta.env.BASE_URL}`}> + <App /> + </BrowserRouter>, + document.querySelector('#app')! +); +\ No newline at end of file diff --git a/src/pages/Join.tsx b/src/pages/Join.tsx @@ -2,7 +2,12 @@ import { PureComponent } from "preact/compat"; import { Client } from "../context"; import { Header } from "../components/header"; import { MatrixClient } from "../matrix/client"; -import { route } from "preact-router"; +import { NavigateFunction } from "react-router-dom"; +import { withNavigateHOC } from "../components/hookHelpers"; + +type Props = { + navigate: NavigateFunction; +}; type State = { homeserver: string; @@ -15,9 +20,9 @@ type State = { const ACTIVE_TAB_CSS = "inline-block p-4 w-full text-gray-900 bg-gray-100 hover:ring-blue-300 hover:ring-1 focus:ring-transparent focus:outline-none dark:bg-gray-700 dark:text-white"; const TAB_CSS = "inline-block p-4 w-full bg-white hover:text-gray-700 hover:bg-gray-50 hover:ring-blue-300 hover:ring-1 focus:ring-transparent focus:outline-none dark:hover:text-white dark:bg-gray-800 dark:hover:bg-gray-700"; -export default class Join extends PureComponent<any, State> { - constructor() { - super(); +class Join extends PureComponent<Props, State> { + constructor(props: Props) { + super(props); this.state = { homeserver: "https://art.midnightthoughts.space", username: "", @@ -41,7 +46,7 @@ export default class Join extends PureComponent<any, State> { } else if (this.state.current_tab === "register" && !client.isLoggedIn()) { await client.register(this.state.homeserver, this.state.username, this.state.password, this.state.create_profile); } - route('/', true); + this.props.navigate('/', { replace: true }); } onInput(e: Event) { @@ -88,4 +93,5 @@ export default class Join extends PureComponent<any, State> { } -Join.contextType = Client; -\ No newline at end of file +Join.contextType = Client; +export default withNavigateHOC(Join); +\ No newline at end of file