module Main exposing (Model, Msg(..), init, main, subscriptions, update, view, viewLink) import Browser import Browser.Navigation as Nav import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Url import Url.Builder exposing (..) -- MAIN main : Program () Model Msg main = Browser.application { init = init , view = view , update = update , subscriptions = subscriptions , onUrlChange = UrlChanged , onUrlRequest = LinkClicked } -- MODEL type alias Model = { key : Nav.Key , url : Url.Url , n : Int } init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg ) init flags url key = ( Model key url 0, Cmd.none ) -- UPDATE type Msg = LinkClicked Browser.UrlRequest | UrlChanged Url.Url | Goto Url.Url update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of LinkClicked urlRequest -> case urlRequest of Browser.Internal url -> ( model, Nav.pushUrl model.key (Url.toString url) ) Browser.External href -> ( model, Nav.load href ) UrlChanged url -> ( { model | url = url, n = model.n + 1 } , Cmd.none ) Goto url -> ( { model | url = url, n = model.n + 1 } , Nav.pushUrl model.key <| Url.toString url ) -- SUBSCRIPTIONS subscriptions : Model -> Sub Msg subscriptions _ = Sub.none -- VIEW view : Model -> Browser.Document Msg view model = let oldUrl = model.url newUrl = { oldUrl | path = "/foo" } in { title = "URL Interceptor" , body = [ text <| "N = " ++ String.fromInt model.n ++ "; The current URL is: " , b [] [ text (Url.toString model.url) ] , ul [] [ viewLink "/home" , viewLink "/profile" , viewLink "/reviews/the-century-of-the-self" , viewLink "/reviews/public-opinion" , viewLink "/reviews/shah-of-shahs" ] , div [ onClick <| Goto newUrl ] [ text "/foo" ] ] } viewLink : String -> Html msg viewLink path = li [] [ a [ href path ] [ text path ] ]