draupnir4all-web

git clone git://archive.git.mtrnord.blog/MTRNord/draupnir4all-web.git
Log | Files | Refs | README | LICENSE

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:
Msrc/app/dashboard/analytics/page.tsx | 6+++++-
Msrc/app/dashboard/bans/page.tsx | 5++++-
Msrc/app/dashboard/overview/page.tsx | 6+++++-
Msrc/app/dashboard/reports/page.tsx | 7+++++--
Msrc/app/dashboard/settings/bot/page.tsx | 8++++++--
Msrc/app/dashboard/settings/members/page.tsx | 6+++++-
Msrc/app/dashboard/settings/protectedRooms/page.tsx | 8++++++--
Msrc/components/analytics/chart-configs.ts | 5+++--
Msrc/components/analytics/heatmap.tsx | 2+-
Msrc/components/dashboard/bans-list.tsx | 8+++++++-
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;