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