omnidash/app/(authenticated)/(app)/TeamSwitcher.tsx

94 lines
2.8 KiB
TypeScript

"use client";
import {
DropdownMenuTrigger,
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
} from "@/components/ui/dropdown-menu";
import { ChevronsUpDown, LogOut } from "lucide-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { Loading } from "@/components/loading";
import {
useAuth,
useOrganization,
useOrganizationList,
useUser,
} from "@clerk/clerk-react";
import { Avatar, AvatarImage } from "@/components/ui/avatar";
import { AvatarFallback } from "@radix-ui/react-avatar";
type Props = {};
export const TeamSwitcher: React.FC<Props> = (): JSX.Element => {
const { setActive, organizationList } = useOrganizationList();
const { organization: currentOrg } = useOrganization();
const { signOut } = useAuth();
const { user } = useUser();
const router = useRouter();
const [loading, setLoading] = useState(false);
async function changeOrg(id: string | null) {
if (!setActive) {
return;
}
try {
setLoading(true);
await setActive({ organization: id });
router.refresh();
} finally {
setLoading(false);
}
}
return (
<DropdownMenu>
{loading ? (
<Loading />
) : (
<DropdownMenuTrigger className="flex items-center justify-between w-full px-2 py-1 rounded gap-4 hover:bg-zinc-100 dark:hover:bg-zinc-700">
<div className="flex items-center justify-start w-full gap-4 ">
<Avatar>
{user?.profileImageUrl ? (
<AvatarImage
src={user.profileImageUrl}
alt={user.username ?? "Profile picture"}
/>
) : null}
<AvatarFallback className="flex items-center justify-center w-8 h-8 overflow-hidden border rounded-md bg-zinc-100 border-zinc-500 text-zinc-700">
{(currentOrg?.slug ?? user?.username ?? "")
.slice(0, 2)
.toUpperCase() ?? "P"}
</AvatarFallback>
</Avatar>
<span>{currentOrg?.name ?? "Personal"}</span>
</div>
{/* <PlanBadge plan={currentTeam?.plan ?? "DISABLED"} /> */}
<ChevronsUpDown className="w-4 h-4" />
</DropdownMenuTrigger>
)}
<DropdownMenuContent className="w-full lg:w-56" align="end" forceMount>
<DropdownMenuGroup>
<DropdownMenuItem asChild>
<button
onClick={async () => {
await signOut();
router.refresh();
}}
className="w-full"
>
<LogOut className="w-4 h-4 mr-2" />
<span>Sign out</span>
</button>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
);
};