base-select-badge

PreviousNext
Docs
reuicomponent

Preview

Loading preview…
registry/default/components/base-select/badge.tsx
import { useState } from 'react';
import { Badge } from '@/registry/default/ui/badge';
import {
  Select,
  SelectClear,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from '@/registry/default/ui/base-select';
import { VariantProps } from 'class-variance-authority';
import { badgeVariants } from '../../ui/base-badge';

type Item = {
  label: string;
  state: VariantProps<typeof badgeVariants>['variant'];
  value: string | null;
};

const items: Item[] = [
  {
    label: 'In Progress',
    state: 'primary',
    value: '1',
  },
  {
    label: 'Completed',
    value: '2',
    state: 'success',
  },
  {
    label: 'Pending',
    value: '3',
    state: 'info',
  },
  {
    label: 'Cancelled',
    value: '4',
    state: 'destructive',
  },
  {
    label: 'Rejected',
    value: '5',
    state: 'warning',
  },
];

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

  const renderValue = (item: Item | null) => {
    return item ? (
      <Badge variant={item.state} size="sm" appearance="outline">
        {item.label}
      </Badge>
    ) : (
      <span>Select a status</span>
    );
  };
  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>
        {items.map((item) => (
          <SelectItem key={item.value} value={item.value}>
            <Badge variant={item.state} size="sm" appearance="outline">
              {item.label}
            </Badge>
          </SelectItem>
        ))}
      </SelectContent>
    </Select>
  );
}

Installation

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

Usage

import { BaseSelectBadge } from "@/components/base-select-badge"
<BaseSelectBadge />