@metapages/hash-query
Version:
Get/set URL parameters (state) in the hash string instead of the query string.
213 lines (169 loc) • 5.34 kB
Markdown
Get/set URL parameters (state) in the hash string instead of the query string.
Keep state in sync in the URL
- Includes react hooks for getting/setting typed values.
- Includes low level tools for getting/setting arbitrary typed values.
- Includes base64 encoding/decoding of JSON objects, booleans, numbers, etc.
## Usage
Install the package:
```sh
npm i @metapages/hash-query
```
Use the hook in your component:
```typescript
import { useHashParamJson } from "@metapages/hash-query/react-hooks";
...
const [jsonBlob, setJsonBlob] = useHashParamJson<Thing>("key", defaultValue);
```
Use the low level tools for getting/setting arbitrary typed values:
```typescript
import {
getHashParamValueJsonFromWindow,
setHashParamValueJsonInWindow,
} from "@metapages/hash-query";
const jsonBlob = getHashParamValueJsonFromWindow<Thing>("key");
setHashParamValueJsonInWindow("key", jsonBlob);
```
Use plain JavaScript hash param listeners (non-React):
```typescript
import {
addEventListenerHashParamJson,
setHashParamValueJsonInWindow,
} from "@metapages/hash-query";
const dispose = addEventListenerHashParamJson<Thing>("key", (value) => {
// Fires once after a tick with current value, then on each hashchange.
console.log("hash param changed:", value);
});
setHashParamValueJsonInWindow("key", { foo: "bar" });
// Later: remove listener
dispose();
```
The hash part of the URL (everything after `#`) is split into the `<hash value>` part and the `key=val` query parts of the hash parameter:
```
https://<origin><path><?querystring>#<hash value>?hashkey1=hashvaue1&hashkey2=hashvaue2...
```
```typescript
import {
useHashParam,
useHashParamBase64,
useHashParamBoolean,
useHashParamFloat,
useHashParamInt,
useHashParamJson,
useHashParamUriEncoded,
} from "@metapages/hash-query/react-hooks";
```
Usage is the same as the JSON example above (get/set value)
### Plain JavaScript listeners (typed):
```typescript
import {
addEventListenerHashParamBase64,
addEventListenerHashParamBoolean,
addEventListenerHashParamFloat,
addEventListenerHashParamInt,
addEventListenerHashParamJson,
addEventListenerHashParamUriEncoded,
} from "@metapages/hash-query";
const cleanupBase64 = addEventListenerHashParamBase64("name", (value) => {
// value: string | undefined (decoded from base64)
});
const cleanupBoolean = addEventListenerHashParamBoolean("enabled", (value) => {
// value: boolean | undefined
});
const cleanupFloat = addEventListenerHashParamFloat("ratio", (value) => {
// value: number | undefined
});
const cleanupInt = addEventListenerHashParamInt("count", (value) => {
// value: number | undefined
});
const cleanupJson = addEventListenerHashParamJson<{ foo: string }>(
"blob",
(value) => {
// value: { foo: string } | undefined
}
);
const cleanupUri = addEventListenerHashParamUriEncoded("q", (value) => {
// value: string | undefined (decoded from URI encoding)
});
// Each listener fires once after a tick with current value, then on hashchange.
cleanupBase64();
cleanupBoolean();
cleanupFloat();
cleanupInt();
cleanupJson();
cleanupUri();
```
```typescript
import { setHashParamsInUrl } from "@metapages/hash-query";
const url = "https://example.com/page#section";
const params = {
theme: "dark",
language: "en",
view: "grid",
filter: undefined, // This will be ignored/removed
};
const newUrl = setHashParamsInUrl(url, params);
// Result: "https://example.com/page#section?theme=dark&language=en&view=grid"
```
Low level tools and utils for getting/setting arbitrary typed values in the URL hash string or manipulating the hash string without having to actually set the URL:
```sh
blobToBase64String
blobFromBase64String
stringToBase64String
stringFromBase64String
getUrlHashParams
getUrlHashParamsFromHashString
getHashParamValue
getHashParamFromWindow
getHashParamsFromWindow
setHashParamInWindow
setHashParamValueInHashString
setHashParamValueInUrl
deleteHashParamFromWindow
deleteHashParamFromUrl
setHashParamValueJsonInUrl
getHashParamValueJsonFromUrl
setHashParamValueJsonInWindow
getHashParamValueJsonFromWindow
setHashParamValueJsonInHashString
setHashParamValueFloatInUrl
getHashParamValueFloatFromUrl
setHashParamValueFloatInWindow
getHashParamValueFloatFromWindow
setHashParamValueIntInUrl
getHashParamValueIntFromUrl
setHashParamValueIntInWindow
getHashParamValueIntFromWindow
setHashParamValueBooleanInUrl
getHashParamValueBooleanFromUrl
setHashParamValueBooleanInWindow
getHashParamValueBooleanFromWindow
setHashParamValueBase64EncodedInUrl
getHashParamValueBase64DecodedFromUrl
setHashParamValueBase64EncodedInWindow
getHashParamValueBase64DecodedFromWindow
setHashParamValueUriEncodedInUrl
getHashParamValueUriDecodedFromUrl
setHashParamValueUriEncodedInWindow
getHashParamValueUriDecodedFromWindow
addEventListenerHashParamBase64
addEventListenerHashParamBoolean
addEventListenerHashParamFloat
addEventListenerHashParamInt
addEventListenerHashParamJson
addEventListenerHashParamUriEncoded
```