From a2a805b45b18f15cf821d03bf887771eee6a7ff8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 9 Feb 2021 12:41:21 +0000 Subject: [PATCH] Ensure client data contexts are correctly updated if a parent context is updated --- .../client/src/components/Provider.svelte | 17 +++++-- packages/client/src/store/context.js | 21 ++++---- .../standard-components/src/RowDetail.svelte | 51 +++++++++++-------- 3 files changed, 52 insertions(+), 37 deletions(-) diff --git a/packages/client/src/components/Provider.svelte b/packages/client/src/components/Provider.svelte index bc95412bab..3c894f6723 100644 --- a/packages/client/src/components/Provider.svelte +++ b/packages/client/src/components/Provider.svelte @@ -11,16 +11,21 @@ // Clone and create new data context for this component tree const context = getContext("context") const component = getContext("component") - const newContext = createContextStore($context) + const newContext = createContextStore() setContext("context", newContext) + + let initiated = false $: providerKey = key || $component.id + // Add data context + $: { + newContext.actions.provideData(providerKey, $context, data) + initiated = true + } + // Instance ID is unique to each instance of a provider let instanceId - // Add data context - $: data !== undefined && newContext.actions.provideData(providerKey, data) - // Add actions context $: { if (instanceId) { @@ -51,4 +56,6 @@ }) - +{#if initiated} + +{/if} diff --git a/packages/client/src/store/context.js b/packages/client/src/store/context.js index 80777cbeff..5725f94231 100644 --- a/packages/client/src/store/context.js +++ b/packages/client/src/store/context.js @@ -1,22 +1,20 @@ import { writable } from "svelte/store" -export const createContextStore = existingContext => { - const store = writable({ ...existingContext }) +export const createContextStore = () => { + const store = writable({}) // Adds a data context layer to the tree - const provideData = (providerId, data) => { - if (!providerId) { - return - } - store.update(state => { - state[providerId] = data + const provideData = (providerId, context, data) => { + let newData = { ...context } + if (providerId && data !== undefined) { + newData[providerId] = data // Keep track of the closest component ID so we can later hydrate a "data" prop. // This is only required for legacy bindings that used "data" rather than a // component ID. - state.closestComponentId = providerId - return state - }) + newData.closestComponentId = providerId + } + store.set(newData) } // Adds an action context layer to the tree @@ -32,7 +30,6 @@ export const createContextStore = existingContext => { return { subscribe: store.subscribe, - update: store.update, actions: { provideData, provideAction }, } } diff --git a/packages/standard-components/src/RowDetail.svelte b/packages/standard-components/src/RowDetail.svelte index ed46fd6927..8a413dfb43 100644 --- a/packages/standard-components/src/RowDetail.svelte +++ b/packages/standard-components/src/RowDetail.svelte @@ -1,46 +1,57 @@ {#if row} -
- + +
- -
+
+ {/if}