ente/packages/shared/hooks/useCastSender.tsx

64 lines
1.7 KiB
TypeScript
Raw Normal View History

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) {
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;
};