useCastSender.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. declare const chrome: any;
  2. declare const cast: any;
  3. declare global {
  4. interface Window {
  5. __onGCastApiAvailable: (isAvailable: boolean) => void;
  6. }
  7. }
  8. import { useEffect, useState } from "react";
  9. type Sender = {
  10. chrome: typeof chrome;
  11. cast: typeof cast;
  12. };
  13. export const loadSender = (() => {
  14. let promise: Promise<Sender> | null = null;
  15. return () => {
  16. if (promise === null) {
  17. promise = new Promise((resolve) => {
  18. const script = document.createElement("script");
  19. script.src =
  20. "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1";
  21. window.__onGCastApiAvailable = (isAvailable) => {
  22. if (isAvailable) {
  23. cast.framework.CastContext.getInstance().setOptions({
  24. receiverApplicationId: "F5BCEC64",
  25. autoJoinPolicy:
  26. chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,
  27. });
  28. resolve({
  29. chrome,
  30. cast,
  31. });
  32. }
  33. };
  34. document.body.appendChild(script);
  35. });
  36. }
  37. return promise;
  38. };
  39. })();
  40. export const useCastSender = () => {
  41. const [sender, setSender] = useState<Sender | { chrome: null; cast: null }>(
  42. {
  43. chrome: null,
  44. cast: null,
  45. },
  46. );
  47. useEffect(() => {
  48. loadSender().then((sender) => {
  49. setSender(sender);
  50. });
  51. }, []);
  52. return sender;
  53. };