"use client"; import { useCallback, useEffect, useMemo } from "react"; import { useStore } from "zustand"; import { toast } from "sonner"; import { ChevronRight } from "lucide-react"; import type { IssueStatus } from "@/shared/types"; import { Skeleton } from "@/components/ui/skeleton"; import { useAuthStore } from "@/features/auth"; import { useWorkspaceStore, WorkspaceAvatar } from "@/features/workspace"; import { useIssueStore } from "@/features/issues/store"; import { filterIssues } from "@/features/issues/utils/filter"; import { BOARD_STATUSES } from "@/features/issues/config"; import { ViewStoreProvider } from "@/features/issues/stores/view-store-context"; import { useIssueSelectionStore } from "@/features/issues/stores/selection-store"; import { BoardView } from "@/features/issues/components/board-view"; import { ListView } from "@/features/issues/components/list-view"; import { BatchActionToolbar } from "@/features/issues/components/batch-action-toolbar"; import { registerViewStoreForWorkspaceSync } from "@/features/issues/stores/view-store"; import { api } from "@/shared/api"; import { myIssuesViewStore } from "../stores/my-issues-view-store"; import { MyIssuesHeader } from "./my-issues-header"; export function MyIssuesPage() { const user = useAuthStore((s) => s.user); const workspace = useWorkspaceStore((s) => s.workspace); const agents = useWorkspaceStore((s) => s.agents); const allIssues = useIssueStore((s) => s.issues); const loading = useIssueStore((s) => s.loading); const viewMode = useStore(myIssuesViewStore, (s) => s.viewMode); const statusFilters = useStore(myIssuesViewStore, (s) => s.statusFilters); const priorityFilters = useStore(myIssuesViewStore, (s) => s.priorityFilters); const scope = useStore(myIssuesViewStore, (s) => s.scope); useEffect(() => { registerViewStoreForWorkspaceSync(myIssuesViewStore); }, []); useEffect(() => { useIssueSelectionStore.getState().clear(); }, [viewMode, scope]); const myAgentIds = useMemo(() => { if (!user) return new Set(); return new Set( agents.filter((a) => a.owner_id === user.id).map((a) => a.id), ); }, [agents, user]); // Per-scope issue lists const assignedToMe = useMemo(() => { if (!user) return []; return allIssues.filter( (i) => i.assignee_type === "member" && i.assignee_id === user.id, ); }, [allIssues, user]); const myAgentIssues = useMemo(() => { if (!user) return []; return allIssues.filter( (i) => i.assignee_type === "agent" && i.assignee_id && myAgentIds.has(i.assignee_id), ); }, [allIssues, user, myAgentIds]); const createdByMe = useMemo(() => { if (!user) return []; return allIssues.filter( (i) => i.creator_type === "member" && i.creator_id === user.id, ); }, [allIssues, user]); const myIssues = useMemo(() => { switch (scope) { case "assigned": return assignedToMe; case "agents": return myAgentIssues; case "created": return createdByMe; default: return assignedToMe; } }, [scope, assignedToMe, myAgentIssues, createdByMe]); // Apply status/priority filters from view store const issues = useMemo( () => filterIssues(myIssues, { statusFilters, priorityFilters, assigneeFilters: [], includeNoAssignee: false, creatorFilters: [], }), [myIssues, statusFilters, priorityFilters], ); const visibleStatuses = useMemo(() => { if (statusFilters.length > 0) return BOARD_STATUSES.filter((s) => statusFilters.includes(s)); return BOARD_STATUSES; }, [statusFilters]); const hiddenStatuses = useMemo(() => { return BOARD_STATUSES.filter((s) => !visibleStatuses.includes(s)); }, [visibleStatuses]); const handleMoveIssue = useCallback( (issueId: string, newStatus: IssueStatus, newPosition?: number) => { const viewState = myIssuesViewStore.getState(); if (viewState.sortBy !== "position") { viewState.setSortBy("position"); viewState.setSortDirection("asc"); } const updates: Partial<{ status: IssueStatus; position: number }> = { status: newStatus, }; if (newPosition !== undefined) updates.position = newPosition; useIssueStore.getState().updateIssue(issueId, updates); api.updateIssue(issueId, updates).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"} My Issues
{/* Header: scope tabs (left) + controls (right) */} {/* Content: scrollable */}
{viewMode === "board" ? ( ) : ( )}
{viewMode === "list" && }
); }