Skip to content

Commit 4e7c2ee

Browse files
refactor: fix lint and build errors
1 parent 1125c14 commit 4e7c2ee

File tree

7 files changed

+302
-189
lines changed

7 files changed

+302
-189
lines changed

app/admin/page.tsx

Lines changed: 60 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,82 @@
1-
'use client'
1+
"use client";
22

3-
import { useState, useEffect } from 'react'
4-
import { TeamHierarchyTree } from '@/components/TeamHierarchyTree'
5-
import { useAuth } from '@/hooks/useAuth'
6-
import { redirect, useSearchParams } from 'next/navigation'
7-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
8-
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
9-
import { useOrganisation } from '@/components/organisation-switcher'
10-
import { Building2 } from 'lucide-react'
11-
import { useOrganisations } from '@/hooks/useOrganisations'
12-
import { StakeholderManagement } from '@/components/StakeholderManagement'
3+
import { useState, useEffect } from "react";
4+
import { TeamHierarchyTree } from "@/components/TeamHierarchyTree";
5+
import { useAuth } from "@/hooks/useAuth";
6+
import { redirect, useSearchParams } from "next/navigation";
7+
import {
8+
Card,
9+
CardContent,
10+
CardDescription,
11+
CardHeader,
12+
CardTitle,
13+
} from "@/components/ui/card";
14+
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
15+
import { useOrganisation } from "@/components/organisation-switcher";
16+
import { Building2 } from "lucide-react";
17+
import { useOrganisations } from "@/hooks/useOrganisations";
18+
import { StakeholderManagement } from "@/components/StakeholderManagement";
1319
import {
1420
Select,
1521
SelectContent,
1622
SelectItem,
1723
SelectTrigger,
1824
SelectValue,
19-
} from "@/components/ui/select"
25+
} from "@/components/ui/select";
2026

2127
export default function AdminPage() {
22-
const { user, loading: authLoading, isAdmin } = useAuth()
23-
const { selectedOrganisation } = useOrganisation()
24-
const { organisations, loading: orgsLoading, fetchAllOrganisations } = useOrganisations()
25-
const [organisationId, setOrganisationId] = useState<string | null>(null)
26-
const searchParams = useSearchParams()
27-
const tabParam = searchParams.get('tab')
28-
const [activeTab, setActiveTab] = useState<string>('team-hierarchy')
28+
const { user, loading: authLoading, isAdmin } = useAuth();
29+
const { selectedOrganisation } = useOrganisation();
30+
const {
31+
organisations,
32+
loading: orgsLoading,
33+
fetchAllOrganisations,
34+
} = useOrganisations();
35+
const [organisationId, setOrganisationId] = useState<string | null>(null);
36+
const searchParams = useSearchParams();
37+
const tabParam = searchParams?.get("tab") ?? "team-hierarchy";
38+
const [activeTab, setActiveTab] = useState<string>("team-hierarchy");
2939

3040
useEffect(() => {
3141
// Fetch all organizations for admin view
3242
if (isAdmin) {
33-
fetchAllOrganisations().catch(error => {
34-
console.error('Failed to fetch all organisations:', error)
35-
})
43+
fetchAllOrganisations().catch((error) => {
44+
console.error("Failed to fetch all organisations:", error);
45+
});
3646
}
37-
}, [isAdmin, fetchAllOrganisations])
47+
}, [isAdmin, fetchAllOrganisations]);
3848

3949
useEffect(() => {
4050
if (selectedOrganisation) {
41-
setOrganisationId(selectedOrganisation.id)
51+
setOrganisationId(selectedOrganisation.id);
4252
}
43-
}, [selectedOrganisation])
53+
}, [selectedOrganisation]);
4454

4555
// Set the active tab based on the URL parameter
4656
useEffect(() => {
4757
if (tabParam) {
48-
setActiveTab(tabParam)
58+
setActiveTab(tabParam);
4959
}
50-
}, [tabParam])
60+
}, [tabParam]);
5161

5262
if (authLoading || orgsLoading) {
53-
return <div className="flex items-center justify-center min-h-screen">Loading...</div>
63+
return (
64+
<div className="flex items-center justify-center min-h-screen">
65+
Loading...
66+
</div>
67+
);
5468
}
5569

5670
// If user is not logged in, redirect to login page
5771
if (!user) {
58-
redirect('/login')
59-
return null
72+
redirect("/login");
73+
return null;
6074
}
6175

6276
// If user is not an admin, redirect to organization page
6377
if (!isAdmin) {
64-
redirect('/organisation')
65-
return null
78+
redirect("/organisation");
79+
return null;
6680
}
6781

6882
return (
@@ -71,14 +85,17 @@ export default function AdminPage() {
7185
<h1 className="text-3xl font-bold">Admin Dashboard</h1>
7286
<div className="flex items-center gap-4">
7387
<Select
74-
value={organisationId || ''}
88+
value={organisationId || ""}
7589
onValueChange={(value) => setOrganisationId(value)}
7690
>
7791
<SelectTrigger className="w-[250px]">
7892
<SelectValue placeholder="Select organisation">
7993
<div className="flex items-center gap-2">
8094
<Building2 className="h-4 w-4" />
81-
<span>{organisations?.find(org => org.id === organisationId)?.name || "Select organisation"}</span>
95+
<span>
96+
{organisations?.find((org) => org.id === organisationId)
97+
?.name || "Select organisation"}
98+
</span>
8299
</div>
83100
</SelectValue>
84101
</SelectTrigger>
@@ -95,15 +112,20 @@ export default function AdminPage() {
95112
</Select>
96113
</div>
97114
</div>
98-
115+
99116
{!organisationId ? (
100117
<Card>
101118
<CardContent className="flex items-center justify-center min-h-[200px] text-muted-foreground">
102119
Please select an organization to view and manage its settings
103120
</CardContent>
104121
</Card>
105122
) : (
106-
<Tabs defaultValue={activeTab} value={activeTab} onValueChange={setActiveTab} className="w-full">
123+
<Tabs
124+
defaultValue={activeTab}
125+
value={activeTab}
126+
onValueChange={setActiveTab}
127+
className="w-full"
128+
>
107129
<TabsList className="mb-4">
108130
<TabsTrigger value="team-hierarchy">Teams</TabsTrigger>
109131
<TabsTrigger value="stakeholders">Stakeholders</TabsTrigger>
@@ -169,5 +191,5 @@ export default function AdminPage() {
169191
</Tabs>
170192
)}
171193
</div>
172-
)
173-
}
194+
);
195+
}

app/organisation/[organisationId]/decision/[id]/view/page.tsx

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,83 @@
1-
'use client'
1+
"use client";
22

3-
import { useParams } from 'next/navigation'
4-
import { useDecision } from '@/hooks/useDecisions'
5-
import { useStakeholders } from '@/hooks/useStakeholders'
6-
import { DecisionSummary } from '@/components/decision-summary'
7-
import Link from 'next/link'
3+
import { useParams } from "next/navigation";
4+
import { useDecision } from "@/hooks/useDecisions";
5+
import { useStakeholders } from "@/hooks/useStakeholders";
6+
import { DecisionSummary } from "@/components/decision-summary";
7+
import Link from "next/link";
88

99
function PublishedBanner() {
1010
return (
1111
<div className="bg-sky-100 p-4 rounded-md">
12-
<p className="text-slate-700">This decision has been published and can no longer be edited</p>
12+
<p className="text-slate-700">
13+
This decision has been published and can no longer be edited
14+
</p>
1315
</div>
14-
)
16+
);
1517
}
1618

17-
function SupersededBanner({ supersedingDecisionId, supersedingDecisionTitle, organisationId }: {
18-
supersedingDecisionId: string
19-
supersedingDecisionTitle: string
20-
organisationId: string
19+
function SupersededBanner({
20+
supersedingDecisionId,
21+
supersedingDecisionTitle,
22+
organisationId,
23+
}: {
24+
supersedingDecisionId: string;
25+
supersedingDecisionTitle: string;
26+
organisationId: string;
2127
}) {
2228
return (
2329
<div className="bg-amber-100 p-4 rounded-md">
2430
<p className="text-slate-700">
25-
This decision has been superseded by{' '}
26-
<Link
31+
This decision has been superseded by{" "}
32+
<Link
2733
href={`/organisation/${organisationId}/decision/${supersedingDecisionId}/view`}
2834
className="text-amber-800 hover:text-amber-900 underline"
2935
>
3036
{supersedingDecisionTitle}
3137
</Link>
3238
</p>
3339
</div>
34-
)
40+
);
3541
}
3642

3743
export default function DecisionView() {
38-
const params = useParams()
39-
const { decision, loading } = useDecision(params.id as string, params.organisationId as string)
40-
const { stakeholders } = useStakeholders()
44+
const params = useParams();
45+
const { stakeholders } = useStakeholders();
46+
const { decision, loading } = useDecision(
47+
(params?.id as string) || "",
48+
(params?.organisationId as string) || "",
49+
);
50+
51+
if (!params?.id || !params?.organisationId) {
52+
return <div>Invalid parameters</div>;
53+
}
4154

4255
if (loading) {
43-
return <div>Loading...</div>
56+
return <div>Loading...</div>;
4457
}
4558

4659
if (!decision) {
47-
return <div>Decision not found</div>
60+
return <div>Decision not found</div>;
4861
}
4962

50-
const supersededByRelationship = decision.getSupersededByRelationship()
63+
const supersededByRelationship = decision.getSupersededByRelationship();
5164

5265
return (
5366
<div className="space-y-8">
5467
<h1 className="text-2xl font-bold text-slate-900">{decision.title}</h1>
5568

56-
<DecisionSummary
57-
decision={decision}
58-
stakeholders={stakeholders}
59-
/>
69+
<DecisionSummary decision={decision} stakeholders={stakeholders} />
6070

6171
{decision.isPublished() && <PublishedBanner />}
6272
{supersededByRelationship && (
63-
<SupersededBanner
73+
<SupersededBanner
6474
supersedingDecisionId={supersededByRelationship.targetDecision.id}
65-
supersedingDecisionTitle={supersededByRelationship.targetDecisionTitle}
75+
supersedingDecisionTitle={
76+
supersededByRelationship.targetDecisionTitle
77+
}
6678
organisationId={params.organisationId as string}
6779
/>
6880
)}
6981
</div>
70-
)
82+
);
7183
}
72-
Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,36 @@
1-
'use client'
1+
"use client";
22

3-
import { useEffect, useRef } from 'react'
4-
import { useRouter, useParams } from 'next/navigation'
5-
import { useOrganisationDecisions } from '@/hooks/useOrganisationDecisions'
6-
import { useAuth } from '@/hooks/useAuth'
3+
import { useEffect, useRef } from "react";
4+
import { useRouter, useParams } from "next/navigation";
5+
import { useOrganisationDecisions } from "@/hooks/useOrganisationDecisions";
6+
import { useAuth } from "@/hooks/useAuth";
77

88
export default function DecisionPage() {
9-
const router = useRouter()
10-
const params = useParams()
11-
const organisationId = params.organisationId as string
12-
const { createDecision } = useOrganisationDecisions(organisationId)
13-
const { user } = useAuth()
14-
const hasCreatedDecision = useRef(false)
9+
const router = useRouter();
10+
const params = useParams();
11+
const { user } = useAuth();
12+
const organisationId = (params?.organisationId as string) || "";
13+
const { createDecision } = useOrganisationDecisions(organisationId);
14+
const hasCreatedDecision = useRef(false);
1515

1616
useEffect(() => {
17-
if (user) { // we need to wait until the logged in user is available
18-
if (!hasCreatedDecision.current) { // we only want to run createDecision once
17+
if (!params?.organisationId) return;
18+
19+
if (user) {
20+
// we need to wait until the logged in user is available
21+
if (!hasCreatedDecision.current) {
22+
// we only want to run createDecision once
1923
hasCreatedDecision.current = true;
2024
createDecision().then((decision) => {
21-
router.push(`${decision.id}/edit`)
22-
})
25+
router.push(`${decision.id}/edit`);
26+
});
2327
}
2428
}
25-
}, [user, createDecision, router])
29+
}, [user, createDecision, router, params?.organisationId]);
30+
31+
if (!params?.organisationId) {
32+
return <div>Invalid organisation ID</div>;
33+
}
2634

27-
return <div>Creating decision...</div>
28-
}
35+
return <div>Creating decision...</div>;
36+
}

0 commit comments

Comments
 (0)