github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/web/elm/src/Main.elm (about)

     1  module Main exposing (main)
     2  
     3  import Application.Application as Application
     4  import Browser
     5  import Browser.Navigation as Navigation
     6  import Concourse
     7  import Message.Effects as Effects
     8  import Message.Subscription as Subscription
     9  import Message.TopLevelMessage as Msgs
    10  import Url
    11  
    12  
    13  type alias TopLevelModel =
    14      { key : Navigation.Key
    15      , model : Application.Model
    16      }
    17  
    18  
    19  init :
    20      Application.Flags
    21      -> Url.Url
    22      -> Navigation.Key
    23      -> ( TopLevelModel, Cmd Msgs.TopLevelMessage )
    24  init flags url key =
    25      let
    26          ( model, effects ) =
    27              Application.init flags url
    28      in
    29      ( { key = key, model = model }, effects )
    30          |> effectsToCmd
    31  
    32  
    33  update :
    34      Msgs.TopLevelMessage
    35      -> TopLevelModel
    36      -> ( TopLevelModel, Cmd Msgs.TopLevelMessage )
    37  update msg model =
    38      let
    39          ( appModel, effects ) =
    40              Application.update msg model.model
    41      in
    42      ( { model | model = appModel }, effects )
    43          |> effectsToCmd
    44  
    45  
    46  main : Program Application.Flags TopLevelModel Msgs.TopLevelMessage
    47  main =
    48      Browser.application
    49          { init = init
    50          , update = update
    51          , view = view
    52          , subscriptions =
    53              .model
    54                  >> Application.subscriptions
    55                  >> subscriptionsToSub
    56          , onUrlChange = Application.locationMsg
    57          , onUrlRequest = Subscription.UrlRequest >> Msgs.DeliveryReceived
    58          }
    59  
    60  
    61  view : TopLevelModel -> Browser.Document Msgs.TopLevelMessage
    62  view model =
    63      Application.view model.model
    64  
    65  
    66  effectsToCmd :
    67      ( TopLevelModel, List Effects.Effect )
    68      -> ( TopLevelModel, Cmd Msgs.TopLevelMessage )
    69  effectsToCmd ( model, effs ) =
    70      ( model
    71      , List.map (effectToCmd model.model.session.csrfToken model.key) effs |> Cmd.batch
    72      )
    73  
    74  
    75  
    76  -- there's a case to be made that this function should actually
    77  -- accept a Session
    78  
    79  
    80  effectToCmd :
    81      Concourse.CSRFToken
    82      -> Navigation.Key
    83      -> Effects.Effect
    84      -> Cmd Msgs.TopLevelMessage
    85  effectToCmd csrfToken key eff =
    86      Effects.runEffect eff key csrfToken |> Cmd.map Msgs.Callback
    87  
    88  
    89  subscriptionsToSub : List Subscription.Subscription -> Sub Msgs.TopLevelMessage
    90  subscriptionsToSub =
    91      List.map Subscription.runSubscription
    92          >> Sub.batch
    93          >> Sub.map Msgs.DeliveryReceived