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.
This app uses several .NET open source technologies from Shiny
- Shiny Mediator - Documentation
- Shiny Mobile Libraries - Documentation
- Periodic Background Jobs using Shiny.Jobs
- Background GPS using Shiny.Locations
- Geofencing using Shiny.Locations
- Local Notifications using Shiny.Notifications
- Mobile Centric AppSettings.json for Microsoft.Extensions.Configuration using Shiny.Extensions.Configuration
- Shiny MAUI Shell Extensions using Shiny.Maui.Shell - Shell navigation made pleasant
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>
- 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
- 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)
- 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
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
It isn't super pretty, but AI built it. This is about functionality and making shiny code!