"use client"; import Link from "next/link"; import { useEffect, useMemo, useState } from "react"; import { Badge, Button, Container } from "@/components/ui"; import { useAuth } from "@/hooks/useAuth"; import { useMe } from "@/hooks/useMe"; import { useTenantHost } from "@/hooks/useTenantHost"; import { api, type PublicTenantSite } from "@/lib/api"; import { applyTheme } from "@/lib/theme"; import { loadCommercialProducts } from "@/modules/commercial/adapters"; import { CommercialEmptyState, ProductCard } from "@/modules/commercial/components"; import type { CommercialProduct } from "@/modules/commercial/types"; /** * صفحه ساب‌دامین tenant: * - مهمان / غیرعضو → لندینگ تمپلیت برند کسب‌وکار * - عضو/مالک لاگین‌شده → دسترسی به سرویس‌ها و داشبورد */ export function TenantSitePage() { const host = useTenantHost(); const { isAuthenticated, login, loading: authLoading, signOut, user } = useAuth(); const { me, loading: meLoading } = useMe(); const [site, setSite] = useState(null); const [error, setError] = useState(""); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; (async () => { setLoading(true); setError(""); try { const data = await api.public.tenantSite({ slug: host.slug, host: host.hostname, }); if (cancelled) return; setSite(data); applyTheme({ site_name: data.name, primary_color: data.primary_color || "#0284c7", secondary_color: data.secondary_color || "#0f172a", logo_url: data.logo_url || "", support_email: "", }); if (typeof document !== "undefined") { document.title = data.name; } } catch (e) { if (!cancelled) { setError(e instanceof Error ? e.message : "بارگذاری سایت ناموفق بود"); setSite(null); } } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [host.slug, host.hostname]); const membership = useMemo(() => { if (!me || !site) return null; return me.memberships.find((m) => m.tenant_slug === site.slug) ?? null; }, [me, site]); const isMember = Boolean(isAuthenticated && membership); const isOwner = Boolean(membership?.is_owner); if (loading || (isAuthenticated && meLoading)) { return (
); } if (error || !site) { return (

سایت یافت نشد

{error || "این دامنه به workspace فعالی وصل نیست."}

بازگشت به تربت‌یار
); } if (isMember) { return ( ); } return ( login()} authLoading={authLoading} platformUrl={`https://${host.baseDomain}`} /> ); } function TenantPublicLanding({ site, onLogin, authLoading, platformUrl, }: { site: PublicTenantSite; onLogin: () => void; authLoading: boolean; platformUrl: string; }) { const initial = site.name.trim().charAt(0) || "ت"; return (
{site.logo_url ? ( // eslint-disable-next-line @next/next/no-img-element ) : ( initial )}
{site.business_type && ( {site.business_type} )}

{site.name}

{site.tagline}. به‌زودی صفحه عمومی و سرویس‌های این کسب‌وکار اینجا تکمیل می‌شود.

{site.primary_domain && (

{site.primary_domain}

)}
); } function TenantMemberHome({ site, isOwner, role, userLabel, onSignOut, }: { site: PublicTenantSite; isOwner: boolean; role?: string; userLabel: string; onSignOut: () => void; }) { return (
{isOwner ? "مالک workspace" : role || "عضو"}

{site.name}

خوش آمدید {userLabel} — سرویس‌های تربت‌یار برای این کسب‌وکار

{site.primary_domain && (

{site.primary_domain}

)}
); } function TenantDiscoveredApps() { const [products, setProducts] = useState([]); const [message, setMessage] = useState(); useEffect(() => { void loadCommercialProducts().then((r) => { setProducts(r.data.filter((p) => p.visibility !== "hidden")); setMessage(r.message); }); }, []); return (

محصولات کشف‌شده

از رجیستری سرویس/محصول — بدون آرایه ثابت frontend.

{products.length ? (
{products.map((p) => ( ))}
) : ( )}
); }