Push updates to open receiver selectors

This commit is contained in:
hensm
2020-08-09 17:04:08 +01:00
parent 2bd9c4071f
commit f002acad8c
7 changed files with 50 additions and 19 deletions

View File

@@ -80,11 +80,9 @@ export default new class StatusManager
const { data: receiver } = message; const { data: receiver } = message;
this.receivers.set(receiver.id, receiver); this.receivers.set(receiver.id, receiver);
const serviceUpEvent = new CustomEvent("serviceUp", { this.dispatchEvent(new CustomEvent("serviceUp", {
detail: receiver detail: receiver
}); }));
this.dispatchEvent(serviceUpEvent);
break; break;
} }
@@ -96,11 +94,9 @@ export default new class StatusManager
this.receivers.delete(id); this.receivers.delete(id);
} }
const serviceDownEvent = new CustomEvent("serviceDown", { this.dispatchEvent(new CustomEvent("serviceDown", {
detail: { id } detail: { id }
}); }));
this.dispatchEvent(serviceDownEvent);
break; break;
} }
@@ -121,6 +117,10 @@ export default new class StatusManager
, ...status , ...status
} }
}); });
this.dispatchEvent(new CustomEvent("statusUpdate", {
detail: { id, status }
}));
} }
} }
} }

View File

@@ -85,6 +85,8 @@ export default class NativeReceiverSelector extends ReceiverSelector {
this._isOpen = true; this._isOpen = true;
} }
public update (): void {}
public close (): void { public close (): void {
if (this.bridgePort) { if (this.bridgePort) {
this.bridgePort.postMessage({ this.bridgePort.postMessage({

View File

@@ -115,6 +115,16 @@ export default class PopupReceiverSelector extends ReceiverSelector {
} }
} }
public update (receivers: Receiver[]) {
this.receivers = receivers;
this.messagePort?.postMessage({
subject: "popup:/populateReceiverList"
, data: {
receivers: this.receivers
}
});
}
public async close (): Promise<void> { public async close (): Promise<void> {
if (this.windowId) { if (this.windowId) {
await browser.windows.remove(this.windowId); await browser.windows.remove(this.windowId);

View File

@@ -42,10 +42,13 @@ export default abstract class ReceiverSelector
abstract readonly isOpen: boolean; abstract readonly isOpen: boolean;
abstract open (receivers: Receiver[] abstract open (
, defaultMediaType: ReceiverSelectorMediaType receivers: Receiver[]
, availableMediaTypes: ReceiverSelectorMediaType , defaultMediaType: ReceiverSelectorMediaType
, requestedAppId?: string): void; , availableMediaTypes: ReceiverSelectorMediaType
, requestedAppId?: string): void;
abstract update (receivers: Receiver[]): void;
abstract close (): void; abstract close (): void;
} }

View File

@@ -124,6 +124,15 @@ async function getSelection (
sharedSelector = await createSelector(); sharedSelector = await createSelector();
function onReceiverChange () {
sharedSelector.update(Array.from(StatusManager.getReceivers()));
}
StatusManager.addEventListener("serviceUp", onReceiverChange);
StatusManager.addEventListener("serviceDown", onReceiverChange);
StatusManager.addEventListener("statusUpdate", onReceiverChange);
let onSelected: any; let onSelected: any;
let onCancelled: any; let onCancelled: any;
let onError: any; let onError: any;
@@ -151,6 +160,10 @@ async function getSelection (
sharedSelector.removeEventListener("cancelled", onCancelled); sharedSelector.removeEventListener("cancelled", onCancelled);
sharedSelector.removeEventListener("error", onError); sharedSelector.removeEventListener("error", onError);
sharedSelector.removeEventListener("stop", onStop); sharedSelector.removeEventListener("stop", onStop);
StatusManager.removeEventListener("serviceUp", onReceiverChange);
StatusManager.removeEventListener("serviceDown", onReceiverChange);
StatusManager.removeEventListener("statusUpdate", onReceiverChange);
} }
sharedSelector.addEventListener("selected" sharedSelector.addEventListener("selected"

View File

@@ -25,8 +25,8 @@ export type Messages = [
subject: "popup:/populateReceiverList" subject: "popup:/populateReceiverList"
, data: { , data: {
receivers: Receiver[] receivers: Receiver[]
, defaultMediaType: ReceiverSelectorMediaType , defaultMediaType?: ReceiverSelectorMediaType
, availableMediaTypes: ReceiverSelectorMediaType , availableMediaTypes?: ReceiverSelectorMediaType
} }
} }
, { , {

View File

@@ -84,11 +84,14 @@ class PopupApp extends Component<{}, PopupAppState> {
this.defaultMediaType = defaultMediaType; this.defaultMediaType = defaultMediaType;
this.setState({ this.setState({ receivers });
receivers: message.data.receivers
, mediaType: this.defaultMediaType if (availableMediaTypes && defaultMediaType) {
, availableMediaTypes: message.data.availableMediaTypes this.setState({
}); availableMediaTypes: availableMediaTypes
, mediaType: defaultMediaType
});
}
break; break;
} }