@@ -11,7 +11,7 @@
11{-# LANGUAGE TypeFamilies #-}
11{-# LANGUAGE TypeFamilies #-}
12{-# LANGUAGE UndecidableInstances #-}
12{-# LANGUAGE UndecidableInstances #-}
14−module Reflex.Dom.NestedRoute where
14+module Reflex.Dom.Routing.Nested where
16import Control.Lens (Rewrapped, Wrapped (..), iso, to,
16import Control.Lens (Rewrapped, Wrapped (..), iso, to,
@@ -32,7 +32,6 @@ import Data.Maybe (listToMaybe)
32import Data.Text (Text)
32import Data.Text (Text)
33import qualified Data.Text as T
33import qualified Data.Text as T
34import Data.Text.Encoding (decodeUtf8, encodeUtf8)
34import Data.Text.Encoding (decodeUtf8, encodeUtf8)
35−import Foreign.JavaScript.TH
36import Language.Javascript.JSaddle (MonadJSM)
35import Language.Javascript.JSaddle (MonadJSM)
37import Reflex
36import Reflex
38import Reflex.Dom.Builder.Class
37import Reflex.Dom.Builder.Class
@@ -114,6 +113,8 @@ instance (DomBuilder t m, MonadHold t m, MonadFix m) => DomBuilder t (RouteT t s
114 placeRawElement = lift . placeRawElement
113 placeRawElement = lift . placeRawElement
115 wrapRawElement e = lift . wrapRawElement e
114 wrapRawElement e = lift . wrapRawElement e
116+instance (Monad m, NotReady t m) => NotReady t (RouteT t segment m)
117instance MonadReader r m => MonadReader r (RouteT t segment m) where
118instance MonadReader r m => MonadReader r (RouteT t segment m) where
118 ask = lift ask
119 ask = lift ask
119 local f (RouteT a) = RouteT $ mapReaderT (local f) a
120 local f (RouteT a) = RouteT $ mapReaderT (local f) a
@@ -127,14 +128,25 @@ instance HasRoute t segment m => HasRoute t segment (EventWriterT t w m) where
127instance EventWriter t w m => EventWriter t w (RouteT t segment m) where
128instance EventWriter t w m => EventWriter t w (RouteT t segment m) where
128 tellEvent = lift . tellEvent
129 tellEvent = lift . tellEvent
131+instance HasRoute t segment m => HasRoute t segment (DynamicWriterT t w m) where
132+ routeContext = lift routeContext
133+ withSegments f (DynamicWriterT a) = DynamicWriterT $ StrictState.mapStateT (withSegments f) a
135+instance DynamicWriter t w m => DynamicWriter t w (RouteT t segment m) where
136+ tellDyn = lift . tellDyn
130instance HasDocument m => HasDocument (RouteT t segment m)
138instance HasDocument m => HasDocument (RouteT t segment m)
131−instance HasJSContext m => HasJSContext (RouteT t segment m) where
139+
132− type JSContextPhantom (RouteT t segment m) = JSContextPhantom m
133− askJSContext = RouteT askJSContext
134#ifndef ghcjs_HOST_OS
140#ifndef ghcjs_HOST_OS
135instance MonadJSM m => MonadJSM (RouteT t segment m)
141instance MonadJSM m => MonadJSM (RouteT t segment m)
144+deriving instance DomRenderHook t m => DomRenderHook t (RouteT t segment m)
146+instance (Prerender t m, Monad m, Reflex t) => Prerender t (RouteT t segment m) where
147+ type Client (RouteT t segment m) = RouteT t segment (Client m)
148+ prerender (RouteT a) (RouteT b) = RouteT $ prerender a b
139instance PrimMonad m => PrimMonad (RouteT t segment m) where
151instance PrimMonad m => PrimMonad (RouteT t segment m) where
140 type PrimState (RouteT t segment m) = PrimState m
152 type PrimState (RouteT t segment m) = PrimState m
@@ -180,8 +192,11 @@ runRouteWithPathInFragment
180 => RouteT t Text m (Event t [Text])
192 => RouteT t Text m (Event t [Text])
182runRouteWithPathInFragment = runRoute
194runRouteWithPathInFragment = runRoute
183− (T.splitOn "/" . T.dropAround (=='/') . fragAsText)
195+ (nullTextToEmptyList . T.splitOn "/" . T.dropAround (=='/') . fragAsText)
184 (\oldUrl -> setFrag oldUrl . T.intercalate "/")
196 (\oldUrl -> setFrag oldUrl . T.intercalate "/")
198+ nullTextToEmptyList [""] = []
199+ nullTextToEmptyList x = x
186-- | Introduces a new "layer" in the nested routing tree. The given function takes
201-- | Introduces a new "layer" in the nested routing tree. The given function takes
187-- the current layer's route segment and builds the DOM for that segment.
202-- the current layer's route segment and builds the DOM for that segment.
@@ -243,9 +258,11 @@ nextRouteSegment = do
243parentRouteSegments :: (MonadHold t m, MonadFix m, HasRoute t segment m, Eq segment) => m (Dynamic t [segment])
258parentRouteSegments :: (MonadHold t m, MonadFix m, HasRoute t segment m, Eq segment) => m (Dynamic t [segment])
244parentRouteSegments = do
259parentRouteSegments = do
245 ctx <- routeContext
260 ctx <- routeContext
247− allSegments <- _routeContext_allSegments ctx
248− pure $ take (_routeContext_currentDepth ctx - 1) allSegments
261+ holdUniqDyn $ take (_routeContext_currentDepth ctx) <$> _routeContext_allSegments ctx
263+-- | Route segments from child layers.
264+childRouteSegments :: (MonadHold t m, MonadFix m, HasRoute t segment m, Eq segment) => m (Dynamic t [segment])
265+childRouteSegments = holdUniqDyn =<< _routeContext_nextSegments <$> routeContext
250-- | A simple helper that produces a routing event on 'getPostBuild'.
267-- | A simple helper that produces a routing event on 'getPostBuild'.
251redirectLocally :: (PostBuild t m) => [segment] -> m (Event t [segment])
268redirectLocally :: (PostBuild t m) => [segment] -> m (Event t [segment])