Skip to content

Commit

Permalink
feat(navigation): onNavigate listener
Browse files Browse the repository at this point in the history
release-npm
  • Loading branch information
tobua committed Jan 19, 2025
1 parent e726350 commit ae79b40
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
6 changes: 5 additions & 1 deletion demo/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { render } from 'epic-jsx'
import { Page, addPage, back, configure, forward, go, initial } from 'epic-router'
import { Page, addPage, back, configure, forward, go, initial, onNavigate } from 'epic-router'
import { connect } from 'epic-state/connect'
import { Exmpl } from 'exmpl'
import { Footer } from './Footer'
Expand All @@ -10,6 +10,10 @@ import { Overview } from './page/Overview'
// TODO not working with globally registered plugin.
// plugin(connect)

onNavigate((route, parameters, initial) => {
console.log('onNavigate:', route, parameters.id, initial)
})

const { router } = configure<{ id: number }>('overview', undefined, undefined, connect)

// TODO epic-jsx bug, link will not be removed when a Fragment is used here instead of the <div>
Expand Down
21 changes: 20 additions & 1 deletion index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { create } from 'logua'
import queryString from 'query-string'
import type { ComponentPropsWithoutRef, JSX, MouseEventHandler, ReactElement } from 'react'
import join from 'url-join'
import type { PageComponent, Pages, Parameters, RouterState } from './types'
import type { NavigateListener, PageComponent, Pages, Parameters, RouterState } from './types'

export const log = create('epic-router', 'yellow')

Expand All @@ -24,6 +24,18 @@ export const history = createHistory()
export const getRouter = () => router
export type WithRouter<T extends object> = { router: { route: string; parameters: T } }

const navigateListeners: NavigateListener[] = []

export function onNavigate(listener: NavigateListener) {
navigateListeners.push(listener)
}

function notifyNavigateListeners(initial = false) {
for (const listener of navigateListeners) {
listener(router.route, router.parameters, initial)
}
}

const removeSlashRegex = /^\/*/
const removeLeadingSlash = (path: string) => path.replace(removeSlashRegex, '')

Expand Down Expand Up @@ -155,6 +167,8 @@ export function configure<T extends Parameters>(initialRoute?: string, homeRoute

const removeListener = history.listen(router.listener)

notifyNavigateListeners(true)

return { router: router as RouterState<T>, removeListener }
}

Expand Down Expand Up @@ -194,14 +208,18 @@ export function go(route: string, parameters: Parameters = {}, historyState: obj
},
historyState,
)

notifyNavigateListeners()
}

export function back() {
history.back()
notifyNavigateListeners()
}

export function forward() {
history.forward()
notifyNavigateListeners()
}

// <a href="/" onClick={click('overview')}>Homepage</a>
Expand All @@ -215,6 +233,7 @@ export function click(route: string, parameters?: Parameters) {
export function initial() {
router.route = getInitialRoute()
history.push(writePath(router.route))
notifyNavigateListeners()
}

export function reset() {
Expand Down
2 changes: 2 additions & 0 deletions types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ export type RouterState<T extends Parameters> = {
plugin?: typeof preactConnect
listener: Listener
}

export type NavigateListener = (route: string, parameters: Parameters, initial: boolean) => void

0 comments on commit ae79b40

Please sign in to comment.