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

     1  port module Message.Subscription exposing
     2      ( Delivery(..)
     3      , Interval(..)
     4      , RawHttpResponse(..)
     5      , Subscription(..)
     6      , decodeHttpResponse
     7      , runSubscription
     8      )
     9  
    10  import Browser
    11  import Browser.Events
    12      exposing
    13          ( onClick
    14          , onKeyDown
    15          , onKeyUp
    16          , onMouseMove
    17          , onMouseUp
    18          , onResize
    19          )
    20  import Build.StepTree.Models exposing (BuildEventEnvelope)
    21  import Concourse exposing (DatabaseID, decodeJob, decodePipeline, decodeTeam)
    22  import Concourse.BuildEvents exposing (decodeBuildEventEnvelope)
    23  import Json.Decode
    24  import Json.Encode
    25  import Keyboard
    26  import Message.Storage as Storage
    27      exposing
    28          ( favoritedPipelinesKey
    29          , jobsKey
    30          , pipelinesKey
    31          , receivedFromLocalStorage
    32          , receivedFromSessionStorage
    33          , sideBarStateKey
    34          , teamsKey
    35          , tokenKey
    36          )
    37  import Routes
    38  import Set exposing (Set)
    39  import SideBar.State exposing (SideBarState, decodeSideBarState)
    40  import Time
    41  import Url
    42  
    43  
    44  port newUrl : (String -> msg) -> Sub msg
    45  
    46  
    47  port eventSource : (Json.Encode.Value -> msg) -> Sub msg
    48  
    49  
    50  port reportIsVisible : (( String, Bool ) -> msg) -> Sub msg
    51  
    52  
    53  port rawHttpResponse : (String -> msg) -> Sub msg
    54  
    55  
    56  port scrolledToId : (( String, String ) -> msg) -> Sub msg
    57  
    58  
    59  type alias Position =
    60      { x : Float
    61      , y : Float
    62      }
    63  
    64  
    65  type alias DatabaseID =
    66      Int
    67  
    68  
    69  type RawHttpResponse
    70      = Success
    71      | Timeout
    72      | NetworkError
    73      | BrowserError
    74  
    75  
    76  type Subscription
    77      = OnClockTick Interval
    78      | OnMouse
    79      | OnMouseUp
    80      | OnKeyDown
    81      | OnKeyUp
    82      | OnWindowResize
    83      | FromEventSource ( String, List String )
    84      | OnNonHrefLinkClicked
    85      | OnElementVisible
    86      | OnTokenSentToFly
    87      | OnTokenReceived
    88      | OnSideBarStateReceived
    89      | OnCachedJobsReceived
    90      | OnCachedPipelinesReceived
    91      | OnCachedTeamsReceived
    92      | OnFavoritedPipelinesReceived
    93      | OnScrolledToId
    94  
    95  
    96  type Delivery
    97      = KeyDown Keyboard.KeyEvent
    98      | KeyUp Keyboard.KeyEvent
    99      | Moused Position
   100      | MouseUp
   101      | ClockTicked Interval Time.Posix
   102      | WindowResized Float Float
   103      | NonHrefLinkClicked String -- must be a String because we can't parse it out too easily :(
   104      | EventsReceived (Result Json.Decode.Error (List BuildEventEnvelope))
   105      | RouteChanged Routes.Route
   106      | UrlRequest Browser.UrlRequest
   107      | ElementVisible ( String, Bool )
   108      | TokenSentToFly RawHttpResponse
   109      | TokenReceived (Result Json.Decode.Error String)
   110      | SideBarStateReceived (Result Json.Decode.Error SideBarState)
   111      | CachedJobsReceived (Result Json.Decode.Error (List Concourse.Job))
   112      | CachedPipelinesReceived (Result Json.Decode.Error (List Concourse.Pipeline))
   113      | CachedTeamsReceived (Result Json.Decode.Error (List Concourse.Team))
   114      | FavoritedPipelinesReceived (Result Json.Decode.Error (Set DatabaseID))
   115      | ScrolledToId ( String, String )
   116      | Noop
   117  
   118  
   119  type Interval
   120      = OneSecond
   121      | FiveSeconds
   122      | OneMinute
   123  
   124  
   125  runSubscription : Subscription -> Sub Delivery
   126  runSubscription s =
   127      case s of
   128          OnClockTick t ->
   129              Time.every (intervalToTime t) (ClockTicked t)
   130  
   131          OnMouse ->
   132              Sub.batch
   133                  [ onMouseMove (Json.Decode.map Moused decodePosition)
   134                  , onClick (Json.Decode.map Moused decodePosition)
   135                  ]
   136  
   137          OnMouseUp ->
   138              onMouseUp <| Json.Decode.succeed MouseUp
   139  
   140          OnKeyDown ->
   141              onKeyDown (Keyboard.decodeKeyEvent |> Json.Decode.map KeyDown)
   142  
   143          OnKeyUp ->
   144              onKeyUp (Keyboard.decodeKeyEvent |> Json.Decode.map KeyUp)
   145  
   146          OnWindowResize ->
   147              onResize
   148                  (\width height -> WindowResized (toFloat width) (toFloat height))
   149  
   150          FromEventSource _ ->
   151              eventSource
   152                  (Json.Decode.decodeValue
   153                      (Json.Decode.list decodeBuildEventEnvelope)
   154                      >> EventsReceived
   155                  )
   156  
   157          OnNonHrefLinkClicked ->
   158              newUrl
   159                  (\path ->
   160                      let
   161                          url =
   162                              { protocol = Url.Http
   163                              , host = ""
   164                              , port_ = Nothing
   165                              , path = path
   166                              , query = Nothing
   167                              , fragment = Nothing
   168                              }
   169                      in
   170                      case Routes.parsePath url of
   171                          Just _ ->
   172                              UrlRequest <| Browser.Internal url
   173  
   174                          Nothing ->
   175                              UrlRequest <| Browser.External path
   176                  )
   177  
   178          OnTokenReceived ->
   179              receivedFromLocalStorage <|
   180                  decodeStorageResponse tokenKey
   181                      Json.Decode.string
   182                      TokenReceived
   183  
   184          OnSideBarStateReceived ->
   185              receivedFromSessionStorage <|
   186                  decodeStorageResponse sideBarStateKey
   187                      decodeSideBarState
   188                      SideBarStateReceived
   189  
   190          OnCachedJobsReceived ->
   191              receivedFromLocalStorage <|
   192                  decodeStorageResponse jobsKey
   193                      (Json.Decode.list decodeJob)
   194                      CachedJobsReceived
   195  
   196          OnCachedPipelinesReceived ->
   197              receivedFromLocalStorage <|
   198                  decodeStorageResponse pipelinesKey
   199                      (Json.Decode.list decodePipeline)
   200                      CachedPipelinesReceived
   201  
   202          OnCachedTeamsReceived ->
   203              receivedFromLocalStorage <|
   204                  decodeStorageResponse teamsKey
   205                      (Json.Decode.list decodeTeam)
   206                      CachedTeamsReceived
   207  
   208          OnFavoritedPipelinesReceived ->
   209              receivedFromLocalStorage <|
   210                  decodeStorageResponse favoritedPipelinesKey
   211                      (Json.Decode.list Json.Decode.int |> Json.Decode.map Set.fromList)
   212                      FavoritedPipelinesReceived
   213  
   214          OnElementVisible ->
   215              reportIsVisible ElementVisible
   216  
   217          OnTokenSentToFly ->
   218              rawHttpResponse (decodeHttpResponse >> TokenSentToFly)
   219  
   220          OnScrolledToId ->
   221              scrolledToId ScrolledToId
   222  
   223  
   224  decodePosition : Json.Decode.Decoder Position
   225  decodePosition =
   226      Json.Decode.map2 Position
   227          (Json.Decode.field "pageX" Json.Decode.float)
   228          (Json.Decode.field "pageY" Json.Decode.float)
   229  
   230  
   231  decodeStorageResponse : Storage.Key -> Json.Decode.Decoder a -> (Result Json.Decode.Error a -> Delivery) -> ( Storage.Key, Storage.Value ) -> Delivery
   232  decodeStorageResponse expectedKey decoder toDelivery ( key, value ) =
   233      if key /= expectedKey then
   234          Noop
   235  
   236      else
   237          value
   238              |> Json.Decode.decodeString decoder
   239              |> toDelivery
   240  
   241  
   242  decodeHttpResponse : String -> RawHttpResponse
   243  decodeHttpResponse value =
   244      case value of
   245          "networkError" ->
   246              NetworkError
   247  
   248          "browserError" ->
   249              BrowserError
   250  
   251          "timeout" ->
   252              Timeout
   253  
   254          _ ->
   255              Success
   256  
   257  
   258  intervalToTime : Interval -> Float
   259  intervalToTime t =
   260      case t of
   261          OneSecond ->
   262              1000
   263  
   264          FiveSeconds ->
   265              5 * 1000
   266  
   267          OneMinute ->
   268              60 * 1000