You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.5 KiB
71 lines
1.5 KiB
import forEach from 'lodash/forEach'
|
|
import size from 'lodash/size'
|
|
|
|
import type { History } from 'history'
|
|
|
|
import { history } from 'config/history'
|
|
|
|
/**
|
|
* Имплементит Storage API (https://developer.mozilla.org/ru/docs/Web/API/Storage)
|
|
*/
|
|
class QueryParamStorage implements Storage {
|
|
/**
|
|
* через history обновляем url строку
|
|
*/
|
|
history: History
|
|
|
|
/**
|
|
* хранит все состояние query param
|
|
*/
|
|
urlParams: URLSearchParams
|
|
|
|
constructor(historyArg: History) {
|
|
this.history = historyArg
|
|
this.urlParams = new URLSearchParams(this.history.location.search)
|
|
}
|
|
|
|
get entries() {
|
|
const entries = this.urlParams.entries()
|
|
return Array.from(entries)
|
|
}
|
|
|
|
updateHistory() {
|
|
history.replace(`?${this.urlParams.toString()}`)
|
|
}
|
|
|
|
clear() {
|
|
forEach(this.entries, ([key]) => {
|
|
this.urlParams.delete(key)
|
|
})
|
|
this.updateHistory()
|
|
}
|
|
|
|
getItem(key: string) {
|
|
return this.urlParams.get(key)
|
|
}
|
|
|
|
key(index: number) {
|
|
const keys = this.urlParams.keys()
|
|
return Array.from(keys)[index]
|
|
}
|
|
|
|
removeItem(key: string) {
|
|
this.urlParams.delete(key)
|
|
this.updateHistory()
|
|
}
|
|
|
|
setItem(key: string, value: string) {
|
|
if (JSON.parse(value)) {
|
|
this.urlParams.set(key, value)
|
|
this.updateHistory()
|
|
} else {
|
|
this.removeItem(key)
|
|
}
|
|
}
|
|
|
|
get length() {
|
|
return size(this.entries)
|
|
}
|
|
}
|
|
|
|
export const queryParamStorage = new QueryParamStorage(history)
|
|
|