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.
 
 
 
 
spa_instat_tv/src/features/QueryParamsStorage/index.tsx

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)