diff --git a/src/settings/DeveloperSettingsTab.test.tsx b/src/settings/DeveloperSettingsTab.test.tsx
index c18cf23bb..7bdf7091d 100644
--- a/src/settings/DeveloperSettingsTab.test.tsx
+++ b/src/settings/DeveloperSettingsTab.test.tsx
@@ -79,6 +79,7 @@ describe("DeveloperSettingsTab", () => {
const { container } = render(
,
diff --git a/src/settings/DeveloperSettingsTab.tsx b/src/settings/DeveloperSettingsTab.tsx
index 254aaf0f4..d16e3ef7f 100644
--- a/src/settings/DeveloperSettingsTab.tsx
+++ b/src/settings/DeveloperSettingsTab.tsx
@@ -22,6 +22,7 @@ import {
import { logger } from "matrix-js-sdk/lib/logger";
import {
EditInPlace,
+ ErrorMessage,
Root as Form,
Heading,
HelpMessage,
@@ -45,9 +46,11 @@ import {
import type { Room as LivekitRoom } from "livekit-client";
import styles from "./DeveloperSettingsTab.module.css";
import { useUrlParams } from "../UrlParams";
+import { getSFUConfigWithOpenID } from "../livekit/openIDSFU";
interface Props {
client: MatrixClient;
+ roomId: string;
livekitRooms?: { room: LivekitRoom; url: string; isLocal?: boolean }[];
env: ImportMetaEnv;
}
@@ -55,6 +58,7 @@ interface Props {
export const DeveloperSettingsTab: FC = ({
client,
livekitRooms,
+ roomId,
env,
}) => {
const { t } = useTranslation();
@@ -92,6 +96,8 @@ export const DeveloperSettingsTab: FC = ({
alwaysShowIphoneEarpieceSetting,
);
+ const [customLivekitUrlUpdateError, setCustomLivekitUrlUpdateError] =
+ useState(null);
const [customLivekitUrl, setCustomLivekitUrl] = useSetting(
customLivekitUrlSetting,
);
@@ -229,14 +235,28 @@ export const DeveloperSettingsTab: FC = ({
savingLabel={t("developer_mode.custom_livekit_url.saving")}
cancelButtonLabel={t("developer_mode.custom_livekit_url.reset")}
onSave={useCallback(
- (e: React.FormEvent) => {
- setCustomLivekitUrl(
- customLivekitUrlTextBuffer === ""
- ? null
- : customLivekitUrlTextBuffer,
- );
+ async (e: React.FormEvent): Promise => {
+ if (
+ customLivekitUrlTextBuffer === "" ||
+ customLivekitUrlTextBuffer === null
+ ) {
+ setCustomLivekitUrl(null);
+ return;
+ }
+
+ try {
+ await getSFUConfigWithOpenID(
+ client,
+ customLivekitUrlTextBuffer,
+ roomId,
+ );
+ setCustomLivekitUrlUpdateError(null);
+ setCustomLivekitUrl(customLivekitUrlTextBuffer);
+ } catch {
+ setCustomLivekitUrlUpdateError("invalid URL (did not update)");
+ }
},
- [setCustomLivekitUrl, customLivekitUrlTextBuffer],
+ [customLivekitUrlTextBuffer, setCustomLivekitUrl, client, roomId],
)}
value={customLivekitUrlTextBuffer ?? ""}
onChange={useCallback(
@@ -251,7 +271,12 @@ export const DeveloperSettingsTab: FC = ({
},
[setCustomLivekitUrl],
)}
- />
+ serverInvalid={customLivekitUrlUpdateError !== null}
+ >
+ {customLivekitUrlUpdateError !== null && (
+ {customLivekitUrlUpdateError}
+ )}
+
{t("developer_mode.matrixRTCMode.title")}
diff --git a/src/settings/SettingsModal.tsx b/src/settings/SettingsModal.tsx
index 2b4078aa5..30ac36185 100644
--- a/src/settings/SettingsModal.tsx
+++ b/src/settings/SettingsModal.tsx
@@ -213,6 +213,7 @@ export const SettingsModal: FC = ({
env={import.meta.env}
client={client}
livekitRooms={livekitRooms}
+ roomId={roomId}
/>
),
};
diff --git a/src/settings/settings.ts b/src/settings/settings.ts
index f85e1414b..03008dca8 100644
--- a/src/settings/settings.ts
+++ b/src/settings/settings.ts
@@ -34,15 +34,20 @@ export class Setting {
this._value$ = new BehaviorSubject(initialValue);
this.value$ = this._value$;
+ this._lastUpdateReason$ = new BehaviorSubject(null);
+ this.lastUpdateReason$ = this._lastUpdateReason$;
}
private readonly key: string;
private readonly _value$: BehaviorSubject;
+ private readonly _lastUpdateReason$: BehaviorSubject;
public readonly value$: Behavior;
+ public readonly lastUpdateReason$: Behavior;
- public readonly setValue = (value: T): void => {
+ public readonly setValue = (value: T, reason?: string): void => {
this._value$.next(value);
+ this._lastUpdateReason$.next(reason ?? null);
localStorage.setItem(this.key, JSON.stringify(value));
};
public readonly getValue = (): T => {