"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { Loader2, UserPlus, Building2, Save } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { authClient } from "@/lib/auth/auth-client"; import { saveBrandingAction } from "@/app/(app)/team/actions"; interface Member { id: string; name: string; email: string; role: string; } interface Branding { brandName: string | null; primaryColor: string | null; logoUrl: string | null; removePoweredBy: boolean; } export function TeamClient({ org, members, branding, seats, }: { org: { id: string; name: string } | null; members: Member[]; branding: Branding | null; seats: number; }) { const router = useRouter(); if (!org) return ; return (
); } function CreateWorkspace() { const router = useRouter(); const [name, setName] = useState(""); const [busy, setBusy] = useState(false); async function create(e: React.FormEvent) { e.preventDefault(); setBusy(true); const slug = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""); const { data, error } = await authClient.organization.create({ name: name.trim(), slug }); if (error) { toast.error(error.message ?? "Could not create workspace"); setBusy(false); return; } if (data?.id) await authClient.organization.setActive({ organizationId: data.id }); toast.success("Workspace created"); router.refresh(); } return ( Create your team workspace Invite up to your plan's seat limit and share a workspace.
setName(e.target.value)} required />
); } function MembersCard({ orgId, members, seats }: { orgId: string; members: Member[]; seats: number }) { const router = useRouter(); const [email, setEmail] = useState(""); const [busy, setBusy] = useState(false); async function invite(e: React.FormEvent) { e.preventDefault(); if (members.length >= seats) { toast.error(`Your plan includes ${seats} seats.`); return; } setBusy(true); await authClient.organization.setActive({ organizationId: orgId }); const { error } = await authClient.organization.inviteMember({ email: email.trim(), role: "member" }); setBusy(false); if (error) { toast.error(error.message ?? "Could not invite"); return; } toast.success(`Invitation sent to ${email}`); setEmail(""); router.refresh(); } return ( Members {members.length} / {seats} seats
{members.map((m) => (
{m.name.slice(0, 2).toUpperCase()}

{m.name}

{m.email}

{m.role}
))}
setEmail(e.target.value)} required />
); } function BrandingCard({ orgId, branding }: { orgId: string; branding: Branding | null }) { const router = useRouter(); const [brandName, setBrandName] = useState(branding?.brandName ?? ""); const [primaryColor, setPrimaryColor] = useState(branding?.primaryColor ?? ""); const [logoUrl, setLogoUrl] = useState(branding?.logoUrl ?? ""); const [removePoweredBy, setRemovePoweredBy] = useState(branding?.removePoweredBy ?? false); const [busy, setBusy] = useState(false); async function save(e: React.FormEvent) { e.preventDefault(); setBusy(true); const res = await saveBrandingAction(orgId, { brandName, primaryColor, logoUrl, removePoweredBy }); setBusy(false); if (res.ok) { toast.success("Branding saved"); router.refresh(); } else { toast.error(res.error ?? "Could not save"); } } return ( White-label branding Make the workspace your own.
setBrandName(e.target.value)} />
setPrimaryColor(e.target.value)} />
setLogoUrl(e.target.value)} />

Remove "Powered by PodcastYes"

Hide PodcastYes branding for your clients.

); }