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 ]