diff --git a/src/Blog.elm b/src/Blog.elm index d3db20e..a3672f5 100644 --- a/src/Blog.elm +++ b/src/Blog.elm @@ -1,9 +1,11 @@ port module Blog exposing (..) import Base exposing (urlPrefix) +import Browser.Dom as Dom import Html exposing (..) import Html.Attributes exposing (class, href, id, style) import Http exposing (Error(..)) +import Task import Url exposing (Protocol(..)) import Yaml.Decode as Yaml exposing (Decoder, field, list, string) @@ -46,6 +48,9 @@ initialModel = port sendString : String -> Cmd msg +port isRenderComplete : (Bool -> msg) -> Sub msg + + view : Model -> Html Msg view model = div [ class "foo-interface" ] @@ -123,9 +128,17 @@ viewMetadata show = ] +scrollOnFragment : String -> Cmd Msg +scrollOnFragment fragment = + Task.attempt ScrollAttempted + (Dom.getElement fragment |> Task.andThen (\info -> Dom.setViewport 0 info.element.y)) + + type Msg = GetMarkdown | DataReceived (Result Http.Error String) + | ScrollToFragment Bool Bool + | ScrollAttempted (Result Dom.Error ()) | NoSuchPage @@ -208,9 +221,15 @@ update msg model = DataReceived (Err _) -> ( { model | success = False }, Cmd.none ) + ScrollToFragment _ _ -> + ( model, scrollOnFragment model.fragment ) + NoSuchPage -> ( { model | success = False }, Cmd.none ) + ScrollAttempted _ -> + ( model, Cmd.none ) + errorToString : Http.Error -> String errorToString error = @@ -237,6 +256,18 @@ errorToString error = errorMessage +subscriptions : Model -> Sub Msg +subscriptions model = + isRenderComplete + (ScrollToFragment <| + if model.fragment == "" then + False + + else + True + ) + + -- main : Program (String, String) Model Msg -- main = diff --git a/src/Main.elm b/src/Main.elm index d1791d3..58ca13d 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -283,6 +283,17 @@ updateUrl model = |> toSplash model +subscriptions : Model -> Sub Msg +subscriptions model = + case model.page of + BlogPage blogModel -> + Blog.subscriptions blogModel + |> Sub.map GotBlogMsg + + _ -> + Sub.none + + -- ENTRYPOINT @@ -293,7 +304,7 @@ main = { init = init , view = view , update = update - , subscriptions = \_ -> Sub.none + , subscriptions = subscriptions , onUrlChange = ChangeUrl , onUrlRequest = ClickedLink }