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 + {integration.icon.length ? integration : ( + {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'