git.iko.soy/rowtype-yoga/purescript-docs-search
on master help sign in
Listen for URI hash changes (#27)
commitf5547d1f82e194d9228e689bdc80e3bf6f7f6a72 authorVladimir Kalnitsky <klntsky@gmail.com> dateFri 29 Nov 2019, 15:46 (7 years ago) parent11426cd
2 files changed+20−6
src/Docs/Search/App.purs+15−1 src/Docs/Search/App/SearchField.purs+5−5
src/Docs/Search/App.purs+15−1
@@ -12,6 +12,7 @@ import Control.Coroutine as Coroutine
1212import Data.Maybe (Maybe(..))
1313import Data.Newtype (wrap)
1414import Effect (Effect)
15+import Effect.Aff (launchAff_)
1516import Halogen as H
1617import Halogen.Aff as HA
1718import Halogen.VDom.Driver (runUI)
@@ -21,10 +22,12 @@ import Web.DOM.Element as Element
2122import Web.DOM.Node as Node
2223import Web.DOM.ParentNode as ParentNode
2324import Web.DOM.Text as Text
25+import Web.Event.EventTarget (addEventListener, eventListener)
2426import Web.HTML as HTML
2527import Web.HTML.HTMLDocument as HTMLDocument
2628import Web.HTML.HTMLElement (fromElement)
2729import Web.HTML.Window as Window
30+import Web.HTML.Event.HashChangeEvent.EventTypes (hashchange)
2831
2932main :: Effect Unit
3033main = do
@@ -57,7 +60,18 @@ main = do
5760
5861 -- We need to read the URI hash only when both components are initialized and
5962 -- the search field is subscribed to the main component.
60− sfio.query (SearchField.ReadURIHash unit)
63+ void $ sfio.query $ H.tell SearchField.ReadURIHash
64+
65+ -- Subscribe to URI hash updates
66+ H.liftEffect do
67+
68+ listener <-
69+ eventListener \event ->
70+ launchAff_ do
71+ sfio.query $ H.tell SearchField.ReadURIHash
72+
73+ addEventListener hashchange listener true (Window.toEventTarget win)
74+
6175
6276insertStyle :: Document.Document -> Effect Unit
6377insertStyle doc = do
src/Docs/Search/App/SearchField.purs+5−5
@@ -63,8 +63,11 @@ handleQuery
6363 . Query a
6464 -> H.HalogenM State Action () SearchFieldMessage Aff (Maybe a)
6565handleQuery (ReadURIHash next) = do
66− state <- H.get
67− H.raise (InputUpdated state.input)
66+ oldInput <- H.get <#> _.input
67+ newInput <- H.liftEffect URIHash.getInput
68+ when (oldInput /= newInput) do
69+ H.modify_ (_ { input = newInput })
70+ H.raise (InputUpdated newInput)
6871 pure Nothing
6972
7073initialState :: forall i. i -> State
@@ -75,9 +78,6 @@ handleAction = case _ of
7578
7679 InitKeyboardListener -> do
7780
78− input <- H.liftEffect URIHash.getInput
79− H.modify_ (_ { input = input })
80−
8181 document <- H.liftEffect $ Web.document =<< Web.window
8282 H.subscribe' \sid ->
8383 ES.eventListenerEventSource