brew-js-react 0.1.9 → 0.2.0

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.
@@ -175,6 +175,7 @@ __webpack_require__.d(src_namespaceObject, {
175
175
  "Mixin": () => (Mixin),
176
176
  "ScrollableMixin": () => (ScrollableMixin),
177
177
  "StatefulMixin": () => (StatefulMixin),
178
+ "ViewStateContainer": () => (ViewStateContainer),
178
179
  "createDialog": () => (createDialog),
179
180
  "default": () => (src),
180
181
  "isViewMatched": () => (isViewMatched),
@@ -195,7 +196,9 @@ __webpack_require__.d(src_namespaceObject, {
195
196
  "useMixin": () => (useMixin),
196
197
  "useMixinRef": () => (useMixinRef),
197
198
  "useRouteParam": () => (useRouteParam),
198
- "useScrollableMixin": () => (useScrollableMixin)
199
+ "useRouteState": () => (useRouteState),
200
+ "useScrollableMixin": () => (useScrollableMixin),
201
+ "useViewContainerState": () => (useViewContainerState)
199
202
  });
200
203
 
201
204
  // EXTERNAL MODULE: external {"commonjs":"brew-js","commonjs2":"brew-js","amd":"brew-js","root":"brew"}
@@ -457,6 +460,8 @@ function Dialog(props) {
457
460
  }, [dialog]);
458
461
  return /*#__PURE__*/external_commonjs_react_dom_commonjs2_react_dom_amd_react_dom_root_ReactDOM_.createPortal(props.children, dialog.root);
459
462
  }
463
+ // EXTERNAL MODULE: external "zeta-dom-react"
464
+ var external_zeta_dom_react_ = __webpack_require__(103);
460
465
  ;// CONCATENATED MODULE: ./tmp/brew-js/defaults.js
461
466
 
462
467
  var defaults_defaultExport = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.defaults;
@@ -475,10 +480,193 @@ install('react', function (app_) {
475
480
  app_app = app_;
476
481
  });
477
482
  brew_js_defaults.react = true;
483
+ ;// CONCATENATED MODULE: ./tmp/brew-js/anim.js
484
+
485
+ var animateIn = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.animateIn,
486
+ animateOut = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.animateOut,
487
+ addAnimateIn = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.addAnimateIn,
488
+ addAnimateOut = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.addAnimateOut;
489
+
490
+ ;// CONCATENATED MODULE: ./src/include/brew-js/anim.js
491
+
492
+ ;// CONCATENATED MODULE: ./src/view.js
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+ var routeMap = new Map();
501
+ var usedParams = {};
502
+ var StateContext = /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createContext(Object.freeze({
503
+ active: true
504
+ }));
505
+ var stateId;
506
+
507
+ function ViewContainer() {
508
+ /** @type {any} */
509
+ var self = this;
510
+ external_commonjs_react_commonjs2_react_amd_react_root_React_.Component.apply(self, arguments);
511
+ self.mounted = false;
512
+
513
+ if (!stateId) {
514
+ stateId = history.state;
515
+ app_app.on('navigate', function () {
516
+ stateId = history.state;
517
+ });
518
+ }
519
+
520
+ self.componentWillUnmount = app_app.on('navigate', function () {
521
+ if (self.mounted && self.getViewComponent()) {
522
+ self.forceUpdate();
523
+ }
524
+ });
525
+ }
526
+
527
+ definePrototype(ViewContainer, external_commonjs_react_commonjs2_react_amd_react_root_React_.Component, {
528
+ componentDidMount: function componentDidMount() {
529
+ this.mounted = true;
530
+ },
531
+ componentDidCatch: function componentDidCatch(error) {
532
+ zeta_dom_dom.emit('error', this.parentElement || zeta_dom_dom.root, {
533
+ error: error
534
+ }, true);
535
+ },
536
+ render: function render() {
537
+ /** @type {any} */
538
+ var self = this;
539
+ var V = self.getViewComponent();
540
+
541
+ if (V && V !== self.currentViewComponent) {
542
+ self.currentViewComponent = V;
543
+
544
+ if (self.currentView && self.currentElement) {
545
+ self.prevView = self.currentView;
546
+ self.prevElement = self.currentElement;
547
+ self.currentElement = undefined;
548
+ animateOut(self.prevElement, 'show').then(function () {
549
+ self.prevElement = undefined;
550
+ self.prevView = undefined;
551
+ self.forceUpdate();
552
+ });
553
+ }
554
+
555
+ var providerProps = {
556
+ key: routeMap.get(V).id,
557
+ value: {}
558
+ };
559
+ var view = /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(StateContext.Provider, providerProps, /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(ViewStateContainer, null, /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(V, {
560
+ rootProps: self.props.rootProps,
561
+ onComponentLoaded: function onComponentLoaded(element) {
562
+ self.currentElement = element;
563
+ self.parentElement = element.parentElement;
564
+ util_setImmediate(function () {
565
+ return animateIn(element, 'show');
566
+ });
567
+ }
568
+ })));
569
+ defineGetterProperty(providerProps.value, 'active', function () {
570
+ return self.currentView === view;
571
+ });
572
+ self.currentView = view;
573
+ }
574
+
575
+ return /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(external_commonjs_react_commonjs2_react_amd_react_root_React_.Fragment, null, self.prevView, self.currentView);
576
+ },
577
+ getViewComponent: function getViewComponent() {
578
+ var props = this.props;
579
+ return any(props.views, isViewMatched) || history.state === stateId && void redirectTo(props.defaultView);
580
+ }
581
+ });
582
+ function useViewContainerState() {
583
+ return external_commonjs_react_commonjs2_react_amd_react_root_React_.useContext(StateContext);
584
+ }
585
+ function isViewMatched(view) {
586
+ var params = routeMap.get(view);
587
+ return !!params && false === any(params.matchers, function (v, i) {
588
+ var value = app_app.route[i] || '';
589
+ return isFunction(v) ? !v(value) : (v || '') !== value;
590
+ });
591
+ }
592
+ function registerView(factory, routeParams) {
593
+ var Component = function Component(props) {
594
+ var Component = (0,external_zeta_dom_react_.useAsync)(factory)[0];
595
+ return /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement('div', extend({}, props.rootProps, {
596
+ ref: function ref(element) {
597
+ if (element && Component) {
598
+ (props.onComponentLoaded || noop)(element);
599
+ }
600
+ },
601
+ children: Component && /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(Component["default"])
602
+ }));
603
+ };
604
+
605
+ routeParams = extend({}, routeParams);
606
+ each(routeParams, function (i, v) {
607
+ usedParams[i] = true;
608
+
609
+ if (v instanceof RegExp) {
610
+ routeParams[i] = v.test.bind(v);
611
+ }
612
+ });
613
+ routeMap.set(Component, {
614
+ id: randomId(),
615
+ matchCount: keys(routeParams).length,
616
+ matchers: routeParams,
617
+ params: pick(routeParams, function (v) {
618
+ return typeof v === 'string';
619
+ })
620
+ });
621
+ return Component;
622
+ }
623
+ function renderView() {
624
+ var views = makeArray(arguments);
625
+ var rootProps = isFunction(views[0]) ? {} : views.shift();
626
+ var defaultView = views[0];
627
+ views.sort(function (a, b) {
628
+ return (routeMap.get(b) || {}).matchCount - (routeMap.get(a) || {}).matchCount;
629
+ });
630
+ return /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(ViewContainer, {
631
+ rootProps: rootProps,
632
+ views: views,
633
+ defaultView: defaultView
634
+ });
635
+ }
636
+ function linkTo(view, params) {
637
+ var viewParams = (routeMap.get(view) || {}).params;
638
+ var newParams = {};
639
+
640
+ for (var i in app_app.route) {
641
+ if (viewParams && i in viewParams) {
642
+ newParams[i] = viewParams[i];
643
+ } else if (params && i in params) {
644
+ newParams[i] = params[i];
645
+ } else if (!usedParams[i]) {
646
+ newParams[i] = app_app.route[i];
647
+ }
648
+ }
649
+
650
+ return app_app.route.getPath(newParams);
651
+ }
652
+ function navigateTo(view, params) {
653
+ return app_app.navigate(linkTo(view, params));
654
+ }
655
+ function redirectTo(view, params) {
656
+ return app_app.navigate(linkTo(view, params), true);
657
+ }
478
658
  ;// CONCATENATED MODULE: ./src/hooks.js
479
659
 
480
660
 
481
661
 
662
+
663
+
664
+ var states = {};
665
+
666
+ function getCurrentStates() {
667
+ return states[history.state] || (states[history.state] = {});
668
+ }
669
+
482
670
  function useAppReady() {
483
671
  var sReady = (0,external_commonjs_react_commonjs2_react_amd_react_root_React_.useState)(false);
484
672
  var ready = sReady[0],
@@ -491,24 +679,75 @@ function useAppReady() {
491
679
  return ready;
492
680
  }
493
681
  function useRouteParam(name, defaultValue) {
494
- var sValue = (0,external_commonjs_react_commonjs2_react_amd_react_root_React_.useState)(app_app.route[name]);
682
+ var container = useViewContainerState();
683
+ var route = app_app.route;
684
+ var sValue = (0,external_commonjs_react_commonjs2_react_amd_react_root_React_.useState)(route[name]);
495
685
  var value = sValue[0],
496
686
  setValue = sValue[1];
497
687
  (0,external_commonjs_react_commonjs2_react_amd_react_root_React_.useEffect)(function () {
498
- var current = app_app.route[name]; // route parameter might be changed after state initialization and before useEffect hook is called
688
+ var current = route[name]; // route parameter might be changed after state initialization and before useEffect hook is called
499
689
 
500
690
  setValue(current);
501
- return app_app.route.watch(name, setValue);
691
+
692
+ if (name in route) {
693
+ return route.watch(name, function (value) {
694
+ util_setImmediate(function () {
695
+ if (container.active) {
696
+ setValue(value);
697
+ }
698
+ });
699
+ });
700
+ }
701
+
702
+ console.error('Route parameter ' + name + ' does not exist');
502
703
  }, [name, defaultValue]);
503
704
 
504
705
  if (!value && defaultValue !== undefined) {
505
- app_app.navigate(app_app.route.getPath(extend({}, app_app.route, kv(name, defaultValue))), true);
706
+ app_app.navigate(route.getPath(extend({}, route, kv(name, defaultValue))), true);
506
707
  }
507
708
 
508
709
  return value || '';
509
710
  }
510
- // EXTERNAL MODULE: external "zeta-dom-react"
511
- var external_zeta_dom_react_ = __webpack_require__(103);
711
+ function useRouteState(key, defaultValue) {
712
+ var container = useViewContainerState();
713
+ var cur = getCurrentStates();
714
+ var state = (0,external_commonjs_react_commonjs2_react_amd_react_root_React_.useState)(key in cur ? cur[key] : defaultValue);
715
+
716
+ if (container.active) {
717
+ cur[key] = state[0];
718
+ }
719
+
720
+ return state;
721
+ }
722
+ function ViewStateContainer(props) {
723
+ var container = useViewContainerState();
724
+ var provider = (0,external_commonjs_react_commonjs2_react_amd_react_root_React_.useState)(function () {
725
+ var cache = {};
726
+ return {
727
+ getState: function getState(uniqueId, key) {
728
+ var cur = getCurrentStates();
729
+ var state = cache[uniqueId] || (cache[uniqueId] = {
730
+ value: cur[key] && cur[key].value,
731
+ get: function get() {
732
+ return state.value;
733
+ },
734
+ set: function set(value) {
735
+ state.value = value;
736
+ }
737
+ });
738
+
739
+ if (container.active) {
740
+ cur[key] = state;
741
+ }
742
+
743
+ return state;
744
+ }
745
+ };
746
+ })[0];
747
+ return /*#__PURE__*/(0,external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement)(external_zeta_dom_react_.ViewStateProvider, {
748
+ value: provider
749
+ }, props.children);
750
+ }
512
751
  // EXTERNAL MODULE: ./src/include/external/waterpipe.js
513
752
  var waterpipe = __webpack_require__(43);
514
753
  ;// CONCATENATED MODULE: ./src/i18n.js
@@ -571,28 +810,29 @@ function makeTranslation(resources, defaultLang) {
571
810
  return getTranslation(prefix, name, data, noEncode) || key;
572
811
  }
573
812
 
574
- function useTranslation() {
813
+ function getTranslationCallback() {
575
814
  var prefix = makeArray(arguments);
576
- var language = useLanguage();
577
- var t = translate;
578
-
579
- if (prefix[0]) {
580
- var key = prefix.join(' ');
581
- t = cache[key] || (cache[key] = createCallback(function (key, data, noEncode) {
582
- return single(prefix, function (v) {
583
- return getTranslation(v, key, data, noEncode);
584
- }) || key;
585
- }));
586
- }
815
+ var key = prefix.join(' ');
816
+ return cache[key] || (cache[key] = createCallback(function (key, data, noEncode) {
817
+ return single(prefix, function (v) {
818
+ return getTranslation(v, key, data, noEncode);
819
+ }) || key;
820
+ }));
821
+ }
587
822
 
823
+ function useTranslation() {
824
+ var language = useLanguage();
825
+ var t = getTranslationCallback.apply(0, arguments);
588
826
  return {
589
827
  language: language,
590
828
  t: t
591
829
  };
592
830
  }
593
831
 
832
+ cache[''] = createCallback(translate);
594
833
  return {
595
- translate: createCallback(translate),
834
+ translate: cache[''],
835
+ getTranslation: getTranslationCallback,
596
836
  useTranslation: useTranslation
597
837
  };
598
838
  }
@@ -1223,144 +1463,6 @@ function useMixinRef(mixin) {
1223
1463
  return mixin && mixin.getMixin().reset();
1224
1464
  }
1225
1465
 
1226
- ;// CONCATENATED MODULE: ./tmp/brew-js/anim.js
1227
-
1228
- var animateIn = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.animateIn,
1229
- animateOut = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.animateOut,
1230
- addAnimateIn = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.addAnimateIn,
1231
- addAnimateOut = external_commonjs_brew_js_commonjs2_brew_js_amd_brew_js_root_brew_.addAnimateOut;
1232
-
1233
- ;// CONCATENATED MODULE: ./src/include/brew-js/anim.js
1234
-
1235
- ;// CONCATENATED MODULE: ./src/view.js
1236
-
1237
-
1238
-
1239
-
1240
-
1241
- var routeMap = new Map();
1242
- var stateId;
1243
-
1244
- function ViewContainer() {
1245
- /** @type {any} */
1246
- var self = this;
1247
- external_commonjs_react_commonjs2_react_amd_react_root_React_.Component.apply(self, arguments);
1248
- self.mounted = false;
1249
-
1250
- if (!stateId) {
1251
- stateId = history.state;
1252
- app_app.on('navigate', function () {
1253
- stateId = history.state;
1254
- });
1255
- }
1256
-
1257
- self.componentWillUnmount = app_app.on('navigate', function () {
1258
- if (self.mounted && self.getViewComponent()) {
1259
- self.forceUpdate();
1260
- }
1261
- });
1262
- }
1263
-
1264
- definePrototype(ViewContainer, external_commonjs_react_commonjs2_react_amd_react_root_React_.Component, {
1265
- componentDidMount: function componentDidMount() {
1266
- this.mounted = true;
1267
- },
1268
- render: function render() {
1269
- /** @type {any} */
1270
- var self = this;
1271
- var V = self.getViewComponent();
1272
-
1273
- if (V && V !== self.currentViewComponent) {
1274
- self.currentViewComponent = V;
1275
-
1276
- if (self.currentView && self.currentElement) {
1277
- self.prevView = self.currentView;
1278
- self.prevElement = self.currentElement;
1279
- self.currentElement = undefined;
1280
- animateOut(self.prevElement, 'show').then(function () {
1281
- self.prevElement = undefined;
1282
- self.prevView = undefined;
1283
- self.forceUpdate();
1284
- });
1285
- }
1286
-
1287
- self.currentView = /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(V, {
1288
- key: routeMap.get(V).id,
1289
- rootProps: self.props.rootProps,
1290
- onComponentLoaded: function onComponentLoaded(element) {
1291
- self.currentElement = element;
1292
- util_setImmediate(function () {
1293
- return animateIn(element, 'show');
1294
- });
1295
- }
1296
- });
1297
- }
1298
-
1299
- return /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(external_commonjs_react_commonjs2_react_amd_react_root_React_.Fragment, null, self.prevView, self.currentView);
1300
- },
1301
- getViewComponent: function getViewComponent() {
1302
- var props = this.props;
1303
- return any(props.views, isViewMatched) || history.state === stateId && void redirectTo(props.defaultView);
1304
- }
1305
- });
1306
- function isViewMatched(view) {
1307
- var params = routeMap.get(view);
1308
- return !!params && !any(params.matchers, function (v, i) {
1309
- var value = app_app.route[i] || '';
1310
- return isFunction(v) ? !v(value) : (v || '') !== value;
1311
- });
1312
- }
1313
- function registerView(factory, routeParams) {
1314
- var Component = function Component(props) {
1315
- var Component = (0,external_zeta_dom_react_.useAsync)(factory)[0];
1316
- return /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement('div', extend({}, props.rootProps, {
1317
- ref: function ref(element) {
1318
- if (element && Component) {
1319
- (props.onComponentLoaded || noop)(element);
1320
- }
1321
- },
1322
- children: Component && /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(Component["default"])
1323
- }));
1324
- };
1325
-
1326
- routeParams = extend({}, routeParams);
1327
- each(routeParams, function (i, v) {
1328
- if (v instanceof RegExp) {
1329
- routeParams[i] = v.test.bind(v);
1330
- }
1331
- });
1332
- routeMap.set(Component, {
1333
- id: randomId(),
1334
- matchCount: keys(routeParams).length,
1335
- matchers: routeParams,
1336
- params: pick(routeParams, function (v) {
1337
- return typeof v === 'string';
1338
- })
1339
- });
1340
- return Component;
1341
- }
1342
- function renderView() {
1343
- var views = makeArray(arguments);
1344
- var rootProps = isFunction(views[0]) ? {} : views.shift();
1345
- var defaultView = views[0];
1346
- views.sort(function (a, b) {
1347
- return (routeMap.get(b) || {}).matchCount - (routeMap.get(a) || {}).matchCount;
1348
- });
1349
- return /*#__PURE__*/external_commonjs_react_commonjs2_react_amd_react_root_React_.createElement(ViewContainer, {
1350
- rootProps: rootProps,
1351
- views: views,
1352
- defaultView: defaultView
1353
- });
1354
- }
1355
- function linkTo(view, params) {
1356
- return app_app.route.getPath(extend({}, app_app.route, params, (routeMap.get(view) || {}).params));
1357
- }
1358
- function navigateTo(view, params) {
1359
- return app_app.navigate(linkTo(view, params));
1360
- }
1361
- function redirectTo(view, params) {
1362
- return app_app.navigate(linkTo(view, params), true);
1363
- }
1364
1466
  ;// CONCATENATED MODULE: ./src/index.js
1365
1467
 
1366
1468
  /* harmony default export */ const src = (brew_js_app);