hook.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { useState, useEffect } from 'react';
  2. import { env } from './env';
  3. var cache = new WeakMap();
  4. var NO_OPTIONS = {};
  5. export function useSidecar(importer, effect) {
  6. var options = (effect && effect.options) || NO_OPTIONS;
  7. if (env.isNode && !options.ssr) {
  8. return [null, null];
  9. }
  10. // eslint-disable-next-line react-hooks/rules-of-hooks
  11. return useRealSidecar(importer, effect);
  12. }
  13. function useRealSidecar(importer, effect) {
  14. var options = (effect && effect.options) || NO_OPTIONS;
  15. var couldUseCache = env.forceCache || (env.isNode && !!options.ssr) || !options.async;
  16. var _a = useState(couldUseCache ? function () { return cache.get(importer); } : undefined), Car = _a[0], setCar = _a[1];
  17. var _b = useState(null), error = _b[0], setError = _b[1];
  18. useEffect(function () {
  19. if (!Car) {
  20. importer().then(function (car) {
  21. var resolved = effect ? effect.read() : car.default || car;
  22. if (!resolved) {
  23. console.error('Sidecar error: with importer', importer);
  24. var error_1;
  25. if (effect) {
  26. console.error('Sidecar error: with medium', effect);
  27. error_1 = new Error('Sidecar medium was not found');
  28. }
  29. else {
  30. error_1 = new Error('Sidecar was not found in exports');
  31. }
  32. setError(function () { return error_1; });
  33. throw error_1;
  34. }
  35. cache.set(importer, resolved);
  36. setCar(function () { return resolved; });
  37. }, function (e) { return setError(function () { return e; }); });
  38. }
  39. }, []);
  40. return [Car, error];
  41. }