"use client"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { organization, useActiveOrganization, useListOrganizations, useSession } from "@/lib/auth-client"; import { ActiveOrganization, Session } from "@/lib/auth-types"; import { ChevronDownIcon, PlusIcon } from "@radix-ui/react-icons"; import { Loader2, MailPlus } from "lucide-react"; import { useState, useEffect } from "react"; import { toast } from "sonner"; import { AnimatePresence, motion } from "framer-motion"; import CopyButton from "@/components/ui/copy-button"; import Image from "next/image"; export function OrganizationCard(props: { session: Session | null }) { const organizations = useListOrganizations() const activeOrg = useActiveOrganization() const [optimisticOrg, setOptimisticOrg] = useState(null) const [isRevoking, setIsRevoking] = useState([]); useEffect(() => { setOptimisticOrg(activeOrg.data) }, [activeOrg.data]) const inviteVariants = { hidden: { opacity: 0, height: 0 }, visible: { opacity: 1, height: 'auto' }, exit: { opacity: 0, height: 0 } }; const { data } = useSession() const session = data || props.session const currentMember = optimisticOrg?.members.find((member) => member.userId === session?.user.id) return ( Organization

{optimisticOrg?.name || "Personal"}

{ organization.setActive(null) setOptimisticOrg(null) }}>

Personal

{ organizations.data?.map((org) => ( { if (org.id === optimisticOrg?.id) { return } organization.setActive(org.id) setOptimisticOrg({ members: [], invitations: [], ...org }) }}>

{org.name}

)) }
{optimisticOrg?.name?.charAt(0) || "P"}

{optimisticOrg?.name || "Personal"}

{optimisticOrg?.members.length || 1} members

Members

{ optimisticOrg?.members.map((member) => (
{member.user.name?.charAt(0)}

{member.user.name}

{member.role}

{ (member.role !== "owner" && (currentMember?.role === "owner" || currentMember?.role === "admin")) && ( )}
)) } { !optimisticOrg?.id && (
{session?.user.name?.charAt(0)}

{session?.user.name}

Owner

) }

Invites

{ optimisticOrg?.invitations .filter((invitation) => invitation.status === "pending") .map((invitation) => (

{invitation.email}

{invitation.role}

)) }
{ optimisticOrg?.invitations.length === 0 && ( No Active Invitations ) } { !optimisticOrg?.id && ( ) }
{ optimisticOrg?.id && ( ) }
{/* */}
) } function CreateOrganizationDialog() { const [name, setName] = useState(""); const [slug, setSlug] = useState(""); const [loading, setLoading] = useState(false); const [open, setOpen] = useState(false); const [isSlugEdited, setIsSlugEdited] = useState(false); const [logo, setLogo] = useState(null); useEffect(() => { if (!isSlugEdited) { const generatedSlug = name.trim().toLowerCase().replace(/\s+/g, "-"); setSlug(generatedSlug); } }, [name, isSlugEdited]); useEffect(() => { if (open) { setName(""); setSlug(""); setIsSlugEdited(false); setLogo(null); } }, [open]); const handleLogoChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { const file = e.target.files[0]; const reader = new FileReader(); reader.onloadend = () => { setLogo(reader.result as string); }; reader.readAsDataURL(file); } }; return ( New Organization Create a new organization to collaborate with your team.
setName(e.target.value)} />
{ setSlug(e.target.value); setIsSlugEdited(true); }} placeholder="Slug" />
{logo && (
Logo preview
)}
) } function InviteMemberDialog({ setOptimisticOrg, optimisticOrg }: { setOptimisticOrg: (org: ActiveOrganization | null) => void, optimisticOrg: ActiveOrganization | null }) { const [open, setOpen] = useState(false); const [email, setEmail] = useState(""); const [role, setRole] = useState("member"); const [loading, setLoading] = useState(false); return ( Invite Member Invite a member to your organization.
setEmail(e.target.value)} />
) }