React
Kompatibilitet
Sektion kaldt “Kompatibilitet”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.
Installation
Sektion kaldt “Installation”npm install @magicfeedback/popup-sdkGrundlæggende integration
Sektion kaldt “Grundlæggende integration”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.
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;}import { useDeepdotsPopups } from './hooks/useDeepdotsPopups';
export default function App() { useDeepdotsPopups('customer-123');
return <YourRoutes />;}Next.js (App Router)
Sektion kaldt “Next.js (App Router)”I App Routeren skal du montere SDK’et inde i en klientkomponent og importere den fra dit rod-layout.
'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;}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> );}Udløs en popup fra en React-komponent
Sektion kaldt “Udløs en popup fra en React-komponent”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> );}Lyt til events
Sektion kaldt “Lyt til events”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); };}, []);