@servicetitan/marketing-ui 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/components/image-cropper/image-cropper.d.ts +23 -0
  2. package/dist/components/image-cropper/image-cropper.d.ts.map +1 -0
  3. package/dist/components/image-cropper/image-cropper.js +146 -0
  4. package/dist/components/image-cropper/image-cropper.js.map +1 -0
  5. package/dist/components/image-cropper/image-cropper.stories.d.ts +10 -0
  6. package/dist/components/image-cropper/image-cropper.stories.d.ts.map +1 -0
  7. package/dist/components/image-cropper/image-cropper.stories.js +55 -0
  8. package/dist/components/image-cropper/image-cropper.stories.js.map +1 -0
  9. package/dist/components/ui/date-range-picker/date-range-picker.d.ts +10 -0
  10. package/dist/components/ui/date-range-picker/date-range-picker.d.ts.map +1 -0
  11. package/dist/components/ui/date-range-picker/date-range-picker.js +77 -0
  12. package/dist/components/ui/date-range-picker/date-range-picker.js.map +1 -0
  13. package/dist/components/ui/date-range-picker/date-range-picker.module.less +42 -0
  14. package/dist/components/ui/date-range-picker/date-range-picker.stories.d.ts +10 -0
  15. package/dist/components/ui/date-range-picker/date-range-picker.stories.d.ts.map +1 -0
  16. package/dist/components/ui/date-range-picker/date-range-picker.stories.js +17 -0
  17. package/dist/components/ui/date-range-picker/date-range-picker.stories.js.map +1 -0
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/utils/date/__mocks__/date-mock.d.ts +5 -0
  23. package/dist/utils/date/__mocks__/date-mock.d.ts.map +1 -0
  24. package/dist/utils/date/__mocks__/date-mock.js +23 -0
  25. package/dist/utils/date/__mocks__/date-mock.js.map +1 -0
  26. package/dist/utils/date/date-range-picker-options.d.ts +45 -0
  27. package/dist/utils/date/date-range-picker-options.d.ts.map +1 -0
  28. package/dist/utils/date/date-range-picker-options.js +138 -0
  29. package/dist/utils/date/date-range-picker-options.js.map +1 -0
  30. package/dist/utils/date/date-range-picker-state.d.ts +24 -0
  31. package/dist/utils/date/date-range-picker-state.d.ts.map +1 -0
  32. package/dist/utils/date/date-range-picker-state.js +73 -0
  33. package/dist/utils/date/date-range-picker-state.js.map +1 -0
  34. package/dist/utils/date/date-tenant.d.ts +17 -0
  35. package/dist/utils/date/date-tenant.d.ts.map +1 -0
  36. package/dist/utils/date/date-tenant.js +51 -0
  37. package/dist/utils/date/date-tenant.js.map +1 -0
  38. package/dist/utils/date/date.d.ts +11 -0
  39. package/dist/utils/date/date.d.ts.map +1 -0
  40. package/dist/utils/date/date.js +22 -0
  41. package/dist/utils/date/date.js.map +1 -0
  42. package/dist/utils/date/index.d.ts +5 -0
  43. package/dist/utils/date/index.d.ts.map +1 -0
  44. package/dist/utils/date/index.js +17 -0
  45. package/dist/utils/date/index.js.map +1 -0
  46. package/dist/utils/history/history.d.ts +9 -3
  47. package/dist/utils/history/history.d.ts.map +1 -1
  48. package/dist/utils/history/history.js +9 -7
  49. package/dist/utils/history/history.js.map +1 -1
  50. package/dist/utils/history/index.d.ts +1 -0
  51. package/dist/utils/history/index.d.ts.map +1 -1
  52. package/dist/utils/history/index.js +1 -0
  53. package/dist/utils/history/index.js.map +1 -1
  54. package/dist/utils/history/query-params-handler.d.ts +1 -0
  55. package/dist/utils/history/query-params-handler.d.ts.map +1 -1
  56. package/dist/utils/history/query-params-handler.js +3 -0
  57. package/dist/utils/history/query-params-handler.js.map +1 -1
  58. package/dist/utils/history/url-params-handler.d.ts +18 -0
  59. package/dist/utils/history/url-params-handler.d.ts.map +1 -0
  60. package/dist/utils/history/url-params-handler.js +64 -0
  61. package/dist/utils/history/url-params-handler.js.map +1 -0
  62. package/dist/utils/history/use-query-params.d.ts.map +1 -1
  63. package/dist/utils/history/use-query-params.js +5 -3
  64. package/dist/utils/history/use-query-params.js.map +1 -1
  65. package/dist/utils/history/use-url-params.d.ts +5 -5
  66. package/dist/utils/history/use-url-params.d.ts.map +1 -1
  67. package/dist/utils/history/use-url-params.js +4 -19
  68. package/dist/utils/history/use-url-params.js.map +1 -1
  69. package/dist/utils/{use-init-effect.d.ts → invariable-hooks.d.ts} +6 -1
  70. package/dist/utils/invariable-hooks.d.ts.map +1 -0
  71. package/dist/utils/{use-init-effect.js → invariable-hooks.js} +11 -2
  72. package/dist/utils/invariable-hooks.js.map +1 -0
  73. package/dist/utils/param-parsers.d.ts +2 -1
  74. package/dist/utils/param-parsers.d.ts.map +1 -1
  75. package/dist/utils/param-parsers.js +21 -1
  76. package/dist/utils/param-parsers.js.map +1 -1
  77. package/package.json +5 -3
  78. package/src/components/image-cropper/image-cropper.stories.tsx +69 -0
  79. package/src/components/image-cropper/image-cropper.tsx +108 -0
  80. package/src/components/ui/date-range-picker/date-range-picker.module.less +42 -0
  81. package/src/components/ui/date-range-picker/date-range-picker.module.less.d.ts +4 -0
  82. package/src/components/ui/date-range-picker/date-range-picker.stories.tsx +22 -0
  83. package/src/components/ui/date-range-picker/date-range-picker.tsx +118 -0
  84. package/src/index.ts +2 -1
  85. package/src/utils/__tests__/param-parsers.test.ts +11 -2
  86. package/src/utils/date/__mocks__/date-mock.ts +23 -0
  87. package/src/utils/date/__tests__/date-range-picker.test.ts +139 -0
  88. package/src/utils/date/__tests__/date-tenant.test.ts +38 -0
  89. package/src/utils/date/date-range-picker-options.ts +167 -0
  90. package/src/utils/date/date-range-picker-state.ts +62 -0
  91. package/src/utils/date/date-tenant.ts +49 -0
  92. package/src/utils/date/date.ts +29 -0
  93. package/src/utils/date/index.ts +4 -0
  94. package/src/utils/history/__tests__/history.test.ts +9 -2
  95. package/src/utils/history/__tests__/url-params-handler.test.ts +32 -0
  96. package/src/utils/history/__tests__/use-url-params.test.ts +2 -1
  97. package/src/utils/history/history.ts +27 -10
  98. package/src/utils/history/index.ts +1 -0
  99. package/src/utils/history/query-params-handler.ts +4 -0
  100. package/src/utils/history/url-params-handler.ts +65 -0
  101. package/src/utils/history/use-query-params.ts +5 -3
  102. package/src/utils/history/use-url-params.ts +7 -32
  103. package/src/utils/{use-init-effect.ts → invariable-hooks.ts} +10 -1
  104. package/src/utils/param-parsers.ts +26 -1
  105. package/dist/utils/use-init-effect.d.ts.map +0 -1
  106. package/dist/utils/use-init-effect.js.map +0 -1
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UrlParamsHandler = void 0;
4
+ const param_parsers_1 = require("../param-parsers");
5
+ const helpers_1 = require("../helpers");
6
+ class UrlParamsHandler {
7
+ constructor(parsers) {
8
+ Object.defineProperty(this, "parsers", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: parsers
13
+ });
14
+ }
15
+ static from(parsers) {
16
+ return new UrlParamsHandler(parsers);
17
+ }
18
+ toString(values) {
19
+ const params = {};
20
+ if (!values) {
21
+ return params;
22
+ }
23
+ for (const key of helpers_1.keys(values)) {
24
+ const parser = this.parsers[key];
25
+ if (!parser) {
26
+ continue;
27
+ }
28
+ const value = values[key];
29
+ if (value !== undefined) {
30
+ params[key] = parser.stringify(value);
31
+ }
32
+ }
33
+ return params;
34
+ }
35
+ parse(params) {
36
+ var _a;
37
+ const values = {};
38
+ for (const key of helpers_1.keys(params)) {
39
+ const parser = (_a = this.parsers) === null || _a === void 0 ? void 0 : _a[key];
40
+ if (!parser) {
41
+ continue;
42
+ }
43
+ const value = params[key];
44
+ if (value !== undefined) {
45
+ values[key] = parser.parse(value);
46
+ }
47
+ }
48
+ return values;
49
+ }
50
+ }
51
+ exports.UrlParamsHandler = UrlParamsHandler;
52
+ Object.defineProperty(UrlParamsHandler, "parserString", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: param_parsers_1.paramParsers.uri
57
+ });
58
+ Object.defineProperty(UrlParamsHandler, "parserNumber", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: param_parsers_1.paramParsers.number
63
+ });
64
+ //# sourceMappingURL=url-params-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-params-handler.js","sourceRoot":"","sources":["../../../src/utils/history/url-params-handler.ts"],"names":[],"mappings":";;;AAAA,oDAAmE;AACnE,wCAAkC;AAUlC,MAAa,gBAAgB;IAIzB,YAAoB,OAAmC;;;;;mBAAnC;;IAAsC,CAAC;IAE3D,MAAM,CAAC,IAAI,CAAI,OAA8B;QACzC,OAAO,IAAI,gBAAgB,CAAI,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,MAAwB;QAC7B,MAAM,MAAM,GAAkC,EAAE,CAAC;QAEjD,IAAI,CAAC,MAAM,EAAE;YACT,OAAO,MAAM,CAAC;SACjB;QAED,KAAK,MAAM,GAAG,IAAI,cAAI,CAAC,MAAM,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAM,CAAC,CAAC;aAC1C;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAA4B;;QAC9B,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,cAAI,CAAC,MAAM,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,OAAO,0CAAG,GAAG,CAAC,CAAC;YAEnC,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACrC;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;;AApDL,4CAqDC;AApDG;;;;WAA+B,4BAAY,CAAC,GAAG;GAAC;AAChD;;;;WAA+B,4BAAY,CAAC,MAAM;GAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-query-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;CAC7C;AAcD,iBAAS,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;AAChF,iBAAS,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjD,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC/B,eAAe,CAAC,CAAC,CAAC,CAAC;AAoCtB,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"use-query-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;CAC7C;AAcD,iBAAS,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;AAChF,iBAAS,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjD,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC/B,eAAe,CAAC,CAAC,CAAC,CAAC;AAqCtB,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -4,6 +4,7 @@ exports.useQueryParams = void 0;
4
4
  const react_1 = require("react");
5
5
  const react_router_dom_1 = require("react-router-dom");
6
6
  const history_1 = require("history");
7
+ const invariable_hooks_1 = require("../invariable-hooks");
7
8
  const parseParams = (search) => {
8
9
  const params = new URLSearchParams(search);
9
10
  const out = {};
@@ -14,9 +15,10 @@ const stringifyParams = (params) => new URLSearchParams(params).toString();
14
15
  function useQueryParams(handler) {
15
16
  const history = react_router_dom_1.useHistory();
16
17
  const search = history.location.search || '';
18
+ const memoHandler = invariable_hooks_1.useInvariableMemo(() => handler);
17
19
  return react_1.useMemo(() => {
18
- const currentValues = handler ? handler.parse(search) : parseParams(search);
19
- const stringify = (params) => handler ? handler.toString(params) : stringifyParams(params);
20
+ const currentValues = memoHandler ? memoHandler.parse(search) : parseParams(search);
21
+ const stringify = (params) => memoHandler ? memoHandler.toString(params) : stringifyParams(params);
20
22
  const createPathWithParams = (pathName, params) => history_1.createPath({ pathname: pathName, search: stringify(params) });
21
23
  const update = (params) => {
22
24
  history.replace(createPathWithParams(history.location.pathname, params));
@@ -36,7 +38,7 @@ function useQueryParams(handler) {
36
38
  pathname: history_1.createPath({ pathname: pathName, search: stringify(params) }),
37
39
  }),
38
40
  };
39
- }, [search, handler, history]);
41
+ }, [search, memoHandler, history]);
40
42
  }
41
43
  exports.useQueryParams = useQueryParams;
42
44
  //# sourceMappingURL=use-query-params.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-query-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA8C;AAC9C,qCAAqC;AAarC,MAAM,WAAW,GAAG,CAAI,MAAc,EAAK,EAAE;IACzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAE,GAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAE5D,OAAO,GAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAgC,MAAS,EAAU,EAAE,CACzE,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAM3C,SAAS,cAAc,CAAI,OAA+B;IACtD,MAAM,OAAO,GAAG,6BAAU,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IAE7C,OAAO,eAAO,CAAC,GAAG,EAAE;QAChB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAI,MAAM,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,CAAC,MAAS,EAAE,EAAE,CAC5B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE,CACzD,oBAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,CAAC,MAAS,EAAE,EAAE;YACzB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC;QAEF,OAAO;YACH,MAAM,EAAE,aAAa;YACrB,MAAM;YACN,aAAa,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,MAAM,iCAAM,aAAa,GAAK,MAAM,EAAG;YAC9E,IAAI,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE;gBACrC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE,CAClC,OAAO,CAAC,UAAU,CAAC;gBACf,QAAQ,EAAE,oBAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;aAC1E,CAAC;SACT,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAEQ,wCAAc"}
1
+ {"version":3,"file":"use-query-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA8C;AAC9C,qCAAqC;AAErC,0DAAwD;AAYxD,MAAM,WAAW,GAAG,CAAI,MAAc,EAAK,EAAE;IACzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAE,GAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAE5D,OAAO,GAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAgC,MAAS,EAAU,EAAE,CACzE,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAM3C,SAAS,cAAc,CAAI,OAA+B;IACtD,MAAM,OAAO,GAAG,6BAAU,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,oCAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAErD,OAAO,eAAO,CAAC,GAAG,EAAE;QAChB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAI,MAAM,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,CAAC,MAAS,EAAE,EAAE,CAC5B,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEzE,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE,CACzD,oBAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,CAAC,MAAS,EAAE,EAAE;YACzB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC;QAEF,OAAO;YACH,MAAM,EAAE,aAAa;YACrB,MAAM;YACN,aAAa,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,MAAM,iCAAM,aAAa,GAAK,MAAM,EAAG;YAC9E,IAAI,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE;gBACrC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE,CAClC,OAAO,CAAC,UAAU,CAAC;gBACf,QAAQ,EAAE,oBAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;aAC1E,CAAC;SACT,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC;AAEQ,wCAAc"}
@@ -1,8 +1,8 @@
1
- import { StringParamParser } from '../param-parsers';
2
- declare type ParsersFromValues<Values extends Record<string, any | undefined>> = {
3
- [Prop in keyof Values]: StringParamParser<Values[Prop]>;
1
+ import { UrlParamsHandler } from './url-params-handler';
2
+ declare type StringParams<T extends Record<string, any>> = {
3
+ [Prop in keyof T]: string | undefined;
4
4
  };
5
- declare function useUrlParams<T extends Record<string, string>>(): Partial<T>;
6
- declare function useUrlParams<T extends Record<string, any>>(parsers: ParsersFromValues<T>): Partial<T>;
5
+ declare function useUrlParams<T extends Record<string, string>>(): StringParams<T>;
6
+ declare function useUrlParams<T extends Record<string, any>>(parsers: UrlParamsHandler<T>): Partial<T>;
7
7
  export { useUrlParams };
8
8
  //# sourceMappingURL=use-url-params.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-url-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,aAAK,iBAAiB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,CAAC,IAAI;KACpE,IAAI,IAAI,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAC1D,CAAC;AAEF,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AACtE,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AA6BhG,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"use-url-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,aAAK,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;KAC9C,IAAI,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS;CACxC,CAAC;AAEF,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC;AAC3E,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAQ/F,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -3,26 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useUrlParams = void 0;
4
4
  const react_1 = require("react");
5
5
  const react_router_dom_1 = require("react-router-dom");
6
- const helpers_1 = require("../helpers");
7
- function useUrlParams(parsers) {
6
+ const invariable_hooks_1 = require("../invariable-hooks");
7
+ function useUrlParams(handler) {
8
8
  const params = react_router_dom_1.useParams();
9
- return react_1.useMemo(() => {
10
- if (!parsers) {
11
- return params;
12
- }
13
- const values = {};
14
- for (const key of helpers_1.keys(params)) {
15
- const parser = parsers[key];
16
- if (!parser) {
17
- continue;
18
- }
19
- const value = params[key];
20
- if (value !== undefined) {
21
- values[key] = parser.parse(value);
22
- }
23
- }
24
- return values;
25
- }, [parsers, params]);
9
+ const memoHandler = invariable_hooks_1.useInvariableMemo(() => handler);
10
+ return react_1.useMemo(() => (memoHandler ? memoHandler.parse(params) : params), [params, memoHandler]);
26
11
  }
27
12
  exports.useUrlParams = useUrlParams;
28
13
  //# sourceMappingURL=use-url-params.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-url-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA6C;AAE7C,wCAAkC;AAYlC,SAAS,YAAY,CAAI,OAA8B;IACnD,MAAM,MAAM,GAAG,4BAAS,EAAmB,CAAC;IAE5C,OAAO,eAAO,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,MAA+B,CAAC;SAC1C;QAED,MAAM,MAAM,GAAe,EAAE,CAAC;QAE9B,KAAK,MAAM,GAAG,IAAI,cAAI,CAAC,MAAM,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAE5B,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACrC;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1B,CAAC;AAEQ,oCAAY"}
1
+ {"version":3,"file":"use-url-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA6C;AAE7C,0DAAwD;AAQxD,SAAS,YAAY,CAAI,OAA6B;IAClD,MAAM,MAAM,GAAG,4BAAS,EAAmB,CAAC;IAC5C,MAAM,WAAW,GAAG,oCAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAErD,OAAO,eAAO,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACpG,CAAC;AAEQ,oCAAY"}
@@ -4,4 +4,9 @@
4
4
  * @param dispose method called after component unmount
5
5
  */
6
6
  export declare function useInitEffect(init: () => void, dispose?: () => void): void;
7
- //# sourceMappingURL=use-init-effect.d.ts.map
7
+ /**
8
+ * gets memo only once
9
+ * @param memo method that returns memoed data
10
+ */
11
+ export declare function useInvariableMemo<T>(memo: () => T): T;
12
+ //# sourceMappingURL=invariable-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariable-hooks.d.ts","sourceRoot":"","sources":["../../src/utils/invariable-hooks.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,IAAI,QAOnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAGrD"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useInitEffect = void 0;
3
+ exports.useInvariableMemo = exports.useInitEffect = void 0;
4
4
  const react_1 = require("react");
5
5
  /**
6
6
  * runs effect only once for component
@@ -15,4 +15,13 @@ function useInitEffect(init, dispose) {
15
15
  }, []);
16
16
  }
17
17
  exports.useInitEffect = useInitEffect;
18
- //# sourceMappingURL=use-init-effect.js.map
18
+ /**
19
+ * gets memo only once
20
+ * @param memo method that returns memoed data
21
+ */
22
+ function useInvariableMemo(memo) {
23
+ // eslint-disable-next-line react-hooks/exhaustive-deps
24
+ return react_1.useMemo(memo, []);
25
+ }
26
+ exports.useInvariableMemo = useInvariableMemo;
27
+ //# sourceMappingURL=invariable-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariable-hooks.js","sourceRoot":"","sources":["../../src/utils/invariable-hooks.ts"],"names":[],"mappings":";;;AAAA,iCAA2C;AAE3C;;;;GAIG;AACH,SAAgB,aAAa,CAAC,IAAgB,EAAE,OAAoB;IAChE,iBAAS,CAAC,GAAG,EAAE;QACX,IAAI,EAAE,CAAC;QAEP,OAAO,OAAO,CAAC;QACf,uDAAuD;IAC3D,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAPD,sCAOC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAI,IAAa;IAC9C,uDAAuD;IACvD,OAAO,eAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAHD,8CAGC"}
@@ -4,7 +4,8 @@ export interface StringParamParser<T> {
4
4
  }
5
5
  export declare const paramParsers: {
6
6
  string: StringParamParser<string>;
7
- stringEnum: <T extends string>(values: T[]) => StringParamParser<T>;
7
+ stringSet: <T extends string>(values: (string | T)[]) => StringParamParser<T>;
8
+ stringEnum: <TS extends string, TV>(map: Record<TS, TV>) => StringParamParser<TV>;
8
9
  uri: StringParamParser<string>;
9
10
  number: StringParamParser<number>;
10
11
  date: StringParamParser<Date>;
@@ -1 +1 @@
1
- {"version":3,"file":"param-parsers.d.ts","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CACvC;AAmED,eAAO,MAAM,YAAY;;;;;;;CAOxB,CAAC"}
1
+ {"version":3,"file":"param-parsers.d.ts","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CACvC;AAyFD,eAAO,MAAM,YAAY;;;;;;;;CAQxB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.paramParsers = void 0;
4
+ const helpers_1 = require("./helpers");
4
5
  const stringParser = {
5
6
  stringify(value) {
6
7
  return value || undefined;
@@ -9,7 +10,7 @@ const stringParser = {
9
10
  return query || undefined;
10
11
  },
11
12
  };
12
- const stringEnumParser = (values) => ({
13
+ const stringSetParser = (values) => ({
13
14
  stringify(value) {
14
15
  return value || undefined;
15
16
  },
@@ -20,6 +21,24 @@ const stringEnumParser = (values) => ({
20
21
  return undefined;
21
22
  },
22
23
  });
24
+ const stringEnumParser = (map) => ({
25
+ stringify(value) {
26
+ for (const key of helpers_1.keys(map)) {
27
+ if (map[key] === value) {
28
+ return key;
29
+ }
30
+ }
31
+ return undefined;
32
+ },
33
+ parse(query) {
34
+ const key = query;
35
+ // eslint-disable-next-line no-prototype-builtins
36
+ if (map.hasOwnProperty(key)) {
37
+ return map[key];
38
+ }
39
+ return undefined;
40
+ },
41
+ });
23
42
  const uriParser = {
24
43
  stringify(value) {
25
44
  return value || undefined;
@@ -59,6 +78,7 @@ const boolParser = {
59
78
  };
60
79
  exports.paramParsers = {
61
80
  string: stringParser,
81
+ stringSet: stringSetParser,
62
82
  stringEnum: stringEnumParser,
63
83
  uri: uriParser,
64
84
  number: numberParser,
@@ -1 +1 @@
1
- {"version":3,"file":"param-parsers.js","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":";;;AAKA,MAAM,YAAY,GAA8B;IAC5C,SAAS,CAAC,KAAK;QACX,OAAO,KAAK,IAAI,SAAS,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,KAAK;QACP,OAAO,KAAK,IAAI,SAAS,CAAC;IAC9B,CAAC;CACJ,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAmB,MAAW,EAAwB,EAAE,CAAC,CAAC;IAC/E,SAAS,CAAC,KAAK;QACX,OAAO,KAAK,IAAI,SAAS,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,KAAK;QACP,IAAI,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAU,CAAC,EAAE;YACtC,OAAO,KAAU,CAAC;SACrB;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,SAAS,GAA8B;IACzC,SAAS,CAAC,KAAK;QACX,OAAO,KAAK,IAAI,SAAS,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,KAAK;QACP,OAAO,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;CACJ,CAAC;AAEF,MAAM,YAAY,GAA8B;IAC5C,SAAS,CAAC,KAAK;QACX,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,KAAK,CAAC,KAAK;QACP,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC;QAEnB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,CAAC;CACJ,CAAC;AAEF,MAAM,UAAU,GAA4B;IACxC,SAAS,CAAC,KAAK;QACX,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK;aACvF,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,KAAK;QACP,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;QAE1C,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;CACJ,CAAC;AAEF,MAAM,UAAU,GAA+B;IAC3C,SAAS,CAAC,KAAK;QACX,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,KAAK;QACP,OAAO,KAAK,KAAK,GAAG,CAAC;IACzB,CAAC;CACJ,CAAC;AAEW,QAAA,YAAY,GAAG;IACxB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACnB,CAAC"}
1
+ {"version":3,"file":"param-parsers.js","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/marketing-ui",
3
- "version": "0.5.0",
3
+ "version": "0.8.0",
4
4
  "description": "Marketing UI component and utils",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,7 +14,8 @@
14
14
  "src"
15
15
  ],
16
16
  "dependencies": {
17
- "classnames": "~2.3.1"
17
+ "classnames": "~2.3.1",
18
+ "react-image-crop": "8.6.5"
18
19
  },
19
20
  "peerDependencies": {
20
21
  "@servicetitan/design-system": "~10.1.1",
@@ -36,6 +37,7 @@
36
37
  "@types/accounting": "~0.4.2",
37
38
  "@types/history": "~4.7.7",
38
39
  "@types/react": "~17.0.15",
40
+ "@types/react-image-crop": "8.1.2",
39
41
  "@types/react-router-dom": "^5.1.8",
40
42
  "accounting": "~0.4.1",
41
43
  "history": "~4.10.1",
@@ -52,5 +54,5 @@
52
54
  "less": true,
53
55
  "webpack": false
54
56
  },
55
- "gitHead": "5c2bbde042f6f4f71ed1f2558ac813bbfc0ac854"
57
+ "gitHead": "67ee035810f83c8ee85519f18ee746a7417f1c6d"
56
58
  }
@@ -0,0 +1,69 @@
1
+ import React from 'react';
2
+ import { ImageCropper } from './image-cropper';
3
+
4
+ export default {
5
+ title: 'Marketing UI/ImageCropper/ImageCropper',
6
+ component: ImageCropper,
7
+ parameters: {},
8
+ };
9
+
10
+ const BasicExample: React.FC = () => {
11
+ const [imageToEdit, setImageToEdit] = React.useState<File>();
12
+ const [croppedImage, setCroppedImage] = React.useState<string>();
13
+
14
+ const imageCropper = React.useRef<ImageCropper>(null);
15
+
16
+ const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
17
+ const file = e.target.files?.[0];
18
+ if (!file) {
19
+ return;
20
+ }
21
+
22
+ setImageToEdit(file);
23
+ };
24
+
25
+ const handleSave = async () => {
26
+ if (!imageToEdit) {
27
+ return;
28
+ }
29
+ const file = await imageCropper.current?.getCroppedImg(imageToEdit.type, imageToEdit.name);
30
+ if (!file) {
31
+ return;
32
+ }
33
+ const reader = new FileReader();
34
+ reader.readAsDataURL(file);
35
+ reader.onload = () => {
36
+ setCroppedImage(reader.result as string);
37
+ };
38
+ };
39
+
40
+ return (
41
+ <React.Fragment>
42
+ <input type="file" accept="image/png, image/jpeg" onChange={handleFileChange} />
43
+ {imageToEdit && (
44
+ <div style={{ marginTop: 30 }}>
45
+ <button onClick={handleSave}>Save cropped image</button>
46
+ <div style={{ marginTop: 30 }}>
47
+ <ImageCropper
48
+ file={imageToEdit}
49
+ ref={imageCropper}
50
+ crop={{ width: 300, height: 300 }}
51
+ />
52
+ </div>
53
+ </div>
54
+ )}
55
+ {croppedImage && (
56
+ <div style={{ marginTop: 30 }}>
57
+ <a href={croppedImage} download={imageToEdit?.name}>
58
+ Download
59
+ </a>
60
+ <div style={{ marginTop: 30 }}>
61
+ <img src={croppedImage} />
62
+ </div>
63
+ </div>
64
+ )}
65
+ </React.Fragment>
66
+ );
67
+ };
68
+
69
+ export const basic = () => <BasicExample />;
@@ -0,0 +1,108 @@
1
+ import React from 'react';
2
+ import { observable, action, makeObservable } from 'mobx';
3
+ import { observer } from 'mobx-react';
4
+ import ReactCrop, { Crop } from 'react-image-crop';
5
+ import 'react-image-crop/dist/ReactCrop.css';
6
+
7
+ interface ImageCropperProps {
8
+ file: File;
9
+ crop: {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ }
14
+
15
+ @observer
16
+ export class ImageCropper extends React.Component<ImageCropperProps> {
17
+ @observable private src?: string;
18
+ @observable private crop?: Crop;
19
+ @observable private image?: HTMLImageElement;
20
+
21
+ constructor(props: ImageCropperProps) {
22
+ super(props);
23
+ makeObservable(this);
24
+ }
25
+
26
+ getCroppedImg = (type: string, fileName: string) =>
27
+ new Promise<File | undefined>(resolve => {
28
+ if (!this.image || !this.crop) {
29
+ resolve(undefined);
30
+ return;
31
+ }
32
+
33
+ const { x, y } = this.crop;
34
+ if (x == null || y == null) {
35
+ resolve(undefined);
36
+ return;
37
+ }
38
+
39
+ const { width, height } = this.props.crop;
40
+ const canvas = document.createElement('canvas');
41
+ canvas.width = width;
42
+ canvas.height = height;
43
+ const ctx = canvas.getContext('2d');
44
+ if (!ctx) {
45
+ resolve(undefined);
46
+ return;
47
+ }
48
+
49
+ ctx.drawImage(
50
+ this.image,
51
+ x * (this.image.naturalWidth / this.image.width),
52
+ y * (this.image.naturalHeight / this.image.height),
53
+ width,
54
+ height,
55
+ 0,
56
+ 0,
57
+ width,
58
+ height
59
+ );
60
+
61
+ canvas.toBlob(
62
+ blob => {
63
+ const result = blob ? new File([blob], fileName) : undefined;
64
+ resolve(result);
65
+ },
66
+ type,
67
+ 1
68
+ );
69
+ });
70
+
71
+ @action
72
+ componentDidMount = () => (this.src = URL.createObjectURL(this.props.file));
73
+
74
+ componentWillUnmount = () => {
75
+ if (this.src) {
76
+ URL.revokeObjectURL(this.src);
77
+ }
78
+ };
79
+
80
+ render() {
81
+ return this.src ? (
82
+ <ReactCrop
83
+ locked
84
+ src={this.src}
85
+ crop={this.crop}
86
+ onChange={this.handleChange}
87
+ onImageLoaded={this.handleImageLoaded}
88
+ />
89
+ ) : null;
90
+ }
91
+
92
+ @action
93
+ private handleChange = (crop: Crop) => (this.crop = crop);
94
+
95
+ @action
96
+ private handleImageLoaded = (image: HTMLImageElement) => {
97
+ this.image = image;
98
+ this.crop = {
99
+ unit: 'px',
100
+ x: 0,
101
+ y: 0,
102
+ width: this.props.crop.width * (image.width / image.naturalWidth),
103
+ height: this.props.crop.height * (image.height / image.naturalHeight),
104
+ };
105
+
106
+ return false;
107
+ };
108
+ }
@@ -0,0 +1,42 @@
1
+ @import (reference) '~@servicetitan/tokens/dist/tokens';
2
+
3
+ /*
4
+ * Custom value text is not supported for DateRangePicker now (will be implemented in DS-699)
5
+ * so temporary adding custom value manually
6
+ */
7
+ .picker-container {
8
+ width: 260px;
9
+
10
+ :global {
11
+ .FormField {
12
+ position: relative;
13
+ }
14
+
15
+ .FormField__label {
16
+ margin: 0;
17
+ }
18
+
19
+ .DateRangeTrigger__shortLabel {
20
+ background: @color-white;
21
+ color: @color-neutral-90;
22
+ border-right: 0;
23
+ }
24
+
25
+ .Trigger__value {
26
+ display: none;
27
+ }
28
+
29
+ .Label__required {
30
+ display: none;
31
+ }
32
+ }
33
+
34
+ .picker-value {
35
+ position: absolute;
36
+ top: 0;
37
+ bottom: 0;
38
+ left: 40px;
39
+ z-index: 1;
40
+ max-width: 190px;
41
+ }
42
+ }
@@ -0,0 +1,4 @@
1
+ export const __esModule: true;
2
+ export const pickerContainer: string;
3
+ export const pickerValue: string;
4
+
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { DateRangePicker } from './date-range-picker';
3
+ import { DateRangePickerState, DateRangePickerOptionsTenantAds } from '../../../utils/date';
4
+
5
+ export default {
6
+ title: 'Marketing UI/ui/date-range-picker/DateRangePicker',
7
+ component: DateRangePicker,
8
+ parameters: {},
9
+ };
10
+
11
+ const tz = { UtcOffset: 0 };
12
+ const state = DateRangePickerState.createWithOptions(DateRangePickerOptionsTenantAds.create(tz));
13
+
14
+ const w = (style: { width?: string; height?: string }, Component: React.FC) => () =>
15
+ (
16
+ <div style={style}>
17
+ <Component />
18
+ </div>
19
+ );
20
+
21
+ export const dateRangePicker = w({}, () => <DateRangePicker state={state} />);
22
+ export const dateRangePickerCompare = w({}, () => <DateRangePicker state={state} compare />);