matrix-art

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

commit fb78a241871e4524db36e7d6c09852e822330551
parent bc3a849bd62ab0f2704c3536ef33eea2b19cac9a
Author: MTRNord <mtrnord1@gmail.com>
Date:   Sat,  5 Feb 2022 20:11:25 +0100

Fix matrix art going up in flames

Diffstat:
M.github/workflows/playwright.yml | 2+-
Mcomponents/FrontPageImage.tsx | 1-
De2e/auth.json | 43-------------------------------------------
Me2e/home.spec.ts | 5-----
Mhelpers/matrix_client.ts | 38+++++++++++++++++++++++++++-----------
Mhelpers/storage.ts | 10++++++++++
Mpages/index.tsx | 7++++++-
Mpages/post/[id].tsx | 33++++++++++++++++++++++-----------
Mpages/profile/[userid].tsx | 46+++++++++++++++++++++++++++-------------------
Mplaywright.config.ts | 5++---
10 files changed, 95 insertions(+), 95 deletions(-)

diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml @@ -50,7 +50,7 @@ jobs: - name: Install Playwright run: npx playwright install --with-deps && npx playwright install msedge - name: Run Playwright tests - run: (node --version && npx playwright --version) && npm run dev-tests & npx playwright test + run: npx playwright test - uses: actions/upload-artifact@82c141cc518b40d92cc801eee768e7aafc9c2fa2 # v2 if: always() with: diff --git a/components/FrontPageImage.tsx b/components/FrontPageImage.tsx @@ -40,7 +40,6 @@ export default class FrontPageImage extends PureComponent<Props, State> { componentDidUpdate(prevProps: Props, prevState: State) { if (this.state.error && this.state.error !== prevState.error) { - toast.dismiss(); toast(() => <div><h2 className="text-xl text-white">{i18n?.t("Error")}</h2><br />{this.state.error}</div>, { autoClose: false }); diff --git a/e2e/auth.json b/e2e/auth.json @@ -1,42 +0,0 @@ -{ - "cookies": [], - "origins": [ - { - "origin": "http://localhost:3000", - "localStorage": [ - { - "name": "mainaccessToken", - "value": "syt_bWF0cml4X2FydF9ndWVzdF8xNjQxMDQ3ODI1NDkz_sHzGkEbUPwgafJZCVqDE_2LrWnQ" - }, - { - "name": "mainserverName", - "value": "art.midnightthoughts.space" - }, - { - "name": "mainuserId", - "value": "@matrix_art_guest_1641047825493:art.midnightthoughts.space" - }, - { - "name": "mainserverUrl", - "value": "https://matrix.art.midnightthoughts.space/_matrix/client" - }, - { - "name": "guestaccessToken", - "value": "syt_bWF0cml4X2FydF9ndWVzdF8xNjQxMDQ3ODI1NDkz_sHzGkEbUPwgafJZCVqDE_2LrWnQ" - }, - { - "name": "guestserverName", - "value": "art.midnightthoughts.space" - }, - { - "name": "guestuserId", - "value": "@matrix_art_guest_1641047825493:art.midnightthoughts.space" - }, - { - "name": "guestserverUrl", - "value": "https://matrix.art.midnightthoughts.space/_matrix/client" - } - ] - } - ] -} -\ No newline at end of file diff --git a/e2e/home.spec.ts b/e2e/home.spec.ts @@ -1,11 +1,6 @@ import { test, expect } from '@playwright/test'; -test.use({ - storageState: 'e2e/auth.json' -}); - test('test navigation to details', async ({ page, baseURL }) => { - console.log(baseURL); page.on('console', msg => console.log(msg.text())); // Go to http://localhost:3000/ diff --git a/helpers/matrix_client.ts b/helpers/matrix_client.ts @@ -73,16 +73,22 @@ export default class MatrixClient { let username = "matrix_art_guest_" + Date.now(); let password = this.generateToken(32); - const data = await this.fetchJson(`${serverUrl}/r0/register?kind=guest`, { - method: "POST", - body: JSON.stringify({ - auth: { - type: "m.login.dummy", - }, - username: username, - password: password, - }), - }); + let data; + try { + data = await this.fetchJson(`${serverUrl}/r0/register?kind=guest`, { + method: "POST", + body: JSON.stringify({ + auth: { + type: "m.login.dummy", + }, + username: username, + password: password, + }), + }); + } catch (error) { + console.log(`${serverUrl}/r0/register?kind=guest`); + throw new Error("Failed to register new guest"); + } this.serverUrl = serverUrl; this._userId = data.user_id; this._accessToken = data.access_token; @@ -158,6 +164,7 @@ export default class MatrixClient { } async register(serverUrl: string, username: string, password: string) { + console.log(`${serverUrl}/r0/register`); const data = await this.fetchJson(`${serverUrl}/r0/register`, { method: "POST", body: JSON.stringify({ @@ -287,7 +294,16 @@ export default class MatrixClient { invite: 100, ban: 100, redact: 100, - } + }, + initial_state: [ + { + type: "m.room.guest_access", + content: { + guest_access: "can_join" + }, + state_key: "" + } + ] }), headers: { Authorization: `Bearer ${this.accessToken}`, diff --git a/helpers/storage.ts b/helpers/storage.ts @@ -1,3 +1,4 @@ +const STORAGE_VERSION = 2; export default class Storage { private prefix; private nodeLocalStorage?; @@ -15,6 +16,15 @@ export default class Storage { } this.nodeLocalStorage = new LocalStorage(dir); } + if (this.getItem("version") === undefined || this.getItem("version") !== STORAGE_VERSION.toString()) { + if (typeof window !== "undefined") { + window.localStorage.clear(); + window.localStorage.setItem("version", STORAGE_VERSION.toString()); + } else { + this.nodeLocalStorage?.clear(); + this.nodeLocalStorage?.setItem("version", STORAGE_VERSION.toString()); + } + } } getItem(key: string): any { if (typeof window !== "undefined") { diff --git a/pages/index.tsx b/pages/index.tsx @@ -152,7 +152,12 @@ export const getServerSideProps: GetServerSideProps = async ({ res, locale }) => // TODO fix this somehow. It is super inefficient. for (let user of data) { // We dont need many events - const roomId = await client?.followUser(user.public_user_room); + let roomId; + try { + roomId = await client?.followUser(user.public_user_room); + } catch { + console.error("Unbable to join room"); + } const events = await client?.getTimeline(roomId, 100); // Filter events by type let images = events.filter((event) => (event.type == "m.image_gallery" || event.type == "m.image") && !event.unsigned?.redacted_because) as MatrixImageEvents[]; diff --git a/pages/post/[id].tsx b/pages/post/[id].tsx @@ -65,21 +65,22 @@ class Post extends PureComponent<Props, State> { try { let serverUrl = constMatrixArtServer + "/_matrix/client"; await this.context.client?.registerAsGuest(serverUrl); - await this.context.guest_client?.registerAsGuest(serverUrl); } catch (error) { console.error("Failed to register as guest:", error); } } else { - if (!this.context.guest_client?.accessToken) { - try { - let serverUrl = constMatrixArtServer + "/_matrix/client"; - await this.context.guest_client?.registerAsGuest(serverUrl); - } catch (error) { - console.error("Failed to register as guest:", error); - } - } console.log("Already logged in"); } + if (!this.context.guest_client?.accessToken) { + try { + let serverUrl = constMatrixArtServer + "/_matrix/client"; + await this.context.guest_client?.registerAsGuest(serverUrl); + } catch (error) { + console.error("Failed to register as guest:", error); + } + } else { + console.log("Guest Already logged in"); + } if (this.props.directory_data && this.props.event_id && this.props.event_id.startsWith("$")) { await this.loadEvent(this.props.event_id); } @@ -99,7 +100,12 @@ class Post extends PureComponent<Props, State> { // TODO fix this. It is super inefficient. for (let user of this.props.directory_data) { // We dont need many events - const roomId = await client?.followUser(user.public_user_room); + let roomId; + try { + roomId = await client?.followUser(user.public_user_room); + } catch { + console.error("Unbable to join room"); + } const events = await client?.getTimeline(roomId, 100); // Filter events by type const image_event = events.find((event) => (event.type === "m.image_gallery" || event.type === "m.image") && event.event_id === event_id); if (image_event == undefined) { @@ -481,7 +487,12 @@ export const getServerSideProps: GetServerSideProps = async ({ res, locale, quer for (let user of data) { // TODO check what happens if this is a non public image. // We dont need many events - const roomId = await client?.followUser(user.public_user_room); + let roomId; + try { + roomId = await client?.followUser(user.public_user_room); + } catch { + console.error("Unbable to join room"); + } const events = await client?.getTimeline(roomId, 100); // Filter events by type const image_event = events.find((event) => ((event.type == "m.image_gallery" || event.type == "m.image") && !event.unsigned?.redacted_because) && event.event_id === event_id); diff --git a/pages/profile/[userid].tsx b/pages/profile/[userid].tsx @@ -65,29 +65,32 @@ class Profile extends PureComponent<Props, State> { if (!this.context.client?.accessToken) { this.registerAsGuest(); } else { - if (!this.context.guest_client?.accessToken) { - try { - let serverUrl = constMatrixArtServer + "/_matrix/client"; - await this.context.guest_client?.registerAsGuest(serverUrl); - } catch (error) { - console.error("Failed to register as guest:", error); - } - } console.log("Already logged in"); - if (!this.props.mxid) { - return; - } + } + if (!this.context.guest_client?.accessToken) { try { - const profile = await this.context.client.getProfile(this.props.mxid); - this.setState({ - displayname: profile.displayname, - avatar_url: profile.avatar_url, - }); + let serverUrl = constMatrixArtServer + "/_matrix/client"; + await this.context.guest_client?.registerAsGuest(serverUrl); } catch (error) { - console.debug(`Failed to fetch profile for user ${this.props.mxid}:`, error); + console.error("Failed to register as guest:", error); } - await this.loadEvents(); + } else { + console.log("Guest Already logged in"); + } + if (!this.props.mxid) { + return; } + try { + const profile = await this.context.client.getProfile(this.props.mxid); + this.setState({ + displayname: profile.displayname, + avatar_url: profile.avatar_url, + }); + } catch (error) { + console.debug(`Failed to fetch profile for user ${this.props.mxid}:`, error); + } + await this.loadEvents(); + this.setState({ isLoggedInUser: this.props.mxid === this.context.client.userId && !this.context.client.isGuest }); @@ -120,7 +123,12 @@ class Profile extends PureComponent<Props, State> { isLoadingImages: true, }); try { - const roomId = await client?.followUser("#" + this.props.mxid); + let roomId; + try { + roomId = await client?.followUser("#" + this.props.mxid); + } catch { + console.error("Unbable to join room"); + } const events = await client?.getTimeline(roomId, 100, { limit: 30, types: ["m.image", "m.image_gallery", "matrixart.profile", "matrixart.profile_banner"] }); const profile_event = events.find((event) => event.type === "matrixart.profile" && event.sender === this.props.mxid); const filtered_events = events.filter(event => event.type !== "m.room.member" && event.type !== "m.room.topic" && event.type !== "m.room.name" && event.type !== "m.room.power_levels"); diff --git a/playwright.config.ts b/playwright.config.ts @@ -104,11 +104,10 @@ const config: PlaywrightTestConfig = { /* Folder for test artifacts such as screenshots, videos, traces, etc. */ outputDir: 'test-results/', - /* Run your local dev server before starting the tests + /* Run your local dev server before starting the tests */ webServer: { command: 'npm run dev-tests', port: 3000, - reuseExistingServer: !process.env.CI, - },*/ + }, }; export default config;