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          ]