From 94b2530f2f9ea0e0efdf6e933f6160105265a2c6 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 21 Apr 2024 14:56:43 -0300 Subject: challenger preact api --- packages/web-util/src/context/navigation.ts | 46 ++++++++++++++++++----------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'packages/web-util/src/context/navigation.ts') diff --git a/packages/web-util/src/context/navigation.ts b/packages/web-util/src/context/navigation.ts index a2fe3ff12..c2f2bbbc1 100644 --- a/packages/web-util/src/context/navigation.ts +++ b/packages/web-util/src/context/navigation.ts @@ -16,17 +16,13 @@ import { ComponentChildren, createContext, h, VNode } from "preact"; import { useContext, useEffect, useState } from "preact/hooks"; -import { AppLocation, ObjectOf, Location, findMatch, RouteDefinition } from "../utils/route.js"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function useCurrentLocation>>( - pagesMap: T, -): Location | undefined { - const pageList = Object.keys(pagesMap as object) as Array; - const { path, params } = useNavigationContext(); - - return findMatch(pagesMap, pageList, path, params); -} +import { + AppLocation, + ObjectOf, + Location, + findMatch, + RouteDefinition, +} from "../utils/route.js"; /** * @@ -35,7 +31,7 @@ export function useCurrentLocation>>( export type Type = { path: string; - params: Record; + params: Record; navigateTo: (path: AppLocation) => void; // addNavigationListener: (listener: (path: string, params: Record) => void) => (() => void); }; @@ -45,13 +41,29 @@ const Context = createContext(undefined); export const useNavigationContext = (): Type => useContext(Context); -function getPathAndParamsFromWindow() { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function useCurrentLocation>>( + pagesMap: T, +): Location | undefined { + const pageList = Object.keys(pagesMap as object) as Array; + const { path, params } = useNavigationContext(); + + return findMatch(pagesMap, pageList, path, params); +} + +function getPathAndParamsFromWindow(): { + path: string; + params: Record; +} { const path = typeof window !== "undefined" ? window.location.hash.substring(1) : "/"; - const params: Record = {}; + const params: Record = {}; if (typeof window !== "undefined") { for (const [key, value] of new URLSearchParams(window.location.search)) { - params[key] = value; + if (!params[key]) { + params[key] = []; + } + params[key].push(value); } } return { path, params }; @@ -80,14 +92,14 @@ export const BrowserHashNavigationProvider = ({ "Can't use BrowserHashNavigationProvider if there is no window object", ); } - function navigateTo(path: string) { + function navigateTo(path: string): void { const { params } = getPathAndParamsFromWindow(); setState({ path, params }); window.location.href = path; } useEffect(() => { - function eventListener() { + function eventListener(): void { setState(getPathAndParamsFromWindow()); } window.addEventListener(PopStateEventType, eventListener); -- cgit v1.2.3