github.com/simpleiot/simpleiot@v0.18.3/frontend/src/Main.elm (about) 1 module Main exposing (Model, Msg, main) 2 3 import Browser 4 import Browser.Navigation as Nav exposing (Key) 5 import Effect 6 import Gen.Model 7 import Gen.Pages as Pages 8 import Gen.Route as Route 9 import Request 10 import Shared 11 import Url exposing (Url) 12 import View 13 14 15 main : Program Shared.Flags Model Msg 16 main = 17 Browser.application 18 { init = init 19 , update = update 20 , view = view 21 , subscriptions = subscriptions 22 , onUrlChange = ChangedUrl 23 , onUrlRequest = ClickedLink 24 } 25 26 27 28 -- INIT 29 30 31 type alias Model = 32 { url : Url 33 , key : Key 34 , shared : Shared.Model 35 , page : Pages.Model 36 } 37 38 39 init : Shared.Flags -> Url -> Key -> ( Model, Cmd Msg ) 40 init flags url key = 41 let 42 ( shared, sharedCmd ) = 43 Shared.init (Request.create () url key) flags 44 45 ( page, effect ) = 46 Pages.init (Route.fromUrl url) shared url key 47 in 48 ( Model url key shared page 49 , Cmd.batch 50 [ Cmd.map Shared sharedCmd 51 , Effect.toCmd ( Shared, Page ) effect 52 ] 53 ) 54 55 56 57 -- UPDATE 58 59 60 type Msg 61 = ChangedUrl Url 62 | ClickedLink Browser.UrlRequest 63 | Shared Shared.Msg 64 | Page Pages.Msg 65 66 67 update : Msg -> Model -> ( Model, Cmd Msg ) 68 update msg model = 69 case msg of 70 ClickedLink (Browser.Internal url) -> 71 ( model 72 , Nav.pushUrl model.key (Url.toString url) 73 ) 74 75 ClickedLink (Browser.External url) -> 76 ( model 77 , Nav.load url 78 ) 79 80 ChangedUrl url -> 81 if url.path /= model.url.path then 82 let 83 ( page, effect ) = 84 Pages.init (Route.fromUrl url) model.shared url model.key 85 in 86 ( { model | url = url, page = page } 87 , Effect.toCmd ( Shared, Page ) effect 88 ) 89 90 else 91 ( { model | url = url }, Cmd.none ) 92 93 Shared sharedMsg -> 94 let 95 ( shared, sharedCmd ) = 96 Shared.update (Request.create () model.url model.key) sharedMsg model.shared 97 98 ( page, effect ) = 99 Pages.init (Route.fromUrl model.url) shared model.url model.key 100 in 101 if page == Gen.Model.Redirecting_ then 102 ( { model | shared = shared, page = page } 103 , Cmd.batch 104 [ Cmd.map Shared sharedCmd 105 , Effect.toCmd ( Shared, Page ) effect 106 ] 107 ) 108 109 else 110 ( { model | shared = shared } 111 , Cmd.map Shared sharedCmd 112 ) 113 114 Page pageMsg -> 115 let 116 ( page, effect ) = 117 Pages.update pageMsg model.page model.shared model.url model.key 118 in 119 ( { model | page = page } 120 , Effect.toCmd ( Shared, Page ) effect 121 ) 122 123 124 125 -- VIEW 126 127 128 view : Model -> Browser.Document Msg 129 view model = 130 Pages.view model.page model.shared model.url model.key 131 |> View.map Page 132 |> View.toBrowserDocument 133 134 135 136 -- SUBSCRIPTIONS 137 138 139 subscriptions : Model -> Sub Msg 140 subscriptions model = 141 Sub.batch 142 [ Pages.subscriptions model.page model.shared model.url model.key |> Sub.map Page 143 , Shared.subscriptions (Request.create () model.url model.key) model.shared |> Sub.map Shared 144 ]