This repository has been archived by the owner on Sep 11, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 833
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support a module API surface for custom functionality (#8246)
* Early implementation of module API surface + functions for ILAG module * Wire up dialog functions and ILAG-needed surface * Ensure component renders for modules get overridden * Respond to changes from module API interface * Use a real module-api dependency * Update for new Dialogs interface * Add support for getConfigValue from module API * Update the remainder of the module API interface * Docs & cleanup * Add some unit tests around module stuff Needs end-to-end tests still. * Appease early linters * Break import cycles by not directly depending on Lifecycle * Appease the linter * Fix bad merge
- Loading branch information
Showing
22 changed files
with
906 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* | ||
Copyright 2022 The Matrix.org Foundation C.I.C. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
import React, { createRef } from "react"; | ||
import { DialogContent, DialogProps } from "@matrix-org/react-sdk-module-api/lib/components/DialogContent"; | ||
import { logger } from "matrix-js-sdk/src/logger"; | ||
|
||
import ScrollableBaseModal, { IScrollableBaseState } from "./ScrollableBaseModal"; | ||
import { IDialogProps } from "./IDialogProps"; | ||
import { _t } from "../../../languageHandler"; | ||
|
||
interface IProps extends IDialogProps { | ||
contentFactory: (props: DialogProps, ref: React.Ref<DialogContent>) => React.ReactNode; | ||
contentProps: DialogProps; | ||
title: string; | ||
} | ||
|
||
interface IState extends IScrollableBaseState { | ||
// nothing special | ||
} | ||
|
||
export class ModuleUiDialog extends ScrollableBaseModal<IProps, IState> { | ||
private contentRef = createRef<DialogContent>(); | ||
|
||
public constructor(props: IProps) { | ||
super(props); | ||
|
||
this.state = { | ||
title: this.props.title, | ||
canSubmit: true, | ||
actionLabel: _t("OK"), | ||
}; | ||
} | ||
|
||
protected async submit() { | ||
try { | ||
const model = await this.contentRef.current.trySubmit(); | ||
this.props.onFinished(true, model); | ||
} catch (e) { | ||
logger.error("Error during submission of module dialog:", e); | ||
} | ||
} | ||
|
||
protected cancel(): void { | ||
this.props.onFinished(false); | ||
} | ||
|
||
protected renderContent(): React.ReactNode { | ||
return <div className="mx_ModuleUiDialog"> | ||
{ this.props.contentFactory(this.props.contentProps, this.contentRef) } | ||
</div>; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/* | ||
Copyright 2022 The Matrix.org Foundation C.I.C. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
import { ActionPayload } from "../payloads"; | ||
import { Action } from "../actions"; | ||
import { IMatrixClientCreds } from "../../MatrixClientPeg"; | ||
|
||
export interface OverwriteLoginPayload extends ActionPayload { | ||
action: Action.OverwriteLogin; | ||
|
||
credentials: IMatrixClientCreds; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* | ||
Copyright 2022 The Matrix.org Foundation C.I.C. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
import { RuntimeModule } from "@matrix-org/react-sdk-module-api/lib/RuntimeModule"; | ||
|
||
import { ModuleFactory } from "./ModuleFactory"; | ||
import { ProxiedModuleApi } from "./ProxiedModuleApi"; | ||
|
||
/** | ||
* Wraps a module factory into a usable module. Acts as a simple container | ||
* for the constructs needed to operate a module. | ||
*/ | ||
export class AppModule { | ||
/** | ||
* The module instance. | ||
*/ | ||
public readonly module: RuntimeModule; | ||
|
||
/** | ||
* The API instance used by the module. | ||
*/ | ||
public readonly api = new ProxiedModuleApi(); | ||
|
||
/** | ||
* Converts a factory into an AppModule. The factory will be called | ||
* immediately. | ||
* @param factory The module factory. | ||
*/ | ||
public constructor(factory: ModuleFactory) { | ||
this.module = factory(this.api); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* | ||
Copyright 2022 The Matrix.org Foundation C.I.C. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
import { TextInputField } from "@matrix-org/react-sdk-module-api/lib/components/TextInputField"; | ||
import { Spinner as ModuleSpinner } from "@matrix-org/react-sdk-module-api/lib/components/Spinner"; | ||
import React from "react"; | ||
|
||
import Field from "../components/views/elements/Field"; | ||
import Spinner from "../components/views/elements/Spinner"; | ||
|
||
// Here we define all the render factories for the module API components. This file should be | ||
// imported by the ModuleRunner to load them into the call stack at runtime. | ||
// | ||
// If a new component is added to the module API, it should be added here too. | ||
// | ||
// Don't forget to add a test to ensure the renderFactory is overridden! See ModuleComponents-test.tsx | ||
|
||
TextInputField.renderFactory = (props) => ( | ||
<Field | ||
type="text" | ||
value={props.value} | ||
onChange={e => props.onChange(e.target.value)} | ||
label={props.label} | ||
autoComplete="off" | ||
/> | ||
); | ||
ModuleSpinner.renderFactory = () => <Spinner />; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
Copyright 2022 The Matrix.org Foundation C.I.C. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
import { RuntimeModule } from "@matrix-org/react-sdk-module-api/lib/RuntimeModule"; | ||
import { ModuleApi } from "@matrix-org/react-sdk-module-api/lib/ModuleApi"; | ||
|
||
export type ModuleFactory = (api: ModuleApi) => RuntimeModule; |
Oops, something went wrong.