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/app.js +8 -4
- package/dist/brew-js-react.js +60 -47
- package/dist/brew-js-react.js.map +1 -1
- package/dist/brew-js-react.min.js +2 -2
- package/dist/brew-js-react.min.js.map +1 -1
- package/index.js +1 -0
- package/mixins/FlyoutMixin.d.ts +5 -0
- package/mixins/FlyoutMixin.js +8 -1
- package/package.json +1 -1
- package/view.d.ts +3 -9
- package/view.js +14 -14
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
|
|
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,
|
|
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
|
}
|