diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 2b88b38..34a60e6 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,7 +1,7 @@ # ─── DATABASE CONNECTION CONFIGURATION ─── spring.datasource.url=jdbc:postgresql://localhost:5432/rit_freshers_hub?sslmode=disable spring.datasource.username=postgres -spring.datasource.password=${DB_PASSWORD:Amudiesh22@.} +spring.datasource.password=${DB_PASSWORD:Devesh@54} # ─── JPA / HIBERNATE SETTINGS ─── spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect diff --git a/package-lock.json b/package-lock.json index 77ba273..202707c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1776,9 +1776,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3602,9 +3599,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3619,9 +3613,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3636,9 +3627,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3653,9 +3641,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3670,9 +3655,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3687,9 +3669,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3704,9 +3683,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3721,9 +3697,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3738,9 +3711,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3755,9 +3725,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3772,9 +3739,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3789,9 +3753,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3806,9 +3767,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ diff --git a/public/bus_routes.json b/public/bus_routes.json index 75aa07a..a28aeaf 100644 --- a/public/bus_routes.json +++ b/public/bus_routes.json @@ -65,14 +65,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.08095, - "lng": 80.27076 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.184827, "from_lng": 80.31205, - "to_lat": 13.08095, - "to_lng": 80.27076, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.184827, @@ -1146,14 +1146,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.08095, - "lng": 80.27076 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.128881, "from_lng": 80.290792, - "to_lat": 13.08095, - "to_lng": 80.27076, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.184827, @@ -2193,14 +2193,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.08095, - "lng": 80.27076 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.08095, "from_lng": 80.27076, - "to_lat": 13.08095, - "to_lng": 80.27076, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.184827, @@ -3258,14 +3258,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0761258, "from_lng": 80.270781, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.100598, @@ -4211,14 +4211,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.090276, "from_lng": 80.265585, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.118326, @@ -5196,14 +5196,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0884944, "from_lng": 80.1909707, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.118326, @@ -6207,14 +6207,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.089154, "from_lng": 80.230054, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.118326, @@ -7220,14 +7220,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.085333, "from_lng": 80.187393, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.085333, @@ -7847,14 +7847,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0293843, "from_lng": 80.2342825, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R05A", @@ -7934,14 +7934,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0617032, "from_lng": 80.2346118, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R06", @@ -8023,14 +8023,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.062841, "from_lng": 80.197105, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.066018, @@ -13337,14 +13337,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R10", @@ -15473,14 +15473,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.2820098, "from_lng": 80.2537109, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R13", @@ -15560,14 +15560,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R13A", @@ -15623,14 +15623,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.1001091, "from_lng": 80.2145485, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R14", @@ -15698,14 +15698,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R14B", @@ -15743,14 +15743,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.1305159, "from_lng": 79.9243758, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R15", @@ -15818,14 +15818,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R15A", @@ -15929,14 +15929,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R15B", @@ -16010,14 +16010,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R16", @@ -16085,14 +16085,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R16B", @@ -16184,14 +16184,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R17", @@ -16245,14 +16245,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.040666, "from_lng": 80.17222, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.054006, @@ -16860,14 +16860,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.040666, "from_lng": 80.17222, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.054006, @@ -17479,14 +17479,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 12.984051, "from_lng": 80.2175088, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R18A", @@ -17542,14 +17542,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R18B", @@ -17635,14 +17635,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 12.7871437, "from_lng": 80.219987, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R19", @@ -17704,14 +17704,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R19A", @@ -17749,14 +17749,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R20", @@ -17818,14 +17818,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R20A", @@ -17881,14 +17881,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R21", @@ -17944,14 +17944,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R22", @@ -18043,14 +18043,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R22A", @@ -18136,14 +18136,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R23", @@ -18211,14 +18211,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R24", @@ -18346,14 +18346,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R25", @@ -18409,14 +18409,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.1331405, "from_lng": 80.1701786, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R25A", @@ -18460,14 +18460,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R26", @@ -18535,14 +18535,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.1938755, "from_lng": 80.2685646, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R27", @@ -20662,14 +20662,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.1158603, "from_lng": 80.2300407, - "to_lat": 13.0118, - "to_lng": 80.0214, + "to_lat": 13.03868, + "to_lng": 80.045138, "polyline": [ [ 13.115889, @@ -21543,14 +21543,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R29A", @@ -21600,14 +21600,14 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 }, { "number": "R29B", @@ -21669,13 +21669,13 @@ { "name": "RIT Campus", "time": "07:40 AM", - "lat": 13.0118, - "lng": 80.0214 + "lat": 13.03868, + "lng": 80.045138 } ], "from_lat": 13.0118, "from_lng": 80.0214, - "to_lat": 13.0118, - "to_lng": 80.0214 + "to_lat": 13.03868, + "to_lng": 80.045138 } ] \ No newline at end of file diff --git a/src/components/BusRouteMap/BusRouteMap.tsx b/src/components/BusRouteMap/BusRouteMap.tsx index 107f4f2..ceb07d6 100644 --- a/src/components/BusRouteMap/BusRouteMap.tsx +++ b/src/components/BusRouteMap/BusRouteMap.tsx @@ -17,28 +17,74 @@ L.Icon.Default.mergeOptions({ shadowUrl: markerShadow, }); +// Glowing Live Bus Icon const liveBusIcon = L.divIcon({ - html: `
🚌
`, + html: `
🚌
`, className: '', iconSize: [40, 40], iconAnchor: [20, 20], }); +// Stopped Bus Icon const stoppedBusIcon = L.divIcon({ - html: `
🚌
`, + html: `
🚌
`, className: '', iconSize: [40, 40], iconAnchor: [20, 20], }); -// Helper component to pan map to active bus marker when selected -function MapPanFocus({ center }: { center: [number, number] | null }) { +// Helper: Create Clean Start Point Icon (Starting Location Name Only) +function createStartIcon(locationName: string) { + return L.divIcon({ + html: ` +
+ +
+ 📍 + ${locationName} +
+
+ `, + className: '', + iconSize: [160, 40], + iconAnchor: [80, 20], + }); +} + +// Helper: Create Clean Destination Point Icon (RIT Campus Only) +function createDestinationIcon(locationName: string) { + const displayName = locationName.includes('RIT') ? locationName : 'RIT Campus'; + return L.divIcon({ + html: ` +
+ +
+ 🏫 + ${displayName} +
+
+ `, + className: '', + iconSize: [160, 40], + iconAnchor: [80, 20], + }); +} + +// Helper component to auto-fit map view bounds when route changes +function MapPanFocus({ bounds }: { bounds: L.LatLngBoundsExpression | null }) { const map = useMap(); + useEffect(() => { - if (center) { - map.setView(center, 13, { animate: true }); + if (bounds) { + map.fitBounds(bounds, { + padding: [80, 80], + maxZoom: 14, + animate: true, + duration: 0.8, + }); } - }, [center, map]); + }, [bounds, map]); + return null; } @@ -47,7 +93,8 @@ interface BusRouteMapProps { allRoutes: BusRoute[]; } -const DEFAULT_CENTER: [number, number] = [13.0118, 80.0214]; // RIT Campus default +const RIT_CAMPUS_COORDS: [number, number] = [13.03868, 80.045138]; // True RIT Campus Kuthambakkam / Poonamallee +const DEFAULT_CENTER: [number, number] = RIT_CAMPUS_COORDS; export default function BusRouteMap({ selectedRoute }: BusRouteMapProps) { const [allLiveLocations, setAllLiveLocations] = useState< @@ -100,36 +147,52 @@ export default function BusRouteMap({ selectedRoute }: BusRouteMapProps) { return () => clearInterval(interval); }, []); - // Determine center focus point if a bus is live or selected - const activeFocusCenter = useMemo<[number, number] | null>(() => { + // Compute Start and Destination coordinates only + const routeData = useMemo(() => { if (!selectedRoute) return null; - const normalizeRouteNum = (str: string) => (str || '').replace(/^[Rr]0*/, '').trim().toUpperCase(); - const matchLocKey = Object.keys(allLiveLocations).find( - (k) => normalizeRouteNum(k) === normalizeRouteNum(selectedRoute.number) - ); - - if (matchLocKey && allLiveLocations[matchLocKey]) { - const loc = allLiveLocations[matchLocKey]; - return [loc.latitude, loc.longitude]; - } + // Start coordinates + let startCoords: [number, number] | null = null; + let startName = selectedRoute.from || 'Start Point'; if (selectedRoute.from_lat && selectedRoute.from_lng) { - return [selectedRoute.from_lat, selectedRoute.from_lng]; + startCoords = [selectedRoute.from_lat, selectedRoute.from_lng]; + } else if (selectedRoute.stops && selectedRoute.stops.length > 0) { + const firstStop = selectedRoute.stops[0]; + if (firstStop.lat && firstStop.lng) { + startCoords = [firstStop.lat, firstStop.lng]; + startName = firstStop.name || startName; + } } - return DEFAULT_CENTER; - }, [selectedRoute, allLiveLocations]); + // Destination is ALWAYS the true RIT Campus location (Kuthambakkam) + const destCoords: [number, number] = RIT_CAMPUS_COORDS; + const destName = 'RIT Campus'; + + // Compute bounding box for map view auto-fit (start & destination only) + const allPoints: [number, number][] = []; + if (startCoords) allPoints.push(startCoords); + if (destCoords) allPoints.push(destCoords); + + const bounds: L.LatLngBoundsExpression | null = + allPoints.length > 0 ? (allPoints as L.LatLngBoundsExpression) : null; + + return { + startCoords, + startName, + destCoords, + destName, + bounds, + }; + }, [selectedRoute]); return (
@@ -138,7 +201,52 @@ export default function BusRouteMap({ selectedRoute }: BusRouteMapProps) { url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> - {/* Live GPS Bus Markers ONLY - No polyline routes */} + {/* ── SELECTED ROUTE MARKERS (Starting Point & RIT Campus Destination ONLY) ── */} + {selectedRoute && routeData && ( + <> + {/* START Point Marker */} + {routeData.startCoords && ( + + +
+ + 📍 ORIGIN / PICKUP + +

{routeData.startName}

+

+ Departure: {selectedRoute.departureTime || 'Early Morning'} +

+
+
+
+ )} + + {/* DESTINATION Point Marker (RIT Campus) */} + {routeData.destCoords && ( + + +
+ + 🏫 DESTINATION + +

{routeData.destName}

+

+ Arrival: {selectedRoute.arrivalTime || '08:30 AM'} +

+
+
+
+ )} + + )} + + {/* ── LIVE GPS BUS TRACKING MARKERS ── */} {Object.entries(allLiveLocations).map(([rNum, loc]) => { const normalizeRouteNum = (str: string) => (str || '').replace(/^[Rr]0*/, '').trim().toUpperCase(); if (selectedRoute && normalizeRouteNum(selectedRoute.number) !== normalizeRouteNum(rNum)) return null; @@ -174,7 +282,8 @@ export default function BusRouteMap({ selectedRoute }: BusRouteMapProps) { ); })} - + {/* Auto fit map bounds when selected route changes */} +
{/* Floating Info Card on Selected Route */} @@ -183,21 +292,21 @@ export default function BusRouteMap({ selectedRoute }: BusRouteMapProps) {
{selectedRoute.number} {selectedRoute.name}
-

- 🏁 Start: {selectedRoute.from} ({selectedRoute.departureTime}) +

+ 📍 Start: {selectedRoute.from} ({selectedRoute.departureTime})

-

- 🏫 Destination: RIT Campus ({selectedRoute.arrivalTime}) +

+ 🏫 Destination: RIT Campus ({selectedRoute.arrivalTime})

-

- 📍 Stops: {selectedRoute.stops.length} mapped stops +

+ 📍 {selectedRoute.stops.length} mapped stops along route

diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index a27b419..a2f90bd 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -58,32 +58,32 @@ export default function Navbar() { initial={{ y: -100, opacity: 0 }} animate={{ y: 0, opacity: 1 }} transition={{ duration: 0.6, ease: 'easeOut' }} - className="fixed top-4 left-1/2 -translate-x-1/2 z-50 w-[95%] max-w-6xl transition-all duration-300 shadow-[0_8px_32px_rgba(0,0,0,0.25)]" + className="fixed top-4 left-1/2 -translate-x-1/2 z-50 w-[96%] max-w-7xl transition-all duration-300 shadow-[0_8px_32px_rgba(0,0,0,0.3)]" style={{ - background: 'linear-gradient(to right, rgba(15, 23, 42, 0.45) 0%, rgba(30, 41, 59, 0.35) 50%, rgba(15, 23, 42, 0.45) 100%)', + background: 'linear-gradient(to right, rgba(15, 23, 42, 0.75) 0%, rgba(30, 41, 59, 0.65) 50%, rgba(15, 23, 42, 0.75) 100%)', backdropFilter: 'blur(16px)', WebkitBackdropFilter: 'blur(16px)', borderRadius: '20px', - border: '1px solid rgba(255, 255, 255, 0.1)', + border: '1px solid rgba(255, 255, 255, 0.15)', }} > -
+
{/* Logo - RIT Event Hub Style */} - + {/* Logo Image */}
- + rit -
-
+
+
RAJALAKSHMI INSTITUTE OF TECHNOLOGY @@ -92,14 +92,14 @@ export default function Navbar() { {/* Desktop Nav */} -
+
{NAV_LINKS.map((link) => { const isActive = checkIsActive(link.path); return ( {/* Right Side: Auth + Mobile Toggle */} -
+
{/* Auth Section */} {isAuthenticated && user ? (
@@ -140,8 +140,8 @@ export default function Navbar() { {user.name.charAt(0).toUpperCase()}
)} -
- +
+ {user.name.split(' ')[0]} {isVerifiedStudent && ( @@ -150,7 +150,7 @@ export default function Navbar() { )}
- + {/* Profile Dropdown */} @@ -213,10 +213,10 @@ export default function Navbar() {
) : ( diff --git a/src/constants/index.ts b/src/constants/index.ts index cccb36c..34f9b46 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -4,7 +4,7 @@ import type { Feature, Stat, BusRoute, Faculty, Event, Club, Question, ToolkitIt export const NAV_LINKS = [ { label: 'Home', path: '/' }, { label: 'Notes', path: '/notes' }, - { label: 'Toolkit', path: '/notes?section=toolkit' }, + { label: 'Toolkit', path: '/toolkit' }, { label: 'Chatbot', path: '/ai-assistant' }, { label: 'Campus Map', path: '/campus' }, { label: 'Bus Routes', path: '/bus-routes' }, @@ -98,6 +98,24 @@ export const FEATURES: Feature[] = [ color: '#06B6D4', bgColor: '#ECFEFF', }, + { + id: 'collab', + icon: 'Code2', + title: 'Dev Collab', + description: 'Connect with peer developers, build campus projects, share repositories, and collaborate.', + path: '/collab', + color: '#6366F1', + bgColor: '#EEF2FF', + }, + { + id: 'leetcode', + icon: 'Trophy', + title: 'LeetCode Leaderboard', + description: 'Track peer coding rankings, solve daily problems, and compete on the campus leaderboard.', + path: '/leetcode', + color: '#F59E0B', + bgColor: '#FEF3C7', + }, ]; // ─── Bus Routes ────────────────────────────────────────────────────────────── diff --git a/src/pages/Campus/Campus.tsx b/src/pages/Campus/Campus.tsx index 4f7ff5d..92c052f 100644 --- a/src/pages/Campus/Campus.tsx +++ b/src/pages/Campus/Campus.tsx @@ -23,8 +23,9 @@ const BLUEPRINT_LEGEND = [ { id: 'a-block', label: 'A Block', color: '#60A5FA', bg: 'bg-blue-50/80', text: 'text-blue-900', border: 'border-blue-200' }, { id: 'b-block', label: 'B Block', color: '#93C5FD', bg: 'bg-blue-50/60', text: 'text-blue-900', border: 'border-blue-200' }, { id: 'c-block', label: 'C Block', color: '#BFDBFE', bg: 'bg-blue-50/40', text: 'text-blue-900', border: 'border-blue-200' }, + { id: 'h-block', label: 'H Block', color: '#C084FC', bg: 'bg-purple-50/80', text: 'text-purple-900', border: 'border-purple-200' }, { id: 'admin', label: 'Admin / Facility', color: '#FDBA74', bg: 'bg-orange-50/80', text: 'text-orange-950', border: 'border-orange-200' }, - { id: 'hostel', label: 'Hostel / Mess', color: '#C084FC', bg: 'bg-purple-50/80', text: 'text-purple-950', border: 'border-purple-200' }, + { id: 'hostel', label: 'Hostel / Mess', color: '#F472B6', bg: 'bg-pink-50/80', text: 'text-pink-950', border: 'border-pink-200' }, { id: 'lab', label: 'Lab / Academic', color: '#FDE047', bg: 'bg-yellow-50/80', text: 'text-yellow-950', border: 'border-yellow-200' }, { id: 'amenity', label: 'Amenity', color: '#BEF264', bg: 'bg-lime-50/80', text: 'text-lime-950', border: 'border-lime-200' }, { id: 'parking', label: 'Parking Area', color: '#94A3B8', bg: 'bg-slate-100/80', text: 'text-slate-900', border: 'border-slate-300' }, @@ -39,15 +40,15 @@ const LOCATION_SPOTS: LocationSpot[] = [ { name: 'Girls Mess', x: 14.5, y: 31.0, category: 'Hostel / Mess', desc: 'Dedicated Dining Hall for Women', area: 'West Wing' }, { name: 'MEC Lab', x: 14.0, y: 39.5, category: 'Lab / Academic', desc: 'Mechanical Engineering Laboratory', area: 'West Wing' }, { name: 'EPL Lab', x: 13.0, y: 47.5, category: 'Lab / Academic', desc: 'Engineering Practices Laboratory', area: 'West Wing' }, - { name: 'Nikola Tesla Block', x: 40.5, y: 36.5, category: 'B Block', desc: 'Main Electrical & Engineering Research Block', area: 'Central Block' }, + { name: 'B Block (Nikola Tesla Block)', x: 40.5, y: 36.5, category: 'B Block', desc: 'Main Electrical & Engineering Research Block', area: 'Central Block' }, { name: 'Astronaut Statue', x: 51.0, y: 23.0, category: 'Amenity', desc: 'Iconic Landmark Monument', area: 'Central Park' }, { name: 'Campus Centre', x: 67.0, y: 23.0, category: 'Admin / Facility', desc: 'Student Activity & Administrative Center', area: 'North East' }, { name: 'Hut', x: 70.0, y: 37.0, category: 'Amenity', desc: 'Student Discussion & Rest Area', area: 'Central East' }, - { name: 'Homi Jehangir Bhabha Block', x: 87.0, y: 24.0, category: 'A Block', desc: 'Science & Physics Research Block', area: 'East Wing' }, - { name: 'Boys Mess', x: 87.0, y: 17.5, category: 'Hostel / Mess', desc: 'Ground Floor Dining Hall for Men (Homi Bhabha Block)', area: 'East Wing' }, - { name: 'Staff Mess', x: 87.0, y: 30.5, category: 'Amenity', desc: 'First Floor Dining Hall for Faculty & Staff (Homi Bhabha Block)', area: 'East Wing' }, + { name: 'H Block (Homi Jehangir Bhabha Block)', x: 87.0, y: 24.0, category: 'H Block', desc: 'Science & Physics Research Block', area: 'East Wing' }, + { name: 'Boys Mess', x: 87.0, y: 17.5, category: 'Hostel / Mess', desc: 'Ground Floor Dining Hall for Men (H Block)', area: 'East Wing' }, + { name: 'Staff Mess', x: 87.0, y: 30.5, category: 'Amenity', desc: 'First Floor Dining Hall for Faculty & Staff (H Block)', area: 'East Wing' }, { name: 'C Block', x: 87.0, y: 38.0, category: 'C Block', desc: 'Labs, Classrooms & Staff Rooms', area: 'East Wing' }, - { name: 'Alan Turing Block', x: 77.0, y: 53.0, category: 'Lab / Academic', desc: 'Computer Science & AI Labs', area: 'East Wing' }, + { name: 'A Block (Alan Turing Block)', x: 77.0, y: 53.0, category: 'A Block', desc: 'Computer Science & AI Labs', area: 'East Wing' }, { name: 'Arcade', x: 35.0, y: 57.0, category: 'Amenity', desc: 'Student Hub & Stores', area: 'Central South' }, { name: 'Green Building', x: 23.0, y: 71.0, category: 'Admin / Facility', desc: 'Eco-Friendly Academic Complex & Library', area: 'South West' }, { name: 'Security Booth', x: 49.0, y: 77.0, category: 'Amenity', desc: 'Main Gate Security Checkpoint', area: 'South Entrance' }, @@ -59,9 +60,9 @@ const LOCATION_SPOTS: LocationSpot[] = [ ]; const CATEGORY_MAP_SPOTS: Record = { - dept: ['Homi Jehangir Bhabha Block', 'Nikola Tesla Block', 'C Block', 'Steve Jobs Block', 'Alan Turing Block', 'Green Building'], + dept: ['A Block (Alan Turing Block)', 'B Block (Nikola Tesla Block)', 'C Block', 'H Block (Homi Jehangir Bhabha Block)', 'Steve Jobs Block', 'Green Building'], library: ['Green Building'], - labs: ['MEC Lab', 'EPL Lab', 'Steve Jobs Block', 'Alan Turing Block', 'Nikola Tesla Block', 'C Block'], + labs: ['MEC Lab', 'EPL Lab', 'A Block (Alan Turing Block)', 'B Block (Nikola Tesla Block)', 'C Block', 'H Block (Homi Jehangir Bhabha Block)', 'Steve Jobs Block'], hostel: ['Girls Hostel', 'Boys Mess'], canteen: ['Canteen', 'Girls Mess', 'Boys Mess', 'Staff Mess', 'Arcade'], auditorium: ['Steve Jobs Block', 'Campus Centre'], @@ -119,6 +120,7 @@ export default function Campus() { if (activeLegend === 'a-block' && spot.category === 'A Block') highlightedSpotNames.add(spot.name); if (activeLegend === 'b-block' && spot.category === 'B Block') highlightedSpotNames.add(spot.name); if (activeLegend === 'c-block' && spot.category === 'C Block') highlightedSpotNames.add(spot.name); + if (activeLegend === 'h-block' && spot.category === 'H Block') highlightedSpotNames.add(spot.name); if (activeLegend === 'admin' && spot.category === 'Admin / Facility') highlightedSpotNames.add(spot.name); if (activeLegend === 'hostel' && spot.category === 'Hostel / Mess') highlightedSpotNames.add(spot.name); if (activeLegend === 'lab' && spot.category === 'Lab / Academic') highlightedSpotNames.add(spot.name); @@ -133,6 +135,7 @@ export default function Campus() { if (activeLegend === 'a-block') return fac.category === 'A Block'; if (activeLegend === 'b-block') return fac.category === 'B Block'; if (activeLegend === 'c-block') return fac.category === 'C Block'; + if (activeLegend === 'h-block') return fac.category === 'H Block'; if (activeLegend === 'admin') return fac.category === 'Admin / Facility'; if (activeLegend === 'hostel') return fac.category === 'Hostel / Mess'; if (activeLegend === 'lab') return fac.category === 'Lab / Academic';