"use client"
import type { Key } from "@heroui/react"
import { Avatar, EmptyState, useListData } from "@heroui/react"
import { Description, Label, Tag, TagGroup } from "@/components/ui/heroui-tag-group"
export default function TagGroupWithListData() {
type User = {
id: string
name: string
avatar: string
fallback: string
}
const list = useListData<User>({
getKey: (item) => item.id,
initialItems: [
{
avatar: "https://cdn.21st.dev/assets/mirror/de/defa32ddb23b6307c5cb8d701022186645dfcee057d2b0ba9ec1955dea22db70.jpg",
fallback: "F",
id: "fred",
name: "Fred",
},
{
avatar: "https://cdn.21st.dev/assets/mirror/c4/c48cdbaa2058ca5420edd44e17537d7f2cbaab72f5ae01e5738fa82f3d090ba1.jpg",
fallback: "M",
id: "michael",
name: "Michael",
},
{
avatar: "https://cdn.21st.dev/assets/mirror/df/dfed184450806d7a0a9d72c650f73979ae15b522cb8e65fade232bb5ec55ca72.jpg",
fallback: "J",
id: "jane",
name: "Jane",
},
{
avatar: "https://cdn.21st.dev/assets/mirror/81/81b92cb17f6c3c142a5cdb568904f7bb147d17fe3454737b9187aafca340412c.jpg",
fallback: "A",
id: "alice",
name: "Alice",
},
{
avatar: "https://cdn.21st.dev/assets/mirror/8b/8b15ec8c71b3a381b6c8117f340742e4f429ab0b65af5c3b220d01a700f0e08d.jpg",
fallback: "B",
id: "bob",
name: "Bob",
},
{
avatar: "https://cdn.21st.dev/assets/mirror/20/2064733c6345e7d91c7a0b55eace63f8a7f3f97abc7d98b12b950c01a5be12e9.jpg",
fallback: "C",
id: "charlie",
name: "Charlie",
},
],
initialSelectedKeys: new Set(["fred", "michael"]),
})
const onRemove = (keys: Set<Key>) => {
list.remove(...keys)
}
return (
<div className="w-sm">
<TagGroup
selectedKeys={list.selectedKeys}
selectionMode="multiple"
onRemove={onRemove}
onSelectionChange={(keys) => list.setSelectedKeys(keys)}
>
<Label>Team Members</Label>
<TagGroup.List
items={list.items}
renderEmptyState={() => <EmptyState className="p-1">No team members</EmptyState>}
>
{(user) => (
<Tag key={user.id} id={user.id} textValue={user.name}>
<Avatar className="size-4" size="sm">
<Avatar.Image src={user.avatar} />
<Avatar.Fallback>{user.fallback}</Avatar.Fallback>
</Avatar>
{user.name}
</Tag>
)}
</TagGroup.List>
<Description>Select team members for your project</Description>
</TagGroup>
{list.selectedKeys !== "all" && Array.from(list.selectedKeys).length > 0 && (
<div className="mt-4 flex flex-col gap-2">
<p className="text-sm font-medium text-muted-foreground">Selected:</p>
<div className="flex flex-wrap gap-2">
{Array.from(list.selectedKeys).map((key) => {
const user = list.getItem(key)
if (!user) return null
return (
<div
key={`${user.id}-selected`}
className="flex items-center gap-2 rounded-lg bg-surface-tertiary px-2 py-1"
>
<Avatar className="size-4" size="sm">
<Avatar.Image src={user.avatar} />
<Avatar.Fallback>{user.fallback}</Avatar.Fallback>
</Avatar>
<span className="text-sm">{user.name}</span>
</div>
)
})}
</div>
</div>
)}
</div>
)
}