Refactored to use URLs at all times

This commit is contained in:
squidfunk
2020-02-22 15:56:08 +01:00
parent eb82c8d586
commit c79b786ea6
9 changed files with 25 additions and 29 deletions

View File

@@ -58,7 +58,7 @@ interface MountOptions {
*/
export function mountHeaderTitle(
{ header$, viewport$ }: MountOptions
): OperatorFunction<HTMLElement, any> {
): OperatorFunction<HTMLElement, boolean> {
return pipe(
switchMap(el => useComponent("main")
.pipe(

View File

@@ -59,7 +59,6 @@ import {
watchToggle,
setToggle,
getElements,
getLocation,
watchMedia,
watchDocument,
watchLocation,
@@ -213,7 +212,7 @@ export function initialize(config: unknown) {
const navigation$ = useComponent("navigation")
.pipe(
mountNavigation({ header$, main$, viewport$, screen$ }),
shareReplay(1)
shareReplay(1) // shareReplay because there might be late subscribers
)
const toc$ = useComponent("toc")
@@ -260,7 +259,8 @@ export function initialize(config: unknown) {
// Close drawer and search on hash change
// put into navigation...
hash$.subscribe(x => {
// TODO: replace with popstate?
hash$.subscribe(() => {
useToggle("drawer").subscribe(el => {
setToggle(el, false)
})

View File

@@ -68,7 +68,7 @@ export function watchDocumentSwitch(
): Observable<Document> {
return location$
.pipe(
startWith(location), // TODO: getLocation should return URL or Location
startWith(getLocation()),
distinctUntilKeyChanged("pathname"),
skip(1),
@@ -81,7 +81,7 @@ export function watchDocumentSwitch(
.pipe<Document, Document>(
pluck("response"),
catchError(() => {
setLocation(url.href) // TODO: setLocation should accept URL or location
setLocation(url)
return NEVER
})
)

View File

@@ -20,8 +20,7 @@
* IN THE SOFTWARE.
*/
import { Subject, fromEvent } from "rxjs"
import { map } from "rxjs/operators"
import { Subject } from "rxjs"
/* ----------------------------------------------------------------------------
* Functions
@@ -30,19 +29,24 @@ import { map } from "rxjs/operators"
/**
* Retrieve location
*
* @return Location
* This function will return a `URL` object (and not `Location`) in order to
* normalize typings across the application. Furthermore, locations need to be
* tracked without setting them and `Location` is a singleton which represents
* the current location.
*
* @return URL
*/
export function getLocation(): string {
return location.href
export function getLocation(): URL {
return new URL(location.href)
}
/**
* Set location
*
* @param value - New location
* @param url - URL to change to
*/
export function setLocation(value: string): void {
location.href = value
export function setLocation(url: URL): void {
location.href = url.href
}
/* ------------------------------------------------------------------------- */
@@ -53,13 +57,5 @@ export function setLocation(value: string): void {
* @return Location subject
*/
export function watchLocation(): Subject<URL> {
const location$ = new Subject<URL>()
// fromEvent<PopStateEvent>(window, "popstate")
// .pipe(
// map(getLocation)
// )
// .subscribe(location$)
/* Return location subject */
return location$
return new Subject<URL>()
}