Skip to content

shinyorg/wonderland

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

81 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Canada's Wonderland Ride Times

This app does serve a functional purpose in that it shows available ride times to Canada's Wonderland This data is pulled from ThemeParks WIKI

This app works offline without issue.

Technology

This app uses several .NET open source technologies from Shiny

The HTTP API to themeparks wiki is generated using Shiny Mediators OpenAPI source generator. Look in the csproj for the following

<ItemGroup>
    <MediatorHttp Include="OpenApiRemote"
                  Uri="https://api.themeparks.wiki/docs/v1.yaml"
                  Namespace="ShinyWonderland.ThemeParksApi"
                  ContractPostfix="HttpRequest"
                  Visible="false" />
</ItemGroup>

APP FEATURES

  • Decent AI Generated .NET MAUI pure control set with light & dark modes
  • Show ride times (including paid times if available) for Canada's Wonderland whether you are inside the park or now
  • Ability to filter out closed rides, & rides that don't have an estimated time
  • Smart & Cross Session Persistent Cache for those time your phone goes offline
  • Basic parking locator
  • Park Hours of Operation
  • Geofence notification reminder for entering to remind user to open app (so GPS is enabled) and to set parking area
  • GPS based notifications while in the park notifying you if ride times have been reduced - GPS shuts off once outside of park
  • Easy example of a navigation service based on Shell without ViewModel lifecycle Shiny MAUI Shell

KNOWN ISSUES

  • Android maps not setup - users need to setup their own keys and stuff
  • Theme park API returns data even park is closed
  • Distance - Sorting and Display (WIP)

FEATURE IDEAS

  • Peak times - requires server
    • Need weather at current time request
  • Wonderland Map
  • Restaurant Points with Menu & Prices
    • This data does not come back
    • Could do manual pins?
  • Drink & Food Pass Timers

FAQ

Can I run this for my own local

Yessir - open themepark.http and run "ALL PARKS" endpoint. Find your park (if available), copy/paste the entityID and location into the appsettings.json. VOILA

Why broadcast GPS, connectivity, & data refreshes through Mediator

Mediator doesn't need to hook events and then clean them up. Everything is managed with almost zero code

Why use mediator for data calls?

Mediator can cache data with nothing more than configuration in appsettings.json. No layers, no DI hell... just a contract and a single service

What is the purpose of CoreServices? This is over complicated dependency injection stuff!

Is it? Those services are used in pretty much every major class in the app. This helps alleviate the pain of injecting a TON of services in every constructor

SCREENSHOTS

It isn't super pretty, but AI built it. This is about functionality and making shiny code!

image1 image2 image3 image4

About

A great example of mediator plus a background Shiny job

Resources

Stars

Watchers

Forks

Languages