dashboard/src/Route.elm

116 lines
3.2 KiB
Elm
Raw Normal View History

2020-11-23 15:44:45 +03:00
module Route exposing (..)
import Air exposing (callBI, fold, next, par, relayEvent, seq, set)
2020-11-25 22:11:11 +03:00
import Dict
import Html exposing (Html)
import HubPage.View as HubPage
2020-11-23 15:44:45 +03:00
import Json.Encode as Encode
2020-11-23 16:31:31 +03:00
import Model exposing (Model, Route(..))
2020-11-25 22:11:11 +03:00
import ModulePage.View as ModulePage
2020-11-23 15:44:45 +03:00
import Port exposing (sendAir)
import Url.Parser exposing ((</>), Parser, map, oneOf, s, string)
routeParser : Parser (Route -> a) a
routeParser =
oneOf
[ map Peer (s "peer" </> string)
, map Module (s "module" </> string)
, map Service (s "service" </> string)
2020-11-23 15:44:45 +03:00
, map Page string
]
2020-11-23 16:31:31 +03:00
parse url =
Maybe.withDefault (Page "") <| Url.Parser.parse routeParser url
2020-11-25 19:51:53 +03:00
2020-11-25 22:11:11 +03:00
routeView : Model -> Route -> Html msg
routeView model route =
case route of
Page page ->
case page of
2020-11-26 21:47:37 +03:00
"" ->
HubPage.view model
2020-11-30 14:31:03 +03:00
"hub" ->
HubPage.view model
2020-11-25 19:51:53 +03:00
_ ->
Html.text ("undefined page: " ++ page)
Peer peer ->
Html.text peer
2020-11-23 16:31:31 +03:00
Service serviceId ->
Html.text serviceId
Module moduleName ->
let
up =
\( pid, p ) -> Maybe.map (\a -> Tuple.pair pid a) (List.head (List.drop 0 p.services))
el =
List.head (List.drop 2 (Dict.toList model.discoveredPeers))
in
case Maybe.andThen up el of
Just ( peerId, service ) ->
let
example =
{ name = moduleName
, id = service.service_id
, author = "Fluence Labs"
, authorPeerId = peerId
, description = "Cool service"
, website = "https://github.com/fluencelabs/chat"
, service = service
}
in
ModulePage.view example
Nothing ->
Html.text moduleName
2020-11-30 14:31:03 +03:00
getPeers : Model -> Cmd msg
getPeers m =
let
clientId =
set "clientId" <| Encode.string m.peerId
relayId =
set "relayId" <| Encode.string m.relayId
air =
seq
(callBI "relayId" ( "dht", "neighborhood" ) [ "clientId" ] (Just "peers"))
(par
(relayEvent "peers_discovered" [ "relayId", "peers" ])
(fold "peers" "p" <|
par
(seq
(callBI "p" ( "dht", "neighborhood" ) [ "clientId" ] (Just "morePeers"))
(relayEvent "peers_discovered" [ "p", "morePeers" ])
)
(next "p")
)
)
in
sendAir (relayId <| clientId <| air)
2020-11-25 19:51:53 +03:00
2020-11-30 14:31:03 +03:00
2020-11-23 15:44:45 +03:00
routeCommand : Model -> Route -> Cmd msg
routeCommand m r =
case r of
Page s ->
getPeers m
2020-11-23 15:44:45 +03:00
Peer _ ->
getPeers m
Service string ->
getPeers m
Module string ->
getPeers m