Skip to content

Commit

Permalink
Simplify router types and clean from ts-expect-error
Browse files Browse the repository at this point in the history
  • Loading branch information
ai committed Jan 19, 2024
1 parent d171636 commit e92f1ab
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 66 deletions.
1 change: 0 additions & 1 deletion core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
"@logux/core": "0.8.5",
"@nanostores/i18n": "0.12.0",
"@nanostores/persistent": "0.9.1",
"@nanostores/router": "0.12.1",
"@slowreader/api": "link:../api",
"just-debounce-it": "3.2.0",
"nanoid": "5.0.4",
Expand Down
63 changes: 34 additions & 29 deletions core/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ export interface Routes {

export type RouteName = keyof Routes

type EmptyObject = Record<string, never>

type ParamlessRouteName = {
[K in RouteName]: Routes[K] extends EmptyObject ? K : never
}[RouteName]

export type Route<Name extends RouteName = RouteName> = Name extends string
? { params: Routes[Name]; redirect?: boolean; route: Name }
: never
Expand All @@ -42,31 +48,24 @@ export type BaseRoute<Name extends RouteName = RouteName> = Name extends string

export type BaseRouter = ReadableAtom<BaseRoute | undefined>

const GUEST = new Set<Route['route']>(['start', 'signin'])
const GUEST = new Set<RouteName>(['start', 'signin'])

const SETTINGS = new Set<Route['route']>([
const SETTINGS = new Set<RouteName>([
'interface',
'profile',
'about',
'download'
])

const ORGANIZE = new Set<Route['route']>(['add', 'categories'])
const ORGANIZE = new Set<RouteName>(['add', 'categories'])

function redirect<Name extends keyof Routes>(
route: Name,
params: Routes[Name]
): Route {
// @ts-expect-error Too complex types
return { params, redirect: true, route }
function open(route: ParamlessRouteName | Route): Route {
if (typeof route === 'string') route = { params: {}, route } as Route
return route
}

function open<Name extends keyof Routes>(
route: Name,
params: Routes[Name]
): Route {
// @ts-expect-error Too complex types
return { params, route }
function redirect(route: ParamlessRouteName | Route): Route {
return { ...open(route), redirect: true }
}

function isNumber(value: number | string): boolean {
Expand All @@ -83,48 +82,54 @@ onEnvironment(({ baseRouter }) => {
[baseRouter, userId, hasFeeds, fastCategories],
(page, user, withFeeds, fast) => {
if (!page) {
return open('notFound', {})
return open('notFound')
} else if (user) {
if (GUEST.has(page.route) || page.route === 'home') {
if (withFeeds) {
return redirect('slowAll', {})
return redirect('slowAll')
} else {
return redirect('welcome', {})
return redirect('welcome')
}
} else if (page.route === 'welcome' && withFeeds) {
return redirect('slowAll', {})
return redirect('slowAll')
} else if (page.route === 'settings') {
return redirect('interface', {})
return redirect('interface')
} else if (page.route === 'feeds') {
return redirect('categories', {})
return redirect({ params: {}, route: 'categories' })
} else if (page.route === 'fast') {
if (!page.params.category && !fast.isLoading) {
return redirect('fast', { category: fast.categories[0].id })
return redirect({
params: { category: fast.categories[0].id },
route: 'fast'
})
}
if (page.params.category && !fast.isLoading) {
let category = fast.categories.find(
i => i.id === page.params.category
)
if (!category) {
return open('notFound', {})
return open('notFound')
}
}
if (page.params.since) {
let since = page.params.since
if (isNumber(since)) {
return open('fast', {
category: page.params.category,
since: typeof since === 'number' ? since : parseInt(since)
return open({
params: {
category: page.params.category,
since: typeof since === 'number' ? since : parseInt(since)
},
route: 'fast'
})
} else {
return open('notFound', {})
return open('notFound')
}
}
}
} else if (!GUEST.has(page.route)) {
return open('start', {})
return open('start')
}
return open(page.route, page.params)
return page
}
)
})
Expand Down
35 changes: 16 additions & 19 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 3 additions & 9 deletions web/main/environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,15 @@ import {

import { detectNetworkType } from '../lib/network.js'
import { locale } from '../stores/locale.js'
import { openURL, urlRouter } from '../stores/router.js'
import { openRoute, urlRouter } from '../stores/router.js'

setupEnvironment({
baseRouter: urlRouter,
errorEvents: window,
locale,
logStoreCreator: () => new IndexedStore(),
networkType: detectNetworkType,
openRoute(page) {
// Too complex types
// @ts-expect-error
openURL(page.route, page.params)
},
openRoute,
persistentEvents: windowPersistentEvents,
persistentStore: localStorage,
restartApp() {
Expand All @@ -34,9 +30,7 @@ setupEnvironment({

router.subscribe(page => {
if (page.redirect) {
// Too complex types
// @ts-expect-error
openURL(page.route, page.params)
openRoute(page)
}
})

Expand Down
2 changes: 1 addition & 1 deletion web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"@mdi/js": "7.4.47",
"@nanostores/i18n": "0.12.0",
"@nanostores/persistent": "0.9.1",
"@nanostores/router": "0.12.1",
"@nanostores/router": "0.13.0",
"@rollup/plugin-node-resolve": "15.2.3",
"@slowreader/core": "link:../core",
"@sveltejs/vite-plugin-svelte": "3.0.1",
Expand Down
4 changes: 2 additions & 2 deletions web/pages/feeds/categories.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
organizeMessages as t
} from '@slowreader/core'
import { getURL, openURL } from '../../stores/router.js'
import { getURL, openRoute } from '../../stores/router.js'
import Button from '../../ui/button.svelte'
import CardLink from '../../ui/card-link.svelte'
import CardLinks from '../../ui/card-links.svelte'
Expand Down Expand Up @@ -97,7 +97,7 @@
<FeedsEdit
{feedId}
on:delete={() => {
openURL('categories')
openRoute({ params: {}, route: 'categories' })
}}
/>
{/if}
Expand Down
8 changes: 3 additions & 5 deletions web/stores/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
getPagePath,
type ParamsArg
} from '@nanostores/router'
import type { BaseRoute } from '@slowreader/core'

export const urlRouter = createRouter({
about: '/settings/about',
Expand Down Expand Up @@ -34,9 +35,6 @@ export function getURL<Name extends keyof UrlConfig>(
return getPagePath(urlRouter, name, ...params)
}

export function openURL<Name extends keyof UrlConfig>(
name: Name,
...params: ParamsArg<UrlConfig, Name>
): void {
urlRouter.open(getURL(name, ...params))
export function openRoute(route: BaseRoute): void {
urlRouter.open(getPagePath(urlRouter, route))
}

0 comments on commit e92f1ab

Please sign in to comment.