Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add RouterHistoryStore #302

Draft
wants to merge 25 commits into
base: main
Choose a base branch
from
Draft
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e39929b
feat: add `RouterHistoryStore`
LayZeeDK Dec 23, 2022
ac97fb9
refactor: add notes on `NavigationCancel` and `NavigationError` events
LayZeeDK Dec 24, 2022
0c28854
test: cover `RouterHistoryStore`
LayZeeDK Dec 24, 2022
61db5b1
refactor: refactor `RouterHistoryStore` to only store the navigation …
LayZeeDK Dec 26, 2022
017e222
test: cover `RouterHistoryStore` with more test cases
LayZeeDK Dec 26, 2022
f0b3924
fix: initialize `RouterHistoryStore` on app initialization
LayZeeDK Dec 27, 2022
61e229c
refactor: add notes on `NavigationSkipped`
LayZeeDK Jan 2, 2023
7febcb5
refactor: remove TODO and notes
LayZeeDK Jan 4, 2023
6198488
refactor: rename router sequences
LayZeeDK Jan 4, 2023
70fccc3
docs: explain history key
LayZeeDK Jan 4, 2023
84805a3
refactor: refactor `#maxCompletedNavigationId$`
LayZeeDK Jan 4, 2023
8370281
refactor: use router navigated observable connected to a single updater
LayZeeDK Jan 4, 2023
9c694e4
refactor: extract `PopstateNavigationStart` type and type guard
LayZeeDK Jan 4, 2023
521cde1
fix: handle `NavigationCancel` and `NavigationError`
LayZeeDK Jan 5, 2023
a2f5bac
refactor: improve type annotations and inline documentation
LayZeeDK Jan 5, 2023
fa809ff
refactor: remove unnecessary selector debouncing
LayZeeDK Jan 5, 2023
654119b
refactor: extract router sequence types and type guard
LayZeeDK Jan 5, 2023
16875ea
refactor: rename `RouterHistory`
LayZeeDK Jan 5, 2023
caefc58
refactor: rename `RouterHistoryStore##findSourceNavigatedSequence`
LayZeeDK Jan 5, 2023
da9f557
docs: describe `RouterHistory`
LayZeeDK Jan 5, 2023
de60779
feat: add navigation effects
LayZeeDK Jan 5, 2023
6508ce1
feat: provide `RouterHistoryStore` as `EnvironmentProviders`
LayZeeDK May 22, 2023
23295c3
refactor: rename `RouterHistoryStore#routerEvents` to `RouterHistoryS…
LayZeeDK May 22, 2023
b284f43
refactor: remove Component Store lifecycle support
LayZeeDK May 22, 2023
a3bdc1d
feat: add WIP `RouterHistoryStore#nextUrl$` property
LayZeeDK May 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: add navigation effects
LayZeeDK committed May 23, 2023
commit de60779ce82d08adb5cb4d9980ebd85c99174257
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AsyncPipe, Location, NgIf } from '@angular/common';
import { AsyncPipe, NgIf } from '@angular/common';
import { Component, inject, NgZone } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
@@ -39,13 +39,11 @@ function createTestComponent(name: string, selector: string) {
`,
})
class TestAppComponent {
#location = inject(Location);

protected routerHistory = inject(RouterHistoryStore);

onBack(event: MouseEvent) {
event.preventDefault();
this.#location.back();
this.routerHistory.onNavigateBack();
}
}

Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Location as NgLocation } from '@angular/common';
import {
APP_INITIALIZER,
FactoryProvider,
@@ -14,7 +15,7 @@ import {
Router,
} from '@angular/router';
import { ComponentStore, provideComponentStore } from '@ngrx/component-store';
import { filter, map, Observable, switchMap, take } from 'rxjs';
import { filter, map, Observable, pipe, switchMap, take, tap } from 'rxjs';
import { filterRouterEvents } from '../filter-router-event.operator';
import { isPopstateNavigationStart } from './popstate-navigation-start';
import {
@@ -57,6 +58,7 @@ export function provideRouterHistoryStore(): Provider[] {

@Injectable()
export class RouterHistoryStore extends ComponentStore<RouterHistoryState> {
#location = inject(NgLocation);
#router = inject(Router);

/**
@@ -163,6 +165,24 @@ export class RouterHistoryStore extends ComponentStore<RouterHistoryState> {
this.#addRouterNavigatedSequence(this.#routerNavigated$);
}

/**
* Navigate back in the browser history.
*
* @remarks
* This is only available when the browser history contains a back entry.
*/
onNavigateBack = this.effect<void>(pipe(tap(() => this.#location.back())));

/**
* Navigate forward in the browser history.
*
* @remarks
* This is only available when the browser history contains a forward entry.
*/
onNavigateForward = this.effect<void>(
pipe(tap(() => this.#location.forward()))
);

/**
* Add a router navigated sequence to the router navigated history.
*/