Frontend Integration
This guide covers how to integrate PocketDNS into your frontend application using various frameworks and approaches.
Basic Integration
The simplest way to integrate PocketDNS is using an iframe with the login URL from the user session API.
html
<iframe
src="{login_url}"
width="100%"
height="600px"
frameborder="0"
allow="payment"
title="PocketDNS Domain Interface">
</iframe>React Components
Basic React Integration
jsx
import React, { useState, useEffect } from 'react';
const PocketDNSEmbed = ({ userIdentifier, email }) => {
const [loginUrl, setLoginUrl] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const createSession = async () => {
try {
const response = await fetch('/api/pocketdns/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userIdentifier, email })
});
if (!response.ok) {
throw new Error('Failed to create session');
}
const { login_url } = await response.json();
setLoginUrl(login_url);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
createSession();
}, [userIdentifier, email]);
if (loading) return <div>Loading domain interface...</div>;
if (error) return <div>Error: {error}</div>;
return (
<div className="pocketdns-embed">
<iframe
src={loginUrl}
width="100%"
height="600px"
frameBorder="0"
allow="payment"
title="Domain Management"
/>
</div>
);
};
export default PocketDNSEmbed;Advanced React Hook
jsx
import { useState, useEffect, useCallback } from 'react';
export const usePocketDNS = (userIdentifier, email) => {
const [session, setSession] = useState(null);
const [domains, setDomains] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const createSession = useCallback(async () => {
setLoading(true);
try {
const response = await fetch('/api/pocketdns/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userIdentifier, email })
});
const sessionData = await response.json();
setSession(sessionData);
return sessionData;
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
}, [userIdentifier, email]);
const fetchDomains = useCallback(async () => {
try {
const response = await fetch(`/api/pocketdns/domains/${userIdentifier}`);
const { domains } = await response.json();
setDomains(domains);
return domains;
} catch (err) {
setError(err.message);
}
}, [userIdentifier]);
return {
session,
domains,
loading,
error,
createSession,
fetchDomains
};
};Advanced Integration
Event Communication
You can listen to events from the embedded interface:
javascript
window.addEventListener('message', (event) => {
if (event.origin !== 'https://embed.pocketdns.com') return;
switch (event.data.type) {
case 'domain_purchased':
console.log('Domain purchased:', event.data.domain);
// Refresh your UI, update user account, etc.
break;
case 'session_expired':
console.log('Session expired, need to refresh');
// Create new session
break;
default:
break;
}
});Styling and Customization
The embedded interface respects your app's theme through CSS custom properties:
css
:root {
--pocketdns-primary-color: #3b82f6;
--pocketdns-secondary-color: #64748b;
--pocketdns-background: #ffffff;
--pocketdns-text: #1e293b;
--pocketdns-border-radius: 8px;
}
/* Dark mode support */
@media (prefers-color-scheme: dark) {
:root {
--pocketdns-background: #0f172a;
--pocketdns-text: #f1f5f9;
}
}Next.js Integration
For Next.js applications, create an API route to handle session creation:
javascript
// pages/api/pocketdns/session.js
export default async function handler(req, res) {
if (req.method !== 'POST') {
return res.status(405).json({ message: 'Method not allowed' });
}
const { userIdentifier, email } = req.body;
try {
const response = await fetch('https://api.pocketdns.com/api/v1/users', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POCKETDNS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ user_identifier: userIdentifier, email })
});
if (!response.ok) {
throw new Error('Failed to create session');
}
const sessionData = await response.json();
res.status(200).json(sessionData);
} catch (error) {
res.status(500).json({ message: error.message });
}
}Vue.js Integration
vue
<template>
<div class="pocketdns-container">
<div v-if="loading">Loading...</div>
<div v-else-if="error">Error: {{ error }}</div>
<iframe
v-else
:src="loginUrl"
width="100%"
height="600px"
frameborder="0"
allow="payment"
/>
</div>
</template>
<script>
export default {
props: ['userIdentifier', 'email'],
data() {
return {
loginUrl: null,
loading: true,
error: null
};
},
async mounted() {
try {
const response = await fetch('/api/pocketdns/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
userIdentifier: this.userIdentifier,
email: this.email
})
});
if (!response.ok) throw new Error('Failed to create session');
const { login_url } = await response.json();
this.loginUrl = login_url;
} catch (error) {
this.error = error.message;
} finally {
this.loading = false;
}
}
};
</script>Best Practices
- Security: Never expose API keys client-side
- Error Handling: Always handle API failures gracefully
- Loading States: Provide feedback while creating sessions
- Session Management: Handle expired sessions appropriately
- Responsive Design: Ensure the embed works on mobile devices
