"use client"; import { useQuery } from "@tanstack/react-query"; import Link from "next/link"; import { BarChart, Bar, XAxis, YAxis, ResponsiveContainer, Tooltip } from "recharts"; import { experienceApi } from "@/modules/experience/services/experience-api"; import { useTenantId } from "@/hooks/useTenantId"; import { useExperienceCapabilities, useExperienceMetrics } from "@/modules/experience/hooks/useExperienceCapabilities"; import { ExperiencePageLoader, ExperiencePageError } from "@/modules/experience/pages/shared"; import { PageHeader, Card, CardContent, Button, Badge } from "@/components/ds"; import { ExperienceBreadcrumbs } from "@/modules/experience/components/ExperienceBreadcrumbs"; import { ExperienceStatGrid } from "@/modules/experience/design-system"; export const ExecutiveDashboard = function ExperienceExecutiveDashboard() { const { tenantId } = useTenantId(); const caps = useExperienceCapabilities(); const metrics = useExperienceMetrics(); const countsQ = useQuery({ queryKey: ["experience", tenantId, "dashboard-counts"], queryFn: async () => { const [workspaces, sites, pages, forms, releases, audit] = await Promise.all([ experienceApi.workspaces.list(tenantId!), experienceApi.sites.list(tenantId!), experienceApi.pages.list(tenantId!), experienceApi.forms.list(tenantId!), experienceApi.publishReleases.list(tenantId!), experienceApi.audit.list(tenantId!, { limit: 10 }), ]); return { workspaces: workspaces.length, sites: sites.length, pages: pages.length, forms: forms.length, releases: releases.length, recentPages: pages.slice(0, 5), recentSites: sites.slice(0, 5), audit: audit.slice(0, 10), }; }, enabled: !!tenantId, }); if (!tenantId || countsQ.isLoading || caps.isLoading) return ; if (countsQ.error) return countsQ.refetch()} />; const c = countsQ.data!; const chartData = [ { name: "فضاها", value: c.workspaces }, { name: "سایت", value: c.sites }, { name: "صفحات", value: c.pages }, { name: "فرم", value: c.forms }, { name: "انتشار", value: c.releases }, ]; return (
Torbat Pages v{caps.data?.version}} />

توزیع منابع

اقدامات سریع

آخرین صفحات

    {c.recentPages.map((p) => (
  • {String(p.title ?? p.slug)}
  • ))}

فعالیت اخیر (ممیزی)

    {c.audit.map((a) => (
  • {String(a.action)} — {String(a.entity_type)} — {new Date(String(a.created_at)).toLocaleString("fa-IR")}
  • ))} {c.audit.length === 0 ?
  • فعالیتی ثبت نشده
  • : null}
{metrics.data ? ( فاز {metrics.data.phase} — {metrics.data.note} ) : null}
); }; export default ExecutiveDashboard;