import { createBrowserHistory, createMemoryHistory } from 'history' import { Observer, observer } from 'mobx-react-lite' import * as React from 'react' import { XRouter } from '../XRouter' import { XRoute } from '../XRoute' export default { title: 'XRouter Mobx', } const validLanguages = ['en', 'da', 'de'] as const const languageParam = `:language(${validLanguages.join('|')})` type ILanguage = (typeof validLanguages)[number] const FooRoute = XRoute( 'foo', `/${languageParam}/foo`, {} as { pathname: { language: ILanguage } search: { a?: string; b?: { x: string } } hash?: string }, ) const FooBarRoute = XRoute( 'foobar', `/${languageParam}/foobar`, {} as { pathname: { language: ILanguage } search: { a?: string; zzz?: string } }, ) const BazRoute = XRoute( 'baz', `/${languageParam}/baz/:baz`, {} as { pathname: { language: ILanguage; baz: string }; search: {} }, ) const DefaultRoute = XRoute( 'default', '/:language?', {} as { pathname: { language?: ILanguage }; search: {} }, ) export const To_path = () => { const Component = () => { const [router] = React.useState( () => new XRouter([FooRoute, BazRoute, DefaultRoute], createMemoryHistory()), ) return ( ) } return ( <> ) } export const Hash_history = () => { const [router] = React.useState( () => new XRouter( [FooRoute, BazRoute, FooBarRoute, DefaultRoute], createBrowserHistory(), ), ) return ( <> {() => ( <>
ACTIVE ROUTE 333:
                  {JSON.stringify(
                    {
                      search: router.route?.search,
                      pathname: router.route?.pathname,
                      hash: router.route?.hash,
                    },
                    null,
                    2,
                  )}
                
{router.route?.toUri()}
Set Random route params:
)}
) } export const Search_params = observer(() => { const [router] = React.useState( () => new XRouter( [FooRoute, BazRoute, FooBarRoute, DefaultRoute], createMemoryHistory(), ), ) console.log('router.pathname', router.pathname) console.log('router.search', router.search) console.log('router.hash', router.hash) const [search, setSearch] = React.useState({ a: `${Date.now()}`, b: { x: '1' }, }) const { foo: route } = router.routes React.useEffect(() => { route.pushExact((uri) => ({ ...uri, search: { ...uri.search, ...search }, pathname: { ...uri.pathname, language: 'en' }, hash: 'woo', })) }, [search]) console.log('route search', { ...route.search }) return ( <>
toUri()
setSearch({ ...search, a: e.target.value, }) } /> setSearch({ ...search, b: { ...search.b, x: e.target.value, }, }) } />
current route:
{route.search.a}
{route.search.b?.x}
ROUTER:
{JSON.stringify(router, null, 2)}
Exact Route 1:
Exact Route 2:
Exact Route 3:
Add `b` to foo:
Add `a` to foo:
Add `a` to foobar:
Add `zzz` to foobar:
) }) export const Shared_language_params = observer(() => { /** Create the router for the demo with the route list */ const [router] = React.useState( () => new XRouter([FooRoute, BazRoute, DefaultRoute], createMemoryHistory()), ) const activeProps = { style: { color: 'green', outline: '2px solid green' }, } return ( <>
INPUT:
URL Bar:
router.replace(e.target.value)} />
Links:
LANGUAGE:{' '} {router.route?.pathname?.language || 'undefined'}
{validLanguages.map((language) => ( <>
))}
FOO

BAZ

DEFAULT


router.location
pathname: {JSON.stringify(router.pathname)}
search: {JSON.stringify(router.search)}
hash: {JSON.stringify(router.hash)}
router.route
{JSON.stringify(router.route, null, 2)}
router.routes
{JSON.stringify(router.routes, null, 2)}
) }) export const Extends_routes = observer(() => { const AppRoute = XRoute('app').Resource('/').Type<{ pathname: {} // pathname: { x?: 1} search: { foo?: number } }>() const NotFoundRoute = XRoute('notFound').Resource('/:garbage(.*)?').Type<{ pathname: { garbage?: string } search: {} }>() const AdminRoute = XRoute('admin').Resource('/admin').Type<{ pathname: {} search: { language?: 'en' | 'da' } }>() const AdminAnalyticsRoute = AdminRoute.Extend('adminAnalytics') .Resource('/analytics') .Type<{ pathname: { section: 'analytics' } search: {} hash: '#foo' }>() const router = React.useMemo( () => new XRouter( [AdminAnalyticsRoute, AdminRoute, AppRoute, NotFoundRoute], createMemoryHistory(), ), [], ) router.routes.adminAnalytics.hash // #foo router.routes.adminAnalytics.pathname?.section // 'analytics' router.routes.adminAnalytics.search?.language // 'en' | 'da' | undefined return (
URL Bar:
router.replace(e.target.value)} />
toUri:
Actions:
`router`
          {JSON.stringify(
            {
              route: router.route,
              routes: router.routes,
              router,
            },
            null,
            2,
          )}
        
) // // or // const AdminAnalyticsRoute2 = AdminRoute.Extend( // XRoute('adminAnalytics').Resource('/:section(analytics)').Type<{ // pathname: { section: 'analytics' } // search: {} // }>(), // ) // const AdminAnalyticsRoute3 = XRoute('adminAnalytics') // .Resource('/:section(analytics)') // .Type<{ // pathname: { section: 'analytics' } // search: {} // }>() // .ExtendsFrom(AdminRoute) // router.routes.adminAnalytics.resource // /admin/:seciton(analytics) // router.routes.adminAnalytics.search?.language // inherited from admin route // router.routes.adminAnalytics.pathname?.section // 'analytics' })