import { useState, useEffect } from 'react';
interface DiditInContextProps {
verificationUrl?: string;
workflowId?: string;
isOpen: boolean;
onClose: () => void;
onComplete?: (sessionId: string, status: string) => void;
}
export function DiditInContext({
verificationUrl,
workflowId,
isOpen,
onClose,
onComplete
}: DiditInContextProps) {
const [iframeSrc, setIframeSrc] = useState<string>('');
useEffect(() => {
if (isOpen) {
if (verificationUrl) {
setIframeSrc(verificationUrl);
} else if (workflowId) {
// Use UniLink format
setIframeSrc(`https://verify.didit.me/u/${btoa(workflowId)}`);
}
document.body.style.overflow = 'hidden';
} else {
setIframeSrc('');
document.body.style.overflow = '';
}
}, [isOpen, verificationUrl, workflowId]);
// Listen for postMessage from iframe
useEffect(() => {
const handleMessage = (event: MessageEvent) => {
if (event.origin !== 'https://verify.didit.me') return;
if (event.data?.type === 'verification_complete' && onComplete) {
onComplete(event.data.sessionId, event.data.status);
onClose();
}
};
window.addEventListener('message', handleMessage);
return () => window.removeEventListener('message', handleMessage);
}, [onComplete, onClose]);
// Handle escape key
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape' && isOpen) onClose();
};
document.addEventListener('keydown', handleEscape);
return () => document.removeEventListener('keydown', handleEscape);
}, [isOpen, onClose]);
if (!isOpen) return null;
return (
<div
className="fixed inset-0 bg-black/60 backdrop-blur-sm z-50 flex items-center justify-center"
onClick={(e) => e.target === e.currentTarget && onClose()}
>
<div className="relative w-[90%] max-w-[480px] h-[85vh] max-h-[750px] bg-white rounded-2xl overflow-hidden shadow-2xl">
<button
onClick={onClose}
className="absolute top-3 right-3 z-10 w-8 h-8 rounded-full bg-black/10 hover:bg-black/20 flex items-center justify-center"
aria-label="Close"
>
✕
</button>
<iframe
src={iframeSrc}
className="w-full h-full border-0"
allow="camera; microphone; fullscreen; autoplay; encrypted-media"
title="Didit Verification"
/>
</div>
</div>
);
}