Skip to content

Commit be95615

Browse files
author
Andika Demas Riyandi
committed
Fixed dyn and cleaning some warning
1 parent 648a954 commit be95615

File tree

2 files changed

+46
-77
lines changed

2 files changed

+46
-77
lines changed

src-ui.v3/src/Main.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ utc2unix x = ceiling (realToFrac (utcTimeToPOSIXSeconds x) :: Double)
110110

111111
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 ()
112112
bodyElement4 = do
113-
_ <- runRouteViewT' app
113+
_ <- runRouteViewT app
114114

115115
--(result, changeStateE) <- runSetRouteT $ app RouteHome
116116
pure ()

src-ui.v3/src/Router.hs

Lines changed: 45 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ module Router
3333
, routeLink
3434
, routePkgIdxTs
3535
, runRouteViewT
36-
, runRouteViewT'
3736
, FragRoute(..), decodeFrag, encodeFrag
3837
) where
3938

@@ -63,13 +62,8 @@ import Reflex.Dom.Builder.Class
6362
import Language.Javascript.JSaddle (MonadJSM, jsNull)
6463
import Reflex.Dom.Core
6564
import qualified GHCJS.DOM as DOM
66-
import qualified GHCJS.DOM.WindowEventHandlers as DOM
67-
import qualified GHCJS.DOM.EventM as DOM
68-
import GHCJS.DOM.Types (History, Window, SerializedScriptValue (..), liftJSM, fromJSVal, toJSVal)
65+
import GHCJS.DOM.Types (SerializedScriptValue (..))
6966
import qualified GHCJS.DOM.Window as Window
70-
import qualified GHCJS.DOM.History as History
71-
import qualified GHCJS.DOM.Location as Location
72-
import qualified GHCJS.DOM.PopStateEvent as PopStateEvent
7367
import Network.URI
7468
import Data.Maybe (Maybe(..), fromMaybe)
7569

@@ -179,27 +173,45 @@ routeLink False r w = do
179173
setRoute $ (switchPkgRoute (Just $ decodeFrag r)) <$ domEvent Click e
180174
return a
181175

182-
routePkgIdxTs :: forall t m. (PostBuild t m, MonadHold t m, MonadFix m, DomBuilder t m, SetRoute t FragRoute m)
176+
routePkgIdxTs :: forall t m. (PerformEvent t m, TriggerEvent t m, MonadJSM m, MonadJSM (Performable m), PostBuild t m, MonadHold t m, MonadFix m, DomBuilder t m, SetRoute t FragRoute m)
183177
=> PkgN
184178
-> Dynamic t (Set PkgIdxTs)
185179
-> Dynamic t PkgIdxTs
186180
-> m ()
187181
routePkgIdxTs pn setIdx ddIdx = do
188182
let evDD = updated $ ffor2 setIdx ddIdx (\sId dVal -> createRoutePackage pn sId dVal)
183+
window <- DOM.currentWindowUnchecked
184+
location <- Window.getLocation window
185+
uri <- getLocationUri location
186+
let
187+
res = (\x -> HistoryStateUpdate
188+
{ _historyStateUpdate_state = SerializedScriptValue jsNull
189+
, _historyStateUpdate_title = ""
190+
, _historyStateUpdate_uri = fromRoutePackage x uri
191+
}) <$> evDD
192+
_ <- manageHistory $ HistoryCommand_PushState <$> res
193+
189194
setRoute $ switchPkgRoute <$> evDD
190195
pure ()
191196

197+
fromRoutePackage :: Maybe FragRoute -> URI -> Maybe URI
198+
fromRoutePackage frag oldUri
199+
| Just fragRoute <- frag
200+
, (RoutePackage txt) <- fragRoute
201+
= Just $ oldUri { uriFragment = T.unpack $ (pkgNToText txt)}
202+
| otherwise = Nothing
203+
192204
createRoutePackage :: PkgN -> Set PkgIdxTs -> PkgIdxTs -> Maybe FragRoute
193205
createRoutePackage _ _ (PkgIdxTs 0) = Nothing
194206
createRoutePackage (PkgN pn) setIdx pkgIdx
195207
| Just maxIdx <- Set.lookupMax setIdx
196208
, True <- maxIdx /= pkgIdx
197-
= Just $ RoutePackage (PkgN $ T.append pn (cons '@' $ idxTsToText pkgIdx))
198-
| otherwise = Just $ RoutePackage (PkgN pn)
209+
= Just $ RoutePackage (PkgN $ "#/package/" <> pn <> "@" <> (idxTsToText pkgIdx))
210+
| otherwise = Just $ RoutePackage (PkgN $ "#/package/" <> pn)
199211

200-
runRouteViewT :: forall t m. (Adjustable t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, MonadJSM m, MonadJSM (Performable m), MonadFix m)
212+
runRouteViewT :: forall t m. (MonadHold t m, MonadSample t m, Adjustable t m, TriggerEvent t m, PerformEvent t m, MonadJSM m, MonadJSM (Performable m), MonadFix m)
201213
=> (FragRoute -> SetRouteT t FragRoute m ())
202-
-> m () --(Dynamic t (Maybe Text))
214+
-> m ()
203215
runRouteViewT app = mdo
204216
historyState <- manageHistory $ HistoryCommand_PushState <$> setState
205217

@@ -209,25 +221,7 @@ runRouteViewT app = mdo
209221
route :: Dynamic t FragRoute
210222
route = decodeFrag . T.pack . uriFragment <$> dynLoc
211223

212-
setState = attachWithMaybe switchRoutingState ( (,) <$> current historyState <*> current route) changeStateE
213-
(result, changeStateE) <- runSetRouteT $ strictDynWidget_ app route
214-
pure result
215-
216-
runRouteViewT' :: forall t m. (MonadJSM m, Adjustable t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, MonadFix m, MonadJSM (Performable m))
217-
=> (FragRoute -> SetRouteT t FragRoute m ())
218-
-> m () --(Dynamic t (Maybe Text))
219-
runRouteViewT' app = mdo
220-
window <- DOM.currentWindowUnchecked
221-
history <- Window.getHistory window
222-
location <- Window.getLocation window
223-
oldUri <- (decodeFrag . T.pack . uriFragment) <$> getLocationUri location
224-
backState <- wrapDomEvent window (`DOM.on` DOM.popState) $ do
225-
e <- DOM.event
226-
jV <- PopStateEvent.getState e
227-
oUri <- liftJSM $ fromJSVal jV
228-
pure $ decodeFrag $ fromMaybe (T.pack "") oUri
229-
setState <- performEvent $ attachWith (switchRoutingState' history) (current route) changeStateE
230-
route <- foldDynMaybe switchFrag oldUri $ setState
224+
setState = fmapMaybe id $ attachWith switchRoutingState ( (,) <$> current historyState <*> current route) changeStateE
231225
(result, changeStateE) <- runSetRouteT $ strictDynWidget_ app route
232226
pure result
233227

@@ -237,43 +231,22 @@ switchFrag newFrag oldFrag
237231
= Nothing
238232
| (RoutePackage _) <- newFrag
239233
, (RoutePackage _) <- oldFrag
240-
= Just newFrag
234+
= Nothing
241235
| otherwise = Just newFrag
242236

243-
{-backRoutingState :: (MonadJSM m) => History -> m FragRoute
244-
backRoutingState hs = wrapDomEvent window (`DOM.on` DOM.popState) $ do
245-
e <- DOM.event
246-
jV <- PopStateEvent.getState e
247-
oUri <- liftJSM $ fromJSVal jV
248-
pure $ decodeFrag $ fromMaybe (T.pack "") oUri
249-
-}
250-
switchRoutingState' :: (MonadJSM m) => History -> FragRoute -> Endo FragRoute -> m FragRoute
251-
switchRoutingState' hs oldR chStateE = do
252-
let newRoute' = appEndo chStateE oldR
253-
newRoute = encodeFrag newRoute'
254-
oldRoute = fromMaybe (T.pack "") $ encodeFrag oldR
255-
histRoute = fromMaybe (T.pack "") $ newRoute
256-
257-
newState <- liftJSM $ toJSVal histRoute
258-
History.pushState hs
259-
(SerializedScriptValue newState)
260-
histRoute
261-
(applyEncoding' oldRoute newRoute)
262-
pure newRoute'
263-
264237
switchRoutingState :: (HistoryItem, FragRoute) -> Endo FragRoute -> Maybe HistoryStateUpdate
265-
switchRoutingState (currentHS, oldR) chStateE = -- chState :: Endo (FragRoute -> FragRoute)
266-
let newR = appEndo chStateE oldR
267-
switchF = switchFrag newR oldR
268-
oldRoute = fromMaybe (T.pack "") $ encodeFrag oldR
269-
270-
in case switchF of
271-
Nothing -> Nothing
272-
Just nR -> Just $ HistoryStateUpdate
273-
{ _historyStateUpdate_state = SerializedScriptValue jsNull
274-
, _historyStateUpdate_title = ""
275-
, _historyStateUpdate_uri = applyEncoding oldRoute nR (_historyItem_uri currentHS)
276-
}
238+
switchRoutingState (currentHS, oldR) chStateE =
239+
let newRoute = appEndo chStateE oldR
240+
in do
241+
newState <- encodeFrag newRoute
242+
oldRoute <- encodeFrag oldR
243+
_ <- switchFrag newRoute oldR
244+
newUri <- applyEncoding oldRoute newState (_historyItem_uri currentHS)
245+
pure $ HistoryStateUpdate
246+
{ _historyStateUpdate_state = SerializedScriptValue jsNull
247+
, _historyStateUpdate_title = ""
248+
, _historyStateUpdate_uri = Just newUri
249+
}
277250

278251
switchPkgRoute :: Maybe FragRoute -> FragRoute -> FragRoute
279252
switchPkgRoute newFrag oldFrag = fromMaybe oldFrag newFrag
@@ -286,16 +259,9 @@ encodeFrag (RoutePackage (PkgN pkg)) = Just $ "#/package/" <> pkg
286259
encodeFrag (RouteUser usr) = Just $ "#/user/" <> usr
287260
encodeFrag (RouteUnknown _) = Nothing
288261

289-
applyEncoding' :: Text -> Maybe Text -> Maybe Text
290-
applyEncoding' _ Nothing = Nothing
291-
applyEncoding' oldR (Just newR)
292-
| oldR /= newR = Just $ newR
293-
| otherwise = Nothing
294-
295-
applyEncoding :: Text -> FragRoute -> URI -> Maybe URI
296-
applyEncoding oldR r u
297-
| Just newR <- encodeFrag r
298-
, oldR /= newR = Just $ u { uriFragment = T.unpack newR }
262+
applyEncoding :: Text -> Text -> URI -> Maybe URI
263+
applyEncoding oldR newR u
264+
| oldR /= newR = Just $ u { uriFragment = T.unpack newR }
299265
| otherwise = Nothing
300266

301267
decodeFrag :: T.Text -> FragRoute
@@ -318,7 +284,10 @@ decodeFrag frag = case frag of
318284

319285
| otherwise -> RouteUnknown frag
320286

321-
strictDynWidget_ :: forall t m. ( MonadSample t m, MonadHold t m, Adjustable t m) => (FragRoute -> m ()) -> Dynamic t FragRoute -> m ()
287+
strictDynWidget_ :: forall t m. ( MonadSample t m, MonadHold t m, Adjustable t m)
288+
=> (FragRoute -> m ())
289+
-> Dynamic t FragRoute
290+
-> m ()
322291
strictDynWidget_ f r = do
323292
r0 <- sample $ current r
324293
(_, _) <- runWithReplace (f r0) $ f <$> updated r

0 commit comments

Comments
 (0)