From 36b39da1bdc339de1c3c81c8446652e521c914df Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Sun, 14 Dec 2025 22:13:30 +0000 Subject: [PATCH] IssueResponse definition and implementation --- packages/frontend/src/Index.tsx | 15 ++++++------ .../src/components/issue-detail-pane.tsx | 17 ++++++++----- .../frontend/src/components/issues-table.tsx | 24 +++++++++---------- packages/shared/src/index.ts | 5 ++++ packages/shared/src/schema.ts | 7 ++++++ 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/packages/frontend/src/Index.tsx b/packages/frontend/src/Index.tsx index 664dccc..254d8b6 100644 --- a/packages/frontend/src/Index.tsx +++ b/packages/frontend/src/Index.tsx @@ -1,4 +1,4 @@ -import type { IssueRecord, ProjectRecord } from "@issue/shared"; +import type { IssueResponse, ProjectRecord } from "@issue/shared"; import { useEffect, useRef, useState } from "react"; import { IssueDetailPane } from "@/components/issue-detail-pane"; import { IssuesTable } from "@/components/issues-table"; @@ -23,8 +23,8 @@ function Index() { }); }, []); - const [selectedIssue, setSelectedIssue] = useState(null); - const [issues, setIssues] = useState([]); + const [selectedIssue, setSelectedIssue] = useState(null); + const [issuesData, setIssues] = useState([]); const serverURL = import.meta.env.SERVER_URL?.trim() || "http://localhost:3000"; @@ -33,8 +33,9 @@ function Index() { fetch(`${serverURL}/issues/${selectedProject.blob}`) .then((res) => res.json()) - .then((data: IssueRecord[]) => { + .then((data: IssueResponse[]) => { setIssues(data); + console.log(data); }) .catch((err) => { console.error("error fetching issues:", err); @@ -78,12 +79,12 @@ function Index() { {/* main body */}
- {selectedProject && issues.length > 0 && ( + {selectedProject && issuesData.length > 0 && ( <> {/* issues list (table) */} setSelectedIssue(null)} />
diff --git a/packages/frontend/src/components/issue-detail-pane.tsx b/packages/frontend/src/components/issue-detail-pane.tsx index ccdc147..06ec605 100644 --- a/packages/frontend/src/components/issue-detail-pane.tsx +++ b/packages/frontend/src/components/issue-detail-pane.tsx @@ -1,22 +1,22 @@ -import type { IssueRecord, ProjectRecord } from "@issue/shared"; +import type { IssueResponse, ProjectRecord } from "@issue/shared"; import { X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { issueID } from "@/lib/utils"; export function IssueDetailPane({ project, - issue, + issueData, close, }: { project: ProjectRecord; - issue: IssueRecord; + issueData: IssueResponse; close: () => void; }) { return (
-

{issueID(project.blob, issue.number)}

+

{issueID(project.blob, issueData.Issue.number)}

-

{issue.title}

-

{issue.description}

+

{issueData.Issue.title}

+

{issueData.Issue.description}

+ +

+ Assignee:{" "} + {issueData.User ? `${issueData.User.name} (${issueData.User.username})` : "Unassigned"} +

); diff --git a/packages/frontend/src/components/issues-table.tsx b/packages/frontend/src/components/issues-table.tsx index 3bef634..9c62867 100644 --- a/packages/frontend/src/components/issues-table.tsx +++ b/packages/frontend/src/components/issues-table.tsx @@ -1,18 +1,18 @@ -import type { IssueRecord, ProjectRecord } from "@issue/shared"; +import type { IssueResponse, ProjectRecord } from "@issue/shared"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; -import { cn, issueID } from "@/lib/utils"; +import { cn } from "@/lib/utils"; export function IssuesTable({ project, - issues, + issuesData, columns = {}, issueSelectAction, className, }: { project: ProjectRecord; - issues: IssueRecord[]; + issuesData: IssueResponse[]; columns?: { id?: boolean; title?: boolean; description?: boolean; assignee?: boolean }; - issueSelectAction?: (issue: IssueRecord) => void; + issueSelectAction?: (issue: IssueResponse) => void; className: string; }) { return ( @@ -31,27 +31,27 @@ export function IssuesTable({ - {issues.map((issue) => ( + {issuesData.map((issueData) => ( { - issueSelectAction?.(issue); + issueSelectAction?.(issueData); }} > {(columns.id == null || columns.id === true) && ( - {issue.number.toString().padStart(3, "0")} + {issueData.Issue.number.toString().padStart(3, "0")} )} {(columns.title == null || columns.title === true) && ( - {issue.title} + {issueData.Issue.title} )} {(columns.description == null || columns.description === true) && ( - {issue.description} + {issueData.Issue.description} )} {(columns.assignee == null || columns.assignee === true) && ( - ? + {issueData.User?.id || "?"} )} ))} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 3174764..a45f87b 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -20,3 +20,8 @@ export { IssueSelectSchema, IssueInsertSchema, } from "./schema"; + +// Responses +export { + IssueResponse, +} from "./schema" \ No newline at end of file diff --git a/packages/shared/src/schema.ts b/packages/shared/src/schema.ts index 044ff6e..18fb6a6 100644 --- a/packages/shared/src/schema.ts +++ b/packages/shared/src/schema.ts @@ -58,3 +58,10 @@ export type ProjectInsert = z.infer; export type IssueRecord = z.infer; export type IssueInsert = z.infer; + +// Responses + +export type IssueResponse = { + Issue: IssueRecord; + User?: UserRecord; +};