Previously we had a ViewModel class which was responsible for little more than creating an ObservableScope. However, since this ObservableScope would be created implicitly upon view model construction, it became a tad bit harder for callers to remember to eventually end the scope (as you wouldn't just have to remember to end ObservableScopes, but also to destroy ViewModels). Requiring the scope to be specified explicitly by the caller also makes it possible for the caller to reuse the scope for other purposes, reducing the number of scopes mentally in flight that need tending to, and for all state holders (not just view models) to be handled uniformly by helper functions such as generateKeyed$.
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
/*
|
|
Copyright 2025 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
import { of, type Observable } from "rxjs";
|
|
import {
|
|
type LocalParticipant,
|
|
type RemoteParticipant,
|
|
type Room as LivekitRoom,
|
|
} from "livekit-client";
|
|
|
|
import { type ObservableScope } from "./ObservableScope.ts";
|
|
import { ScreenShareViewModel } from "./MediaViewModel.ts";
|
|
import type { RoomMember } from "matrix-js-sdk";
|
|
import type { EncryptionSystem } from "../e2ee/sharedKeyManagement.ts";
|
|
import type { Behavior } from "./Behavior.ts";
|
|
|
|
/**
|
|
* A screen share media item to be presented in a tile. This is a thin wrapper
|
|
* around ScreenShareViewModel which essentially just establishes an
|
|
* ObservableScope for behaviors that the view model depends on.
|
|
*/
|
|
export class ScreenShare {
|
|
public readonly vm: ScreenShareViewModel;
|
|
|
|
public constructor(
|
|
private readonly scope: ObservableScope,
|
|
id: string,
|
|
member: RoomMember,
|
|
participant: LocalParticipant | RemoteParticipant,
|
|
encryptionSystem: EncryptionSystem,
|
|
livekitRoom: LivekitRoom,
|
|
focusUrl: string,
|
|
pretendToBeDisconnected$: Behavior<boolean>,
|
|
displayName$: Observable<string>,
|
|
) {
|
|
this.vm = new ScreenShareViewModel(
|
|
this.scope,
|
|
id,
|
|
member,
|
|
of(participant),
|
|
encryptionSystem,
|
|
livekitRoom,
|
|
focusUrl,
|
|
pretendToBeDisconnected$,
|
|
this.scope.behavior(displayName$),
|
|
participant.isLocal,
|
|
);
|
|
}
|
|
}
|