TransportContext.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import React, { useEffect, useState, useContext, createContext } from 'react';
  2. import { MediaTransport } from './transport';
  3. import { MockTransport } from './transport.mock';
  4. import { SubstrateTransport } from './transport.substrate';
  5. import ApiContext from '@polkadot/react-api/ApiContext';
  6. import { ApiProps } from '@polkadot/react-api/types';
  7. export const TransportContext = createContext<MediaTransport>(undefined as unknown as MediaTransport);
  8. export const useTransportContext = () =>
  9. useContext(TransportContext);
  10. export const MockTransportProvider = (props: React.PropsWithChildren<{}>) =>
  11. <TransportContext.Provider value={new MockTransport()}>
  12. {props.children}
  13. </TransportContext.Provider>;
  14. export const SubstrateTransportProvider = (props: React.PropsWithChildren<{}>) => {
  15. const api: ApiProps = useContext(ApiContext);
  16. const [transport, setTransport] = useState<SubstrateTransport>();
  17. const [loaded, setLoaded] = useState<boolean>();
  18. useEffect(() => {
  19. if (!loaded && api && api.isApiReady) {
  20. setTransport(new SubstrateTransport(api));
  21. setLoaded(true);
  22. }
  23. }, [loaded]);
  24. if (!transport) {
  25. // Substrate API is not ready yet.
  26. return null;
  27. }
  28. return (
  29. <TransportContext.Provider value={transport}>
  30. {props.children}
  31. </TransportContext.Provider>
  32. );
  33. };