"use client"; import { useCallback, useMemo } from "react"; import { toast } from "sonner"; import { ChevronRight } from "lucide-react"; import type { IssueStatus } from "@multica/types"; import { Skeleton } from "@/components/ui/skeleton"; import { useIssueStore } from "@/features/issues/store"; import { useIssueViewStore } from "@/features/issues/stores/view-store"; import { useWorkspaceStore } from "@/features/workspace"; import { WorkspaceAvatar } from "@/features/workspace"; import { api } from "@/shared/api"; import { IssuesHeader } from "./issues-header"; import { BoardView } from "./board-view"; import { ListView } from "./list-view"; const BOARD_STATUSES: IssueStatus[] = [ "backlog", "todo", "in_progress", "in_review", "done", "blocked", ]; export function IssuesPage() { const allIssues = useIssueStore((s) => s.issues); const loading = useIssueStore((s) => s.loading); const workspace = useWorkspaceStore((s) => s.workspace); const viewMode = useIssueViewStore((s) => s.viewMode); const statusFilters = useIssueViewStore((s) => s.statusFilters); const priorityFilters = useIssueViewStore((s) => s.priorityFilters); const clearFilters = useIssueViewStore((s) => s.clearFilters); const issues = useMemo(() => { return allIssues.filter((issue) => { if (statusFilters.length > 0 && !statusFilters.includes(issue.status)) return false; if ( priorityFilters.length > 0 && !priorityFilters.includes(issue.priority) ) return false; return true; }); }, [allIssues, statusFilters, priorityFilters]); const visibleStatuses = useMemo(() => { if (statusFilters.length > 0) return BOARD_STATUSES.filter((s) => statusFilters.includes(s)); return BOARD_STATUSES; }, [statusFilters]); const handleMoveIssue = useCallback( (issueId: string, newStatus: IssueStatus) => { useIssueStore.getState().updateIssue(issueId, { status: newStatus }); api.updateIssue(issueId, { status: newStatus }).catch(() => { toast.error("Failed to move issue"); api.listIssues({ limit: 200 }).then((res) => { useIssueStore.getState().setIssues(res.issues); }); }); }, [] ); if (loading) { return (
{Array.from({ length: 5 }).map((_, i) => (
))}
); } return (
{/* Header 1: Workspace breadcrumb */}
{workspace?.name ?? "Workspace"} Issues
{/* Header 2: View toggle + filters */} {/* Content: scrollable */}
{issues.length === 0 ? (

No matching issues

{(statusFilters.length > 0 || priorityFilters.length > 0) && ( )}
) : viewMode === "board" ? ( ) : ( )}
); }