github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/web/elm/src/FlySuccess/FlySuccess.elm (about) 1 module FlySuccess.FlySuccess exposing 2 ( documentTitle 3 , handleDelivery 4 , init 5 , subscriptions 6 , tooltip 7 , update 8 , view 9 ) 10 11 import Assets 12 import EffectTransformer exposing (ET) 13 import FlySuccess.Models as Models exposing (ButtonState(..), InputState(..), Model, hover) 14 import FlySuccess.Styles as Styles 15 import FlySuccess.Text as Text 16 import Html exposing (Html) 17 import Html.Attributes exposing (attribute, href, id, style, value) 18 import Html.Events exposing (onClick, onMouseEnter, onMouseLeave) 19 import Login.Login as Login 20 import Message.Callback exposing (Callback(..)) 21 import Message.Effects exposing (Effect(..)) 22 import Message.Message exposing (DomID(..), Message(..)) 23 import Message.Subscription as Subscription 24 exposing 25 ( Delivery(..) 26 , RawHttpResponse(..) 27 , Subscription(..) 28 ) 29 import Message.TopLevelMessage exposing (TopLevelMessage(..)) 30 import Routes 31 import Tooltip 32 import UserState exposing (UserState) 33 import Views.Icon as Icon 34 import Views.Styles 35 import Views.TopBar as TopBar 36 37 38 init : 39 { authToken : String 40 , flyPort : Maybe Int 41 , noop : Bool 42 } 43 -> ( Model, List Effect ) 44 init { authToken, flyPort, noop } = 45 ( { copyTokenButtonState = Unhovered 46 , sendTokenButtonState = Unhovered 47 , copyTokenInputState = InputUnhovered 48 , authToken = authToken 49 , tokenTransfer = 50 case ( noop, flyPort ) of 51 ( False, Just _ ) -> 52 Models.Pending 53 54 ( False, Nothing ) -> 55 Models.NoFlyPort 56 57 ( True, _ ) -> 58 Models.Success 59 , isUserMenuExpanded = False 60 , flyPort = flyPort 61 } 62 , case ( noop, flyPort ) of 63 ( False, Just fp ) -> 64 [ SendTokenToFly authToken fp ] 65 66 _ -> 67 [] 68 ) 69 70 71 handleDelivery : Delivery -> ET Model 72 handleDelivery delivery ( model, effects ) = 73 case delivery of 74 TokenSentToFly Subscription.Success -> 75 ( { model | tokenTransfer = Models.Success }, effects ) 76 77 TokenSentToFly Subscription.NetworkError -> 78 ( { model | tokenTransfer = Models.NetworkTrouble }, effects ) 79 80 TokenSentToFly Subscription.BrowserError -> 81 ( { model | tokenTransfer = Models.BlockedByBrowser }, effects ) 82 83 _ -> 84 ( model, effects ) 85 86 87 update : Message -> ET Model 88 update msg ( model, effects ) = 89 case msg of 90 Hover (Just CopyTokenButton) -> 91 ( { model 92 | copyTokenButtonState = hover True model.copyTokenButtonState 93 } 94 , effects 95 ) 96 97 Hover (Just SendTokenButton) -> 98 ( { model 99 | sendTokenButtonState = hover True model.sendTokenButtonState 100 } 101 , effects 102 ) 103 104 Hover (Just CopyTokenInput) -> 105 ( { model | copyTokenInputState = InputHovered }, effects ) 106 107 Hover Nothing -> 108 ( { model 109 | copyTokenButtonState = hover False model.copyTokenButtonState 110 , sendTokenButtonState = hover False model.sendTokenButtonState 111 , copyTokenInputState = InputUnhovered 112 } 113 , effects 114 ) 115 116 Click CopyTokenButton -> 117 ( { model | copyTokenButtonState = Clicked }, effects ) 118 119 _ -> 120 ( model, effects ) 121 122 123 subscriptions : List Subscription 124 subscriptions = 125 [ OnTokenSentToFly ] 126 127 128 documentTitle : String 129 documentTitle = 130 "Fly Login" 131 132 133 view : UserState -> Model -> Html Message 134 view userState model = 135 Html.div [] 136 [ Html.div 137 (id "page-including-top-bar" :: Views.Styles.pageIncludingTopBar) 138 [ Html.div 139 (id "top-bar-app" :: Views.Styles.topBar False) 140 [ TopBar.concourseLogo 141 , Login.view userState model 142 ] 143 , Html.div 144 (id "page-below-top-bar" 145 :: (Views.Styles.pageBelowTopBar <| 146 Routes.FlySuccess False Nothing 147 ) 148 ) 149 [ Html.div 150 (id "success-card" :: Styles.card) 151 [ Html.p 152 (id "success-card-title" :: Styles.title) 153 [ Html.text Text.title ] 154 , Html.div 155 (id "success-card-body" :: Styles.body) 156 <| 157 body model 158 ] 159 ] 160 ] 161 ] 162 163 164 tooltip : Model -> a -> Maybe Tooltip.Tooltip 165 tooltip _ _ = 166 Nothing 167 168 169 body : Model -> List (Html Message) 170 body model = 171 let 172 p1 = 173 paragraph 174 { identifier = "first-paragraph" 175 , lines = Text.firstParagraph model.tokenTransfer 176 } 177 178 p2 = 179 paragraph 180 { identifier = "second-paragraph" 181 , lines = Text.secondParagraph model.tokenTransfer 182 } 183 in 184 case model.tokenTransfer of 185 Models.Pending -> 186 [ Html.text Text.pending ] 187 188 Models.Success -> 189 [ p1, p2 ] 190 191 Models.NetworkTrouble -> 192 [ p1, tokenTextBox model, copyTokenButton model, p2 ] 193 194 Models.BlockedByBrowser -> 195 [ p1, tokenTextBox model, sendTokenButton model, p2, copyTokenButton model ] 196 197 Models.NoFlyPort -> 198 [ p1, tokenTextBox model, copyTokenButton model, p2 ] 199 200 201 tokenTextBox : Model -> Html Message 202 tokenTextBox { copyTokenInputState, authToken } = 203 Html.label [] 204 [ Html.text Text.copyTokenInput 205 , Html.input 206 ([ id "manual-copy-token" 207 , value authToken 208 , onMouseEnter <| Hover <| Just CopyTokenInput 209 , onMouseLeave <| Hover Nothing 210 ] 211 ++ Styles.input copyTokenInputState 212 ) 213 [] 214 ] 215 216 217 paragraph : { identifier : String, lines : Text.Paragraph } -> Html Message 218 paragraph { identifier, lines } = 219 lines 220 |> List.map Html.text 221 |> List.intersperse (Html.br [] []) 222 |> Html.p (id identifier :: Styles.paragraph) 223 224 225 copyTokenButton : Model -> Html Message 226 copyTokenButton { authToken, copyTokenButtonState } = 227 Html.span 228 ([ id "copy-token" 229 , onMouseEnter <| Hover <| Just CopyTokenButton 230 , onMouseLeave <| Hover Nothing 231 , onClick <| Click CopyTokenButton 232 , attribute "data-clipboard-text" authToken 233 ] 234 ++ Styles.button copyTokenButtonState 235 ) 236 [ Icon.icon 237 { sizePx = 20 238 , image = Assets.ClippyIcon 239 } 240 [ id "copy-icon" 241 , style "margin-right" "5px" 242 ] 243 , Html.text <| Text.copyTokenButton copyTokenButtonState 244 ] 245 246 247 sendTokenButton : Model -> Html Message 248 sendTokenButton { sendTokenButtonState, flyPort, authToken } = 249 Html.a 250 ([ id "send-token" 251 , onMouseEnter <| Hover <| Just SendTokenButton 252 , onMouseLeave <| Hover Nothing 253 , href 254 (Maybe.map (Routes.tokenToFlyRoute authToken) flyPort 255 |> Maybe.withDefault "" 256 ) 257 ] 258 ++ Styles.button sendTokenButtonState 259 ) 260 [ Html.text <| Text.sendTokenButton ]