Files
element-call/src/settings/settings.ts
T

109 lines
2.7 KiB
TypeScript
Raw Normal View History

2024-05-08 15:29:39 -04:00
/*
Copyright 2024 New Vector Ltd.
2024-05-08 15:29:39 -04:00
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
2024-05-08 15:29:39 -04:00
*/
import { logger } from "matrix-js-sdk/src/logger";
import { BehaviorSubject, Observable } from "rxjs";
import { useObservableEagerState } from "observable-hooks";
import { PosthogAnalytics } from "../analytics/PosthogAnalytics";
export class Setting<T> {
2024-11-08 17:36:40 +00:00
public constructor(
key: string,
public readonly defaultValue: T,
) {
2024-05-08 15:29:39 -04:00
this.key = `matrix-setting-${key}`;
const storedValue = localStorage.getItem(this.key);
let initialValue = defaultValue;
if (storedValue !== null) {
try {
initialValue = JSON.parse(storedValue);
} catch (e) {
logger.warn(
`Invalid value stored for setting ${key}: ${storedValue}.`,
e,
);
2024-05-08 15:29:39 -04:00
}
}
this._value = new BehaviorSubject(initialValue);
this.value = this._value;
}
private readonly key: string;
private readonly _value: BehaviorSubject<T>;
public readonly value: Observable<T>;
public readonly setValue = (value: T): void => {
this._value.next(value);
localStorage.setItem(this.key, JSON.stringify(value));
};
}
/**
* React hook that returns a settings's current value and a setter.
*/
export function useSetting<T>(setting: Setting<T>): [T, (value: T) => void] {
return [useObservableEagerState(setting.value), setting.setValue];
}
// null = undecided
export const optInAnalytics = new Setting<boolean | null>(
"opt-in-analytics",
null,
);
// TODO: This setting can be disabled. Work out an approach to disableable
// settings thats works for Observables in addition to React.
export const useOptInAnalytics = (): [
boolean | null,
((value: boolean | null) => void) | null,
] => {
const setting = useSetting(optInAnalytics);
2024-07-12 14:15:27 -04:00
return PosthogAnalytics.instance.isEnabled() ? setting : [false, null];
2024-05-08 15:29:39 -04:00
};
export const developerSettingsTab = new Setting(
"developer-settings-tab",
false,
);
2024-05-08 16:00:42 -04:00
export const duplicateTiles = new Setting("duplicate-tiles", 0);
2024-05-08 15:29:39 -04:00
export const audioInput = new Setting<string | undefined>(
"audio-input",
undefined,
);
export const audioOutput = new Setting<string | undefined>(
"audio-output",
undefined,
);
export const videoInput = new Setting<string | undefined>(
"video-input",
undefined,
);
2024-05-16 13:33:02 -04:00
2024-11-04 08:54:13 -01:00
export const showHandRaisedTimer = new Setting<boolean>(
"hand-raised-show-timer",
false,
);
2024-11-08 17:36:40 +00:00
export const showReactions = new Setting<boolean>("reactions-show", true);
export const playReactionsSound = new Setting<boolean>(
"reactions-play-sound",
true,
);
2024-11-07 16:42:43 +00:00
export const soundEffectVolumeSetting = new Setting<number>(
"sound-effect-volume",
1,
);
2024-11-07 16:35:37 +00:00
2024-05-16 13:33:02 -04:00
export const alwaysShowSelf = new Setting<boolean>("always-show-self", true);