brew-js-react 0.6.2 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/view.d.ts CHANGED
@@ -4,6 +4,7 @@ import { useRouteState } from "./hooks";
4
4
 
5
5
  export type ViewComponentRootProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
6
6
  export type ViewComponent<P> = React.FC<ViewProps<P>>;
7
+ export type ViewParamMatchers = Zeta.Dictionary<null | string | RegExp | ((value: string) => boolean)>;
7
8
  /**
8
9
  * @deprecated Alias of {@link ViewContext}
9
10
  */
@@ -108,21 +109,14 @@ export function useViewContext(): ViewContext;
108
109
  */
109
110
  export function useViewContainerState(): ViewContainerState;
110
111
 
111
- /**
112
- * Registers view component with specific route paramters.
113
- * Route parameters will be matched against current route state by {@link renderView}.
114
- * @param factory A callback that returns a promise resolving a React component, typically using async `import`.
115
- * @param params A dictionary containing route parameters.
116
- */
117
- export function registerView<P>(factory: () => Promise<{ default: React.ComponentType<P> }>, params: Zeta.Dictionary<null | string | RegExp | ((value: string) => boolean)>): ViewComponent<P extends ViewProps<infer S> ? S : {}>;
118
112
 
119
113
  /**
120
114
  * Registers view component with specific route paramters.
121
115
  * Route parameters will be matched against current route state by {@link renderView}.
122
- * @param component A React component.
116
+ * @param component A React component, or a callback that returns a promise resolving a React component, typically using async `import`.
123
117
  * @param params A dictionary containing route parameters.
124
118
  */
125
- export function registerView<P>(component: React.ComponentType<P>, params: Zeta.Dictionary<null | string | RegExp | ((value: string) => boolean)>): ViewComponent<P extends ViewProps<infer S> ? S : {}>;
119
+ export function registerView<P = ViewProps>(component: React.ComponentType<P> | (() => Promise<{ default: React.ComponentType<P>; }>), params: ViewParamMatchers): ViewComponent<P extends ViewProps<infer S> ? S : {}>;
126
120
 
127
121
  /**
128
122
  * Registers a default error view to be displayed when view component failed to render.
package/view.js CHANGED
@@ -1,9 +1,8 @@
1
1
  import { Component, Fragment, createContext, createElement, useContext, useEffect, useState } from "react";
2
2
  import { useAsync } from "zeta-dom-react";
3
3
  import dom, { reportError } from "zeta-dom/dom";
4
- import { notifyAsync } from "zeta-dom/domLock";
5
4
  import { ZetaEventContainer } from "zeta-dom/events";
6
- import { any, arrRemove, catchAsync, createPrivateStore, defineObservableProperty, defineOwnProperty, definePrototype, each, exclude, executeOnce, extend, freeze, grep, isArray, isFunction, isThenable, isUndefinedOrNull, keys, makeArray, map, noop, pick, randomId, resolveAll, setImmediate, single, throwNotFunction, watch } from "zeta-dom/util";
5
+ import { any, arrRemove, catchAsync, createPrivateStore, defineObservableProperty, defineOwnProperty, definePrototype, each, exclude, executeOnce, extend, freeze, grep, isArray, isFunction, isThenable, isUndefinedOrNull, keys, makeArray, map, noop, pick, randomId, setImmediate, single, throwNotFunction, watch } from "zeta-dom/util";
7
6
  import { animateIn, animateOut } from "brew-js/anim";
8
7
  import { removeQueryAndHash } from "brew-js/util/path";
9
8
  import { app, onAppInit } from "./app.js";
@@ -39,6 +38,7 @@ onAppInit(function () {
39
38
  });
40
39
  })(rootState);
41
40
  });
41
+ rootState.setPage(app.page);
42
42
  });
43
43
 
44
44
  function ViewContext(view, page, parent) {
@@ -83,27 +83,30 @@ definePrototype(ErrorBoundary, Component, {
83
83
  if (errorView && !self.state.error) {
84
84
  self.setState({ error });
85
85
  } else {
86
- // emit error in next tick as ref callback may yet to be invoked
87
- // if error is thrown synchronously in first render
88
- setImmediate(function () {
89
- reportError(error, self.context.container);
90
- });
91
86
  // ensure promise sent to beforepageload event is resolved
92
87
  self.props.onComponentLoaded();
88
+ reportError(error, self.context.container);
93
89
  }
94
90
  },
95
91
  render: function () {
96
92
  var self = this;
93
+ if (!self.context.container) {
94
+ setImmediate(function () {
95
+ self.forceUpdate();
96
+ });
97
+ return null;
98
+ }
97
99
  var props = {
98
100
  view: self.context.view,
99
101
  error: self.state.error,
100
102
  reset: self.reset.bind(self)
101
103
  };
102
104
  var onComponentLoaded = self.props.onComponentLoaded;
105
+ var onError = self.componentDidCatch.bind(self);
103
106
  if (props.error) {
104
- return createElement(errorView, { onComponentLoaded, viewProps: props });
107
+ return createElement(errorView, { onComponentLoaded, onError, viewProps: props });
105
108
  }
106
- return createElement(props.view, { onComponentLoaded, viewProps: self.props.viewProps });
109
+ return createElement(props.view, { onComponentLoaded, onError, viewProps: self.props.viewProps });
107
110
  },
108
111
  reset: function () {
109
112
  this.setState({ error: null });
@@ -184,7 +187,6 @@ definePrototype(ViewContainer, Component, {
184
187
  app.emit('pageenter', element, { pathname: context.page.path, view: V }, true);
185
188
  }
186
189
  });
187
- notifyAsync(element, promise);
188
190
  });
189
191
  var viewProps = function () {
190
192
  return freeze({
@@ -278,10 +280,11 @@ function createViewComponent(factory) {
278
280
  catchAsync(promise);
279
281
  }
280
282
  var state = useAsync(function () {
281
- return promise;
283
+ return promise.then(null, props.onError);
282
284
  }, !!promise)[1];
283
285
  var loaded = !promise || !state.loading;
284
286
  useEffect(function () {
287
+ state.elementRef(viewContext.container);
285
288
  // listen to property directly so that it is invoked after pagechange event handlers in actual component
286
289
  return watch(viewContext, 'page', function () {
287
290
  viewProps[1](props.viewProps);
@@ -292,9 +295,6 @@ function createViewComponent(factory) {
292
295
  setImmediate(props.onComponentLoaded);
293
296
  }
294
297
  }, [loaded]);
295
- if (state.error) {
296
- throw state.error;
297
- }
298
298
  return children || (state.value ? createElement(state.value.default, viewProps[0]) : null);
299
299
  };
300
300
  }