summaryrefslogtreecommitdiff
path: root/packages/integrations/preact/src/client.ts
diff options
context:
space:
mode:
authorGravatar Phil <me@ph1p.dev> 2024-08-28 12:41:35 +0200
committerGravatar GitHub <noreply@github.com> 2024-08-28 11:41:35 +0100
commit5f2536b51df93bfd51098c48220d647e7ad3954c (patch)
tree056a91c16866655154ede8173ffebbed022ea46e /packages/integrations/preact/src/client.ts
parent26c63a2b07e6298dfb59c0c3178348cbd02c8a73 (diff)
downloadastro-5f2536b51df93bfd51098c48220d647e7ad3954c.tar.gz
astro-5f2536b51df93bfd51098c48220d647e7ad3954c.tar.zst
astro-5f2536b51df93bfd51098c48220d647e7ad3954c.zip
fix: handle preact signals in array correctly (#11834)
* fix: handle preact signals in array correctly * feat: serialize signals in object
Diffstat (limited to 'packages/integrations/preact/src/client.ts')
-rw-r--r--packages/integrations/preact/src/client.ts31
1 files changed, 26 insertions, 5 deletions
diff --git a/packages/integrations/preact/src/client.ts b/packages/integrations/preact/src/client.ts
index 3fb36d22a..fa20a9928 100644
--- a/packages/integrations/preact/src/client.ts
+++ b/packages/integrations/preact/src/client.ts
@@ -18,13 +18,34 @@ export default (element: HTMLElement) =>
let signalsRaw = element.dataset.preactSignals;
if (signalsRaw) {
const { signal } = await import('@preact/signals');
- let signals: Record<string, string> = JSON.parse(element.dataset.preactSignals!);
+ let signals: Record<string, string | [string, number][]> = JSON.parse(
+ element.dataset.preactSignals!,
+ );
for (const [propName, signalId] of Object.entries(signals)) {
- if (!sharedSignalMap.has(signalId)) {
- const signalValue = signal(props[propName]);
- sharedSignalMap.set(signalId, signalValue);
+ if (Array.isArray(signalId)) {
+ signalId.forEach(([id, indexOrKeyInProps]) => {
+ const mapValue = props[propName][indexOrKeyInProps];
+ let valueOfSignal = mapValue;
+
+ // not an property key
+ if(typeof indexOrKeyInProps !== 'string') {
+ valueOfSignal = mapValue[0];
+ indexOrKeyInProps = mapValue[1];
+ }
+
+ if (!sharedSignalMap.has(id)) {
+ const signalValue = signal(valueOfSignal);
+ sharedSignalMap.set(id, signalValue);
+ }
+ props[propName][indexOrKeyInProps] = sharedSignalMap.get(id);
+ });
+ } else {
+ if (!sharedSignalMap.has(signalId)) {
+ const signalValue = signal(props[propName]);
+ sharedSignalMap.set(signalId, signalValue);
+ }
+ props[propName] = sharedSignalMap.get(signalId);
}
- props[propName] = sharedSignalMap.get(signalId);
}
}