import type { IssueResponse, ProjectResponse, UserRecord } from "@issue/shared"; import { useEffect, useRef, useState } from "react"; import { IssueDetailPane } from "@/components/issue-detail-pane"; import { IssuesTable } from "@/components/issues-table"; import SmallUserDisplay from "@/components/small-user-display"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { getAuthHeaders } from "@/lib/utils"; import LogOutButton from "./components/log-out-button"; import Loading from "./components/loading"; function Index() { const serverURL = import.meta.env.VITE_SERVER_URL?.trim() || "http://localhost:3000"; const user = JSON.parse(localStorage.getItem("user") || "{}") as UserRecord; const [selectedProject, setSelectedProject] = useState(null); const [projects, setProjects] = useState([]); const projectsRef = useRef(false); useEffect(() => { if (projectsRef.current) return; projectsRef.current = true; fetch(`${serverURL}/projects/by-owner?ownerId=${user.id}`, { headers: getAuthHeaders() }) .then((res) => res.json()) .then((data: ProjectResponse[]) => { setProjects(data); }) .catch((err) => { console.error("error fetching projects:", err); }); }, [user.id]); const [selectedIssue, setSelectedIssue] = useState(null); const [issuesData, setIssues] = useState([]); useEffect(() => { if (!selectedProject) return; fetch(`${serverURL}/issues/${selectedProject.Project.blob}`, { headers: getAuthHeaders() }) .then((res) => res.json()) .then((data: IssueResponse[]) => { setIssues(data); }) .catch((err) => { console.error("error fetching issues:", err); }); }, [selectedProject]); return (
{/* header area */}
{selectedProject && (
Owner:
)}
{user && (
You:
)}
{/* main body */}
{selectedProject && issuesData.length > 0 && ( <> {/* issues list (table) */} {/* issue detail pane */} {selectedIssue && (
setSelectedIssue(null)} />
)} )}
); } export default Index;