commit a89e4ab8b15a07c21bc70c7473f05fbc677ffba0
parent a3e94964f52ae993618675a557c442ea4321fb68
Author: MTRNord <mtrnord1@gmail.com>
Date: Thu, 1 May 2025 18:52:13 +0200
Fix unchecked access with placeholders
Signed-off-by: MTRNord <mtrnord1@gmail.com>
Diffstat:
10 files changed, 47 insertions(+), 14 deletions(-)
diff --git a/src/app/dashboard/analytics/page.tsx b/src/app/dashboard/analytics/page.tsx
@@ -76,7 +76,11 @@ export default async function AnalyticsDashboard({
return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
}
- const selectedBot = listData.bots.find((team) => team.id === teamIdParam) || listData.bots[0];
+ const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
// Generate mock data
const reportsHeatmapData = generateHeatmapData(1.5, 42)
diff --git a/src/app/dashboard/bans/page.tsx b/src/app/dashboard/bans/page.tsx
@@ -29,7 +29,10 @@ export default async function Bans({
}
const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
-
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
// Filter policy lists based on selected team
// TODO: Fetch from API
diff --git a/src/app/dashboard/overview/page.tsx b/src/app/dashboard/overview/page.tsx
@@ -26,7 +26,11 @@ export default async function OverviewPage({
return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
}
- const selectedBot = listData.bots.find((team) => team.id === teamIdParam) || listData.bots[0];
+ const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
// TODO: get reports and policy lists from the API
const reports = mockReports;
// TODO: get policy list details from the API
diff --git a/src/app/dashboard/reports/page.tsx b/src/app/dashboard/reports/page.tsx
@@ -34,8 +34,11 @@ export default async function ReportsPage({
return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
}
- const selectedBot = listData.bots.find((team) => team.id === teamIdParam) || listData.bots[0];
-
+ const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
// Filter reports based on selected team
// TODO: Fetch from API
const reports = mockReports
diff --git a/src/app/dashboard/settings/bot/page.tsx b/src/app/dashboard/settings/bot/page.tsx
@@ -24,8 +24,12 @@ export default async function BotSettingsPage({
return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
}
- const selectedBot = listData.bots.find((team) => team.id === teamIdParam) || listData.bots[0];
-
+ const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
+
return (
<SettingsLayout currentTab={"settings"} listData={listData} selectedBot={selectedBot} teamIdParam={teamIdParam}>
<div className="space-y-4">
diff --git a/src/app/dashboard/settings/members/page.tsx b/src/app/dashboard/settings/members/page.tsx
@@ -29,7 +29,11 @@ export default async function MembersSettingsPage({
return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
}
- const selectedBot = listData.bots.find((team) => team.id === teamIdParam) || listData.bots[0];
+ const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
// TODO: get teams from the API
// @ts-expect-error - members is not a property of the data yet
selectedBot.members = []
diff --git a/src/app/dashboard/settings/protectedRooms/page.tsx b/src/app/dashboard/settings/protectedRooms/page.tsx
@@ -23,8 +23,12 @@ export default async function ProtectedRoomsSettingsPage({
return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
}
- const selectedBot = listData.bots.find((team) => team.id === teamIdParam) || listData.bots[0];
-
+ const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0];
+ if (!selectedBot) {
+ // TODO: Redirect to register page?
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
+
return (
<SettingsLayout currentTab={"rooms"} listData={listData} selectedBot={selectedBot} teamIdParam={teamIdParam}>
<div className="flex items-center justify-between">
diff --git a/src/components/analytics/chart-configs.ts b/src/components/analytics/chart-configs.ts
@@ -1,7 +1,8 @@
import type { Data, Layout } from "plotly.js"
+import { HeatmapDay } from "./heatmap"
// Helper function to generate heatmap data
-export const generateHeatmapData = (intensity = 1, seed = 42) => {
+export const generateHeatmapData = (intensity = 1, seed = 42): HeatmapDay[] => {
const today = new Date()
const data = []
@@ -15,7 +16,7 @@ export const generateHeatmapData = (intensity = 1, seed = 42) => {
const value = Math.floor(Math.sin(dayOfYear * 0.1 + seed) * Math.cos(date.getMonth() * 0.3 + seed) * 10 * intensity)
data.push({
- date: date.toISOString().split("T")[0],
+ date: date.toISOString().split("T")[0] as string,
count: Math.max(0, value),
})
}
diff --git a/src/components/analytics/heatmap.tsx b/src/components/analytics/heatmap.tsx
@@ -2,7 +2,7 @@
import { Calendar } from "lucide-react"
-interface HeatmapDay {
+export interface HeatmapDay {
date: string
count: number
}
diff --git a/src/components/dashboard/bans-list.tsx b/src/components/dashboard/bans-list.tsx
@@ -16,7 +16,13 @@ export default function BansList({ policyLists }: BanListProps) {
const [selectedPolicyList, setSelectedPolicyList] = useState("global")
const [filter, setFilter] = useState("all")
const [searchTerm, setSearchTerm] = useState("")
- const selectedList = policyLists.find((list) => list.id === selectedPolicyList) || policyLists[0] || { entries: [] }
+ const selectedList = policyLists.find((list) => list.id === selectedPolicyList) ?? policyLists[0]
+
+ if (!selectedList) {
+ // TODO: Error handling
+ return <div className="flex h-screen w-full items-center justify-center">Loading...</div>
+ }
+
const entries = selectedList.entries.filter((entry) => {
if (filter === "all") return true;
if (filter === "users") return entry.type === EBanTypes.User;