Created
March 8, 2020 10:52
-
-
Save edgarfgp/4a76dd43190bcc955c2390f4ba20d45b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| namespace DynamicUI | |
| open Fabulous.XamarinForms.LiveUpdate | |
| open Fabulous | |
| open Fabulous.XamarinForms | |
| open Models | |
| open Xamarin.Forms | |
| module App = | |
| type Msg = | |
| | HomePageMsg of HomePage.Msg | |
| | DetailPageMsg of DetailPage.Msg | |
| | GoToDetailPage of Music | |
| | NavigationPopped | |
| type Model = | |
| { HomePageModel: HomePage.Model | |
| DetailPageModel: DetailPage.Model option | |
| WorkaroundNavPageBug: bool | |
| WorkaroundNavPageBugPendingCmd: Cmd<Msg> } | |
| type Pages = | |
| { HomePage: ViewElement | |
| DetailPage: ViewElement option } | |
| let init () = | |
| let hModel, cmd = HomePage.init | |
| { HomePageModel = hModel | |
| DetailPageModel = None | |
| WorkaroundNavPageBug = false | |
| WorkaroundNavPageBugPendingCmd = Cmd.none }, Cmd.map HomePageMsg cmd | |
| let handleHomeExternalMsg externalMsg = | |
| match externalMsg with | |
| | HomePage.ExternalMsg.NoOp -> | |
| Cmd.none | |
| | HomePage.ExternalMsg.NavigateToDetail music -> | |
| Cmd.ofMsg (GoToDetailPage music) | |
| let navigationMapper model = | |
| let detailModel = model.DetailPageModel | |
| match detailModel with | |
| | None -> | |
| model | |
| | Some _ -> | |
| { model with DetailPageModel = None } | |
| let update msg model = | |
| match msg with | |
| | HomePageMsg msg -> | |
| let hModel, cmd, externalMsg = HomePage.update msg model.HomePageModel | |
| let externalHomeMsg = handleHomeExternalMsg externalMsg | |
| { model with HomePageModel = hModel }, Cmd.batch[ Cmd.map HomePageMsg cmd ; externalHomeMsg] | |
| | DetailPageMsg _ -> | |
| { model with DetailPageModel = None }, Cmd.none | |
| | GoToDetailPage music -> | |
| let dModel = DetailPage.init music | |
| { model with DetailPageModel = Some dModel }, Cmd.none | |
| | NavigationPopped -> | |
| match model.WorkaroundNavPageBug with | |
| | true -> | |
| let newModel = | |
| { model with | |
| WorkaroundNavPageBug = false | |
| WorkaroundNavPageBugPendingCmd = Cmd.none } | |
| newModel, model.WorkaroundNavPageBugPendingCmd | |
| | false -> | |
| navigationMapper model, Cmd.none | |
| let getPages allPages = | |
| let homePage = allPages.HomePage | |
| let detailPage = allPages.DetailPage | |
| match detailPage with | |
| | None -> [ homePage ] | |
| | Some detailPage -> [ homePage ; detailPage ] | |
| let view model dispatch = | |
| let homePage = HomePage.view model.HomePageModel (HomePageMsg >> dispatch) | |
| let detailPage = | |
| model.DetailPageModel |> Option.map (fun dmodel -> DetailPage.view dmodel.Music (DetailPageMsg >> dispatch)) | |
| let allPages = | |
| { HomePage = homePage | |
| DetailPage = detailPage } | |
| View.NavigationPage( | |
| useSafeArea = true, | |
| barTextColor = Color.Azure, | |
| barBackgroundColor = Color.LightBlue, | |
| popped =(fun _ -> dispatch NavigationPopped), | |
| pages = (getPages allPages)) | |
| let program = Program.mkProgram init update view | |
| type App () as app = | |
| inherit Application () | |
| let runner = | |
| App.program | |
| #if DEBUG | |
| |> Program.withConsoleTrace | |
| #endif | |
| |> XamarinFormsProgram.run app | |
| #if DEBUG | |
| do runner.EnableLiveUpdate() | |
| #endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment