| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import { types } from 'mobx-state-tree';
- import { toJS } from 'mobx';
- import { toUrlParams } from 'app/core/utils/url';
- const QueryInnerValueType = types.union(types.string, types.boolean, types.number);
- const QueryValueType = types.union(QueryInnerValueType, types.array(QueryInnerValueType));
- export const ViewStore = types
- .model({
- path: types.string,
- query: types.map(QueryValueType),
- routeParams: types.map(QueryValueType),
- })
- .views(self => ({
- get currentUrl() {
- let path = self.path;
- if (self.query.size) {
- path += '?' + toUrlParams(toJS(self.query));
- }
- return path;
- },
- }))
- .actions(self => {
- // querystring only
- function updateQuery(query: any, clear = true) {
- if (clear) {
- self.query.clear();
- }
- for (const key of Object.keys(query)) {
- if (query[key]) {
- self.query.set(key, query[key]);
- } else {
- self.query.delete(key);
- }
- }
- }
- // needed to get route parameters like slug from the url
- function updateRouteParams(routeParams: any) {
- self.routeParams.clear();
- for (const key of Object.keys(routeParams)) {
- if (routeParams[key]) {
- self.routeParams.set(key, routeParams[key]);
- }
- }
- }
- function updatePathAndQuery(path: string, query: any, routeParams: any) {
- self.path = path;
- updateQuery(query);
- updateRouteParams(routeParams);
- }
- return {
- updateQuery,
- updatePathAndQuery,
- };
- });
|