import type { IssueResponse, OrganisationResponse, ProjectResponse, UserRecord } from "@issue/shared"; import { useEffect, useRef, useState } from "react"; import { Link } from "react-router-dom"; import { IssueDetailPane } from "@/components/issue-detail-pane"; import { IssuesTable } from "@/components/issues-table"; import SmallUserDisplay from "@/components/small-user-display"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { getAuthHeaders } from "@/lib/utils"; function Index() { const serverURL = import.meta.env.VITE_SERVER_URL?.trim() || "http://localhost:3000"; const user = JSON.parse(localStorage.getItem("user") || "{}") as UserRecord; const organisationsRef = useRef(false); const [organisations, setOrganisations] = useState([]); const [organisationSelectOpen, setOrganisationSelectOpen] = useState(false); const [selectedOrganisation, setSelectedOrganisation] = useState(null); const [projects, setProjects] = useState([]); const [projectSelectOpen, setProjectSelectOpen] = useState(false); const [selectedProject, setSelectedProject] = useState(null); const [issues, setIssues] = useState([]); const [selectedIssue, setSelectedIssue] = useState(null); useEffect(() => { if (organisationsRef.current) return; organisationsRef.current = true; fetch(`${serverURL}/organisation/by-user?userId=${user.id}`, { headers: getAuthHeaders() }) .then((res) => res.json()) .then((data: Array) => { setOrganisations(data); setSelectedOrganisation(data[0] || null); }) .catch((err) => { console.error("error fetching organisations:", err); }); }, [user.id]); // fetch projects when organisation is selected useEffect(() => { setProjects([]); setSelectedProject(null); setSelectedIssue(null); setIssues([]); if (!selectedOrganisation) { return; } fetch( `${serverURL}/projects/by-organisation?organisationId=${selectedOrganisation.Organisation.id}`, { headers: getAuthHeaders(), }, ) .then((res) => res.json()) .then((data: ProjectResponse[]) => { setProjects(data); }) .catch((err) => { console.error("error fetching projects:", err); setProjects([]); }); }, [selectedOrganisation]); // fetch issues when project is selected 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]); useEffect(() => { if (projects.length > 0) { setSelectedProject(projects[0]); } }, [projects]); return (
{/* header area */}
{/* organisation selection */} {/* project selection - only shown when organisation is selected */} {selectedOrganisation && ( )}
Settings
{/* main body */}
{selectedProject && issues.length > 0 && ( <> {/* issues list (table) */} {/* issue detail pane */} {selectedIssue && (
setSelectedIssue(null)} />
)} )}
{/* */}
); } export default Index;