2023-11-07 00:02:14 +00:00
|
|
|
declare const chrome: any;
|
|
|
|
declare const cast: any;
|
|
|
|
|
|
|
|
declare global {
|
|
|
|
interface Window {
|
|
|
|
__onGCastApiAvailable: (isAvailable: boolean) => void;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
import { useEffect, useState } from 'react';
|
|
|
|
|
|
|
|
type Sender = {
|
|
|
|
chrome: typeof chrome;
|
|
|
|
cast: typeof cast;
|
|
|
|
};
|
|
|
|
|
2023-12-16 17:22:26 +00:00
|
|
|
export const loadSender = (() => {
|
2023-11-07 00:02:14 +00:00
|
|
|
let promise: Promise<Sender> | null = null;
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
if (promise === null) {
|
|
|
|
promise = new Promise((resolve) => {
|
|
|
|
const script = document.createElement('script');
|
|
|
|
script.src =
|
|
|
|
'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';
|
|
|
|
window.__onGCastApiAvailable = (isAvailable) => {
|
|
|
|
if (isAvailable) {
|
2023-11-26 22:43:12 +00:00
|
|
|
cast.framework.CastContext.getInstance().setOptions({
|
|
|
|
receiverApplicationId:
|
|
|
|
process.env.NEXT_PUBLIC_CAST_APP_ID,
|
|
|
|
autoJoinPolicy:
|
|
|
|
chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,
|
|
|
|
});
|
|
|
|
|
2023-11-07 00:02:14 +00:00
|
|
|
resolve({
|
|
|
|
chrome,
|
|
|
|
cast,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
document.body.appendChild(script);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return promise;
|
|
|
|
};
|
|
|
|
})();
|
|
|
|
|
|
|
|
export const useCastSender = () => {
|
|
|
|
const [sender, setSender] = useState<Sender | { chrome: null; cast: null }>(
|
|
|
|
{
|
|
|
|
chrome: null,
|
|
|
|
cast: null,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-12-16 17:22:26 +00:00
|
|
|
loadSender().then((sender) => {
|
2023-11-07 00:02:14 +00:00
|
|
|
setSender(sender);
|
|
|
|
});
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
return sender;
|
|
|
|
};
|