@steroidsjs/core 2.1.0-beta.9 → 2.1.0-beta.9.1

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.
Files changed (58) hide show
  1. package/actions/list.d.ts +1 -0
  2. package/actions/list.js +1 -0
  3. package/components/ClientStorageComponent.d.ts +3 -3
  4. package/components/ClientStorageComponent.js +28 -22
  5. package/components/HttpComponent.js +32 -15
  6. package/components/LocaleComponent.js +9 -9
  7. package/components/MetricsComponent.js +3 -1
  8. package/components/StoreComponent.d.ts +6 -0
  9. package/components/StoreComponent.js +5 -6
  10. package/components/UiComponent.d.ts +1 -1
  11. package/components/WebSocketComponent.d.ts +1 -1
  12. package/hoc/components.d.ts +1 -1
  13. package/hoc/components.js +1 -1
  14. package/hooks/index.d.ts +2 -1
  15. package/hooks/index.js +3 -1
  16. package/hooks/useApplication.d.ts +29 -26
  17. package/hooks/useApplication.js +17 -82
  18. package/hooks/useComponents.d.ts +1 -14
  19. package/hooks/useComponents.js +5 -5
  20. package/hooks/useFetch.d.ts +11 -3
  21. package/hooks/useFetch.js +35 -31
  22. package/hooks/useLayout.d.ts +9 -0
  23. package/hooks/useLayout.js +64 -44
  24. package/hooks/useList.d.ts +45 -0
  25. package/hooks/useList.js +83 -53
  26. package/hooks/useModel.js +1 -1
  27. package/hooks/useScreen.d.ts +1 -1
  28. package/hooks/useScreen.js +2 -2
  29. package/hooks/useSsr.d.ts +2 -0
  30. package/hooks/useSsr.js +8 -0
  31. package/package.json +5 -3
  32. package/providers/ComponentsProvider.d.ts +26 -0
  33. package/providers/ComponentsProvider.js +28 -0
  34. package/providers/ScreenProvider.d.ts +20 -0
  35. package/providers/ScreenProvider.js +87 -0
  36. package/providers/SsrProvider.d.ts +17 -0
  37. package/providers/SsrProvider.js +32 -0
  38. package/providers/index.d.ts +4 -0
  39. package/providers/index.js +12 -0
  40. package/reducers/form.d.ts +1 -1
  41. package/reducers/form.js +1 -1
  42. package/reducers/list.js +1 -3
  43. package/reducers/router.js +1 -1
  44. package/ui/crud/Crud/Crud.d.ts +1 -1
  45. package/ui/crud/index.d.ts +1 -0
  46. package/ui/form/TextField/TextField.d.ts +2 -1
  47. package/ui/form/TextField/TextField.js +1 -1
  48. package/ui/icon/Icon/Icon.js +3 -0
  49. package/ui/layout/Meta/Meta.d.ts +56 -0
  50. package/ui/layout/Meta/Meta.js +36 -0
  51. package/ui/layout/Meta/index.d.ts +2 -0
  52. package/ui/layout/Meta/index.js +7 -0
  53. package/ui/layout/Notifications/Notifications.js +1 -1
  54. package/ui/layout/Portal.js +3 -0
  55. package/ui/nav/Router/Router.d.ts +13 -0
  56. package/ui/nav/Router/Router.js +1 -1
  57. package/ui/nav/Router/SsrProvider.d.ts +0 -15
  58. package/ui/nav/Router/SsrProvider.js +0 -55
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "2.1.0-beta.9",
3
+ "version": "2.1.0-beta.9.1",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -43,13 +43,15 @@
43
43
  "react-day-picker": "^7.4.8",
44
44
  "react-dom": "^17.0.2",
45
45
  "react-grid-gallery": "^0.4.8",
46
+ "react-helmet": "^6.1.0",
46
47
  "react-input-mask": "^3.0.0-alpha.2",
47
48
  "react-redux": "^7.1.1",
48
49
  "react-router": "^5.2.0",
49
50
  "react-router-dom": "^5.2.0",
50
51
  "react-use": "^17.1.0",
51
52
  "redux": "^4.0.4",
52
- "redux-mock-store": "^1.5.4"
53
+ "redux-mock-store": "^1.5.4",
54
+ "set-cookie-parser": "^2.4.8"
53
55
  },
54
56
  "devDependencies": {
55
57
  "@babel/cli": "^7.13.14",
@@ -58,12 +60,12 @@
58
60
  "@babel/preset-react": "^7.13.13",
59
61
  "@babel/preset-typescript": "^7.13.0",
60
62
  "@types/enzyme": "^3.10.8",
63
+ "@types/enzyme-adapter-react-16": "^1.0.6",
61
64
  "@types/jest": "^26.0.22",
62
65
  "@types/markdown-to-jsx": "^6.11.3",
63
66
  "@types/reach__router": "^1.3.7",
64
67
  "@types/react": "=17.0.3",
65
68
  "@types/react-color": "^3.0.4",
66
- "@types/enzyme-adapter-react-16": "^1.0.6",
67
69
  "@types/react-syntax-highlighter": "^13.5.0",
68
70
  "@types/webpack-env": "^1.16.0",
69
71
  "@typescript-eslint/eslint-plugin": "^4.15.0",
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+ import { PropsWithChildren } from 'react';
3
+ declare global {
4
+ interface Window {
5
+ SteroidsComponents: IComponents;
6
+ }
7
+ }
8
+ export interface IComponents {
9
+ api?: any;
10
+ clientStorage?: any;
11
+ html?: any;
12
+ http?: any;
13
+ locale?: any;
14
+ store?: any;
15
+ ui?: any;
16
+ resource?: any;
17
+ ws?: any;
18
+ pushNotification?: any;
19
+ meta?: any;
20
+ [key: string]: any;
21
+ }
22
+ export interface IComponentsProviderProps extends PropsWithChildren<any> {
23
+ components: IComponents;
24
+ }
25
+ export declare const ComponentsContext: React.Context<IComponents>;
26
+ export default function ComponentsProvider(props: IComponentsProviderProps): JSX.Element;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ exports.__esModule = true;
22
+ exports.ComponentsContext = void 0;
23
+ var React = __importStar(require("react"));
24
+ exports.ComponentsContext = React.createContext({});
25
+ function ComponentsProvider(props) {
26
+ return (React.createElement(exports.ComponentsContext.Provider, { value: props.components }, props.children));
27
+ }
28
+ exports["default"] = ComponentsProvider;
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { PropsWithChildren } from 'react';
3
+ export interface IScreen {
4
+ width: number;
5
+ media: Record<string, any>;
6
+ setMedia: any;
7
+ isPhone: () => boolean;
8
+ isTablet: () => boolean;
9
+ isDesktop: () => boolean;
10
+ getDeviceType: () => string;
11
+ }
12
+ export declare const ScreenContext: React.Context<IScreen>;
13
+ export interface IScreenProviderProps extends PropsWithChildren<any> {
14
+ media?: Record<string, any>;
15
+ skipTimeout?: boolean;
16
+ }
17
+ export declare const SCREEN_PHONE = "phone";
18
+ export declare const SCREEN_TABLET = "tablet";
19
+ export declare const SCREEN_DESKTOP = "desktop";
20
+ export default function ScreenProvider(props: IScreenProviderProps): JSX.Element;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ exports.__esModule = true;
22
+ exports.SCREEN_DESKTOP = exports.SCREEN_TABLET = exports.SCREEN_PHONE = exports.ScreenContext = void 0;
23
+ var React = __importStar(require("react"));
24
+ var react_1 = require("react");
25
+ var react_use_1 = require("react-use");
26
+ exports.ScreenContext = React.createContext({});
27
+ exports.SCREEN_PHONE = 'phone';
28
+ exports.SCREEN_TABLET = 'tablet';
29
+ exports.SCREEN_DESKTOP = 'desktop';
30
+ function ScreenProvider(props) {
31
+ var _a;
32
+ var _b = react_1.useState(!process.env.IS_SSR ? window.innerWidth : 1280), width = _b[0], setWidth = _b[1];
33
+ var _c = react_1.useState(props.media || (_a = {},
34
+ _a[exports.SCREEN_PHONE] = 320,
35
+ _a[exports.SCREEN_TABLET] = 768,
36
+ _a[exports.SCREEN_DESKTOP] = 1024,
37
+ _a)), media = _c[0], setMedia = _c[1];
38
+ var timer = null;
39
+ var onResize = function () {
40
+ if (timer) {
41
+ clearTimeout(timer);
42
+ }
43
+ if (props.skipTimeout) {
44
+ setWidth(window.innerWidth);
45
+ }
46
+ else {
47
+ timer = setTimeout(function () { return setWidth(window.innerWidth); }, 100);
48
+ }
49
+ };
50
+ react_use_1.useMount(function () {
51
+ window.addEventListener('resize', onResize, false);
52
+ });
53
+ react_use_1.useUnmount(function () {
54
+ window.removeEventListener('resize', onResize);
55
+ });
56
+ var getDeviceType = react_1.useCallback(function () {
57
+ if (width < media[exports.SCREEN_TABLET]) {
58
+ return exports.SCREEN_PHONE;
59
+ }
60
+ if (width < media[exports.SCREEN_DESKTOP]) {
61
+ return exports.SCREEN_TABLET;
62
+ }
63
+ return exports.SCREEN_DESKTOP;
64
+ }, [width, media]);
65
+ var isPhone = react_1.useCallback(function () { return getDeviceType() === exports.SCREEN_PHONE; }, [getDeviceType]);
66
+ var isTablet = react_1.useCallback(function () { return getDeviceType() === exports.SCREEN_TABLET; }, [getDeviceType]);
67
+ var isDesktop = react_1.useCallback(function () { return getDeviceType() === exports.SCREEN_DESKTOP; }, [getDeviceType]);
68
+ var value = react_1.useMemo(function () { return ({
69
+ width: width,
70
+ media: media,
71
+ setMedia: setMedia,
72
+ isPhone: isPhone,
73
+ isTablet: isTablet,
74
+ isDesktop: isDesktop,
75
+ getDeviceType: getDeviceType
76
+ }); }, [
77
+ width,
78
+ media,
79
+ setMedia,
80
+ isPhone,
81
+ isTablet,
82
+ isDesktop,
83
+ getDeviceType,
84
+ ]);
85
+ return (React.createElement(exports.ScreenContext.Provider, { value: value }, props.children));
86
+ }
87
+ exports["default"] = ScreenProvider;
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ import { PropsWithChildren } from 'react';
3
+ import { StaticRouterContext } from 'react-router';
4
+ export interface IPreloadedData {
5
+ [configId: string]: any;
6
+ }
7
+ export interface ISsr {
8
+ history?: {
9
+ initialEntries: string[];
10
+ };
11
+ staticContext?: StaticRouterContext;
12
+ preloadedData?: IPreloadedData;
13
+ }
14
+ export declare const SsrProviderContext: React.Context<ISsr>;
15
+ export interface ISsrProviderProps extends ISsr, PropsWithChildren<any> {
16
+ }
17
+ export default function SsrProvider(props: ISsrProviderProps): JSX.Element;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ exports.__esModule = true;
22
+ exports.SsrProviderContext = void 0;
23
+ var React = __importStar(require("react"));
24
+ exports.SsrProviderContext = React.createContext(null);
25
+ function SsrProvider(props) {
26
+ return (React.createElement(exports.SsrProviderContext.Provider, { value: {
27
+ history: props.history,
28
+ staticContext: props.staticContext,
29
+ preloadedData: props.preloadedData
30
+ } }, props.children));
31
+ }
32
+ exports["default"] = SsrProvider;
@@ -0,0 +1,4 @@
1
+ import SsrProvider from '@steroidsjs/core/providers/SsrProvider';
2
+ import ScreenProvider from '@steroidsjs/core/providers/ScreenProvider';
3
+ import ComponentsProvider from '@steroidsjs/core/providers/ComponentsProvider';
4
+ export { SsrProvider, ScreenProvider, ComponentsProvider };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ exports.ComponentsProvider = exports.ScreenProvider = exports.SsrProvider = void 0;
7
+ var SsrProvider_1 = __importDefault(require("@steroidsjs/core/providers/SsrProvider"));
8
+ exports.SsrProvider = SsrProvider_1["default"];
9
+ var ScreenProvider_1 = __importDefault(require("@steroidsjs/core/providers/ScreenProvider"));
10
+ exports.ScreenProvider = ScreenProvider_1["default"];
11
+ var ComponentsProvider_1 = __importDefault(require("@steroidsjs/core/providers/ComponentsProvider"));
12
+ exports.ComponentsProvider = ComponentsProvider_1["default"];
@@ -4,6 +4,6 @@
4
4
  * @param action
5
5
  */
6
6
  export declare function reducerItem(state: any, action: any): any;
7
- declare const _default: (state: {}, action: any) => {};
7
+ declare const _default: (state: {}, action: any) => any;
8
8
  export default _default;
9
9
  export declare const formSelector: (state: any, formId: any, selector: any) => any;
package/reducers/form.js CHANGED
@@ -58,7 +58,7 @@ var initialState = {};
58
58
  exports["default"] = (function (state, action) {
59
59
  if (state === void 0) { state = initialState; }
60
60
  if (action.formId) {
61
- state[action.formId] = reducerItem(state[action.formId], action);
61
+ return dot_prop_immutable_1.set(state, action.formId, reducerItem(state[action.formId], action));
62
62
  }
63
63
  return state;
64
64
  });
package/reducers/list.js CHANGED
@@ -32,9 +32,7 @@ var reducerMap = (_a = {},
32
32
  },
33
33
  _a[list_1.LIST_SET_ITEMS] = function (state, action) {
34
34
  var _a;
35
- return (__assign(__assign({}, state), { lists: __assign(__assign({}, state.lists), (_a = {}, _a[action.listId] = {
36
- items: action.items
37
- }, _a)) }));
35
+ return (__assign(__assign({}, state), { lists: __assign(__assign({}, state.lists), (_a = {}, _a[action.listId] = __assign(__assign({}, state.lists[action.listId]), { items: action.items }), _a)) }));
38
36
  },
39
37
  _a[list_1.LIST_BEFORE_FETCH] = function (state, action) {
40
38
  var _a;
@@ -95,7 +95,7 @@ exports.buildUrl = buildUrl;
95
95
  */
96
96
  var checkIsActive = function (state, item) {
97
97
  // Check is active
98
- var pathname = window.location.protocol === 'file:'
98
+ var pathname = !process.env.IS_SSR && window.location.protocol === 'file:'
99
99
  ? window.location.hash.replace(/^#/, '')
100
100
  : get_1["default"](state, 'location.pathname');
101
101
  var checkActive = function (subPathname, subItem) {
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { IApiRest } from '../../../components/ApiComponent';
4
- import { IComponents } from '../../../hooks/useComponents';
4
+ import { IComponents } from '../../../providers/ComponentsProvider';
5
5
  import { IComponentsHocOutput } from '../../../hoc/components';
6
6
  import { IConnectHocOutput } from '../../../hoc/connect';
7
7
  import { IFormProps } from '../../form/Form/Form';
@@ -31,4 +31,5 @@ export declare const generateCrud: (routeId: string, props: ICrudGeneratorProps)
31
31
  items?: IRouteItem[] | {
32
32
  [key: string]: IRouteItem;
33
33
  };
34
+ preloadData?: (match: Record<string, any>) => (import("../../hooks/useFetch").IFetchConfig | import("../list/List/List").IListProps)[];
34
35
  };
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { KeyboardEventHandler } from 'react';
2
3
  import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../Field/fieldWrapper';
3
4
  /**
4
5
  * TextField
@@ -35,7 +36,7 @@ export interface ITextFieldViewProps extends ITextFieldProps, IFieldWrapperOutpu
35
36
  inputProps: {
36
37
  name: string;
37
38
  onChange: (value: string | React.ChangeEvent) => void;
38
- onKeyUp: (e: Event | React.KeyboardEvent) => void;
39
+ onKeyUp: KeyboardEventHandler<HTMLTextAreaElement>;
39
40
  value: string | number;
40
41
  placeholder: string;
41
42
  disabled: boolean;
@@ -30,7 +30,7 @@ function TextField(props) {
30
30
  // TODO This is not worked in redux... =(
31
31
  // dispatch(submit(props.formId));
32
32
  }
33
- }, [dispatch, props.formId, props.submitOnEnter]);
33
+ }, [props.formId, props.submitOnEnter]);
34
34
  var onChange = react_1.useCallback(function (e) { return props.input.onChange.call(null, e.target ? e.target.value : e.nativeEvent.text); }, [props.input.onChange]);
35
35
  var inputProps = react_1.useMemo(function () { return (__assign({ name: props.input.name, value: props.input.value || '', onChange: onChange,
36
36
  onKeyUp: onKeyUp, placeholder: props.placeholder, disabled: props.disabled }, props.inputProps)); }, [onKeyUp, onChange, props.disabled, props.input.name, props.input.value, props.inputProps, props.placeholder]);
@@ -20,6 +20,9 @@ var hooks_1 = require("../../../hooks");
20
20
  function Icon(props) {
21
21
  var components = hooks_1.useComponents();
22
22
  var name = props.name;
23
+ if (!isString_1["default"](name)) {
24
+ return null;
25
+ }
23
26
  var icon;
24
27
  if (process.env.PLATFORM === 'mobile') {
25
28
  icon = components.ui.getIcon(name) || name;
@@ -0,0 +1,56 @@
1
+ import { BaseHTMLAttributes, LinkHTMLAttributes, MetaHTMLAttributes, PropsWithChildren, ScriptHTMLAttributes, StyleHTMLAttributes } from 'react';
2
+ interface IInnerHTML {
3
+ /**
4
+ * Содержимое тега
5
+ */
6
+ innerHtml?: string;
7
+ }
8
+ interface IScript extends ScriptHTMLAttributes<any>, IInnerHTML {
9
+ }
10
+ interface IStyle extends StyleHTMLAttributes<any>, IInnerHTML {
11
+ }
12
+ /**
13
+ * Meta
14
+ * Компонент используется для ssr и нужен для конфигурации html-тегов в документе.
15
+ */
16
+ interface IMetaProps extends PropsWithChildren<any> {
17
+ /**
18
+ * Заголовок документа
19
+ * @example Home page
20
+ */
21
+ title?: string;
22
+ /**
23
+ * Описание документа
24
+ * @example The main page of the site
25
+ */
26
+ description?: string;
27
+ /**
28
+ * Скрипты, которые необходимо разместить на сайте
29
+ * @example [{src: '/lib/SomeLibrary.min.js'}]
30
+ */
31
+ scripts?: IScript[];
32
+ /**
33
+ * Мета-теги
34
+ * @example [{name: 'yandex-verification', content: 'ce...9e6'}]
35
+ */
36
+ meta?: MetaHTMLAttributes<any>[];
37
+ /**
38
+ * Ссылки на ресурсы
39
+ * @example [{href: '/lib/SomeLibrary.css', rel: 'stylesheet', type: 'text/css'}]
40
+ */
41
+ links?: LinkHTMLAttributes<any>[];
42
+ /**
43
+ * Контент для тегов \<style\>
44
+ */
45
+ styles?: IStyle[];
46
+ /**
47
+ * Контент для тегов \<noscript\>
48
+ */
49
+ noScripts?: IInnerHTML[];
50
+ /**
51
+ * Конфигурация тега \<base\>
52
+ */
53
+ base?: BaseHTMLAttributes<any>;
54
+ }
55
+ declare function Meta(props: IMetaProps): JSX.Element;
56
+ export default Meta;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ exports.__esModule = true;
17
+ var react_1 = __importDefault(require("react"));
18
+ var react_helmet_1 = __importDefault(require("react-helmet"));
19
+ function Meta(props) {
20
+ var _a, _b, _c, _d, _e;
21
+ return (react_1["default"].createElement(react_helmet_1["default"], null,
22
+ react_1["default"].createElement("title", null, props.title),
23
+ props.base && react_1["default"].createElement("base", __assign({}, props.base)),
24
+ props.description && react_1["default"].createElement("meta", { name: 'description', content: props.description }), (_a = props.meta) === null || _a === void 0 ? void 0 :
25
+ _a.map(function (attrs, index) { return react_1["default"].createElement("meta", __assign({ key: index }, attrs)); }), (_b = props.links) === null || _b === void 0 ? void 0 :
26
+ _b.map(function (attrs, index) { return react_1["default"].createElement("link", __assign({ key: index }, attrs)); }), (_c = props.styles) === null || _c === void 0 ? void 0 :
27
+ _c.map(function (attrs, index) { return (react_1["default"].createElement("style", __assign({ key: index }, attrs, { dangerouslySetInnerHTML: {
28
+ __html: attrs.innerHtml
29
+ } }))); }), (_d = props.scripts) === null || _d === void 0 ? void 0 :
30
+ _d.map(function (attrs, index) { return (react_1["default"].createElement("script", __assign({ key: index }, attrs), attrs.innerHtml || '')); }), (_e = props.noScripts) === null || _e === void 0 ? void 0 :
31
+ _e.map(function (attrs, index) { return (react_1["default"].createElement("noscript", { key: index, dangerouslySetInnerHTML: {
32
+ __html: attrs.innerHtml
33
+ } })); }),
34
+ props.children));
35
+ }
36
+ exports["default"] = Meta;
@@ -0,0 +1,2 @@
1
+ import Meta from './Meta';
2
+ export default Meta;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ var Meta_1 = __importDefault(require("./Meta"));
7
+ exports["default"] = Meta_1["default"];
@@ -54,7 +54,7 @@ function Notifications(props) {
54
54
  if (props.initialFlashes) {
55
55
  dispatch(notifications_1.setFlashes(props.initialFlashes));
56
56
  // Disable scroll or scroll to top on show notifications
57
- if (typeof window !== 'undefined') {
57
+ if (!process.env.IS_SSR) {
58
58
  if ('scrollRestoration' in window.history) {
59
59
  window.history.scrollRestoration = 'manual';
60
60
  }
@@ -21,6 +21,9 @@ function Portal(props) {
21
21
  document.body.removeChild(elementRef.current);
22
22
  }
23
23
  });
24
+ if (process.env.IS_SSR) {
25
+ return null;
26
+ }
24
27
  return react_dom_1.createPortal(props.children, elementRef.current);
25
28
  }
26
29
  exports["default"] = Portal;
@@ -1,4 +1,6 @@
1
1
  import * as React from 'react';
2
+ import { IFetchConfig } from '@steroidsjs/core/hooks/useFetch';
3
+ import { IListProps } from '@steroidsjs/core/ui/list/List/List';
2
4
  import { IFetchHocConfigFunc } from '../../../hoc/fetch';
3
5
  /**
4
6
  * Router
@@ -89,6 +91,17 @@ export interface IRouteItem {
89
91
  items?: IRouteItem[] | {
90
92
  [key: string]: IRouteItem;
91
93
  };
94
+ /**
95
+ * Обработчик, который принимает параметры URL и возвращает массив с пропсами для хука useFetch и компонента
96
+ * List.
97
+ * Функция запускается перед рендерингом приложения в режиме SSR и используется для предварительной
98
+ * загрузки данных, необходимых на текущей странице.
99
+ * Хук useFetch и компонент List не будут повторно инициализироваться и делать запросы на клиенте,
100
+ * если подгруженные данные существуют.
101
+ * @param {Object} match
102
+ * @return {Array} Например, [{url: '/api/v1/some-data'}, {listId: 'someList', action: '/api/v1/some-list'}]
103
+ */
104
+ preloadData?: (match: Record<string, any>) => (IFetchConfig | IListProps)[];
92
105
  [key: string]: any;
93
106
  }
94
107
  export interface IRouterProps {
@@ -49,7 +49,7 @@ var hoc_1 = require("../../../hoc");
49
49
  var router_1 = require("../../../actions/router");
50
50
  var useDispatch_1 = __importDefault(require("../../../hooks/useDispatch"));
51
51
  var router_2 = require("../../../reducers/router");
52
- var SsrProvider_1 = require("./SsrProvider");
52
+ var SsrProvider_1 = require("../../../providers/SsrProvider");
53
53
  var findRedirectPathRecursive = function (route) {
54
54
  if (!route) {
55
55
  return null;
@@ -1,15 +0,0 @@
1
- import * as React from 'react';
2
- interface ISsrProviderContext {
3
- history?: any;
4
- staticContext?: any;
5
- }
6
- export declare const SsrProviderContext: React.Context<ISsrProviderContext>;
7
- interface ISsrProviderProps {
8
- history?: any;
9
- store?: any;
10
- staticContext?: any;
11
- }
12
- export default class SsrProvider extends React.PureComponent<ISsrProviderProps> {
13
- render(): JSX.Element;
14
- }
15
- export {};
@@ -1,55 +0,0 @@
1
- "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || function (mod) {
30
- if (mod && mod.__esModule) return mod;
31
- var result = {};
32
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
- __setModuleDefault(result, mod);
34
- return result;
35
- };
36
- exports.__esModule = true;
37
- exports.SsrProviderContext = void 0;
38
- var React = __importStar(require("react"));
39
- var react_redux_1 = require("react-redux");
40
- exports.SsrProviderContext = React.createContext(null);
41
- var SsrProvider = /** @class */ (function (_super) {
42
- __extends(SsrProvider, _super);
43
- function SsrProvider() {
44
- return _super !== null && _super.apply(this, arguments) || this;
45
- }
46
- SsrProvider.prototype.render = function () {
47
- return (React.createElement(exports.SsrProviderContext.Provider, { value: {
48
- history: this.props.history,
49
- staticContext: this.props.staticContext
50
- } },
51
- React.createElement(react_redux_1.Provider, { store: this.props.store }, this.props.children)));
52
- };
53
- return SsrProvider;
54
- }(React.PureComponent));
55
- exports["default"] = SsrProvider;