import { redirect } from "next/navigation" import { getSessionUser } from "@/lib/session" import { getAccountContext } from "@/lib/account" import { listProviders, listConnections } from "@/lib/accounting" import { listEsignAdapters, listEsignConnections } from "@/lib/esign" import { AccountingIntegrations } from "@/components/dashboard/accounting-integrations" import { EsignIntegrations } from "@/components/dashboard/esign-integrations" export const metadata = { title: "Integrations" } export const dynamic = "force-dynamic" export default async function IntegrationsPage({ searchParams, }: { searchParams: Promise<{ connected?: string; error?: string }> }) { const user = await getSessionUser() if (!user) redirect("/login") const ctx = await getAccountContext(user.id) const sp = await searchParams const providers = listProviders() const connections = ctx.isOwner ? await listConnections(ctx.ownerId) : [] const esignAdapters = listEsignAdapters() const esignConnections = ctx.isOwner ? await listEsignConnections(ctx.ownerId) : [] const appUrl = (process.env.NEXT_PUBLIC_APP_URL ?? "http://localhost:3000").replace(/\/+$/, "") // DocuSign vs Dropbox Sign flash messages are keyed by provider id, so a single // connected/error param drives whichever card the user just acted on. const esignFlash = { connected: sp.connected, error: sp.error } return (
Connect your own DocuSign or Dropbox Sign account to send leases for signature.
Connect your accounting software to automatically push rent income and expenses into your books.