ViewStore.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { types } from 'mobx-state-tree';
  2. import { toJS } from 'mobx';
  3. import { toUrlParams } from 'app/core/utils/url';
  4. const QueryInnerValueType = types.union(types.string, types.boolean, types.number);
  5. const QueryValueType = types.union(QueryInnerValueType, types.array(QueryInnerValueType));
  6. export const ViewStore = types
  7. .model({
  8. path: types.string,
  9. query: types.map(QueryValueType),
  10. routeParams: types.map(QueryValueType),
  11. })
  12. .views(self => ({
  13. get currentUrl() {
  14. let path = self.path;
  15. if (self.query.size) {
  16. path += '?' + toUrlParams(toJS(self.query));
  17. }
  18. return path;
  19. },
  20. }))
  21. .actions(self => {
  22. // querystring only
  23. function updateQuery(query: any, clear = true) {
  24. if (clear) {
  25. self.query.clear();
  26. }
  27. for (const key of Object.keys(query)) {
  28. if (query[key]) {
  29. self.query.set(key, query[key]);
  30. } else {
  31. self.query.delete(key);
  32. }
  33. }
  34. }
  35. // needed to get route parameters like slug from the url
  36. function updateRouteParams(routeParams: any) {
  37. self.routeParams.clear();
  38. for (const key of Object.keys(routeParams)) {
  39. if (routeParams[key]) {
  40. self.routeParams.set(key, routeParams[key]);
  41. }
  42. }
  43. }
  44. function updatePathAndQuery(path: string, query: any, routeParams: any) {
  45. self.path = path;
  46. updateQuery(query);
  47. updateRouteParams(routeParams);
  48. }
  49. return {
  50. updateQuery,
  51. updatePathAndQuery,
  52. };
  53. });