"use client" import Image from "next/image" import * as React from "react" import { Avatar as AvatarPrimitive } from "radix-ui" import { cn } from "@/shared/lib/utils" type AvatarImageStatus = "idle" | "loading" | "loaded" | "error" type AvatarImageStatusContextValue = { status: AvatarImageStatus setStatus: React.Dispatch> } const AvatarImageStatusContext = React.createContext(null) function Avatar({ className, size = "default", ...props }: React.ComponentProps & { size?: "default" | "sm" | "lg" }) { const [status, setStatus] = React.useState("idle") return ( ) } function AvatarImage({ className, sizes = "100%", onLoadingStatusChange, onLoad, onError, ...props }: Omit, "fill"> & Pick, "onLoadingStatusChange">) { const imageStatusContext = React.useContext(AvatarImageStatusContext) const { setStatus } = imageStatusContext ?? {} React.useEffect(() => { setStatus?.("loading") onLoadingStatusChange?.("loading") }, [onLoadingStatusChange, setStatus]) return ( { setStatus?.("loaded") onLoadingStatusChange?.("loaded") onLoad?.(event) }} onError={(event) => { setStatus?.("error") onLoadingStatusChange?.("error") onError?.(event) }} {...props} /> ) } function AvatarFallback({ className, ...props }: React.ComponentProps) { const imageStatusContext = React.useContext(AvatarImageStatusContext) if (imageStatusContext?.status === "loaded") { return null } return ( ) } function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) { return ( svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", className )} {...props} /> ) } function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) { return (
) } function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">) { return (
svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className )} {...props} /> ) } export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge, }