From a550879c5e0ad088503a37a951ebb4837de99df0 Mon Sep 17 00:00:00 2001 From: Emma Ruby Date: Sun, 24 Nov 2024 17:27:55 -0600 Subject: [PATCH] more changes, pog --- .env | 1 - app/api/cron/update-controllers/route.ts | 76 +++++++++++ app/auth/callback/route.ts | 18 +++ app/controllers/[cid]/page.tsx | 55 ++++++++ app/controllers/page.tsx | 61 +++++++++ app/page.tsx | 36 ++---- bun.lockb | Bin 0 -> 238837 bytes components/auth-button.tsx | 59 +++++++++ components/controller-profile.tsx | 139 ++++++++++++++++++++ components/controller-table.tsx | 91 +++++++++++++ components/header.tsx | 60 ++++++--- lib/supabase/client.ts | 6 + lib/supabase/server.ts | 8 ++ middleware.ts | 18 +++ package-lock.json | 157 +++++++++++++++++++++++ package.json | 5 +- types/supabase.ts | 61 +++++++++ 17 files changed, 805 insertions(+), 46 deletions(-) delete mode 100644 .env create mode 100644 app/api/cron/update-controllers/route.ts create mode 100644 app/auth/callback/route.ts create mode 100644 app/controllers/[cid]/page.tsx create mode 100644 app/controllers/page.tsx create mode 100644 bun.lockb create mode 100644 components/auth-button.tsx create mode 100644 components/controller-profile.tsx create mode 100644 components/controller-table.tsx create mode 100644 lib/supabase/client.ts create mode 100644 lib/supabase/server.ts create mode 100644 middleware.ts create mode 100644 types/supabase.ts diff --git a/.env b/.env deleted file mode 100644 index 4ce83b9..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -NEXT_PUBLIC_BASE_URL=http://localhost:3000 diff --git a/app/api/cron/update-controllers/route.ts b/app/api/cron/update-controllers/route.ts new file mode 100644 index 0000000..75ed94d --- /dev/null +++ b/app/api/cron/update-controllers/route.ts @@ -0,0 +1,76 @@ +import { createClient } from '@supabase/supabase-js' + +import { NextResponse } from 'next/server' + +const facilityTypes = { + 0: "OBS", + 1: "FSS", + 2: "DEL", + 3: "GND", + 4: "TWR", + 5: "APP", + 6: "CTR", +} as const; + +// Define FIR coverage +const CZQM_AIRPORTS = ["CYHZ", "CYFC", "CYQM", "CYSJ", "CYZX", "CYYG", "CYYT", "CYQX", "CYYR", "LFVP", "CYQI", "CYAY", "CYDF", "CYJT"]; + +export async function GET() { + try { + // Fetch current VATSIM data + const response = await fetch('https://data.vatsim.net/v3/vatsim-data.json'); + if (!response.ok) throw new Error('Failed to fetch VATSIM data'); + const data = await response.json(); + + const supabase = createClient(process.env.NEXT_PUBLIC_SUPABASE_URL, process.env.NEXT_SECRET_SUPABASE_KEY) + + // Filter controllers in CZQM airspace + const czqmControllers = data.controllers.filter((controller: any) => { + const callsign = controller.callsign; + // console.log(callsign) + return callsign.startsWith('CZQM_') || + callsign.startsWith('CZQX_') || + CZQM_AIRPORTS.some(airport => callsign.startsWith(airport)); + }); + + // Process each controller + for (const controller of czqmControllers) { + const facilityType = facilityTypes[controller.facility as keyof typeof facilityTypes]; + const airport = CZQM_AIRPORTS.find(ap => controller.callsign.startsWith(ap)) || 'CZQM'; + + // Insert or update controller session + const { error } = await supabase + .from('controller_sessions') + .upsert({ + cid: controller.cid, + name: controller.name, + callsign: controller.callsign, + facility_type: facilityType, + frequency: controller.frequency, + airport: airport, + last_seen: new Date().toISOString(), + logon_time: controller.logon_time, + }); + + if (error) { + console.error('Error updating controller session:', error); + } + } + + // Clean up old sessions (controllers who have logged off) + const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString(); + const { error: cleanupError } = await supabase + .from('controller_sessions') + .delete() + .lt('last_seen', fiveMinutesAgo); + + if (cleanupError) { + console.error('Error cleaning up old sessions:', cleanupError); + } + + return NextResponse.json({ success: true }); + } catch (error) { + console.error('Error in controller update:', error); + return NextResponse.json({ error: 'Failed to update controller data' }, { status: 500 }); + } +} \ No newline at end of file diff --git a/app/auth/callback/route.ts b/app/auth/callback/route.ts new file mode 100644 index 0000000..e2e56f2 --- /dev/null +++ b/app/auth/callback/route.ts @@ -0,0 +1,18 @@ +import { createClient } from '@/lib/supabase/server' +import { NextResponse } from 'next/server' + +export async function GET(request: Request) { + const { searchParams, origin } = new URL(request.url) + const code = searchParams.get('code') + const next = searchParams.get('next') ?? '/' + + if (code) { + const supabase = createClient() + const { error } = await supabase.auth.exchangeCodeForSession(code) + if (!error) { + return NextResponse.redirect(`${origin}${next}`) + } + } + + return NextResponse.redirect(`${origin}/auth/auth-code-error`) +} \ No newline at end of file diff --git a/app/controllers/[cid]/page.tsx b/app/controllers/[cid]/page.tsx new file mode 100644 index 0000000..7117854 --- /dev/null +++ b/app/controllers/[cid]/page.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useParams } from "next/navigation"; +import { Card } from "@/components/ui/card"; +import { Header } from "@/components/header"; +import { ControllerProfile } from "@/components/controller-profile"; +import { createClient } from "@/lib/supabase/client"; + +export default function ControllerProfilePage() { + const params = useParams(); + const [sessions, setSessions] = useState([]); + const [loading, setLoading] = useState(true); + const supabase = createClient(); + + useEffect(() => { + async function loadControllerData() { + try { + const { data, error } = await supabase + .from('controller_sessions') + .select('*') + .eq('cid', params.cid) + .order('last_seen', { ascending: false }); + + if (error) throw error; + setSessions(data || []); + } catch (error) { + console.error("Error fetching controller data:", error); + } finally { + setLoading(false); + } + } + + loadControllerData(); + }, [params.cid]); + + const controllerName = sessions[0]?.name || params.cid; + + return ( +
+
+
+
+ + + + +
+
+
+ ); +} \ No newline at end of file diff --git a/app/controllers/page.tsx b/app/controllers/page.tsx new file mode 100644 index 0000000..13832c5 --- /dev/null +++ b/app/controllers/page.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { Card } from "@/components/ui/card"; +import { Header } from "@/components/header"; +import { ControllerTable } from "@/components/controller-table"; +import { createClient } from "@/lib/supabase/client"; + +export default function ControllersPage() { + const [controllers, setControllers] = useState([]); + const [loading, setLoading] = useState(true); + const supabase = createClient(); + + useEffect(() => { + async function loadControllers() { + try { + // Get unique controllers with their latest session + const { data, error } = await supabase + .from('controller_sessions') + .select('*') + .order('last_seen', { ascending: false }); + + if (error) throw error; + + // Group by CID and take the most recent session + const uniqueControllers = data.reduce((acc: any[], curr) => { + const existingIndex = acc.findIndex(c => c.cid === curr.cid); + if (existingIndex === -1) { + acc.push(curr); + } + return acc; + }, []); + + setControllers(uniqueControllers); + } catch (error) { + console.error("Error fetching controller data:", error); + } finally { + setLoading(false); + } + } + + loadControllers(); + }, []); + + return ( +
+
+
+
+ + + + +
+
+
+ ); +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 3f6bf82..1924ecc 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,4 +1,4 @@ -"use client"; // Mark this component as client-side +"use client"; import { useEffect, useState } from "react"; import { Card } from "@/components/ui/card"; @@ -7,35 +7,27 @@ import { CallsignSearch } from "@/components/callsign-search"; import { Header } from "@/components/header"; import { getUTCtime } from "@/lib/utils/metar"; -// Function to fetch METAR data from the API -async function fetchMetarData() { - const response = await fetch('/api/metar'); - if (!response.ok) { - throw new Error('Failed to fetch METAR data'); - } - return await response.json(); -} - export default function Home() { - const [metarData, setMetarData] = useState(null); + const [metarData, setMetarData] = useState([]); const [loading, setLoading] = useState(true); const currentTime = getUTCtime(); useEffect(() => { async function loadMetarData() { try { - const data = await fetchMetarData(); - setMetarData(data); // Update the state with fetched data + const response = await fetch('/api/metar'); + if (!response.ok) throw new Error('Failed to fetch METAR data'); + const data = await response.json(); + setMetarData(data); } catch (error) { console.error("Error fetching METAR data:", error); - setMetarData(null); // Optionally handle error case } finally { - setLoading(false); // Set loading to false after fetching + setLoading(false); } } - loadMetarData(); // Call the fetch function when the component mounts - }, []); // Empty dependency array means this effect runs once after mount + loadMetarData(); + }, []); return (
@@ -44,13 +36,7 @@ export default function Home() {
- {loading ? ( -

Loading METAR data...

- ) : metarData ? ( - - ) : ( -

Error loading METAR data.

- )} +
@@ -63,4 +49,4 @@ export default function Home() {
); -} +} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..070e31be7dd2790b67f430038e084c1645c9d0da GIT binary patch literal 238837 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 { + await supabase.auth.signInWithOAuth({ + provider: 'vatsim', + options: { + redirectTo: `${location.origin}/auth/callback`, + }, + }) + } + + const handleSignOut = async () => { + await supabase.auth.signOut() + window.location.reload() + } + + if (user) { + return ( + + + + + + Account + + + + Sign Out + + + + ) + } + + return ( + + ) +} \ No newline at end of file diff --git a/components/controller-profile.tsx b/components/controller-profile.tsx new file mode 100644 index 0000000..a29be36 --- /dev/null +++ b/components/controller-profile.tsx @@ -0,0 +1,139 @@ +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Card } from "@/components/ui/card"; +import { formatDistanceToNow, format } from "date-fns"; +import { Clock, Calendar, Radio } from "lucide-react"; + +interface ControllerProfileProps { + sessions: any[]; + loading: boolean; +} + +export function ControllerProfile({ sessions, loading }: ControllerProfileProps) { + if (loading) { + return ; + } + + const totalTime = sessions.reduce((acc, session) => { + const duration = new Date(session.last_seen).getTime() - new Date(session.logon_time).getTime(); + return acc + duration; + }, 0); + + const totalHours = Math.floor(totalTime / (1000 * 60 * 60)); + const totalMinutes = Math.floor((totalTime % (1000 * 60 * 60)) / (1000 * 60)); + + // Get unique positions + const positions = [...new Set(sessions.map(s => s.facility_type))]; + + return ( +
+
+ +
+ +

Total Time

+
+

+ {totalHours}h {totalMinutes}m +

+
+ + +
+ +

Total Sessions

+
+

{sessions.length}

+
+ + +
+ +

Positions

+
+
+ {positions.map(position => ( + + {position} + + ))} +
+
+
+ +
+

Session History

+ + + + Date + Callsign + Position + Airport + Frequency + Duration + + + + {sessions.map((session) => ( + + + {format(new Date(session.logon_time), "MMM d, yyyy")} + + {session.callsign} + {session.facility_type} + {session.airport} + {session.frequency} + + {formatSessionDuration(session.logon_time, session.last_seen)} + + + ))} + +
+
+
+ ); +} + +function formatSessionDuration(start: string, end: string) { + const duration = new Date(end).getTime() - new Date(start).getTime(); + const hours = Math.floor(duration / (1000 * 60 * 60)); + const minutes = Math.floor((duration % (1000 * 60 * 60)) / (1000 * 60)); + return `${hours}h ${minutes}m`; +} + +function LoadingSkeleton() { + return ( +
+
+ + + +
+
+ + {Array.from({ length: 5 }).map((_, i) => ( +
+ + + + + + +
+ ))} +
+
+ ); +} \ No newline at end of file diff --git a/components/controller-table.tsx b/components/controller-table.tsx new file mode 100644 index 0000000..0b7b613 --- /dev/null +++ b/components/controller-table.tsx @@ -0,0 +1,91 @@ +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { Skeleton } from "@/components/ui/skeleton"; +import { formatDistanceToNow } from "date-fns"; + +interface ControllerTableProps { + data: any[]; + loading: boolean; +} + +export function ControllerTable({ data, loading }: ControllerTableProps) { + const router = useRouter(); + + const handleControllerClick = (cid: string) => { + router.push(`/controllers/${cid}`); + }; + + if (loading) { + return ; + } + + return ( + + + + Name + CID + Current Position + Airport + Frequency + Last Seen + Session Duration + + + + {data.map((controller) => ( + handleControllerClick(controller.cid)} + > + {controller.name} + {controller.cid} + {controller.callsign} + {controller.airport} + {controller.frequency} + + {formatDistanceToNow(new Date(controller.last_seen), { addSuffix: true })} + + + {formatSessionDuration(controller.logon_time, controller.last_seen)} + + + ))} + +
+ ); +} + +function formatSessionDuration(start: string, end: string) { + const duration = new Date(end).getTime() - new Date(start).getTime(); + const hours = Math.floor(duration / (1000 * 60 * 60)); + const minutes = Math.floor((duration % (1000 * 60 * 60)) / (1000 * 60)); + return `${hours}h ${minutes}m`; +} + +function LoadingSkeleton() { + return ( +
+ {Array.from({ length: 5 }).map((_, i) => ( +
+ + + + + + + +
+ ))} +
+ ); +} \ No newline at end of file diff --git a/components/header.tsx b/components/header.tsx index 1cc8076..5917e60 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -2,31 +2,53 @@ import { RefreshCcw, Plane } from "lucide-react"; import { Button } from "@/components/ui/button"; +import Link from "next/link"; interface HeaderProps { - currentTime: string; + title?: string; + subtitle?: string; + currentTime?: string; } -export function Header({ currentTime }: HeaderProps) { +export function Header({ title, subtitle, currentTime }: HeaderProps) { return ( -
-
- -

CZQM Ops Support Tool

-
-
-

- Last updated: {currentTime} -

- +
+
+
+ +

+ {title || "CZQM Ops Support Tool"} +

+
+
+ {currentTime && ( +

+ Last updated: {currentTime} +

+ )} +
+ + +
+ {currentTime && ( + + )} +
+ {subtitle && ( +

{subtitle}

+ )}
); } \ No newline at end of file diff --git a/lib/supabase/client.ts b/lib/supabase/client.ts new file mode 100644 index 0000000..e3968ac --- /dev/null +++ b/lib/supabase/client.ts @@ -0,0 +1,6 @@ +import { createClientComponentClient } from '@supabase/auth-helpers-nextjs' +import type { Database } from '@/types/supabase' + +export const createClient = () => { + return createClientComponentClient() +} \ No newline at end of file diff --git a/lib/supabase/server.ts b/lib/supabase/server.ts new file mode 100644 index 0000000..4906c7d --- /dev/null +++ b/lib/supabase/server.ts @@ -0,0 +1,8 @@ +import { createServerComponentClient } from '@supabase/auth-helpers-nextjs' +import { cookies } from 'next/headers' +import { Database } from '@/types/supabase' + +export const createClient = () => { + const cookieStore = cookies() + return createServerComponentClient({ cookies: () => cookieStore }) +} \ No newline at end of file diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 0000000..356a4c6 --- /dev/null +++ b/middleware.ts @@ -0,0 +1,18 @@ +import { NextResponse } from 'next/server' +import type { NextRequest } from 'next/server' + +export async function middleware(request: NextRequest) { + return NextResponse.next() +} + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + '/((?!_next/static|_next/image|favicon.ico).*)', + ], +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cd47866..bab91e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,8 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", + "@supabase/auth-helpers-nextjs": "^0.9.0", + "@supabase/supabase-js": "^2.39.0", "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", @@ -1845,6 +1847,96 @@ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==" }, + "node_modules/@supabase/auth-helpers-nextjs": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.9.0.tgz", + "integrity": "sha512-V+UKFngSCkzAucX3Zi5D4TRiJZUUx0RDme7W217nIkwhCTvJY7Ih2L1cgnAMihQost2YYgTzJ7DrUzz4mm8i8A==", + "dependencies": { + "@supabase/auth-helpers-shared": "0.6.3", + "set-cookie-parser": "^2.6.0" + }, + "peerDependencies": { + "@supabase/supabase-js": "^2.19.0" + } + }, + "node_modules/@supabase/auth-helpers-shared": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.6.3.tgz", + "integrity": "sha512-xYQRLFeFkL4ZfwC7p9VKcarshj3FB2QJMgJPydvOY7J5czJe6xSG5/wM1z63RmAzGbCkKg+dzpq61oeSyWiGBQ==", + "dependencies": { + "jose": "^4.14.4" + }, + "peerDependencies": { + "@supabase/supabase-js": "^2.19.0" + } + }, + "node_modules/@supabase/auth-js": { + "version": "2.65.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.65.1.tgz", + "integrity": "sha512-IA7i2Xq2SWNCNMKxwmPlHafBQda0qtnFr8QnyyBr+KaSxoXXqEzFCnQ1dGTy6bsZjVBgXu++o3qrDypTspaAPw==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.3.tgz", + "integrity": "sha512-sOLXy+mWRyu4LLv1onYydq+10mNRQ4rzqQxNhbrKLTLTcdcmS9hbWif0bGz/NavmiQfPs4ZcmQJp4WqOXlR4AQ==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.16.3.tgz", + "integrity": "sha512-HI6dsbW68AKlOPofUjDTaosiDBCtW4XAm0D18pPwxoW3zKOE2Ru13Z69Wuys9fd6iTpfDViNco5sgrtnP0666A==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.10.7.tgz", + "integrity": "sha512-OLI0hiSAqQSqRpGMTUwoIWo51eUivSYlaNBgxsXZE7PSoWh12wPRdVt0psUMaUzEonSB85K21wGc7W5jHnT6uA==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14", + "@types/phoenix": "^1.5.4", + "@types/ws": "^8.5.10", + "ws": "^8.14.2" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.7.1.tgz", + "integrity": "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.46.1.tgz", + "integrity": "sha512-HiBpd8stf7M6+tlr+/82L8b2QmCjAD8ex9YdSAKU+whB/SHXXJdus1dGlqiH9Umy9ePUuxaYmVkGd9BcvBnNvg==", + "dependencies": { + "@supabase/auth-js": "2.65.1", + "@supabase/functions-js": "2.4.3", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.16.3", + "@supabase/realtime-js": "2.10.7", + "@supabase/storage-js": "2.7.1" + } + }, "node_modules/@swc/helpers": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", @@ -1917,6 +2009,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==" }, + "node_modules/@types/phoenix": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.5.tgz", + "integrity": "sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==" + }, "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", @@ -1945,6 +2042,14 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==" }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -4896,6 +5001,14 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6100,6 +6213,11 @@ "node": ">=10" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -6619,6 +6737,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -6896,6 +7019,20 @@ "node": ">=10.13.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7085,6 +7222,26 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yaml": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", diff --git a/package.json b/package.json index a0806d1..eff36f8 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,8 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", + "@supabase/auth-helpers-nextjs": "^0.9.0", + "@supabase/supabase-js": "^2.39.0", "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", @@ -61,6 +63,7 @@ "react-resizable-panels": "^2.1.3", "recharts": "^2.12.7", "sonner": "^1.5.0", + "supabase": "^1.223.10", "tailwind-merge": "^2.5.2", "tailwindcss": "3.3.3", "tailwindcss-animate": "^1.0.7", @@ -68,4 +71,4 @@ "vaul": "^0.9.9", "zod": "^3.23.8" } -} +} \ No newline at end of file diff --git a/types/supabase.ts b/types/supabase.ts new file mode 100644 index 0000000..71ecb59 --- /dev/null +++ b/types/supabase.ts @@ -0,0 +1,61 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] + +export interface Database { + public: { + Tables: { + controller_sessions: { + Row: { + id: number + cid: string + name: string + callsign: string + facility_type: string + frequency: string + airport: string + last_seen: string + logon_time: string + created_at: string + } + Insert: { + id?: number + cid: string + name: string + callsign: string + facility_type: string + frequency: string + airport: string + last_seen: string + logon_time: string + created_at?: string + } + Update: { + id?: number + cid?: string + name?: string + callsign?: string + facility_type?: string + frequency?: string + airport?: string + last_seen?: string + logon_time?: string + created_at?: string + } + } + } + Views: { + [_ in never]: never + } + Functions: { + [_ in never]: never + } + Enums: { + [_ in never]: never + } + } +} \ No newline at end of file