diff --git a/frontend/app/components/Client/Integrations/IntegrationItem.tsx b/frontend/app/components/Client/Integrations/IntegrationItem.tsx
index f1b69c029..ec730e7c1 100644
--- a/frontend/app/components/Client/Integrations/IntegrationItem.tsx
+++ b/frontend/app/components/Client/Integrations/IntegrationItem.tsx
@@ -22,7 +22,9 @@ const IntegrationItem = (props: Props) => {
)}
-
+ {integration.icon.length ?
: (
+ {integration.header}
+ )}
{integration.title}
{/*
{integration.subtitle && integration.subtitle}
*/}
diff --git a/frontend/app/components/Client/Integrations/Integrations.tsx b/frontend/app/components/Client/Integrations/Integrations.tsx
index cde34ed89..8080213b1 100644
--- a/frontend/app/components/Client/Integrations/Integrations.tsx
+++ b/frontend/app/components/Client/Integrations/Integrations.tsx
@@ -30,6 +30,7 @@ import { PageTitle, Loader } from 'UI';
import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
import withPageTitle from 'HOCs/withPageTitle';
import PiniaDoc from './PiniaDoc'
+import ZustandDoc from './ZustandDoc'
interface Props {
fetch: (name: string, siteId: string) => void;
@@ -171,6 +172,7 @@ const integrations = [
{ title: 'Profiler', slug: '', icon: 'integrations/openreplay', component:
},
{ title: 'Axios', slug: '', icon: 'integrations/openreplay', component:
},
{ title: 'Assist', slug: '', icon: 'integrations/openreplay', component:
},
+ { title: 'Zustand', slug: '', icon: '', header: '🐻', component:
}
],
},
];
diff --git a/frontend/app/components/Client/Integrations/ZustandDoc/ZustandDoc.js b/frontend/app/components/Client/Integrations/ZustandDoc/ZustandDoc.js
new file mode 100644
index 000000000..35ff5ecdf
--- /dev/null
+++ b/frontend/app/components/Client/Integrations/ZustandDoc/ZustandDoc.js
@@ -0,0 +1,92 @@
+import React from 'react';
+import Highlight from 'react-highlight';
+import ToggleContent from '../../../shared/ToggleContent';
+import DocLink from 'Shared/DocLink/DocLink';
+import { connect } from 'react-redux';
+
+const ZustandDoc = (props) => {
+ const { projectKey } = props;
+ return (
+
+
Zustand
+
+
+ This plugin allows you to capture Zustand mutations/state and inspect them later on while replaying session recordings. This is very
+ useful for understanding and fixing issues.
+
+
+
Installation
+
{`npm i @openreplay/tracker-zustand --save`}
+
+
Usage
+
+ Initialize the @openreplay/tracker package as usual and load the plugin into it. Then put the generated plugin into your plugins
+ field of your store.
+
+
+
+
+ {`import create from "zustand";
+import Tracker from '@openreplay/tracker';
+import trackerZustand from '@openreplay/tracker-zustand';
+
+
+const tracker = new Tracker({
+ projectKey: ${projectKey},
+});
+
+const zustandPlugin = tracker.use(trackerZustand())
+// store name, optional
+// randomly generated if undefined
+const bearStoreLogger = zustandPlugin('bear_store')
+
+
+const useBearStore = create(
+ bearStoreLogger((set: any) => ({
+ bears: 0,
+ increasePopulation: () => set((state: any) => ({ bears: state.bears + 1 })),
+ removeAllBears: () => set({ bears: 0 }),
+ }))
+)`}
+
+ }
+ second={
+
+ {`import create from "zustand";
+import Tracker from '@openreplay/tracker/cjs';
+import trackerZustand from '@openreplay/tracker-zustand/cjs';
+
+
+const tracker = new Tracker({
+ projectKey: ${projectKey},
+});
+
+const zustandPlugin = tracker.use(trackerZustand())
+// store name, optional
+// randomly generated if undefined
+const bearStoreLogger = zustandPlugin('bear_store')
+
+
+const useBearStore = create(
+ bearStoreLogger((set: any) => ({
+ bears: 0,
+ increasePopulation: () => set((state: any) => ({ bears: state.bears + 1 })),
+ removeAllBears: () => set({ bears: 0 }),
+ }))
+)`}
+
+ }
+ />
+
+
+
+
+ );
+};
+
+ZustandDoc.displayName = 'ZustandDoc';
+
+export default connect((state) => ({ projectKey: state.getIn(['site', 'instance', 'projectKey'])}) )(ZustandDoc)
diff --git a/frontend/app/components/Client/Integrations/ZustandDoc/index.js b/frontend/app/components/Client/Integrations/ZustandDoc/index.js
new file mode 100644
index 000000000..f7061eb7a
--- /dev/null
+++ b/frontend/app/components/Client/Integrations/ZustandDoc/index.js
@@ -0,0 +1 @@
+export { default } from './ZustandDoc'