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
