"use client" import { useMemo, useState } from "react" import { IconApps, IconArrowUp, IconAt, IconBook, IconCircleDashedPlus, IconPaperclip, IconPlus, IconWorld, IconX, } from "@tabler/icons-react" import { Avatar, AvatarFallback, AvatarImage, } from "@/styles/radix-nova/ui/avatar" import { Badge } from "@/styles/radix-nova/ui/badge" import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/styles/radix-nova/ui/command" import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/styles/radix-nova/ui/dropdown-menu" import { Field, FieldLabel } from "@/styles/radix-nova/ui/field" import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupTextarea, } from "@/styles/radix-nova/ui/input-group" import { Popover, PopoverContent, PopoverTrigger, } from "@/styles/radix-nova/ui/popover" import { Switch } from "@/styles/radix-nova/ui/switch" import { Tooltip, TooltipContent, TooltipTrigger, } from "@/styles/radix-nova/ui/tooltip" const SAMPLE_DATA = { mentionable: [ { type: "page", title: "Meeting Notes", image: "📝", }, { type: "page", title: "Project Dashboard", image: "📊", }, { type: "page", title: "Ideas & Brainstorming", image: "💡", }, { type: "page", title: "Calendar & Events", image: "📅", }, { type: "page", title: "Documentation", image: "📚", }, { type: "page", title: "Goals & Objectives", image: "🎯", }, { type: "page", title: "Budget Planning", image: "💰", }, { type: "page", title: "Team Directory", image: "👥", }, { type: "page", title: "Technical Specs", image: "🔧", }, { type: "page", title: "Analytics Report", image: "📈", }, { type: "user", title: "shadcn", image: "https://github.com/shadcn.png", workspace: "Workspace", }, { type: "user", title: "maxleiter", image: "https://github.com/maxleiter.png", workspace: "Workspace", }, { type: "user", title: "evilrabbit", image: "https://github.com/evilrabbit.png", workspace: "Workspace", }, ], models: [ { name: "Auto", }, { name: "Agent Mode", badge: "Beta", }, { name: "Plan Mode", }, ], } function MentionableIcon({ item, }: { item: (typeof SAMPLE_DATA.mentionable)[0] }) { return item.type === "page" ? ( {item.image} ) : ( {item.title[0]} ) } export function NotionPromptForm() { const [mentions, setMentions] = useState([]) const [mentionPopoverOpen, setMentionPopoverOpen] = useState(false) const [modelPopoverOpen, setModelPopoverOpen] = useState(false) const [selectedModel, setSelectedModel] = useState< (typeof SAMPLE_DATA.models)[0] >(SAMPLE_DATA.models[0]) const [scopeMenuOpen, setScopeMenuOpen] = useState(false) const grouped = useMemo(() => { return SAMPLE_DATA.mentionable.reduce( (acc, item) => { const isAvailable = !mentions.includes(item.title) if (isAvailable) { if (!acc[item.type]) { acc[item.type] = [] } acc[item.type].push(item) } return acc }, {} as Record ) }, [mentions]) const hasMentions = mentions.length > 0 return (
Prompt e.stopPropagation()} > {!hasMentions && "Add context"} Mention a person, page, or date No pages found {Object.entries(grouped).map(([type, items]) => ( {items.map((item) => ( { setMentions((prev) => [...prev, currentValue]) setMentionPopoverOpen(false) }} className="rounded-lg" > {item.title} ))} ))}
{mentions.map((mention) => { const item = SAMPLE_DATA.mentionable.find( (item) => item.title === mention ) if (!item) { return null } return ( { setMentions((prev) => prev.filter((m) => m !== mention)) }} > {item.title} ) })}
Attach file {selectedModel.name} Select AI model Select Agent Mode {SAMPLE_DATA.models.map((model) => ( { if (checked) { setSelectedModel(model) } }} className="pl-2 *:[span:first-child]:right-2 *:[span:first-child]:left-auto" > {model.name} {model.badge && ( {model.badge} )} ))} All Sources e.preventDefault()} > e.preventDefault()} > All Sources I can access CN shadcn No knowledge found {SAMPLE_DATA.mentionable .filter((item) => item.type === "user") .map((user) => ( { // Handle user selection here console.log("Selected user:", user.title) }} > {user.title[0]} {user.title}{" "} - {user.workspace} ))} Help Center Connect Apps We'll only search in the sources selected here.
) }