summaryrefslogtreecommitdiff
path: root/packages/integrations/react/client-v17.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/react/client-v17.js')
-rw-r--r--packages/integrations/react/client-v17.js22
1 files changed, 22 insertions, 0 deletions
diff --git a/packages/integrations/react/client-v17.js b/packages/integrations/react/client-v17.js
new file mode 100644
index 000000000..bd17050ea
--- /dev/null
+++ b/packages/integrations/react/client-v17.js
@@ -0,0 +1,22 @@
+import { createElement } from 'react';
+import { hydrate, render, unmountComponentAtNode } from 'react-dom';
+import StaticHtml from './static-html.js';
+
+export default (element) =>
+ (Component, props, { default: children, ...slotted }, { client }) => {
+ for (const [key, value] of Object.entries(slotted)) {
+ props[key] = createElement(StaticHtml, { value, name: key });
+ }
+ const componentEl = createElement(
+ Component,
+ props,
+ children != null ? createElement(StaticHtml, { value: children }) : children,
+ );
+
+ const isHydrate = client !== 'only';
+ const bootstrap = isHydrate ? hydrate : render;
+ bootstrap(componentEl, element);
+ element.addEventListener('astro:unmount', () => unmountComponentAtNode(element), {
+ once: true,
+ });
+ };