ViewStore.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { types } from 'mobx-state-tree';
  2. const QueryValueType = types.union(types.string, types.boolean, types.number);
  3. const urlParameterize = queryObj => {
  4. const keys = Object.keys(queryObj);
  5. const newQuery = keys.reduce((acc: string, key: string, idx: number) => {
  6. const preChar = idx === 0 ? '?' : '&';
  7. return acc + preChar + key + '=' + queryObj[key];
  8. }, '');
  9. return newQuery;
  10. };
  11. export const ViewStore = types
  12. .model({
  13. path: types.string,
  14. query: types.map(QueryValueType),
  15. routeParams: types.map(QueryValueType),
  16. })
  17. .views(self => ({
  18. get currentUrl() {
  19. let path = self.path;
  20. if (self.query.size) {
  21. path += urlParameterize(self.query.toJS());
  22. }
  23. return path;
  24. },
  25. }))
  26. .actions(self => {
  27. function updateQuery(query: any) {
  28. self.query.clear();
  29. for (let key of Object.keys(query)) {
  30. self.query.set(key, query[key]);
  31. }
  32. }
  33. function updateRouteParams(routeParams: any) {
  34. self.routeParams.clear();
  35. for (let key of Object.keys(routeParams)) {
  36. self.routeParams.set(key, routeParams[key]);
  37. }
  38. }
  39. function updatePathAndQuery(path: string, query: any, routeParams: any) {
  40. self.path = path;
  41. updateQuery(query);
  42. updateRouteParams(routeParams);
  43. }
  44. return {
  45. updateQuery,
  46. updatePathAndQuery,
  47. };
  48. });