Compare commits

..
3 Commits
Author SHA1 Message Date
cjdenio 736b47f9f8 better json 2026-07-05 16:54:49 -06:00
cjdenio 2e2fa0c597 bump 2026-07-05 16:30:33 -06:00
cjdenio 31cd41d2a9 nav 2026-07-05 16:30:09 -06:00
3 changed files with 68 additions and 29 deletions

No files matched your search

+28 -23
View File
@@ -21,12 +21,12 @@ import (
var scheduleDb *sql.DB var scheduleDb *sql.DB
var headsignMappings map[string]string = map[string]string{ var headsignMappings map[string]string = map[string]string{
"to medical": "To University Medical", "to medical": "To University Medical",
"to airport": "To Airport", "to airport": "To Airport",
"to draper": "To Draper", "to draper": "To Draper",
"to salt lake": "To Salt Lake Central", "to salt lake": "To Salt Lake Central",
"to meadowbrook": "To Meadowbrook", "to meadowbrook": "To Meadowbrook",
"to ballpark": "To Ballpark", "to ballpark": "To Ballpark",
} }
func distance(lat1 float64, lng1 float64, lat2 float64, lng2 float64) float64 { func distance(lat1 float64, lng1 float64, lat2 float64, lng2 float64) float64 {
@@ -207,23 +207,8 @@ func feedifyVehicles(vehicles []*pb.VehiclePosition, header *pb.FeedHeader, rout
} }
} }
func main() { func vehicleHandler(mode string) http.HandlerFunc {
fmt.Println("Opening database...") return func(w http.ResponseWriter, r *http.Request) {
_db, err := sql.Open("sqlite3", "uta-gtfs.db")
if err != nil {
log.Fatal(err)
}
scheduleDb = _db
http.Handle("/", http.FileServer(http.Dir("./static")))
http.HandleFunc("/schema.proto", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./proto/schema.proto")
})
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
vehicles, header, err := getVehicles() vehicles, header, err := getVehicles()
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@@ -244,7 +229,7 @@ func main() {
} }
} }
if r.Header.Get("Accept") == "application/json" { if mode == "json" || r.Header.Get("Accept") == "application/json" {
feed := feedifyVehicles(vehicles, header, routeTypeFilter) feed := feedifyVehicles(vehicles, header, routeTypeFilter)
response, err := json.Marshal(&feed) response, err := json.Marshal(&feed)
if err != nil { if err != nil {
@@ -269,8 +254,28 @@ func main() {
w.Header().Add("Content-Length", strconv.Itoa(len(b))) w.Header().Add("Content-Length", strconv.Itoa(len(b)))
w.Write(b) w.Write(b)
} }
}
}
func main() {
fmt.Println("Opening database...")
_db, err := sql.Open("sqlite3", "uta-gtfs.db")
if err != nil {
log.Fatal(err)
}
scheduleDb = _db
http.Handle("/", http.FileServer(http.Dir("./static")))
http.HandleFunc("/schema.proto", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./proto/schema.proto")
}) })
http.HandleFunc("/api", vehicleHandler(""))
http.HandleFunc("/api.json", vehicleHandler("json"))
port := "3000" port := "3000"
if portEnv, ok := os.LookupEnv("PORT"); ok { if portEnv, ok := os.LookupEnv("PORT"); ok {
port = portEnv port = portEnv
+33 -6
View File
@@ -19,7 +19,7 @@
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet">
<style> <style>
.leaflet-marker-icon:has(.vehicle) { body:not(.skip-vehicle-animation) .leaflet-marker-icon:has(.vehicle) {
transition: transform 300ms linear; transition: transform 300ms linear;
} }
@@ -71,6 +71,28 @@
background-image: linear-gradient(to bottom right, #2eb566 33%, #004a97 33%, #004a97 66%, #be2036 66%); background-image: linear-gradient(to bottom right, #2eb566 33%, #004a97 33%, #004a97 66%, #be2036 66%);
} }
.nav {
grid-column: span 2;
background-color: #e5e7eb;
display: flex;
gap: 10px;
box-sizing: border-box;
line-height: 1.5;
}
.nav a {
display: block;
font-size: 30px;
padding: 0 20px;
text-decoration: none;
font-family: sans-serif;
}
.nav__item--selected {
background-color: white;
border-bottom: 3px solid #93c5fd;
}
#banner { #banner {
grid-column: span 2; grid-column: span 2;
background-color: #ef4444; background-color: #ef4444;
@@ -88,7 +110,7 @@
} }
#map, #sidebar { #map, #sidebar {
grid-row: 2 / 3; grid-row: 3 / 4;
} }
#sidebar label { #sidebar label {
@@ -108,7 +130,7 @@
#bottom-bar { #bottom-bar {
display: none; display: none;
grid-row: 3 / 4; grid-row: 4 / 5;
gap: 10px; gap: 10px;
justify-content: center; justify-content: center;
padding: 10px; padding: 10px;
@@ -126,7 +148,7 @@
#container { #container {
display: grid; display: grid;
grid-template-columns: auto 300px; grid-template-columns: auto 300px;
grid-template-rows: auto 1fr; grid-template-rows: auto auto 1fr;
height: 100dvh; height: 100dvh;
} }
@@ -138,7 +160,7 @@
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
#container { #container {
grid-template-columns: 1fr; grid-template-columns: 1fr;
grid-template-rows: auto 1fr auto; grid-template-rows: auto auto 1fr auto;
} }
#sidebar { #sidebar {
display: none; display: none;
@@ -156,6 +178,11 @@
There are currently no vehicles running. Either service has ended for There are currently no vehicles running. Either service has ended for
the day, or UTA's tracker isn't working. Come back later! the day, or UTA's tracker isn't working. Come back later!
</div> </div>
<div class="nav">
<a title="UTA Vehicle Tracker" href="https://uta.clb.li" class="nav__item--selected">🚆</a>
<a title="TRAXcidents" href="https://traxcidents.clb.li">💥</a>
<a title="GreenBike Firehose" href="https://greenbike.clb.li">🚲</a>
</div>
<div id="map"></div> <div id="map"></div>
<div id="bottom-bar"> <div id="bottom-bar">
@@ -273,6 +300,6 @@
</div> </div>
</div> </div>
<script type="module" src="/js/main.js?v=4"></script> <script type="module" src="/js/main.js?v=5"></script>
</body> </body>
</html> </html>
+7
View File
@@ -36,6 +36,13 @@ L.tileLayer(
} }
).addTo(map); ).addTo(map);
map.on("zoomstart", () => {
document.body.classList.add("skip-vehicle-animation")
})
map.on("zoomend", () => {
document.body.classList.remove("skip-vehicle-animation")
})
const busLayer = L.layerGroup().addTo(map); const busLayer = L.layerGroup().addTo(map);
const brtLayer = L.layerGroup().addTo(map); const brtLayer = L.layerGroup().addTo(map);
const traxLayer = L.layerGroup().addTo(map); const traxLayer = L.layerGroup().addTo(map);