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 (
-
Foo route path, german:{' '}
-
Foo route path, en:{' '}
)
}
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'
})