mapcomplete/Logic/Web/QueryParameters.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

124 lines
3.9 KiB
TypeScript
Raw Normal View History

2020-07-22 23:47:04 +02:00
/**
* Wraps the query parameters into UIEventSources
*/
import { UIEventSource } from "../UIEventSource"
2020-11-17 02:22:48 +01:00
import Hash from "./Hash"
import { Utils } from "../../Utils"
2020-07-22 23:47:04 +02:00
export class QueryParameters {
2022-10-27 01:50:41 +02:00
static defaults: Record<string, string> = {}
static documentation: Map<string, string> = new Map<string, string>()
2020-11-13 23:58:11 +01:00
private static order: string[] = ["layout", "test", "z", "lat", "lon"]
2022-09-18 12:45:02 +02:00
protected static readonly _wasInitialized: Set<string> = new Set()
protected static readonly knownSources: Record<string, UIEventSource<string>> = {}
2020-07-31 17:11:44 +02:00
private static initialized = false
2022-09-08 21:40:48 +02:00
public static GetQueryParameter(
key: string,
deflt: string,
documentation?: string
): UIEventSource<string> {
if (!this.initialized) {
this.init()
}
QueryParameters.documentation.set(key, documentation)
if (deflt !== undefined) {
QueryParameters.defaults[key] = deflt
}
if (QueryParameters.knownSources[key] !== undefined) {
return QueryParameters.knownSources[key]
}
QueryParameters.addOrder(key)
const source = new UIEventSource<string>(deflt, "&" + key)
QueryParameters.knownSources[key] = source
source.addCallback(() => QueryParameters.Serialize())
return source
}
public static GetBooleanQueryParameter(
key: string,
deflt: boolean,
documentation?: string
): UIEventSource<boolean> {
return QueryParameters.GetQueryParameter(key, "" + deflt, documentation).sync(
(str) => str === "true",
[],
(b) => "" + b
2022-09-08 21:40:48 +02:00
)
}
public static wasInitialized(key: string): boolean {
return QueryParameters._wasInitialized.has(key)
}
2020-11-13 23:58:11 +01:00
private static addOrder(key) {
if (this.order.indexOf(key) < 0) {
2020-07-22 23:47:04 +02:00
this.order.push(key)
}
}
private static init() {
2020-11-13 23:58:11 +01:00
if (this.initialized) {
2020-07-25 18:00:08 +02:00
return
}
2020-07-31 17:11:44 +02:00
this.initialized = true
if (Utils.runningFromConsole) {
return
}
2020-07-31 17:11:44 +02:00
if (window?.location?.search) {
2020-07-22 23:47:04 +02:00
const params = window.location.search.substr(1).split("&")
for (const param of params) {
const kv = param.split("=")
2020-10-17 03:56:08 +02:00
const key = decodeURIComponent(kv[0])
2020-07-22 23:47:04 +02:00
QueryParameters.addOrder(key)
QueryParameters._wasInitialized.add(key)
2020-10-17 03:56:08 +02:00
const v = decodeURIComponent(kv[1])
2020-07-22 23:47:04 +02:00
const source = new UIEventSource<string>(v)
source.addCallback(() => QueryParameters.Serialize())
2020-07-31 17:11:44 +02:00
QueryParameters.knownSources[key] = source
2020-07-22 23:47:04 +02:00
}
}
}
private static Serialize() {
const parts = []
for (const key of QueryParameters.order) {
2021-01-08 18:02:07 +01:00
if (QueryParameters.knownSources[key]?.data === undefined) {
2020-07-22 23:47:04 +02:00
continue
}
2020-12-04 21:30:35 +01:00
if (QueryParameters.knownSources[key].data === "undefined") {
continue
}
2021-01-08 18:02:07 +01:00
if (QueryParameters.knownSources[key].data === QueryParameters.defaults[key]) {
2020-07-29 15:05:19 +02:00
continue
}
2020-11-02 20:15:55 +01:00
2020-07-22 23:47:04 +02:00
parts.push(
encodeURIComponent(key) +
"=" +
encodeURIComponent(QueryParameters.knownSources[key].data)
2022-09-08 21:40:48 +02:00
)
2020-07-22 23:47:04 +02:00
}
if (!Utils.runningFromConsole) {
// Don't pollute the history every time a parameter changes
2022-10-27 01:50:41 +02:00
try {
2022-09-18 12:45:02 +02:00
history.replaceState(null, "", "?" + parts.join("&") + Hash.Current())
2022-10-27 01:50:41 +02:00
} catch (e) {
2022-09-18 12:45:02 +02:00
console.error(e)
}
}
2020-11-13 23:58:11 +01:00
}
2022-09-17 03:24:01 +02:00
static ClearAll() {
for (const name in QueryParameters.knownSources) {
2022-09-18 12:45:02 +02:00
QueryParameters.knownSources[name].setData(undefined)
2022-09-17 03:24:01 +02:00
}
QueryParameters._wasInitialized.clear()
2022-09-18 12:45:02 +02:00
QueryParameters.order = []
2022-09-17 03:24:01 +02:00
}
2020-07-22 23:47:04 +02:00
}