import { useClerk, useUser } from "@clerk/clerk-react"; import { Avatar, AvatarImage, AvatarFallback } from "../ui/avatar"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuLabel, } from "../ui/dropdown-menu"; import { useStore } from "../../store/store"; import { capitalize } from "./utils"; import StripeCustomerPortalLink from "./StripeCustomerPortalLink"; import { Progress } from "../ui/progress"; import { useAuthenticatedFetch } from "./useAuthenticatedFetch"; import { SAAS_BACKEND_URL } from "../../config"; import { CreditsUsage } from "./types"; import { useState } from "react"; import toast from "react-hot-toast"; export default function AvatarDropdown() { const [isOpen, setIsOpen] = useState(false); const [isLoadingUsage, setIsLoadingUsage] = useState(false); const [usedCredits, setUsedCredits] = useState(0); const [totalCredits, setTotalCredits] = useState(0); const subscriberTier = useStore((state) => state.subscriberTier); const setPricingDialogOpen = useStore((state) => state.setPricingDialogOpen); const isFreeUser = subscriberTier === "free"; const { user, isLoaded, isSignedIn } = useUser(); const { signOut } = useClerk(); const authenticatedFetch = useAuthenticatedFetch(); async function open(isOpen: boolean) { setIsOpen(isOpen); // Do not fetch usage if the user is a free user // or that information hasn't loaded yet // or the dropdown is closed if (isFreeUser || !subscriberTier || !isOpen) return; setIsLoadingUsage(true); try { const res: CreditsUsage = await authenticatedFetch( SAAS_BACKEND_URL + "/credits/usage", "POST" ); setUsedCredits(res.used_monthly_credits); setTotalCredits(res.total_monthly_credits); } catch (e) { toast.error( "Failed to fetch credit usage. Please contact support to get this issue fixed." ); } finally { setIsLoadingUsage(false); } } // If Clerk is still loading or user is logged out, don't show anything if (!isLoaded || !isSignedIn) return null; return ( <> {user?.firstName} {/* Free users */} {isFreeUser && ( setPricingDialogOpen(true)}>Get pro )} {/* Paying user */} {!isFreeUser && ( <> {capitalize(subscriberTier) + " Subscriber"} {/* Loading credit usage */} {isLoadingUsage && ( Loading credit usage... )} {/* Credits usage */} {!isLoadingUsage && ( <> {usedCredits} out of {totalCredits} credits used for{" "} {new Date().toLocaleString("default", { month: "long" })}. {subscriberTier !== "pro" && ( <> Upgrade to Pro to get more credits. )} )} Email support )} {/* All users */} signOut()}>Log out ); }