diff --git a/frontend/src/components/screencast.ts b/frontend/src/components/screencast.ts index ddc95267..64dbf26f 100644 --- a/frontend/src/components/screencast.ts +++ b/frontend/src/components/screencast.ts @@ -3,7 +3,7 @@ import { msg, localized, str } from "@lit/localize"; import { property, state } from "lit/decorators.js"; type Message = { - id: string; // page ID + id: number; // page ID }; type InitMessage = Message & { @@ -133,17 +133,13 @@ export class Screencast extends LitElement { // List of browser screens @state() - private dataList: Array = []; + private dataMap: { [index: string]: ScreencastMessage | null } = {}; @state() private focusedScreenData?: ScreencastMessage; // Websocket connections private wsMap: Map = new Map(); - // Map data order to screen data - private dataMap: { [index: number]: ScreencastMessage | null } = {}; - // Map page ID to data order - private pageOrderMap: Map = new Map(); // Number of available browsers. // Multiply by scale to get available browser window count private browsersCount = 1; @@ -166,14 +162,12 @@ export class Screencast extends LitElement { this.disconnectAll(); this.connectAll(); } - if (changedProperties.has("scale")) { - const prevScale = changedProperties.get("scale"); - if (prevScale) { - if (this.scale > prevScale) { - this.scaleUp(); - } else { - this.scaleDown(); - } + const prevScale = changedProperties.get("scale"); + if (prevScale !== undefined) { + if (this.scale > prevScale) { + this.scaleUp(); + } else { + this.scaleDown(); } } } @@ -185,36 +179,17 @@ export class Screencast extends LitElement { } render() { + const screenCount = this.scale * this.browsersCount; return html`
- ${this.dataList.map( - (pageData) => - html`
(this.focusedScreenData = pageData) - : () => {}} - > -
- ${pageData?.url || html` `} -
-
- ${pageData - ? html`` - : html``} -
-
` + ${Array.from({ length: screenCount }).map((_, i) => + this.renderScreen(`${i}`) )}
@@ -247,6 +222,26 @@ export class Screencast extends LitElement { `; } + private renderScreen = (id: string) => { + const pageData = this.dataMap[id]; + return html`
(this.focusedScreenData = pageData) : () => {}} + > +
${pageData?.url || html` `}
+
+ ${pageData + ? html`` + : html``} +
+
`; + }; + private scaleUp() { // Reconnect after 20 second delay this.timerIds.push( @@ -306,22 +301,17 @@ export class Screencast extends LitElement { message: InitMessage | ScreencastMessage | CloseMessage ) { if (message.msg === "init") { - this.dataList = Array.from( - { length: message.browsers * this.scale }, - () => null - ); - this.dataMap = this.dataList.reduce( - (acc, val, i) => ({ - ...acc, - [i]: val, - }), - {} - ); + const dataMap: any = {}; + for (let i = 0; i < message.browsers * this.scale; i++) { + dataMap[i] = null; + } + this.dataMap = dataMap; this.browsersCount = message.browsers; this.screenWidth = message.width; this.screenHeight = message.height; } else { const { id } = message; + const dataMap = { ...this.dataMap }; if (message.msg === "screencast") { if (message.url === "about:blank") { @@ -329,34 +319,16 @@ export class Screencast extends LitElement { return; } - let idx = this.pageOrderMap.get(id); - - if (idx === undefined) { - // Find and fill first empty slot - idx = this.dataList.indexOf(null); - - if (idx === -1) { - console.debug("no empty slots"); - } - - this.pageOrderMap.set(id, idx); - } - if (this.focusedScreenData?.id === id) { this.focusedScreenData = message; } - this.dataMap[idx] = message; - this.updateDataList(); + dataMap[id] = message; } else if (message.msg === "close") { - const idx = this.pageOrderMap.get(id); - - if (idx !== undefined && idx !== null) { - this.dataMap[idx] = null; - this.updateDataList(); - this.pageOrderMap.set(id, -1); - } + dataMap[id] = null; } + + this.dataMap = dataMap; } } @@ -415,12 +387,7 @@ export class Screencast extends LitElement { }); } - updateDataList() { - this.dataList = Object.values(this.dataMap); - } - unfocusScreen() { - this.updateDataList(); this.focusedScreenData = undefined; } }