Official Next.js SDK for integrating Suada with your Next.js applications
npm install @suada/next @suada/core # or yarn add @suada/next @suada/core # or pnpm add @suada/next @suada/core
.env.local
NEXT_PUBLIC_SUADA_API_KEY=your-api-key NEXT_PUBLIC_SUADA_BASE_URL=https://api.suada.ai
// app/layout.tsx import { SuadaProvider } from '@suada/next'; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( <html lang="en"> <body> <SuadaProvider config={{ apiKey: process.env.NEXT_PUBLIC_SUADA_API_KEY!, }} > {children} </SuadaProvider> </body> </html> ); }
// app/page.tsx import { IntegrationButton, IntegrationList } from '@suada/next'; export default function Home() { return ( <div className="p-4"> <h1>My Integrations</h1> <IntegrationButton provider="notion" /> <IntegrationList /> </div> ); }
// app/api/auth/callback/route.ts import { handleOAuthCallback } from '@suada/next'; export async function GET(request: Request) { const { searchParams } = new URL(request.url); const code = searchParams.get('code'); if (!code) { return new Response('No code provided', { status: 400 }); } try { await handleOAuthCallback(code); return Response.redirect(new URL('/success', request.url)); } catch (error) { return new Response('Authentication failed', { status: 500 }); } }
// app/globals.css @tailwind base; @tailwind components; @tailwind utilities; @layer components { .suada-integration-button { @apply px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600; } }
// app/integrations/page.tsx import { getIntegrations } from '@suada/next'; export default async function IntegrationsPage() { const integrations = await getIntegrations(); return ( <div> <h1>Connected Integrations</h1> {integrations.map((integration) => ( <div key={integration.id}> {integration.name} - {integration.status} </div> ))} </div> ); }
// app/integrations/page.tsx import { IntegrationButton, IntegrationList } from '@suada/next'; export default function IntegrationsPage() { return ( <div className="space-y-4"> <h1 className="text-2xl font-bold">Integrations</h1> <IntegrationButton provider="notion" /> <IntegrationList /> </div> ); }
// app/integrations/[provider]/page.tsx import { getIntegration, updateIntegration } from '@suada/next'; export default async function IntegrationPage({ params, }: { params: { provider: string }; }) { const integration = await getIntegration(params.provider); return ( <div> <h1>{integration.name}</h1> <button onClick={async () => { await updateIntegration(params.provider, { settings: { /* ... */ }, }); }} > Update Settings </button> </div> ); }
// app/integrations/page.tsx import { getIntegrations } from '@suada/next'; export default async function IntegrationsPage() { const integrations = await getIntegrations(); return ( <div> {integrations.map((integration) => ( <div key={integration.id}>{integration.name}</div> ))} </div> ); }
// app/integrations/page.tsx import { ErrorBoundary } from '@suada/next'; export default function IntegrationsPage() { return ( <ErrorBoundary fallback={<div>Something went wrong</div>}> <IntegrationList /> </ErrorBoundary> ); }
Was this page helpful?