UNPKG

@liveblocks/react-ui

Version:

A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.

1 lines 2.7 kB
{"version":3,"file":"Avatar.cjs","sources":["../../../src/components/internal/Avatar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Relax } from \"@liveblocks/core\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { getInitials } from \"../../utils/get-initials\";\nimport { useUserOrGroupInfo } from \"../../utils/use-user-or-group-info\";\n\ninterface AvatarLayoutProps extends ComponentProps<\"div\"> {\n src?: string;\n name?: string;\n fallback?: string;\n isLoading: boolean;\n}\n\nexport type AvatarProps = ComponentProps<\"div\"> & {\n icon?: ReactNode;\n} & Relax<\n | {\n /**\n * The user ID to display the avatar for.\n */\n userId: string;\n }\n | {\n /**\n * The group ID to display the avatar for.\n */\n groupId: string;\n }\n >;\n\nfunction AvatarLayout({\n src,\n name,\n fallback,\n isLoading,\n className,\n ...props\n}: AvatarLayoutProps) {\n const nameInitials = useMemo(\n () => (name ? getInitials(name) : undefined),\n [name]\n );\n const fallbackInitials = useMemo(\n () => (!isLoading && fallback && !name ? getInitials(fallback) : undefined),\n [isLoading, fallback, name]\n );\n\n return (\n <div\n className={cn(\"lb-avatar\", className)}\n data-loading={isLoading ? \"\" : undefined}\n {...props}\n >\n {src && <img className=\"lb-avatar-image\" src={src} alt={name} />}\n {nameInitials ? (\n <span className=\"lb-avatar-fallback\" aria-hidden>\n {nameInitials}\n </span>\n ) : fallbackInitials ? (\n <span\n className=\"lb-avatar-fallback\"\n aria-label={fallback}\n title={fallback}\n >\n {fallbackInitials}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport function Avatar({ userId, groupId, icon, ...props }: AvatarProps) {\n const { info, isLoading } = useUserOrGroupInfo(\n userId ? \"user\" : \"group\",\n userId ?? groupId\n );\n\n return icon && (isLoading || !info?.avatar) ? (\n <div {...props}>{icon}</div>\n ) : (\n <AvatarLayout\n src={info?.avatar}\n name={info?.name}\n fallback={userId ?? groupId}\n isLoading={isLoading}\n {...props}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAkCA;AAAsB;AACpB;AACA;AACA;AACA;AACA;AAEF;AACE;AAAqB;AACe;AAC7B;AAEP;AAAyB;AAC0C;AACvC;AAG5B;AACE;AAAC;AAAA;AACqC;AACL;AAC3B;AAEH;AAA6D;AAM5D;AAAC;AAAA;AACW;AACE;AACL;AAEN;AAAA;AAED;AAAA;AAAA;AAGV;AAEO;AACL;AAA4B;AACR;AACR;AAGZ;AAGE;AAAC;AAAA;AACY;AACC;AACQ;AACpB;AACI;AAAA;AAGV;;"}