Gå til indhold

React

SDK’et er et browserbibliotek: det afhænger af window og document og monterer sin egen container på document.body. Det fungerer uden yderligere opsætning i enhver React-app, der kører i browseren (Vite, CRA, Next.js, Remix osv.).

I frameworks med SSR (Next.js App Router, Remix) skal du sørge for, at SDK’et kun instantieres på klienten — typisk inde i useEffect eller en 'use client'-komponent.

Terminal window
npm install @magicfeedback/popup-sdk

SDK’et har intern tilstand og bør oprettes én gang pr. applikation. Den reneste tilgang er at pakke det ind i en custom hook og kalde den fra din rod-layout eller en provider på øverste niveau.

hooks/useDeepdotsPopups.ts
import { useEffect, useRef } from 'react';
import { DeepdotsPopups } from '@magicfeedback/popup-sdk';
export function useDeepdotsPopups(userId?: string) {
const ref = useRef<DeepdotsPopups | null>(null);
useEffect(() => {
if (ref.current) return;
const popups = new DeepdotsPopups();
popups.init({
mode: 'server',
apiKey: 'YOUR_PUBLIC_API_KEY',
userId,
});
popups.autoLaunch();
ref.current = popups;
}, [userId]);
return ref;
}
App.tsx
import { useDeepdotsPopups } from './hooks/useDeepdotsPopups';
export default function App() {
useDeepdotsPopups('customer-123');
return <YourRoutes />;
}

I App Routeren skal du montere SDK’et inde i en klientkomponent og importere den fra dit rod-layout.

app/components/DeepdotsProvider.tsx
'use client';
import { useEffect } from 'react';
import { DeepdotsPopups } from '@magicfeedback/popup-sdk';
export function DeepdotsProvider({ userId }: { userId?: string }) {
useEffect(() => {
const popups = new DeepdotsPopups();
popups.init({
mode: 'server',
apiKey: process.env.NEXT_PUBLIC_DEEPDOTS_API_KEY!,
userId,
});
popups.autoLaunch();
}, [userId]);
return null;
}
app/layout.tsx
import { DeepdotsProvider } from './components/DeepdotsProvider';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="da">
<body>
{children}
<DeepdotsProvider userId="customer-123" />
</body>
</html>
);
}

Du kan også gemme en reference til instansen og kalde show() eller triggerEvent() fra en event handler.

'use client';
import { useEffect, useRef } from 'react';
import { DeepdotsPopups } from '@magicfeedback/popup-sdk';
export function FeedbackButton() {
const popupsRef = useRef<DeepdotsPopups | null>(null);
useEffect(() => {
const popups = new DeepdotsPopups();
popups.init({
mode: 'server',
apiKey: 'YOUR_PUBLIC_API_KEY',
});
popups.autoLaunch();
popupsRef.current = popups;
}, []);
return (
<button
onClick={() =>
popupsRef.current?.show({
surveyId: 'survey-home-001',
productId: 'product-main',
})
}
>
Giv feedback
</button>
);
}

Abonnér inde i useEffect, og afmeld i cleanup for at undgå lækager mellem re-mounts (f.eks. med React StrictMode i udvikling).

useEffect(() => {
const popups = new DeepdotsPopups();
popups.init({ mode: 'server', apiKey: 'YOUR_PUBLIC_API_KEY' });
const onShown = (event: unknown) => console.log('shown', event);
const onCompleted = (event: unknown) => console.log('completed', event);
popups.on('popup_shown', onShown);
popups.on('survey_completed', onCompleted);
popups.autoLaunch();
return () => {
popups.off('popup_shown', onShown);
popups.off('survey_completed', onCompleted);
};
}, []);