Skip to content

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 ​

  1. Security: Never expose API keys client-side
  2. Error Handling: Always handle API failures gracefully
  3. Loading States: Provide feedback while creating sessions
  4. Session Management: Handle expired sessions appropriately
  5. Responsive Design: Ensure the embed works on mobile devices

Built with ❤️ for PocketDNS Partners