base-select-avatar

PreviousNext
Docs
reuicomponent

Preview

Loading preview…
registry/default/components/base-select/avatar.tsx
import { useState } from 'react';
import { Avatar, AvatarFallback, AvatarImage } from '@/registry/default/ui/avatar';
import {
  Select,
  SelectClear,
  SelectContent,
  SelectGroup,
  SelectItem,
  SelectLabel,
  SelectTrigger,
  SelectValue,
} from '@/registry/default/ui/base-select';

interface Item {
  label: string;
  avatar: string;
  value: string;
}

const items: Item[] = [
  {
    label: 'Alan Bold',
    avatar: 'https://randomuser.me/api/portraits/men/46.jpg',
    value: '1',
  },
  {
    label: 'Ethan James',
    avatar: 'https://randomuser.me/api/portraits/men/29.jpg',
    value: '2',
  },
  {
    label: 'Nina Clark',
    avatar: 'https://randomuser.me/api/portraits/men/10.jpg',
    value: '3',
  },
  {
    label: 'Sean Otto',
    avatar: 'https://randomuser.me/api/portraits/men/12.jpg',
    value: '4',
  },
];

export default function BaseSelectDemo() {
  const [value, setValue] = useState<string | null>(null);

  const renderValue = (item: Item | null) => {
    return item ? (
      <span className="flex items-center gap-2">
        <Avatar className="size-5">
          <AvatarImage src={item.avatar} alt="@reui" />
          <AvatarFallback>{item.label.charAt(0)}</AvatarFallback>
        </Avatar>
        <span>{item.label}</span>
      </span>
    ) : (
      <span>Select a user</span>
    );
  };

  const selectedItem = items.find((item) => item.value === value) || null;

  return (
    <Select value={value} onValueChange={(value) => setValue(value as string | null)} indicatorPosition="right">
      <SelectTrigger className="w-60">
        <SelectValue>{renderValue(selectedItem)}</SelectValue>
        {value && <SelectClear onClick={() => setValue(null)} />}
      </SelectTrigger>
      <SelectContent>
        <SelectGroup>
          <SelectLabel className="text-xs py-1 font-normal text-muted-foreground ps-2">Select a user</SelectLabel>
          {items.map((item) => (
            <SelectItem key={item.value} value={item.value}>
              <span className="flex items-center gap-2">
                <Avatar className="size-6">
                  <AvatarImage src={item.avatar} alt="@reui" />
                  <AvatarFallback>{item.label.charAt(0)}</AvatarFallback>
                </Avatar>
                <span>{item.label}</span>
              </span>
            </SelectItem>
          ))}
        </SelectGroup>
      </SelectContent>
    </Select>
  );
}

Installation

npx shadcn@latest add @reui/base-select-avatar

Usage

import { BaseSelectAvatar } from "@/components/base-select-avatar"
<BaseSelectAvatar />