diff --git a/src/app/api/social/route.ts b/src/app/api/social/route.ts new file mode 100644 index 0000000..9abff26 --- /dev/null +++ b/src/app/api/social/route.ts @@ -0,0 +1,51 @@ +import { NextResponse } from 'next/server'; +import { createClient } from '@/lib/supabase/server'; +import { resolveActiveTenant, restGet } from '@/lib/tenant-context'; +import { isAgencyRole, userRole } from '@/lib/agency'; + +export const dynamic = 'force-dynamic'; + +/** GET — social channel integrations for active tenant. */ +export async function GET() { + const supabase = await createClient(); + const { + data: { user }, + } = await supabase.auth.getUser(); + if (!user) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const ctx = await resolveActiveTenant(user); + if (!ctx.tenantId || ctx.portfolioWide) { + return NextResponse.json({ + integrations: [], + warning: 'Selecciona un cliente en Contexto', + }); + } + + const agency = isAgencyRole(userRole(user)); + const providers = 'instagram,facebook,tiktok,linkedin'; + + if (agency && ctx.viaView) { + const tid = encodeURIComponent(ctx.tenantId); + const r = await restGet( + `/rest/v1/integrations?tenant_id=eq.${tid}&provider=in.(${providers})&select=provider,status,external_account_id,label,last_sync_at,meta,error_message` + ); + return NextResponse.json({ + integrations: r.data || [], + warning: r.error || null, + }); + } + + const { data, error } = await supabase + .from('integrations') + .select( + 'provider,status,external_account_id,label,last_sync_at,meta,error_message' + ) + .in('provider', ['instagram', 'facebook', 'tiktok', 'linkedin']); + + return NextResponse.json({ + integrations: data || [], + warning: error?.message || null, + }); +} diff --git a/src/app/dashboard/ad-tracker/page.tsx b/src/app/dashboard/ad-tracker/page.tsx index b63c899..77847f6 100644 --- a/src/app/dashboard/ad-tracker/page.tsx +++ b/src/app/dashboard/ad-tracker/page.tsx @@ -34,7 +34,7 @@ export default async function AdTrackerPage() { if (ctx.portfolioWide) { return (
- Selecciona un cliente en Contexto para abrir su Ad Tracker (privado por + Selecciona un cliente en Contexto para abrir Ads (Meta / Google Ads por tenant).
); diff --git a/src/app/dashboard/social/page.tsx b/src/app/dashboard/social/page.tsx new file mode 100644 index 0000000..ae4c9ce --- /dev/null +++ b/src/app/dashboard/social/page.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { createClient } from '@/lib/supabase/server'; +import { redirect } from 'next/navigation'; +import { resolveActiveTenant } from '@/lib/tenant-context'; +import { isAgencyRole, userRole } from '@/lib/agency'; +import SocialDashboard from '@/components/SocialDashboard'; + +export const dynamic = 'force-dynamic'; + +export default async function SocialPage() { + const supabase = await createClient(); + const { + data: { user }, + } = await supabase.auth.getUser(); + if (!user) redirect('/login'); + + const ctx = await resolveActiveTenant(user); + const agency = isAgencyRole(userRole(user)); + + if (ctx.portfolioWide) { + return ( ++ Selecciona un cliente en Contexto para abrir Social (perfiles RRSS por + tenant). +
+ ); + } + + return ( ++ {err} +
+ )} + + {loading ? ( +
+
+ {ch.label} +
++ {row?.meta?.account_name || + row?.label || + row?.external_account_id || + '—'} +
+ {row?.meta?.warning && ( ++ {row.meta.warning} +
+ )} + {url && ( + + Abrir perfilPróximo en Social
+