From f9f295e37cc627e1f7f2d414d9e42c7c67f45f23 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sat, 30 Apr 2022 11:59:42 +0200 Subject: [PATCH 01/11] fix(server-dev): Add actions.js to build watcher. --- packages/server-dev/manager/watchers/nextBuildWatcher.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server-dev/manager/watchers/nextBuildWatcher.mjs b/packages/server-dev/manager/watchers/nextBuildWatcher.mjs index 2f47541ee..48b0602ac 100644 --- a/packages/server-dev/manager/watchers/nextBuildWatcher.mjs +++ b/packages/server-dev/manager/watchers/nextBuildWatcher.mjs @@ -24,6 +24,7 @@ const hashes = {}; const watchedFiles = [ 'build/config.json', + 'build/plugins/actions.js', 'build/plugins/blocks.js', 'build/plugins/connections.js', 'build/plugins/icons.js', From eed470ff2cda71028b2a152a7cbf2054bc1ef2fa Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sat, 30 Apr 2022 12:00:17 +0200 Subject: [PATCH 02/11] fix(server): Add actions-core as default to server. --- .pnp.cjs | 1 + packages/server/package.json | 1 + yarn.lock | 1 + 3 files changed, 3 insertions(+) diff --git a/.pnp.cjs b/.pnp.cjs index 3c070f1b5..64ae33f05 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3522,6 +3522,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/server/", "packageDependencies": [ ["@lowdefy/server", "workspace:packages/server"], + ["@lowdefy/actions-core", "workspace:packages/plugins/actions/actions-core"], ["@lowdefy/api", "workspace:packages/api"], ["@lowdefy/blocks-antd", "workspace:packages/plugins/blocks/blocks-antd"], ["@lowdefy/blocks-basic", "workspace:packages/plugins/blocks/blocks-basic"], diff --git a/packages/server/package.json b/packages/server/package.json index 76c307099..6ac0d122d 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -40,6 +40,7 @@ "next": "next" }, "dependencies": { + "@lowdefy/actions-core": "4.0.0-alpha.8", "@lowdefy/api": "4.0.0-alpha.8", "@lowdefy/blocks-antd": "4.0.0-alpha.8", "@lowdefy/blocks-basic": "4.0.0-alpha.8", diff --git a/yarn.lock b/yarn.lock index 930ad42db..2e95daa07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2675,6 +2675,7 @@ __metadata: version: 0.0.0-use.local resolution: "@lowdefy/server@workspace:packages/server" dependencies: + "@lowdefy/actions-core": 4.0.0-alpha.8 "@lowdefy/api": 4.0.0-alpha.8 "@lowdefy/blocks-antd": 4.0.0-alpha.8 "@lowdefy/blocks-basic": 4.0.0-alpha.8 From 4a394f8ebc194af02e7c5720c8d8707da94d0410 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sat, 30 Apr 2022 22:53:46 +0200 Subject: [PATCH 03/11] chore: Add server-dev next dev script. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index cada06e21..6909caf00 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "start:server:docs": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../docs && yarn && yarn workspace @lowdefy/server build:next && yarn workspace @lowdefy/server start", "start:server:next-dev:app": "yarn start:cli:build:app && yarn && yarn workspace @lowdefy/server dev", "start:server:next-dev:docs": "yarn start:cli:build:docs && yarn && yarn workspace @lowdefy/server dev", + "start:server-dev:next-dev:app": "yarn workspace lowdefy start build --config-directory ../../app --server-directory ../server-dev --output-directory ../ && yarn workspace @lowdefy/server-dev next dev", "test": "lerna run test", "test-ci": "yarn test --ignore='@lowdefy/engine' --ignore='@lowdefy/format' --ignore='@lowdefy/blocks-*' --ignore='@lowdefy/plugin-aws'" }, From fc32c75ea2d8c5c97e21280b09fce5518ec14d37 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sat, 30 Apr 2022 22:56:27 +0200 Subject: [PATCH 04/11] fix(client): Render progress bar next to context, and event order fixes. --- packages/client/src/Client.js | 60 +++++++++---------- packages/client/src/Context.js | 6 +- packages/client/src/ProgressBarController.js | 29 ++++++--- packages/client/src/block/Block.js | 19 +++--- packages/client/src/initLowdefyContext.js | 6 ++ packages/engine/src/getContext.js | 6 +- .../src/blocks/ProgressBar/ProgressBar.js | 35 +++++------ 7 files changed, 86 insertions(+), 75 deletions(-) diff --git a/packages/client/src/Client.js b/packages/client/src/Client.js index 0783ce362..49cf5c390 100644 --- a/packages/client/src/Client.js +++ b/packages/client/src/Client.js @@ -25,40 +25,34 @@ import initLowdefyContext from './initLowdefyContext.js'; const Client = ({ Components, config, router, stage, types, window }) => { const lowdefy = initLowdefyContext({ Components, config, router, types, stage, window }); - return ( - ( - - {(context) => { - return ( - <> - - - - ); - }} - - ), - }} - /> + <> + + + {(context) => { + if (!context._internal.onInitDone) return ''; + return ( + <> + + + + ); + }} + + ); }; diff --git a/packages/client/src/Context.js b/packages/client/src/Context.js index c1dd8299e..4b4e2fc97 100644 --- a/packages/client/src/Context.js +++ b/packages/client/src/Context.js @@ -19,21 +19,21 @@ import getContext from '@lowdefy/engine'; import MountEvents from './MountEvents.js'; -const Context = ({ children, config, lowdefy, progress }) => { +const Context = ({ children, config, lowdefy }) => { const context = getContext({ config, lowdefy }); return ( { await context._internal.runOnInit(() => { - progress.dispatch({ + lowdefy._internal.progress.dispatch({ type: 'increment', }); }); }} triggerEventAsync={() => { context._internal.runOnInitAsync(() => { - progress.dispatch({ + lowdefy._internal.progress.dispatch({ type: 'increment', }); }); diff --git a/packages/client/src/ProgressBarController.js b/packages/client/src/ProgressBarController.js index 73d1a8779..a9b3cd6c1 100644 --- a/packages/client/src/ProgressBarController.js +++ b/packages/client/src/ProgressBarController.js @@ -19,23 +19,41 @@ import { makeCssClass } from '@lowdefy/block-utils'; const initialState = { progress: 0, + onMounts: 0, }; function reducer(state, action) { switch (action.type) { case 'increment': - return { progress: state.progress + (100 - state.progress) / 3 }; + return { + ...state, + progress: state.progress + (100 - state.progress) / 3, + }; + case 'increment-on-mount': + return { + ...state, + onMounts: state.onMounts + 1, + }; case 'auto-increment': - return { progress: state.progress + (100 - state.progress) / 200 }; + return { + ...state, + progress: state.progress + (100 - state.progress) / 200, + }; case 'done': - return { progress: 100 }; + return { + progress: state.onMounts - 1 === 0 ? 100 : state.progress, + onMounts: state.onMounts - 1, + }; default: throw new Error('Invalid action type for ProgressBarController reducer.'); } } -const ProgressBarController = ({ id, ProgressBar, content, lowdefy }) => { +const ProgressBarController = ({ id, lowdefy }) => { const [state, dispatch] = useReducer(reducer, initialState); + const ProgressBar = lowdefy._internal.blockComponents.ProgressBar; + lowdefy._internal.progress.state = state; + lowdefy._internal.progress.dispatch = dispatch; useEffect(() => { const timer = state.progress < 95 && setInterval(() => dispatch({ type: 'auto-increment' }), 500); @@ -51,9 +69,6 @@ const ProgressBarController = ({ id, ProgressBar, content, lowdefy }) => { pageId={lowdefy.pageId} properties={state} user={lowdefy.user} - content={{ - content: () => content.content({ state, dispatch }), - }} /> ); }; diff --git a/packages/client/src/block/Block.js b/packages/client/src/block/Block.js index fe60af0e4..c5d362405 100644 --- a/packages/client/src/block/Block.js +++ b/packages/client/src/block/Block.js @@ -20,14 +20,7 @@ import CategorySwitch from './CategorySwitch.js'; import ErrorBoundary from '../ErrorBoundary.js'; import MountEvents from '../MountEvents.js'; -const Block = ({ - block, - Blocks, - context, - lowdefy, - parentLoading, - progress = { dispatch: () => {} }, -}) => { +const Block = ({ block, Blocks, context, lowdefy, parentLoading }) => { const [updates, setUpdate] = useState(0); lowdefy._internal.updaters[block.id] = () => setUpdate(updates + 1); @@ -36,10 +29,14 @@ const Block = ({ { + context._internal.lowdefy._internal.progress.dispatch({ + type: 'increment-on-mount', + id: block.id, + }); await block.triggerEvent({ name: 'onMount', progress: () => { - progress.dispatch({ + lowdefy._internal.progress.dispatch({ type: 'increment', }); }, @@ -49,12 +46,12 @@ const Block = ({ block.triggerEvent({ name: 'onMountAsync', progress: () => { - progress.dispatch({ + lowdefy._internal.progress.dispatch({ type: 'increment', }); }, }); - progress.dispatch({ + lowdefy._internal.progress.dispatch({ type: 'done', }); }} diff --git a/packages/client/src/initLowdefyContext.js b/packages/client/src/initLowdefyContext.js index 231791d11..d90f3a4e1 100644 --- a/packages/client/src/initLowdefyContext.js +++ b/packages/client/src/initLowdefyContext.js @@ -31,6 +31,12 @@ const lowdefy = { return () => undefined; }, link: () => undefined, + progress: { + state: { + progress: 0, + }, + dispatch: () => undefined, + }, }, contexts: {}, inputs: {}, diff --git a/packages/engine/src/getContext.js b/packages/engine/src/getContext.js index 78ff824bc..b99923e71 100644 --- a/packages/engine/src/getContext.js +++ b/packages/engine/src/getContext.js @@ -55,12 +55,12 @@ const blockData = ({ visible, }); -function getContext({ config, lowdefy, development = false }) { +function getContext({ config, lowdefy }) { if (!config) { throw new Error('A page must be provided to get context.'); } const { id } = config; - if (lowdefy.contexts[id] && !development) { + if (lowdefy.contexts[id]) { lowdefy.contexts[id]._internal.update(); return lowdefy.contexts[id]; } @@ -100,6 +100,7 @@ function getContext({ config, lowdefy, development = false }) { name: 'onInit', progress, }); + _internal.update(); _internal.State.freezeState(); _internal.onInitDone = true; } @@ -113,6 +114,7 @@ function getContext({ config, lowdefy, development = false }) { _internal.onInitAsyncDone = true; } }; + ctx._internal.update(); lowdefy.contexts[id] = ctx; return ctx; } diff --git a/packages/plugins/blocks/blocks-loaders/src/blocks/ProgressBar/ProgressBar.js b/packages/plugins/blocks/blocks-loaders/src/blocks/ProgressBar/ProgressBar.js index 2429142c7..59e878358 100644 --- a/packages/plugins/blocks/blocks-loaders/src/blocks/ProgressBar/ProgressBar.js +++ b/packages/plugins/blocks/blocks-loaders/src/blocks/ProgressBar/ProgressBar.js @@ -17,7 +17,7 @@ import React from 'react'; import { blockDefaultProps } from '@lowdefy/block-utils'; -const ProgressBar = ({ blockId, methods, style, properties, content }) => { +const ProgressBar = ({ blockId, methods, style, properties }) => { const { progress = 30, height = 4, @@ -28,31 +28,28 @@ const ProgressBar = ({ blockId, methods, style, properties, content }) => { } = properties; return ( - <> -
-
-
- {shadow ?
: null} -
+
+
+
+ {shadow ?
: null}
- {content.content && content.content()} - +
); }; ProgressBar.defaultProps = blockDefaultProps; ProgressBar.meta = { - category: 'container', + category: 'display', icons: [], styles: ['blocks/ProgressBar/style.less'], }; From b4431b17b36576cfc8cd30a5d1e2485502fd337e Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sat, 30 Apr 2022 22:57:47 +0200 Subject: [PATCH 05/11] fix(server-dev): Do not render page before redirect. --- packages/server-dev/lib/App.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server-dev/lib/App.js b/packages/server-dev/lib/App.js index d8e526970..e52b4960d 100644 --- a/packages/server-dev/lib/App.js +++ b/packages/server-dev/lib/App.js @@ -38,6 +38,7 @@ const App = () => { const { redirect, pageId } = setPageId(router, rootConfig); if (redirect) { router.push(`/${pageId}`); + return ''; } return ( From f303bc046164c0d0370af66c3f7741eb04d7a93c Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sun, 1 May 2022 16:27:25 +0200 Subject: [PATCH 06/11] feat(server-dev): Reload to pass resetContext flag. --- packages/server-dev/lib/App.js | 31 +++++++++++++++++-------------- packages/server-dev/lib/Page.js | 3 ++- packages/server-dev/lib/Reload.js | 11 +++++++---- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/server-dev/lib/App.js b/packages/server-dev/lib/App.js index e52b4960d..d1c13d8c9 100644 --- a/packages/server-dev/lib/App.js +++ b/packages/server-dev/lib/App.js @@ -42,20 +42,23 @@ const App = () => { } return ( - + {(resetContext) => ( + + )} ); }; diff --git a/packages/server-dev/lib/Page.js b/packages/server-dev/lib/Page.js index 8904abfa7..8682687a0 100644 --- a/packages/server-dev/lib/Page.js +++ b/packages/server-dev/lib/Page.js @@ -19,7 +19,7 @@ import React from 'react'; import Client from '@lowdefy/client'; import usePageConfig from './utils/usePageConfig.js'; -const Page = ({ Components, config, pageId, router, types }) => { +const Page = ({ Components, config, pageId, resetContext, router, types }) => { const { data: pageConfig } = usePageConfig(pageId, router.basePath); if (!pageConfig) { router.replace(`/404`); @@ -32,6 +32,7 @@ const Page = ({ Components, config, pageId, router, types }) => { ...config, pageConfig, }} + resetContext={resetContext} router={router} stage="dev" types={types} diff --git a/packages/server-dev/lib/Reload.js b/packages/server-dev/lib/Reload.js index bf701ffef..b15b192de 100644 --- a/packages/server-dev/lib/Reload.js +++ b/packages/server-dev/lib/Reload.js @@ -14,18 +14,20 @@ limitations under the License. */ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import useMutateCache from './utils/useMutateCache.js'; import waitForRestartedServer from './utils/waitForRestartedServer.js'; const Reload = ({ children, basePath }) => { + const [reset, setReset] = useState(false); const mutateCache = useMutateCache(basePath); useEffect(() => { const sse = new EventSource(`${basePath}/api/reload`); - sse.addEventListener('reload', () => { - mutateCache(); + sse.addEventListener('reload', async () => { + await mutateCache(); + setReset(true); console.log('Reloaded config.'); }); @@ -37,7 +39,8 @@ const Reload = ({ children, basePath }) => { sse.close(); }; }, []); - return <>{children}; + // TODO: reload needs to pass a flag that the server is restarting / installing types. + return <>{children({ reset, setReset })}; }; export default Reload; From 09f49a2072f2803268b20f69655e03a57ef8f097 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sun, 1 May 2022 16:28:38 +0200 Subject: [PATCH 07/11] feat(client): Apply reset context flag to recreate context on client. --- packages/client/src/Client.js | 20 +++++++++++++++++--- packages/client/src/Context.js | 4 ++-- packages/client/src/MountEvents.js | 1 + packages/client/src/ProgressBarController.js | 10 +++++++++- packages/engine/src/getContext.js | 11 ++++++++--- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/client/src/Client.js b/packages/client/src/Client.js index 49cf5c390..119ea8553 100644 --- a/packages/client/src/Client.js +++ b/packages/client/src/Client.js @@ -23,16 +23,30 @@ import ProgressBarController from './ProgressBarController.js'; import initLowdefyContext from './initLowdefyContext.js'; -const Client = ({ Components, config, router, stage, types, window }) => { - const lowdefy = initLowdefyContext({ Components, config, router, types, stage, window }); +const Client = ({ + Components, + config, + resetContext = { reset: false, setReset: () => undefined }, + router, + stage, + types, + window, +}) => { + const lowdefy = initLowdefyContext({ Components, config, router, stage, types, window }); return ( <> - + {(context) => { if (!context._internal.onInitDone) return ''; return ( diff --git a/packages/client/src/Context.js b/packages/client/src/Context.js index 4b4e2fc97..e2ed968f9 100644 --- a/packages/client/src/Context.js +++ b/packages/client/src/Context.js @@ -19,8 +19,8 @@ import getContext from '@lowdefy/engine'; import MountEvents from './MountEvents.js'; -const Context = ({ children, config, lowdefy }) => { - const context = getContext({ config, lowdefy }); +const Context = ({ children, config, lowdefy, resetContext }) => { + const context = getContext({ config, lowdefy, resetContext }); return ( const [error, setError] = useState(null); useEffect(() => { let mounted = true; + setLoading(true); const mount = async () => { try { await triggerEvent(); diff --git a/packages/client/src/ProgressBarController.js b/packages/client/src/ProgressBarController.js index a9b3cd6c1..c8cf83d30 100644 --- a/packages/client/src/ProgressBarController.js +++ b/packages/client/src/ProgressBarController.js @@ -44,12 +44,17 @@ function reducer(state, action) { progress: state.onMounts - 1 === 0 ? 100 : state.progress, onMounts: state.onMounts - 1, }; + case 'reset': + return { + progress: 0, + onMounts: 0, + }; default: throw new Error('Invalid action type for ProgressBarController reducer.'); } } -const ProgressBarController = ({ id, lowdefy }) => { +const ProgressBarController = ({ id, lowdefy, resetContext }) => { const [state, dispatch] = useReducer(reducer, initialState); const ProgressBar = lowdefy._internal.blockComponents.ProgressBar; lowdefy._internal.progress.state = state; @@ -59,6 +64,9 @@ const ProgressBarController = ({ id, lowdefy }) => { state.progress < 95 && setInterval(() => dispatch({ type: 'auto-increment' }), 500); return () => clearInterval(timer); }, [state]); + if (resetContext.reset && state.progress === 100) { + dispatch({ type: 'reset' }); + } return ( undefined }, +}) { if (!config) { throw new Error('A page must be provided to get context.'); } const { id } = config; - if (lowdefy.contexts[id]) { + if (lowdefy.contexts[id] && !resetContext.reset) { + // memoize context if already created, eg between page transitions, unless the reset flag is raised lowdefy.contexts[id]._internal.update(); return lowdefy.contexts[id]; } - + resetContext.setReset(false); // lower context reset flag. if (!lowdefy.inputs[id]) { lowdefy.inputs[id] = {}; } From f94ee32a797b61b5f0f2bcc4de429b815f6de864 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Sun, 1 May 2022 21:04:14 +0200 Subject: [PATCH 08/11] feat(client): Add display message implementation. --- packages/build/src/build/buildTypes.js | 1 + packages/client/src/Client.js | 15 ++++++++-- packages/client/src/DisplayMessage.js | 35 +++++++++++++++++++++++ packages/client/src/initLowdefyContext.js | 4 +-- 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 packages/client/src/DisplayMessage.js diff --git a/packages/build/src/build/buildTypes.js b/packages/build/src/build/buildTypes.js index 8e39e0886..5661c479b 100644 --- a/packages/build/src/build/buildTypes.js +++ b/packages/build/src/build/buildTypes.js @@ -49,6 +49,7 @@ function buildTypes({ components, context }) { // Add loaders and basic basicTypes.blocks.forEach((block) => typeCounters.blocks.increment(block)); loaderTypes.blocks.forEach((block) => typeCounters.blocks.increment(block)); + typeCounters.blocks.increment('Message'); // Used for DisplayMessage in @lowdefy/client components.types = { actions: {}, diff --git a/packages/client/src/Client.js b/packages/client/src/Client.js index 119ea8553..1feef9206 100644 --- a/packages/client/src/Client.js +++ b/packages/client/src/Client.js @@ -18,6 +18,7 @@ import React from 'react'; import Block from './block/Block.js'; import Context from './Context.js'; +import DisplayMessage from './DisplayMessage.js'; import Head from './Head.js'; import ProgressBarController from './ProgressBarController.js'; @@ -36,11 +37,21 @@ const Client = ({ return ( <> + { + lowdefy._internal.displayMessage = method; + }, + }} + /> { + return ( + undefined, + }} + properties={{}} + /> + ); +}; + +export default DisplayMessage; diff --git a/packages/client/src/initLowdefyContext.js b/packages/client/src/initLowdefyContext.js index d90f3a4e1..acb95cc25 100644 --- a/packages/client/src/initLowdefyContext.js +++ b/packages/client/src/initLowdefyContext.js @@ -17,9 +17,9 @@ import { urlQuery } from '@lowdefy/helpers'; import callRequest from './callRequest.js'; -import setupLink from './setupLink.js'; -import createLinkComponent from './createLinkComponent.js'; import createIcon from './createIcon.js'; +import createLinkComponent from './createLinkComponent.js'; +import setupLink from './setupLink.js'; const lowdefy = { _internal: { From 7d957284ca082b8aa2aa8316b1dc8d7e1ca8a2c6 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Mon, 2 May 2022 13:21:03 +0200 Subject: [PATCH 09/11] fix(engine): Catch block type not found error. --- packages/engine/src/Blocks.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/engine/src/Blocks.js b/packages/engine/src/Blocks.js index 6c390d935..0b8a7ccbe 100644 --- a/packages/engine/src/Blocks.js +++ b/packages/engine/src/Blocks.js @@ -91,8 +91,13 @@ class Blocks { block.styleEval = {}; block.validationEval = {}; block.visibleEval = {}; - - block.meta = this.context._internal.lowdefy._internal.blockComponents[block.type].meta; + try { + block.meta = this.context._internal.lowdefy._internal.blockComponents[block.type].meta; + } catch (error) { + throw new Error( + `Block type ${block.type} not found at ${block.blockId}. Check your plugins to make sure the block is installed. For more info, see https://docs.lowdefy.com/plugins.` + ); + } if (!type.isNone(block.areas)) { block.areasLayout = {}; From 7895b53691f83b81629c2f4dfb174c858571c407 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Mon, 2 May 2022 13:21:46 +0200 Subject: [PATCH 10/11] fix(server-dev): Render app rebuild page. --- packages/server-dev/lib/Page.js | 6 ++- packages/server-dev/lib/Reload.js | 18 +++++--- packages/server-dev/lib/RestartingPage.js | 46 +++++++++++++++++++ .../lib/utils/waitForRestartedServer.js | 2 +- 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 packages/server-dev/lib/RestartingPage.js diff --git a/packages/server-dev/lib/Page.js b/packages/server-dev/lib/Page.js index 8682687a0..1640f1506 100644 --- a/packages/server-dev/lib/Page.js +++ b/packages/server-dev/lib/Page.js @@ -15,8 +15,9 @@ */ import React from 'react'; - import Client from '@lowdefy/client'; + +import RestartingPage from './RestartingPage.js'; import usePageConfig from './utils/usePageConfig.js'; const Page = ({ Components, config, pageId, resetContext, router, types }) => { @@ -25,6 +26,9 @@ const Page = ({ Components, config, pageId, resetContext, router, types }) => { router.replace(`/404`); return ''; } + if (resetContext.restarting) { + return ; + } return ( { const [reset, setReset] = useState(false); + const [restarting, setRestarting] = useState(false); const mutateCache = useMutateCache(basePath); useEffect(() => { const sse = new EventSource(`${basePath}/api/reload`); - sse.addEventListener('reload', async () => { - await mutateCache(); - setReset(true); - console.log('Reloaded config.'); + sse.addEventListener('reload', () => { + // add a update delay to prevent rerender before server is shut down for rebuild, ideally we don't want to do this. + // TODO: We need to pass a flag when a rebuild will happen so that client does not trigger render. + setTimeout(async () => { + await mutateCache(); + setReset(true); + console.log('Reloaded config.'); + }, 600); }); sse.onerror = () => { + setRestarting(true); + console.log('Rebuilding Lowdefy App.'); sse.close(); waitForRestartedServer(basePath); }; @@ -39,8 +46,7 @@ const Reload = ({ children, basePath }) => { sse.close(); }; }, []); - // TODO: reload needs to pass a flag that the server is restarting / installing types. - return <>{children({ reset, setReset })}; + return <>{children({ reset, setReset, restarting })}; }; export default Reload; diff --git a/packages/server-dev/lib/RestartingPage.js b/packages/server-dev/lib/RestartingPage.js new file mode 100644 index 000000000..7c4ad24b3 --- /dev/null +++ b/packages/server-dev/lib/RestartingPage.js @@ -0,0 +1,46 @@ +/* + Copyright 2020-2022 Lowdefy, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import React from 'react'; + +const RestartingPage = () => { + return ( +
+
+

Rebuilding Lowdefy App

+

+ The server is reconfiguring Lowdefy types and restarting. The page will reload when ready. +

+
+
+ ); +}; + +export default RestartingPage; diff --git a/packages/server-dev/lib/utils/waitForRestartedServer.js b/packages/server-dev/lib/utils/waitForRestartedServer.js index 98bbcd250..d55e89705 100644 --- a/packages/server-dev/lib/utils/waitForRestartedServer.js +++ b/packages/server-dev/lib/utils/waitForRestartedServer.js @@ -26,7 +26,7 @@ function waitForRestartedServer(basePath) { } catch (error) { waitForRestartedServer(basePath); } - }, 1500); + }, 500); // TODO: this ping should be shorter than rerender delay until we can pass a rebuild flag to reload. } export default waitForRestartedServer; From e19e23d7aee0d8f1ec7a62ca3951c62e55387a9a Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Mon, 2 May 2022 15:17:41 +0200 Subject: [PATCH 11/11] chore: Review fixes. --- packages/client/src/Client.js | 2 +- packages/server-dev/lib/RestartingPage.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/client/src/Client.js b/packages/client/src/Client.js index 1feef9206..968409103 100644 --- a/packages/client/src/Client.js +++ b/packages/client/src/Client.js @@ -43,7 +43,7 @@ const Client = ({ resetContext={resetContext} /> { >

Rebuilding Lowdefy App

- The server is reconfiguring Lowdefy types and restarting. The page will reload when ready. + The server is restarting because your configuration changed. The page will reload when + ready.