Skip to content

Commit 678b801

Browse files
author
Andika Demas Riyandi
committed
Initial Fix
1 parent 5d2554f commit 678b801

File tree

3 files changed

+50
-36
lines changed

3 files changed

+50
-36
lines changed

src-ui.v3/matrix-ui.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ executable matrix-ui
1717
main-is: Main.hs
1818
other-modules: API
1919
, PkgId
20+
, Router
2021

2122
mixins: base hiding (Prelude)
2223

src-ui.v3/src/Main.hs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ import qualified Data.Vector as V
4949
import qualified Data.Version as Ver
5050
import GHC.Generics (Rep)
5151
import qualified GHCJS.DOM.Types as DOM
52+
import qualified GHCJS.DOM.Window as Window
53+
import qualified GHCJS.DOM as DOM
5254
import Language.Javascript.JSaddle (jsNull)
5355
import Network.URI
5456
--import Reflex.Dom
@@ -107,15 +109,13 @@ utc2unix x = ceiling (realToFrac (utcTimeToPOSIXSeconds x) :: Double)
107109

108110
bodyElement4 :: forall t m . (SupportsServantReflex t m, MonadFix m, MonadIO m, MonadHold t m, PostBuild t m, DomBuilder t m, Adjustable t m, DomBuilderSpace m ~ GhcjsDomSpace) => m ()
109111
bodyElement4 = do
110-
--dynLoc <- browserHistoryWith getLocationUri
111-
--let dynFrag = decodeFrag . T.pack . uriFragment <$> dynLoc
112112
_ <- runRouteViewT app
113+
114+
--(result, changeStateE) <- runSetRouteT $ app RouteHome
113115
pure ()
114-
-- ticker1 <- tickLossy 1 =<< liftIO getCurrentTime
115-
-- ticker1cnt <- count ticker1
116116

117117
app :: forall t m. (SetRoute t FragRoute m, SupportsServantReflex t m, MonadFix m, MonadIO m, MonadHold t m, PostBuild t m, DomBuilder t m, Adjustable t m, DomBuilderSpace m ~ GhcjsDomSpace)
118-
=> Dynamic t FragRoute
118+
=> FragRoute -- Dynamic t FragRoute
119119
-> m ()
120120
app dynFrag = do
121121
-- top-level PB event
@@ -156,8 +156,8 @@ app dynFrag = do
156156
_ <- searchBoxWidget dynPackages0
157157
el "hr" blank
158158

159-
_ <- dyn $ dynFrag >>= \case
160-
RouteHome -> pure $ do
159+
_ <- case dynFrag of --dyn $ dynFrag >>= \case
160+
RouteHome -> do
161161
elAttr "div" (("id" =: "page-home") <> ("class" =: "page")) $ do
162162
divClass "leftcol" $ do
163163
elAttr "h2" ("class" =: "main-header") $ text "Welcome"
@@ -205,7 +205,7 @@ app dynFrag = do
205205
text "Cookbook for common build failures"
206206
pure ()
207207

208-
RouteQueue -> pure $ do
208+
RouteQueue -> do
209209
evPB <- getPostBuild
210210

211211
let dynUnixTime = utc2unix <$> dynUTCTime
@@ -320,7 +320,7 @@ app dynFrag = do
320320
pure ()
321321
pure ()
322322

323-
RoutePackages -> pure $ do
323+
RoutePackages -> do
324324
el "h1" $ text "Packages"
325325
evPB <- getPostBuild
326326
evTags<- getTags (constDyn $ QParamSome False) evPB
@@ -330,7 +330,7 @@ app dynFrag = do
330330
let dynPkgTags = pkgTagList <$> dynTagPkgs
331331
packagesPageWidget dynPackages0 dynTags dynPkgTags
332332

333-
RoutePackage (pn, idxSt) -> pure $ do
333+
RoutePackage (pn, idxSt) -> do
334334

335335
el "h2" $ text (pkgNToText pn)
336336
el "p" $ el "em" $ elAttr "a" ("href" =: ("https://hackage.haskell.org/package/" <> pkgNToText pn)) $
@@ -380,8 +380,7 @@ app dynFrag = do
380380
ddReports <- el "p" $ do
381381
evQButton <- button "Queue a build"
382382
text " for the index-state "
383-
uniqReport <- holdUniqDyn dynReports
384-
tmp <- routePkgIdxTs pn (PkgIdxTs 0) uniqReport xs ddCfg
383+
tmp <- routePkgIdxTs pn (PkgIdxTs 0) dynReports xs ddCfg
385384
text " shown below"
386385

387386
_ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value tmp) (constDyn $ Right (QEntryUpd (-1))) evQButton
@@ -434,7 +433,7 @@ app dynFrag = do
434433

435434
pure ()
436435

437-
RouteUser u -> pure $ do
436+
RouteUser u -> do
438437
el "h1" (text u)
439438

440439
evPB <- getPostBuild
@@ -447,7 +446,7 @@ app dynFrag = do
447446

448447
pure ()
449448

450-
RouteUnknown frag -> pure $ do
449+
RouteUnknown frag -> do
451450
el "p" $ text ("No handler found for " <> T.pack (show frag))
452451
pure ()
453452

src-ui.v3/src/Router.hs

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ import Reflex.Dom.Builder.Class
6363
import Language.Javascript.JSaddle
6464
import Reflex.Dom.Core
6565
import qualified GHCJS.DOM.Types as DOM
66+
import qualified GHCJS.DOM.Window as Window
67+
import qualified GHCJS.DOM as DOM
6668
import Network.URI
6769
import Data.Maybe (Maybe(..), fromMaybe)
6870

@@ -187,41 +189,47 @@ routePkgIdxTs pn k0 setIdx opt ddConf = do
187189
pure dd
188190

189191
createRoutePackage :: PkgN -> Set PkgIdxTs -> PkgIdxTs -> Maybe FragRoute
190-
createRoutePackage pn _ (PkgIdxTs 0) = Nothing
192+
createRoutePackage _ _ (PkgIdxTs 0) = Nothing
191193
createRoutePackage pn setIdx pkgIdx
192194
| Just maxIdx <- Set.lookupMax setIdx
193195
, True <- maxIdx /= pkgIdx
194196
= Just $ RoutePackage (pn, Just pkgIdx)
195197
| otherwise = Just $ RoutePackage (pn, Nothing)
196198

197-
runRouteViewT :: forall t m a. (TriggerEvent t m, PerformEvent t m, MonadHold t m, MonadJSM m, MonadJSM (Performable m), MonadFix m)
198-
=> (Dynamic t FragRoute -> SetRouteT t FragRoute m a)
199-
-> m a
199+
switchHistoryItem :: HistoryCommand -> HistoryItem -> HistoryItem
200+
switchHistoryItem hC hI
201+
| (HistoryCommand_PushState su) <- hC
202+
, (Just uri) <- _historyStateUpdate_uri su
203+
= hI { _historyItem_uri = uri }
204+
| otherwise = hI
205+
206+
runRouteViewT :: forall t m. (Adjustable t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, MonadJSM m, MonadJSM (Performable m), MonadFix m)
207+
=> (FragRoute -> SetRouteT t FragRoute m ())
208+
-> m (Dynamic t (Maybe Text))
200209
runRouteViewT app = mdo
201210
historyState <- manageHistory $ HistoryCommand_PushState <$> setState
202-
--dynLoc <- browserHistoryWith getLocationUri
203-
(result, changeStateE) <- runSetRouteT $ app route -- changeStateE :: Event t (Endo (Fragroute -> FragRoute)
211+
204212
let
205213
dynLoc = _historyItem_uri <$> historyState
206214

207215
route :: Dynamic t FragRoute
208216
route = decodeFrag . T.pack . uriFragment <$> dynLoc
209217

210-
f (currentHistoryState, oldR) chStateE = -- chState :: Endo (FragRoute -> FragRoute)
211-
let newRoute = encodeFrag $ appEndo chStateE oldR
212-
--oldRoute = case encodeFrag oldR of
213-
-- (Just a) -> a
214-
-- Nothing -> T.empty
215-
in do
216-
oldRoute <- encodeFrag oldR
217-
newUri <- applyEncoding oldRoute newRoute (_historyItem_uri currentHistoryState)
218-
pure $ HistoryStateUpdate
219-
{ _historyStateUpdate_state = DOM.SerializedScriptValue jsNull
220-
, _historyStateUpdate_title = ""
221-
, _historyStateUpdate_uri = Just newUri
222-
}
223-
setState = fmapMaybe id $ attachWith f ( (,) <$> current historyState <*> current route) changeStateE
224-
pure result
218+
setState = fmapMaybe id $ attachWith switchRoutingState ( (,) <$> current historyState <*> current route) changeStateE
219+
(result, changeStateE) <- runSetRouteT $ strictDynWidget_ app route
220+
pure (encodeFrag <$> route)
221+
222+
switchRoutingState :: (HistoryItem, FragRoute) -> Endo FragRoute -> Maybe HistoryStateUpdate
223+
switchRoutingState (currentHS, oldR) chStateE = -- chState :: Endo (FragRoute -> FragRoute)
224+
let newRoute = encodeFrag $ appEndo chStateE oldR
225+
in do
226+
oldRoute <- encodeFrag oldR
227+
newUri <- applyEncoding oldRoute newRoute (_historyItem_uri currentHS)
228+
pure $ HistoryStateUpdate
229+
{ _historyStateUpdate_state = DOM.SerializedScriptValue jsNull
230+
, _historyStateUpdate_title = ""
231+
, _historyStateUpdate_uri = Just newUri
232+
}
225233

226234
switchPkgRoute :: Maybe FragRoute -> FragRoute -> FragRoute
227235
switchPkgRoute newFrag oldFrag = fromMaybe oldFrag newFrag
@@ -261,4 +269,10 @@ decodeFrag frag = case frag of
261269
, T.all (\c -> C.isAsciiLower c || C.isAsciiUpper c || C.isDigit c || c == '_') sfx
262270
-> RouteUser sfx
263271

264-
| otherwise -> RouteUnknown frag
272+
| otherwise -> RouteUnknown frag
273+
274+
strictDynWidget_ :: forall t m. ( MonadSample t m, MonadHold t m, Adjustable t m) => (FragRoute -> m ()) -> Dynamic t FragRoute -> m ()
275+
strictDynWidget_ f r = do
276+
r0 <- sample $ current r
277+
(_, _) <- runWithReplace (f r0) $ f <$> updated r
278+
pure ()

0 commit comments

Comments
 (0)