Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions res/css/structures/_SpacePanel.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,10 @@ Please see LICENSE files in the repository root for full details.
}
}

&.mx_SpaceButton_withIcon .mx_SpaceButton_icon {
background-color: $panel-actions;
}

&.mx_SpaceButton_home .mx_SpaceButton_icon::before {
mask-image: url("@vector-im/compound-design-tokens/icons/home-solid.svg");
}
Expand Down
6 changes: 3 additions & 3 deletions src/PosthogTrackers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const notLoggedInMap: Record<Exclude<Views, Views.LOGGED_IN>, ScreenName> = {
[Views.LOCK_STOLEN]: "SessionLockStolen",
};

const loggedInPageTypeMap: Record<PageType, ScreenName> = {
const loggedInPageTypeMap: Record<PageType | string, ScreenName> = {
[PageType.HomePage]: "Home",
[PageType.RoomView]: "Room",
[PageType.UserView]: "User",
Expand All @@ -48,10 +48,10 @@ export default class PosthogTrackers {
}

private view: Views = Views.LOADING;
private pageType?: PageType;
private pageType?: PageType | string;
private override?: ScreenName;

public trackPageChange(view: Views, pageType: PageType | undefined, durationMs: number): void {
public trackPageChange(view: Views, pageType: PageType | string | undefined, durationMs: number): void {
this.view = view;
this.pageType = pageType;
if (this.override) return;
Expand Down
38 changes: 26 additions & 12 deletions src/components/structures/LoggedInView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
import { MatrixClientContextProvider } from "./MatrixClientContextProvider";
import { Landmark, LandmarkNavigation } from "../../accessibility/LandmarkNavigation";
import { SDKContext } from "../../contexts/SDKContext.ts";
import ModuleApi from "../../modules/Api.ts";

Check failure on line 72 in src/components/structures/LoggedInView.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"/home/runner/work/element-web/element-web/src/modules/Api"' has no default export. Did you mean to use 'import { ModuleApi } from "/home/runner/work/element-web/element-web/src/modules/Api"' instead?

// We need to fetch each pinned message individually (if we don't already have it)
// so each pinned message may trigger a request. Limit the number per room for sanity.
Expand Down Expand Up @@ -679,6 +680,10 @@
public render(): React.ReactNode {
let pageElement;

const moduleRenderer = this.props.page_type
? ModuleApi.navigation.locationRenderers.get(this.props.page_type)
: undefined;

switch (this.props.page_type) {
case PageTypes.RoomView:
pageElement = (
Expand All @@ -705,6 +710,13 @@
);
}
break;
default: {
if (moduleRenderer) {
pageElement = moduleRenderer();
} else {
console.warn(`Couldn't render page type "${this.props.page_type}"`);
}
}
}

const wrapperClasses = classNames({
Expand Down Expand Up @@ -746,20 +758,22 @@
)}
<SpacePanel />
{!useNewRoomList && <BackdropPanel backgroundImage={this.state.backgroundImage} />}
<div
className="mx_LeftPanel_wrapper--user"
ref={this._resizeContainer}
data-collapsed={shouldUseMinimizedUI ? true : undefined}
>
<LeftPanel
pageType={this.props.page_type as PageTypes}
isMinimized={shouldUseMinimizedUI || false}
resizeNotifier={this.context.resizeNotifier}
/>
</div>
{!moduleRenderer && (
<div
className="mx_LeftPanel_wrapper--user"
ref={this._resizeContainer}
data-collapsed={shouldUseMinimizedUI ? true : undefined}
>
<LeftPanel
pageType={this.props.page_type as PageTypes}
isMinimized={shouldUseMinimizedUI || false}
resizeNotifier={this.context.resizeNotifier}
/>
</div>
)}
</div>
</div>
<ResizeHandle passRef={this.resizeHandler} id="lp-resizer" />
{!moduleRenderer && <ResizeHandle passRef={this.resizeHandler} id="lp-resizer" />}
<div className="mx_RoomView_wrapper">{pageElement}</div>
</div>
</div>
Expand Down
11 changes: 8 additions & 3 deletions src/components/structures/MatrixChat.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
import Markdown from "../../Markdown";
import { sanitizeHtmlParams } from "../../Linkify";
import { isOnlyAdmin } from "../../utils/membership";
import ModuleApi from "../../modules/Api.ts";

Check failure on line 143 in src/components/structures/MatrixChat.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"/home/runner/work/element-web/element-web/src/modules/Api"' has no default export. Did you mean to use 'import { ModuleApi } from "/home/runner/work/element-web/element-web/src/modules/Api"' instead?

// legacy export
export { default as Views } from "../../Views";
Expand Down Expand Up @@ -175,9 +176,11 @@
interface IState {
// the master view we are showing.
view: Views;
// What the LoggedInView would be showing if visible
// What the LoggedInView would be showing if visible.
// A member of the enum for standard pages or a string for those provided by
// a module.
// eslint-disable-next-line camelcase
page_type?: PageType;
page_type?: PageType | string;
// The ID of the room we're viewing. This is either populated directly
// in the case where we view a room by ID or by RoomView when it resolves
// what ID an alias points at.
Expand Down Expand Up @@ -1922,7 +1925,9 @@
subAction: params?.action,
});
} else {
logger.info(`Ignoring showScreen for '${screen}'`);
if (ModuleApi.navigation.locationRenderers.get(screen)) {
this.setState({ page_type: screen });
}
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/components/structures/RoomView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import { debounce, throttle } from "lodash";
import { CryptoEvent } from "matrix-js-sdk/src/crypto-api";
import { type ViewRoomOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle";
import { type RoomViewProps } from "@element-hq/element-web-module-api";

Check failure on line 47 in src/components/structures/RoomView.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'RoomViewProps'.

import shouldHideEvent from "../../shouldHideEvent";
import { _t } from "../../languageHandler";
Expand Down Expand Up @@ -147,7 +148,7 @@
debuglog = logger.log.bind(console);
}

interface IRoomProps {
interface IRoomProps extends RoomViewProps {
threepidInvite?: IThreepidInvite;
oobData?: IOOBData;

Expand Down
2 changes: 2 additions & 0 deletions src/components/views/spaces/SpacePanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
import { Landmark, LandmarkNavigation } from "../../../accessibility/LandmarkNavigation";
import { KeyboardShortcut } from "../settings/KeyboardShortcut";
import { ReleaseAnnouncement } from "../../structures/ReleaseAnnouncement";
import ModuleApi from "../../../modules/Api.ts";

Check failure on line 72 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"/home/runner/work/element-web/element-web/src/modules/Api"' has no default export. Did you mean to use 'import { ModuleApi } from "/home/runner/work/element-web/element-web/src/modules/Api"' instead?

const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => {
const invites = useEventEmitterState<Room[]>(SpaceStore.instance, UPDATE_INVITED_SPACES, () => {
Expand Down Expand Up @@ -341,6 +342,7 @@
</Draggable>
))}
{children}
{ModuleApi.extras.spacePanelItems.map((renderer) => renderer({ isPanelCollapsed }))}

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Parameter 'renderer' implicitly has an 'any' type.

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

<SpacePanel /> › should allow rearranging via drag and drop

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at Object.<anonymous> (test/unit-tests/components/views/spaces/SpacePanel-test.tsx:183:42)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

<SpacePanel /> › create new space button › opens context menu on create space button click

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at Object.<anonymous> (test/unit-tests/components/views/spaces/SpacePanel-test.tsx:168:19)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

<SpacePanel /> › create new space button › does not render create space button when UIComponent.CreateSpaces component should not be shown

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at Object.<anonymous> (test/unit-tests/components/views/spaces/SpacePanel-test.tsx:162:19)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

<SpacePanel /> › create new space button › renders create space button when UIComponent.CreateSpaces component should be shown

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at Object.<anonymous> (test/unit-tests/components/views/spaces/SpacePanel-test.tsx:156:19)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

<SpacePanel /> › should show all activated MetaSpaces in the correct order

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at Object.<anonymous> (test/unit-tests/components/views/spaces/SpacePanel-test.tsx:149:36)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › should fire FocusMessageSearch on Ctrl+F when enabled

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:427:9)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on changes to account_data › stops listening to account data events on unmount

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:409:37)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on changes to account_data › updates all mismatched rules from synced rules on a change to push rules account data when primary rule is disabled

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:384:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on changes to account_data › updates all mismatched rules from synced rules on a change to push rules account data

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:361:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on changes to account_data › ignores other account data events

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:342:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on mount › catches and logs errors while updating a rule

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:308:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on mount › updates all mismatched rules from synced rules when primary rule is disabled

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:276:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on mount › updates all mismatched rules from synced rules

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:246:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on mount › handles when user doesnt have a push rule defined in vector definitions

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:222:17)

Check failure on line 345 in src/components/views/spaces/SpacePanel.tsx

View workflow job for this annotation

GitHub Actions / Jest (2)

<LoggedInView /> › synced push rules › on mount › handles when user has no push rules event in account data

TypeError: Cannot read properties of undefined (reading 'extras') at extras (src/components/views/spaces/SpacePanel.tsx:345:28) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at updateSimpleMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9830:14) at updateMemoComponent (node_modules/react-dom/cjs/react-dom-client.development.js:9763:13) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:12204:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:18957:7) at flushActQueue (node_modules/react/cjs/react.development.js:590:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:884:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:94:15) at Object.getComponent (test/unit-tests/components/structures/LoggedInView-test.tsx:210:17)
{shouldShowComponent(UIComponent.CreateSpaces) && (
<CreateSpaceButton isPanelCollapsed={isPanelCollapsed} setPanelCollapsed={setPanelCollapsed} />
)}
Expand Down
5 changes: 4 additions & 1 deletion src/components/views/spaces/SpaceTreeLevel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ type ButtonProps<T extends keyof HTMLElementTagNameMap> = Omit<
className?: string;
selected?: boolean;
label: string;
icon?: JSX.Element;
contextMenuTooltip?: string;
notificationState?: NotificationState;
isNarrow?: boolean;
Expand All @@ -65,6 +66,7 @@ export const SpaceButton = <T extends keyof HTMLElementTagNameMap>({
space,
spaceKey: _spaceKey,
className,
icon,
selected,
label,
contextMenuTooltip,
Expand All @@ -84,7 +86,7 @@ export const SpaceButton = <T extends keyof HTMLElementTagNameMap>({

let avatar = (
<div className="mx_SpaceButton_avatarPlaceholder">
<div className="mx_SpaceButton_icon" />
<div className="mx_SpaceButton_icon">{icon}</div>
</div>
);
if (space) {
Expand Down Expand Up @@ -143,6 +145,7 @@ export const SpaceButton = <T extends keyof HTMLElementTagNameMap>({
mx_SpaceButton_active: selected,
mx_SpaceButton_hasMenuOpen: menuDisplayed,
mx_SpaceButton_narrow: isNarrow,
mx_SpaceButton_withIcon: Boolean(icon),
})}
aria-label={label}
title={!isNarrow || menuDisplayed ? undefined : label}
Expand Down
2 changes: 2 additions & 0 deletions src/modules/Api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { WatchableProfile } from "./Profile.ts";
import { NavigationApi } from "./Navigation.ts";
import { openDialog } from "./Dialog.tsx";
import { overwriteAccountAuth } from "./Auth.ts";
import { ElementWebExtrasApi } from "./ExtrasApi.ts";

const legacyCustomisationsFactory = <T extends object>(baseCustomisations: T) => {
let used = false;
Expand Down Expand Up @@ -79,6 +80,7 @@ export class ModuleApi implements Api {
public readonly config = new ConfigApi();
public readonly i18n = new I18nApi();
public readonly customComponents = new CustomComponentsApi();
public readonly extras = new ElementWebExtrasApi();
public readonly rootNode = document.getElementById("matrixchat")!;

public createRoot(element: Element): Root {
Expand Down
16 changes: 16 additions & 0 deletions src/modules/BuiltinsApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
Copyright 2025 New Vector Ltd.

SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/

import { type RoomViewProps, type BuiltinsApi } from "@element-hq/element-web-module-api";

Check failure on line 8 in src/modules/BuiltinsApi.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'BuiltinsApi'.

Check failure on line 8 in src/modules/BuiltinsApi.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'RoomViewProps'.

import { RoomView } from "../components/structures/RoomView";

export class ElementWebBuiltinsApi implements BuiltinsApi {
public getRoomViewComponent(): React.ComponentType<RoomViewProps> {
return RoomView;
}
}
16 changes: 16 additions & 0 deletions src/modules/ExtrasApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
Copyright 2025 New Vector Ltd.

SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/

import { type SpacePanelItemRenderFunction, type ExtrasApi } from "@element-hq/element-web-module-api";

Check failure on line 8 in src/modules/ExtrasApi.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'ExtrasApi'.

Check failure on line 8 in src/modules/ExtrasApi.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'SpacePanelItemRenderFunction'.

export class ElementWebExtrasApi implements ExtrasApi {
public spacePanelItems: SpacePanelItemRenderFunction[] = [];

public addSpacePanelItem(renderer: SpacePanelItemRenderFunction): void {
this.spacePanelItems.push(renderer);
}
}
8 changes: 7 additions & 1 deletion src/modules/Navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
Please see LICENSE files in the repository root for full details.
*/

import { type NavigationApi as INavigationApi } from "@element-hq/element-web-module-api";
import { type LocationRenderFunction, type NavigationApi as INavigationApi } from "@element-hq/element-web-module-api";

Check failure on line 8 in src/modules/Navigation.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'LocationRenderFunction'.

import { navigateToPermalink } from "../utils/permalinks/navigator.ts";
import { parsePermalink } from "../utils/permalinks/Permalinks.ts";
Expand All @@ -14,6 +14,8 @@
import type { ViewRoomPayload } from "../dispatcher/payloads/ViewRoomPayload.ts";

export class NavigationApi implements INavigationApi {
public locationRenderers = new Map<string, LocationRenderFunction>();

public async toMatrixToLink(link: string, join = false): Promise<void> {
navigateToPermalink(link);

Expand All @@ -38,4 +40,8 @@
}
}
}

public registerLocationRenderer(path: string, renderer: LocationRenderFunction): void {
this.locationRenderers.set(path, renderer);
}
}
Loading