@@ -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
6362import Language.Javascript.JSaddle (MonadJSM , jsNull )
6463import Reflex.Dom.Core
6564import 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 (.. ))
6966import 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
7367import Network.URI
7468import 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 ()
187181routePkgIdxTs 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+
192204createRoutePackage :: PkgN -> Set PkgIdxTs -> PkgIdxTs -> Maybe FragRoute
193205createRoutePackage _ _ (PkgIdxTs 0 ) = Nothing
194206createRoutePackage (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 ()
203215runRouteViewT 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-
264237switchRoutingState :: (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
278251switchPkgRoute :: Maybe FragRoute -> FragRoute -> FragRoute
279252switchPkgRoute newFrag oldFrag = fromMaybe oldFrag newFrag
@@ -286,16 +259,9 @@ encodeFrag (RoutePackage (PkgN pkg)) = Just $ "#/package/" <> pkg
286259encodeFrag (RouteUser usr) = Just $ " #/user/" <> usr
287260encodeFrag (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
301267decodeFrag :: 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 ()
322291strictDynWidget_ f r = do
323292 r0 <- sample $ current r
324293 (_, _) <- runWithReplace (f r0) $ f <$> updated r
0 commit comments