diff --git a/src/components/conversations/conversation-manage-dialog.tsx b/src/components/conversations/conversation-manage-dialog.tsx index 3fccb8d..c6c1d40 100644 --- a/src/components/conversations/conversation-manage-dialog.tsx +++ b/src/components/conversations/conversation-manage-dialog.tsx @@ -61,10 +61,11 @@ import type { import { AGENT_LABELS, ALL_AGENT_TYPES, - STATUS_COLORS, + STATUS_ICON_COLORS, STATUS_ORDER, } from "@/lib/types" import { cn } from "@/lib/utils" +import { ConversationStatusIcon } from "@/components/conversations/conversation-status-icon" interface ConversationManageDialogProps { open: boolean @@ -291,11 +292,9 @@ export function ConversationManageDialog({ {STATUS_ORDER.map((s) => ( - {tStatus(s)} @@ -388,11 +387,7 @@ export function ConversationManageDialog({ {formatRelative(conv.updated_at)} + > + + ) }) @@ -434,11 +439,9 @@ export function ConversationManageDialog({ key={s} onSelect={() => handleBulkStatus(s)} > - {tStatus(s)} diff --git a/src/components/conversations/conversation-status-icon.tsx b/src/components/conversations/conversation-status-icon.tsx new file mode 100644 index 0000000..a010705 --- /dev/null +++ b/src/components/conversations/conversation-status-icon.tsx @@ -0,0 +1,105 @@ +"use client" + +import type { ConversationStatus } from "@/lib/types" +import { cn } from "@/lib/utils" + +interface ConversationStatusIconProps { + status: ConversationStatus + className?: string +} + +export function ConversationStatusIcon({ + status, + className, +}: ConversationStatusIconProps) { + return ( + + {status === "in_progress" ? ( + <> + + + + + + ) : status === "pending_review" ? ( + <> + + + + ) : status === "cancelled" ? ( + <> + + + + ) : ( + <> + + + + )} + + ) +} diff --git a/src/components/conversations/search-command-dialog.tsx b/src/components/conversations/search-command-dialog.tsx index 93cc8b7..ebc1fd7 100644 --- a/src/components/conversations/search-command-dialog.tsx +++ b/src/components/conversations/search-command-dialog.tsx @@ -17,8 +17,9 @@ import type { DbConversationSummary, } from "@/lib/types" import { useFileTree, type FlatFileEntry } from "@/hooks/use-file-tree" -import { AGENT_LABELS, STATUS_COLORS, compareAgentType } from "@/lib/types" +import { AGENT_LABELS, STATUS_ICON_COLORS, compareAgentType } from "@/lib/types" import { AgentIcon } from "@/components/agent-icon" +import { ConversationStatusIcon } from "@/components/conversations/conversation-status-icon" import { CommandDialog, CommandInput, @@ -268,11 +269,12 @@ export function SearchCommandDialog({ value={`${conv.id}-${conv.title ?? ""}`} onSelect={() => handleSelectConversation(conv)} > - diff --git a/src/components/conversations/sidebar-conversation-card.tsx b/src/components/conversations/sidebar-conversation-card.tsx index 61c1841..0e1f95e 100644 --- a/src/components/conversations/sidebar-conversation-card.tsx +++ b/src/components/conversations/sidebar-conversation-card.tsx @@ -1,20 +1,10 @@ "use client" import { memo, useState, useCallback } from "react" -import { - Pencil, - Trash2, - Circle, - CircleAlert, - CircleCheck, - CircleDashed, - CircleX, - Plus, - type LucideIcon, -} from "lucide-react" +import { Pencil, Trash2, Circle, Plus } from "lucide-react" import { useTranslations } from "next-intl" import type { DbConversationSummary, ConversationStatus } from "@/lib/types" -import { STATUS_ORDER } from "@/lib/types" +import { STATUS_ICON_COLORS, STATUS_ORDER } from "@/lib/types" import { cn } from "@/lib/utils" import { ContextMenu, @@ -45,24 +35,8 @@ import { } from "@/components/ui/alert-dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" -import { - SidebarStatusIcon, - conversationStatusToBead, -} from "./sidebar-status-icon" - -const STATUS_ICONS: Record = { - in_progress: CircleDashed, - pending_review: CircleAlert, - completed: CircleCheck, - cancelled: CircleX, -} - -const STATUS_ICON_COLORS: Record = { - in_progress: "text-blue-500", - pending_review: "text-orange-500", - completed: "text-green-500", - cancelled: "text-red-500", -} +import { ConversationStatusIcon } from "./conversation-status-icon" +import { SidebarStatusIcon } from "./sidebar-status-icon" interface SidebarConversationCardProps { conversation: DbConversationSummary @@ -123,7 +97,6 @@ export const SidebarConversationCard = memo(function SidebarConversationCard({ }, [conversation.id, conversation.agent_type, onDelete]) const status = conversation.status as ConversationStatus - const beadStatus = conversationStatusToBead(conversation.status) const isRunning = status === "in_progress" const isFailed = status === "cancelled" @@ -165,7 +138,7 @@ export const SidebarConversationCard = memo(function SidebarConversationCard({ transform: "translateX(-50%)", }} /> - + {STATUS_ORDER.filter((s) => s !== conversation.status).map( - (s) => { - const StatusIcon = STATUS_ICONS[s] - return ( - onStatusChange(conversation.id, s)} - > - - {tStatus(s)} - - ) - } + (s) => ( + onStatusChange(conversation.id, s)} + > + + {tStatus(s)} + + ) )} diff --git a/src/components/conversations/sidebar-status-icon.tsx b/src/components/conversations/sidebar-status-icon.tsx index de700a8..1b62fe9 100644 --- a/src/components/conversations/sidebar-status-icon.tsx +++ b/src/components/conversations/sidebar-status-icon.tsx @@ -1,24 +1,29 @@ "use client" +import type { ConversationStatus } from "@/lib/types" import { cn } from "@/lib/utils" - -export type SidebarBeadStatus = "done" | "active" | "running" | "failed" +import { ConversationStatusIcon } from "./conversation-status-icon" interface SidebarStatusIconProps { - status: SidebarBeadStatus + status: ConversationStatus emphasized?: boolean className?: string } -function IconFrame({ - children, - colorClass, +export function SidebarStatusIcon({ + status, + emphasized = false, className, -}: { - children: React.ReactNode - colorClass: string - className?: string -}) { +}: SidebarStatusIconProps) { + const colorClass = + status === "completed" + ? emphasized + ? "text-sidebar-primary/75" + : "text-sidebar-primary/40" + : emphasized + ? "text-sidebar-primary" + : "text-sidebar-primary/65" + return (
- {children} +
) } - -export function SidebarStatusIcon({ - status, - emphasized = false, - className, -}: SidebarStatusIconProps) { - if (status === "running") { - return ( - - - - - - - - - ) - } - - if (status === "failed") { - return ( - - - - - - - ) - } - - if (status === "active") { - return ( - - - - - - - ) - } - - return ( - - - - - - - ) -} - -export function conversationStatusToBead(status: string): SidebarBeadStatus { - switch (status) { - case "in_progress": - return "running" - case "pending_review": - return "active" - case "cancelled": - return "failed" - case "completed": - default: - return "done" - } -} diff --git a/src/lib/types.ts b/src/lib/types.ts index 105d470..afdebfd 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -228,6 +228,13 @@ export const STATUS_COLORS: Record = { cancelled: "bg-red-500", } +export const STATUS_ICON_COLORS: Record = { + in_progress: "text-blue-500", + pending_review: "text-orange-500", + completed: "text-green-500", + cancelled: "text-red-500", +} + export const AGENT_DISPLAY_ORDER: AgentType[] = [ "codex", "claude_code",