From 5cf0262a7f2c1bb25fea31c849b67a367725cd13 Mon Sep 17 00:00:00 2001 From: Mateusz Knapik Date: Wed, 3 Nov 2021 21:13:58 +0100 Subject: [PATCH 1/5] Add init page that is loaded when app starts --- packages/build/src/lowdefySchema.json | 7 ++++++ .../src/controllers/componentController.js | 22 +++++++++++++++---- packages/graphql/src/schema.js | 1 + packages/renderer/src/Renderer.js | 19 ++++++++++++++-- packages/renderer/src/page/Page.js | 9 +++++--- packages/renderer/src/page/block/Context.js | 3 ++- .../renderer/src/page/block/MountEvents.js | 12 +++++++++- 7 files changed, 62 insertions(+), 11 deletions(-) diff --git a/packages/build/src/lowdefySchema.json b/packages/build/src/lowdefySchema.json index 055a38b53..7bbcd1ab5 100644 --- a/packages/build/src/lowdefySchema.json +++ b/packages/build/src/lowdefySchema.json @@ -583,6 +583,13 @@ "type": "App \"config.homePageId\" should be a string." } }, + "initPageId": { + "type": "string", + "description": "Page id to load when app is first run. After loading it, app will redirect to the requested page.", + "errorMessage": { + "type": "App \"config.initPageId\" should be a string." + } + }, "auth": { "$ref": "#/definitions/authConfig" } diff --git a/packages/graphql/src/controllers/componentController.js b/packages/graphql/src/controllers/componentController.js index 24ce1548f..73e87ab9e 100644 --- a/packages/graphql/src/controllers/componentController.js +++ b/packages/graphql/src/controllers/componentController.js @@ -30,27 +30,32 @@ class ComponentController { async getMenus() { const loadedMenus = await this.componentLoader.load('menus'); - const menus = this.filterMenus({ menus: loadedMenus || [] }); + const initPageId = await this.getInitPageId(); + const menus = this.filterMenus({ menus: loadedMenus || [], initPageId }); const homePageId = await this.getHomePageId({ menus }); return { menus, homePageId, + initPageId, }; } - filterMenus({ menus }) { + filterMenus({ menus, initPageId }) { return menus.map((menu) => { return { ...menu, - links: this.filterMenuList({ menuList: get(menu, 'links', { default: [] }) }), + links: this.filterMenuList({ menuList: get(menu, 'links', { default: [] }), initPageId }), }; }); } - filterMenuList({ menuList }) { + filterMenuList({ menuList, initPageId }) { return menuList .map((item) => { if (item.type === 'MenuLink') { + if (item.pageId === initPageId) { + return null; + } if (this.authorizationController.authorize(item)) { return item; } @@ -72,6 +77,15 @@ class ComponentController { .filter((item) => item !== null); } + async getInitPageId() { + const configData = await this.componentLoader.load('config'); + if (configData && get(configData, 'initPageId')) { + return get(configData, 'initPageId'); + } else { + return null; + } + } + async getHomePageId({ menus }) { const configData = await this.componentLoader.load('config'); if (configData && get(configData, 'homePageId')) { diff --git a/packages/graphql/src/schema.js b/packages/graphql/src/schema.js index 80ee73ad8..bad63ce9f 100644 --- a/packages/graphql/src/schema.js +++ b/packages/graphql/src/schema.js @@ -44,6 +44,7 @@ const typeDefs = gql` type MenuResponse { menus: [Menu] homePageId: String + initPageId: String } type Menu { diff --git a/packages/renderer/src/Renderer.js b/packages/renderer/src/Renderer.js index 7d0d00506..96b41228b 100644 --- a/packages/renderer/src/Renderer.js +++ b/packages/renderer/src/Renderer.js @@ -14,7 +14,7 @@ limitations under the License. */ -import React from 'react'; +import React, { useState } from 'react'; import { BrowserRouter, Route, Redirect, Switch, useLocation } from 'react-router-dom'; import { ApolloProvider, useQuery, gql } from '@apollo/client'; @@ -89,6 +89,7 @@ const GET_ROOT = gql` } } homePageId + initPageId } } `; @@ -99,6 +100,7 @@ const RootQuery = ({ children, lowdefy }) => { if (error) return

Error

; lowdefy.homePageId = get(data, 'menu.homePageId'); + lowdefy.initPageId = get(data, 'menu.initPageId'); // Make a copy to avoid immutable error when calling setGlobal. lowdefy.lowdefyGlobal = JSON.parse(JSON.stringify(get(data, 'lowdefyGlobal', { default: {} }))); lowdefy.menus = get(data, 'menu.menus'); @@ -124,6 +126,19 @@ const Home = ({ lowdefy }) => { return ; }; +const PageLoader = ({ lowdefy }) => { + const { initPageId } = lowdefy; + const [initEventsTriggered, setInitEventsTriggered] = useState(false); + + if (!initPageId || initEventsTriggered) { + return ; + } else { + return ( + + ); + } +}; + const Root = ({ gqlUri }) => { lowdefy.updateBlock = (blockId) => lowdefy.updaters[blockId] && lowdefy.updaters[blockId](); lowdefy.client = useGqlClient({ gqlUri, lowdefy }); @@ -151,7 +166,7 @@ const Root = ({ gqlUri }) => { - + diff --git a/packages/renderer/src/page/Page.js b/packages/renderer/src/page/Page.js index 42251f2fb..d1ef414de 100644 --- a/packages/renderer/src/page/Page.js +++ b/packages/renderer/src/page/Page.js @@ -35,9 +35,11 @@ const GET_PAGE = gql` } `; -const PageContext = ({ lowdefy }) => { - const { pageId } = useParams(); - const { search } = useLocation(); +const PageContext = (pageArgs) => { + const { lowdefy } = pageArgs; + const { initEventsTriggered } = pageArgs; + const { pageId = useParams().pageId } = pageArgs; + const { search = useLocation().search } = pageArgs; lowdefy.pageId = pageId; lowdefy.routeHistory = useHistory(); lowdefy.link = setupLink(lowdefy); @@ -74,6 +76,7 @@ const PageContext = ({ lowdefy }) => { urlQuery: lowdefy.urlQuery, })} lowdefy={lowdefy} + initEventsTriggered={initEventsTriggered} > {(context) => ( <> diff --git a/packages/renderer/src/page/block/Context.js b/packages/renderer/src/page/block/Context.js index 0e5aa07fe..62d1d0190 100644 --- a/packages/renderer/src/page/block/Context.js +++ b/packages/renderer/src/page/block/Context.js @@ -20,7 +20,7 @@ import getContext from '@lowdefy/engine'; import MountEvents from './MountEvents'; import LoadingBlock from './LoadingBlock'; -const Context = ({ block, children, contextId, lowdefy }) => { +const Context = ({ block, children, contextId, lowdefy, initEventsTriggered }) => { const [context, setContext] = useState({}); const [error, setError] = useState(null); @@ -58,6 +58,7 @@ const Context = ({ block, children, contextId, lowdefy }) => { triggerEvent={({ name, context }) => context.RootBlocks.areas.root.blocks[0].triggerEvent({ name }) } + initEventsTriggered={initEventsTriggered} > {(loaded) => (!loaded ? : children(context))} diff --git a/packages/renderer/src/page/block/MountEvents.js b/packages/renderer/src/page/block/MountEvents.js index 9f968b70d..65202b0e6 100644 --- a/packages/renderer/src/page/block/MountEvents.js +++ b/packages/renderer/src/page/block/MountEvents.js @@ -16,7 +16,14 @@ import React, { useEffect, useState } from 'react'; -const MountEvents = ({ asyncEventName, context, eventName, triggerEvent, children }) => { +const MountEvents = ({ + asyncEventName, + context, + eventName, + triggerEvent, + initEventsTriggered, + children, +}) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { @@ -28,6 +35,9 @@ const MountEvents = ({ asyncEventName, context, eventName, triggerEvent, childre triggerEvent({ name: asyncEventName, context }); setLoading(false); } + if (initEventsTriggered) { + initEventsTriggered(true); + } } catch (err) { setError(err); } From d271f7e00ffeb6f13dfc5b15d3385e5f034593f3 Mon Sep 17 00:00:00 2001 From: Mateusz Knapik Date: Wed, 3 Nov 2021 21:31:19 +0100 Subject: [PATCH 2/5] Add tests --- .../src/resolvers/queries/menu/menu.test.js | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/packages/graphql/src/resolvers/queries/menu/menu.test.js b/packages/graphql/src/resolvers/queries/menu/menu.test.js index e9c81d660..c36c8fbc7 100644 --- a/packages/graphql/src/resolvers/queries/menu/menu.test.js +++ b/packages/graphql/src/resolvers/queries/menu/menu.test.js @@ -45,6 +45,40 @@ const mockLoadMenus = jest.fn((id) => { return null; }); +const mockLoadMenusInitPage = jest.fn((id) => { + if (id === 'menus') { + return [ + { + id: 'menu:default', + menuId: 'default', + links: [ + { + id: 'menuitem:default:0', + type: 'MenuGroup', + auth: { public: true }, + links: [ + { + id: 'menuitem:default:1', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + { + id: 'menuitem:default:2', + type: 'MenuLink', + pageId: 'initPage', + auth: { public: true }, + }, + ], + }, + ], + initPageId: 'initPage', + }, + ]; + } + return null; +}); + const mockGetMenus = jest.fn(() => { return { menus: [ @@ -67,6 +101,7 @@ const mockGetMenus = jest.fn(() => { }, ], homePageId: 'page', + initPageId: 'initPage', }; }); @@ -80,6 +115,12 @@ const loaders = { }, }; +const loadersInitPage = { + component: { + load: mockLoadMenusInitPage, + }, +}; + const GET_MENUS = gql` fragment MenuLinkFragment on MenuLink { id @@ -115,6 +156,7 @@ const GET_MENUS = gql` } } homePageId + initPageId } } `; @@ -142,6 +184,7 @@ test('menu resolver', async () => { }, ], homePageId: 'page', + initPageId: 'initPage', }); }); @@ -180,3 +223,40 @@ test('menu graphql', async () => { }, }); }); + +test('menu graphql initPage', async () => { + const res = await runTestQuery({ + gqlQuery: GET_MENUS, + loadersInitPage, + }); + expect(res.errors).toBe(undefined); + expect(res.data).toEqual({ + menu: { + menus: [ + { + id: 'menu:default', + menuId: 'default', + properties: null, + links: [ + { + id: 'menuitem:default:0', + type: 'MenuGroup', + properties: null, + links: [ + { + id: 'menuitem:default:1', + type: 'MenuLink', + properties: null, + pageId: 'page', + url: null, + }, + ], + }, + ], + }, + ], + homePageId: 'page', + initPageId: 'initPage' + }, + }); +}); From ca15fc8a74fdd15eca57a5df49651caa46ee7759 Mon Sep 17 00:00:00 2001 From: Mateusz Knapik Date: Wed, 3 Nov 2021 23:22:55 +0100 Subject: [PATCH 3/5] Invoke onEnter from init page on every page --- packages/renderer/src/Renderer.js | 2 +- packages/renderer/src/page/Page.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/renderer/src/Renderer.js b/packages/renderer/src/Renderer.js index 96b41228b..e91375a71 100644 --- a/packages/renderer/src/Renderer.js +++ b/packages/renderer/src/Renderer.js @@ -131,7 +131,7 @@ const PageLoader = ({ lowdefy }) => { const [initEventsTriggered, setInitEventsTriggered] = useState(false); if (!initPageId || initEventsTriggered) { - return ; + return ; } else { return ( diff --git a/packages/renderer/src/page/Page.js b/packages/renderer/src/page/Page.js index d1ef414de..2cb4b6b82 100644 --- a/packages/renderer/src/page/Page.js +++ b/packages/renderer/src/page/Page.js @@ -40,6 +40,16 @@ const PageContext = (pageArgs) => { const { initEventsTriggered } = pageArgs; const { pageId = useParams().pageId } = pageArgs; const { search = useLocation().search } = pageArgs; + + if ( + initEventsTriggered && + lowdefy.pageId && + lowdefy.pageId !== pageId && + lowdefy.pageId != lowdefy.initPageId + ) { + initEventsTriggered(false); + } + lowdefy.pageId = pageId; lowdefy.routeHistory = useHistory(); lowdefy.link = setupLink(lowdefy); From 60a29ebf496ae428d0938b178e4a0739478bedc0 Mon Sep 17 00:00:00 2001 From: Mateusz Knapik Date: Fri, 5 Nov 2021 16:52:45 +0100 Subject: [PATCH 4/5] Add documentation Add experimental_ prefix to config property Add tests --- packages/build/src/lowdefySchema.json | 6 +- packages/docs/concepts/lowdefy-schema.yaml | 12 + .../src/controllers/componentController.js | 11 +- .../controllers/componentController.test.js | 209 +++++++++++++++++- .../src/resolvers/queries/menu/menu.test.js | 78 +------ packages/renderer/src/Renderer.js | 4 +- packages/renderer/src/page/Page.js | 8 +- .../renderer/src/page/block/MountEvents.js | 3 +- 8 files changed, 238 insertions(+), 93 deletions(-) diff --git a/packages/build/src/lowdefySchema.json b/packages/build/src/lowdefySchema.json index 7bbcd1ab5..a65684103 100644 --- a/packages/build/src/lowdefySchema.json +++ b/packages/build/src/lowdefySchema.json @@ -583,11 +583,11 @@ "type": "App \"config.homePageId\" should be a string." } }, - "initPageId": { + "experimental_initPageId": { "type": "string", - "description": "Page id to load when app is first run. After loading it, app will redirect to the requested page.", + "description": "Id of the page to load when app is first run. After loading it, app will redirect to the requested page.", "errorMessage": { - "type": "App \"config.initPageId\" should be a string." + "type": "App \"config.experimental_initPageId\" should be a string." } }, "auth": { diff --git a/packages/docs/concepts/lowdefy-schema.yaml b/packages/docs/concepts/lowdefy-schema.yaml index d6f4fbf1c..ad4f25bdc 100644 --- a/packages/docs/concepts/lowdefy-schema.yaml +++ b/packages/docs/concepts/lowdefy-schema.yaml @@ -43,7 +43,19 @@ _ref: The config object has the following properties: - `homePageId: string`: The pageId of the page that should be loaded when a user loads the app without a pageId in the url route. This is the page that is loaded when you navigate to `yourdomain.com`. + - `experimental_initPageId: string`: The pageId of the page that should be loaded when app is initialized. User is then redirected to requeted page. You can use onInit/onInitAsync/onEnter/onEnterAsync events to fetch and prepare global variables for other parts of the app. + - id: alert1 + type: Alert + properties: + type: warning + showIcon: false + message: Init page is an experimental feature, that may disappear in future releases as well as the flag itself can be changed. Use at your own risk. + + - id: md2 + type: MarkdownWithCode + properties: + content: | # Global Any data that you wish to use in your app can be stored in the __global__ object, and accessed using the [`_global`](/_global) operator. This is a good place to store data or configuration that is used throughout the app, for example the url of a logo or configuration of a page, since then these are only written once, and can be updated easily. diff --git a/packages/graphql/src/controllers/componentController.js b/packages/graphql/src/controllers/componentController.js index 73e87ab9e..607c89532 100644 --- a/packages/graphql/src/controllers/componentController.js +++ b/packages/graphql/src/controllers/componentController.js @@ -14,7 +14,7 @@ limitations under the License. */ -import { get } from '@lowdefy/helpers'; +import { get, type } from '@lowdefy/helpers'; class ComponentController { constructor({ getController, getLoader }) { @@ -53,7 +53,7 @@ class ComponentController { return menuList .map((item) => { if (item.type === 'MenuLink') { - if (item.pageId === initPageId) { + if (!type.isNone(initPageId) && item.pageId === initPageId) { return null; } if (this.authorizationController.authorize(item)) { @@ -63,7 +63,8 @@ class ComponentController { } if (item.type === 'MenuGroup') { const filteredSubItems = this.filterMenuList({ - menuList: get(item, 'links', { default: [] }), + menuList: get(item, 'links', { default: [] },), + initPageId: initPageId, }); if (filteredSubItems.length > 0) { return { @@ -79,8 +80,8 @@ class ComponentController { async getInitPageId() { const configData = await this.componentLoader.load('config'); - if (configData && get(configData, 'initPageId')) { - return get(configData, 'initPageId'); + if (configData && get(configData, 'experimental_initPageId')) { + return get(configData, 'experimental_initPageId'); } else { return null; } diff --git a/packages/graphql/src/controllers/componentController.test.js b/packages/graphql/src/controllers/componentController.test.js index 2c13a9984..ccf09470f 100644 --- a/packages/graphql/src/controllers/componentController.test.js +++ b/packages/graphql/src/controllers/componentController.test.js @@ -62,7 +62,7 @@ test('getMenus, menus not found', async () => { }); const controller = createComponentController(context); const res = await controller.getMenus(); - expect(res).toEqual({ menus: [], homePageId: null }); + expect(res).toEqual({ menus: [], homePageId: null, initPageId: null }); }); test('getMenus, menu with configured home page id', async () => { @@ -124,6 +124,7 @@ test('getMenus, menu with configured home page id', async () => { }, ], homePageId: 'homePageId', + initPageId: null, }); }); @@ -168,6 +169,7 @@ test('getMenus, get homePageId at first level', async () => { }, ], homePageId: 'page', + initPageId: null, }); }); @@ -228,6 +230,7 @@ test('getMenus, get homePageId at second level', async () => { }, ], homePageId: 'page', + initPageId: null, }); }); @@ -304,6 +307,7 @@ test('getMenus, get homePageId at third level', async () => { }, ], homePageId: 'page', + initPageId: null, }); }); @@ -348,6 +352,7 @@ test('getMenus, no default menu, no configured homepage', async () => { }, ], homePageId: 'page', + initPageId: null, }); }); @@ -416,6 +421,7 @@ test('getMenus, more than 1 menu, no configured homepage', async () => { }, ], homePageId: 'default-page', + initPageId: null, }); }); @@ -444,6 +450,7 @@ test('getMenus, default menu has no links', async () => { }, ], homePageId: null, + initPageId: null, }); }); @@ -527,6 +534,7 @@ describe('filter menus', () => { }, ], homePageId: null, + initPageId: null, }); }); @@ -655,6 +663,7 @@ describe('filter menus', () => { }, ], homePageId: 'page', + initPageId: null, }); }); @@ -737,6 +746,7 @@ describe('filter menus', () => { const res = await controller.getMenus(); expect(res).toEqual({ homePageId: 'page', + initPageId: null, menus: [ { links: [ @@ -776,6 +786,202 @@ describe('filter menus', () => { ], }); }); + + test('Init page defined', async () => { + mockLoadComponent.mockImplementation((id) => { + if (id === 'menus') { + return [ + { + menuId: 'default', + links: [ + { + id: 'menuitem:default:1', + menuItemId: '1', + type: 'MenuLink', + pageId: 'initPage', + auth: { public: true }, + }, + { + id: 'menuitem:default:2', + menuItemId: '2', + type: 'MenuGroup', + links: [ + { + id: 'menuitem:default:3', + menuItemId: '3', + type: 'MenuLink', + pageId: 'initPage', + auth: { public: true }, + }, + { + id: 'menuitem:default:4', + menuItemId: '4', + type: 'MenuGroup', + links: [ + { + id: 'menuitem:default:5', + menuItemId: '5', + type: 'MenuLink', + pageId: 'initPage', + auth: { public: true }, + }, + ], + }, + ], + }, + ], + }, + { + menuId: 'other', + links: [ + { + id: 'menuitem:other:1', + menuItemId: '1', + type: 'MenuLink', + pageId: 'initPage', + auth: { public: true }, + }, + ], + }, + ]; + } + if (id === 'config') { + return { + experimental_initPageId: 'initPage', + }; + } + return null; + }); + const controller = createComponentController(context); + const res = await controller.getMenus(); + expect(res).toEqual({ + menus: [ + { + menuId: 'default', + links: [], + }, + { + menuId: 'other', + links: [], + }, + ], + homePageId: null, + initPageId: 'initPage', + }); + }); + + test('Nested init page defined', async () => { + mockLoadComponent.mockImplementation((id) => { + if (id === 'menus') { + return [ + { + menuId: 'default', + links: [ + { + id: 'menuitem:default:1', + menuItemId: '1', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + { + id: 'menuitem:default:2', + menuItemId: '2', + type: 'MenuGroup', + links: [ + { + id: 'menuitem:default:3', + menuItemId: '3', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + { + id: 'menuitem:default:4', + menuItemId: '4', + type: 'MenuGroup', + links: [ + { + id: 'menuitem:default:5', + menuItemId: '5', + type: 'MenuLink', + pageId: 'initPage', + auth: { public: true }, + }, + ], + }, + ], + }, + ], + }, + { + menuId: 'other', + links: [ + { + id: 'menuitem:other:1', + menuItemId: '1', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + ], + }, + ]; + } + if (id === 'config') { + return { + experimental_initPageId: 'initPage', + }; + } + return null; + }); + const controller = createComponentController(context); + const res = await controller.getMenus(); + expect(res).toEqual({ + menus: [ + { + menuId: 'default', + links: [ + { + id: 'menuitem:default:1', + menuItemId: '1', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + { + id: 'menuitem:default:2', + menuItemId: '2', + type: 'MenuGroup', + links: [ + { + id: 'menuitem:default:3', + menuItemId: '3', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + ], + }, + ], + }, + { + menuId: 'other', + links: [ + { + id: 'menuitem:other:1', + menuItemId: '1', + type: 'MenuLink', + pageId: 'page', + auth: { public: true }, + }, + ], + }, + ], + homePageId: 'page', + initPageId: 'initPage', + }); + }); }); test('Filter invalid menu item types', async () => { @@ -805,6 +1011,7 @@ test('Filter invalid menu item types', async () => { const res = await controller.getMenus(); expect(res).toEqual({ homePageId: null, + initPageId: null, menus: [ { menuId: 'default', diff --git a/packages/graphql/src/resolvers/queries/menu/menu.test.js b/packages/graphql/src/resolvers/queries/menu/menu.test.js index c36c8fbc7..5c4aa5351 100644 --- a/packages/graphql/src/resolvers/queries/menu/menu.test.js +++ b/packages/graphql/src/resolvers/queries/menu/menu.test.js @@ -45,40 +45,6 @@ const mockLoadMenus = jest.fn((id) => { return null; }); -const mockLoadMenusInitPage = jest.fn((id) => { - if (id === 'menus') { - return [ - { - id: 'menu:default', - menuId: 'default', - links: [ - { - id: 'menuitem:default:0', - type: 'MenuGroup', - auth: { public: true }, - links: [ - { - id: 'menuitem:default:1', - type: 'MenuLink', - pageId: 'page', - auth: { public: true }, - }, - { - id: 'menuitem:default:2', - type: 'MenuLink', - pageId: 'initPage', - auth: { public: true }, - }, - ], - }, - ], - initPageId: 'initPage', - }, - ]; - } - return null; -}); - const mockGetMenus = jest.fn(() => { return { menus: [ @@ -115,12 +81,6 @@ const loaders = { }, }; -const loadersInitPage = { - component: { - load: mockLoadMenusInitPage, - }, -}; - const GET_MENUS = gql` fragment MenuLinkFragment on MenuLink { id @@ -220,43 +180,7 @@ test('menu graphql', async () => { }, ], homePageId: 'page', - }, - }); -}); - -test('menu graphql initPage', async () => { - const res = await runTestQuery({ - gqlQuery: GET_MENUS, - loadersInitPage, - }); - expect(res.errors).toBe(undefined); - expect(res.data).toEqual({ - menu: { - menus: [ - { - id: 'menu:default', - menuId: 'default', - properties: null, - links: [ - { - id: 'menuitem:default:0', - type: 'MenuGroup', - properties: null, - links: [ - { - id: 'menuitem:default:1', - type: 'MenuLink', - properties: null, - pageId: 'page', - url: null, - }, - ], - }, - ], - }, - ], - homePageId: 'page', - initPageId: 'initPage' + initPageId: null, }, }); }); diff --git a/packages/renderer/src/Renderer.js b/packages/renderer/src/Renderer.js index e91375a71..4f3c96bab 100644 --- a/packages/renderer/src/Renderer.js +++ b/packages/renderer/src/Renderer.js @@ -19,7 +19,7 @@ import { BrowserRouter, Route, Redirect, Switch, useLocation } from 'react-route import { ApolloProvider, useQuery, gql } from '@apollo/client'; import { ErrorBoundary, Loading } from '@lowdefy/block-tools'; -import { get } from '@lowdefy/helpers'; +import { get, type } from '@lowdefy/helpers'; import useGqlClient from './utils/graphql/useGqlClient'; import createLogin from './utils/auth/createLogin'; @@ -130,7 +130,7 @@ const PageLoader = ({ lowdefy }) => { const { initPageId } = lowdefy; const [initEventsTriggered, setInitEventsTriggered] = useState(false); - if (!initPageId || initEventsTriggered) { + if (!type.isNone(initPageId) || initEventsTriggered) { return ; } else { return ( diff --git a/packages/renderer/src/page/Page.js b/packages/renderer/src/page/Page.js index 2cb4b6b82..2b64d65e4 100644 --- a/packages/renderer/src/page/Page.js +++ b/packages/renderer/src/page/Page.js @@ -21,7 +21,7 @@ import { useParams, useHistory, useLocation, Redirect } from 'react-router-dom'; import { useQuery, gql } from '@apollo/client'; import { Loading } from '@lowdefy/block-tools'; -import { get, urlQuery } from '@lowdefy/helpers'; +import { get, urlQuery, type } from '@lowdefy/helpers'; import { makeContextId } from '@lowdefy/engine'; import Block from './block/Block'; @@ -42,10 +42,10 @@ const PageContext = (pageArgs) => { const { search = useLocation().search } = pageArgs; if ( - initEventsTriggered && - lowdefy.pageId && + type.isFunction(initEventsTriggered) && + !type.isNone(lowdefy.pageId) && lowdefy.pageId !== pageId && - lowdefy.pageId != lowdefy.initPageId + lowdefy.pageId !== lowdefy.initPageId ) { initEventsTriggered(false); } diff --git a/packages/renderer/src/page/block/MountEvents.js b/packages/renderer/src/page/block/MountEvents.js index 65202b0e6..f39fd0edd 100644 --- a/packages/renderer/src/page/block/MountEvents.js +++ b/packages/renderer/src/page/block/MountEvents.js @@ -15,6 +15,7 @@ */ import React, { useEffect, useState } from 'react'; +import { type } from '@lowdefy/helpers'; const MountEvents = ({ asyncEventName, @@ -35,7 +36,7 @@ const MountEvents = ({ triggerEvent({ name: asyncEventName, context }); setLoading(false); } - if (initEventsTriggered) { + if (type.isFunction(initEventsTriggered)) { initEventsTriggered(true); } } catch (err) { From eae6bd88740249380267376c086ff29e22c6dc0d Mon Sep 17 00:00:00 2001 From: Mateusz Knapik Date: Fri, 5 Nov 2021 16:58:49 +0100 Subject: [PATCH 5/5] Fix typo --- packages/renderer/src/Renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/renderer/src/Renderer.js b/packages/renderer/src/Renderer.js index 4f3c96bab..46f17fbd3 100644 --- a/packages/renderer/src/Renderer.js +++ b/packages/renderer/src/Renderer.js @@ -130,7 +130,7 @@ const PageLoader = ({ lowdefy }) => { const { initPageId } = lowdefy; const [initEventsTriggered, setInitEventsTriggered] = useState(false); - if (!type.isNone(initPageId) || initEventsTriggered) { + if (type.isNone(initPageId) || initEventsTriggered) { return ; } else { return (