From 78082960eb210ade110896195bc5907f5431825f Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Wed, 31 Dec 2025 05:44:33 +0000 Subject: [PATCH] added OrganisationSelect and overview of selected org --- packages/frontend/src/Organisations.tsx | 90 ++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/Organisations.tsx b/packages/frontend/src/Organisations.tsx index 05a9d6e..5110fec 100644 --- a/packages/frontend/src/Organisations.tsx +++ b/packages/frontend/src/Organisations.tsx @@ -1,9 +1,97 @@ +import type { OrganisationResponse, UserRecord } from "@issue/shared"; +import { useCallback, useEffect, useState } from "react"; +import { OrganisationSelect } from "@/components/organisation-select"; import { SettingsPageLayout } from "@/components/settings-page-layout"; +import { getAuthHeaders } from "@/lib/utils"; + +const SERVER_URL = import.meta.env.VITE_SERVER_URL?.trim() || "http://localhost:3000"; function Organisations() { + const user = JSON.parse(localStorage.getItem("user") || "{}") as UserRecord; + + const [organisations, setOrganisations] = useState([]); + const [selectedOrganisation, setSelectedOrganisation] = useState(null); + + const refetchOrganisations = useCallback( + async (options?: { selectOrganisationId?: number }) => { + try { + const res = await fetch(`${SERVER_URL}/organisation/by-user?userId=${user.id}`, { + headers: getAuthHeaders(), + }); + + if (!res.ok) { + console.error(await res.text()); + setOrganisations([]); + setSelectedOrganisation(null); + return; + } + + const data = (await res.json()) as Array; + setOrganisations(data); + + if (options?.selectOrganisationId) { + const created = data.find((o) => o.Organisation.id === options.selectOrganisationId); + if (created) { + setSelectedOrganisation(created); + return; + } + } + + setSelectedOrganisation((prev) => { + if (!prev) return data[0] || null; + const stillExists = data.find((o) => o.Organisation.id === prev.Organisation.id); + return stillExists || data[0] || null; + }); + } catch (err) { + console.error("error fetching organisations:", err); + setOrganisations([]); + setSelectedOrganisation(null); + } + }, + [user.id], + ); + + useEffect(() => { + void refetchOrganisations(); + }, [refetchOrganisations]); + + useEffect(() => { + setSelectedOrganisation((prev) => prev || organisations[0] || null); + }, [organisations]); + return ( -

Organisations page here

+
+
+ { + await refetchOrganisations({ selectOrganisationId: organisationId }); + }} + /> +
+ + {selectedOrganisation ? ( +
+

{selectedOrganisation.Organisation.name}

+

+ Slug: {selectedOrganisation.Organisation.slug} +

+

+ Role: {selectedOrganisation.OrganisationMember.role} +

+ {selectedOrganisation.Organisation.description ? ( +

{selectedOrganisation.Organisation.description}

+ ) : ( +

No description

+ )} +
+ ) : ( +

No organisations yet.

+ )} +
); }