mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-09 17:19:59 +00:00
Implement receiver action listeners
This commit is contained in:
@@ -11,18 +11,30 @@ export enum ReceiverSelectorMediaType {
|
||||
, File = 8
|
||||
}
|
||||
|
||||
export interface ReceiverSelection {
|
||||
export enum ReceiverSelectionActionType {
|
||||
Cast = 1
|
||||
, Stop = 2
|
||||
}
|
||||
|
||||
export interface ReceiverSelectionCast {
|
||||
actionType: ReceiverSelectionActionType.Cast;
|
||||
receiver: Receiver;
|
||||
mediaType: ReceiverSelectorMediaType;
|
||||
filePath?: string;
|
||||
}
|
||||
export interface ReceiverSelectionStop {
|
||||
actionType: ReceiverSelectionActionType.Stop;
|
||||
receiver: Receiver;
|
||||
}
|
||||
|
||||
export type ReceiverSelection = ReceiverSelectionCast | ReceiverSelectionStop;
|
||||
|
||||
|
||||
export interface ReceiverSelectorEvents {
|
||||
"selected": ReceiverSelection;
|
||||
"selected": ReceiverSelectionCast;
|
||||
"error": string;
|
||||
"cancelled": void;
|
||||
"stop": { receiver: Receiver };
|
||||
"stop": ReceiverSelectionStop;
|
||||
}
|
||||
|
||||
export default interface ReceiverSelector
|
||||
|
||||
@@ -13,6 +13,7 @@ import { DEFAULT_MEDIA_RECEIVER_APP_ID } from "../../shim/cast/media/";
|
||||
import { ReceiverSelector
|
||||
, ReceiverSelectorType } from "./";
|
||||
import { ReceiverSelection
|
||||
, ReceiverSelectionActionType
|
||||
, ReceiverSelectorMediaType } from "./ReceiverSelector";
|
||||
|
||||
import NativeReceiverSelector from "./NativeReceiverSelector";
|
||||
@@ -122,10 +123,28 @@ async function getSelection (
|
||||
// Get a new selector for each selection
|
||||
sharedSelector = await createSelector();
|
||||
|
||||
sharedSelector.addEventListener("selected", onSelected);
|
||||
sharedSelector.addEventListener("cancelled", onCancelled);
|
||||
sharedSelector.addEventListener("error", onError);
|
||||
sharedSelector.addEventListener("stop", onStop);
|
||||
|
||||
let onSelected: any;
|
||||
let onCancelled: any;
|
||||
let onError: any;
|
||||
let onStop: any;
|
||||
|
||||
type EvParamsType =
|
||||
Parameters<typeof sharedSelector.addEventListener>[0];
|
||||
|
||||
function storeListener<T> (type: EvParamsType, fn: T) {
|
||||
if (type === "selected") {
|
||||
onSelected = fn;
|
||||
} else if (type === "cancelled") {
|
||||
onCancelled = fn;
|
||||
} else if (type === "error") {
|
||||
onError = fn;
|
||||
} else if (type === "stop") {
|
||||
onStop = fn;
|
||||
}
|
||||
|
||||
return fn;
|
||||
}
|
||||
|
||||
function removeListeners () {
|
||||
sharedSelector.removeEventListener("selected", onSelected);
|
||||
@@ -134,31 +153,48 @@ async function getSelection (
|
||||
sharedSelector.removeEventListener("stop", onStop);
|
||||
}
|
||||
|
||||
function onSelected (ev: any) {
|
||||
logger.info("Selected receiver", ev.detail);
|
||||
resolve(ev.detail);
|
||||
removeListeners();
|
||||
}
|
||||
sharedSelector.addEventListener("selected"
|
||||
, storeListener("selected", ev => {
|
||||
|
||||
logger.info("Selected receiver", ev.detail);
|
||||
resolve({
|
||||
actionType: ReceiverSelectionActionType.Cast
|
||||
, receiver: ev.detail.receiver
|
||||
, mediaType: ev.detail.mediaType
|
||||
, filePath: ev.detail.filePath
|
||||
});
|
||||
removeListeners();
|
||||
}));
|
||||
|
||||
sharedSelector.addEventListener("cancelled"
|
||||
, storeListener("cancelled", () => {
|
||||
|
||||
function onCancelled () {
|
||||
logger.info("Cancelled receiver selection");
|
||||
resolve(null);
|
||||
removeListeners();
|
||||
}
|
||||
}));
|
||||
|
||||
function onError () {
|
||||
logger.error("Failed to select receiver");
|
||||
sharedSelector.addEventListener("error"
|
||||
, storeListener("error", () => {
|
||||
reject();
|
||||
removeListeners();
|
||||
}
|
||||
}));
|
||||
|
||||
sharedSelector.addEventListener("stop"
|
||||
, storeListener("stop", ev => {
|
||||
|
||||
function onStop (ev: any) {
|
||||
logger.info("Stopped receiver app", ev.detail);
|
||||
|
||||
StatusManager.init().then(() => {
|
||||
StatusManager.stopReceiverApp(ev.detail.receiver);
|
||||
});
|
||||
}
|
||||
StatusManager.init()
|
||||
.then(() => StatusManager.stopReceiverApp(ev.detail.receiver))
|
||||
.then(() => {
|
||||
resolve({
|
||||
actionType: ReceiverSelectionActionType.Stop
|
||||
, receiver: ev.detail.receiver
|
||||
});
|
||||
removeListeners();
|
||||
});
|
||||
}));
|
||||
|
||||
|
||||
// Ensure status manager is initialized
|
||||
|
||||
@@ -14,4 +14,5 @@ export enum ReceiverSelectorType {
|
||||
}
|
||||
|
||||
export { ReceiverSelection
|
||||
, ReceiverSelectionActionType
|
||||
, ReceiverSelectorMediaType } from "./ReceiverSelector";
|
||||
|
||||
Reference in New Issue
Block a user