@servicetitan/mpa-components 0.1.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 (141) hide show
  1. package/lib/components/settings/company-details/company-details-form.stories.d.ts +9 -0
  2. package/lib/components/settings/company-details/company-details-form.stories.d.ts.map +1 -0
  3. package/lib/components/settings/company-details/company-details-form.stories.js +45 -0
  4. package/lib/components/settings/company-details/company-details-form.stories.js.map +1 -0
  5. package/lib/components/settings/company-details/index.d.ts +20 -0
  6. package/lib/components/settings/company-details/index.d.ts.map +1 -0
  7. package/lib/components/settings/company-details/index.js +11 -0
  8. package/lib/components/settings/company-details/index.js.map +1 -0
  9. package/lib/components/settings/company-email-footer/company-email-footer.stories.d.ts +9 -0
  10. package/lib/components/settings/company-email-footer/company-email-footer.stories.d.ts.map +1 -0
  11. package/lib/components/settings/company-email-footer/company-email-footer.stories.js +38 -0
  12. package/lib/components/settings/company-email-footer/company-email-footer.stories.js.map +1 -0
  13. package/lib/components/settings/company-email-footer/index.d.ts +11 -0
  14. package/lib/components/settings/company-email-footer/index.d.ts.map +1 -0
  15. package/lib/components/settings/company-email-footer/index.js +10 -0
  16. package/lib/components/settings/company-email-footer/index.js.map +1 -0
  17. package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.d.ts +9 -0
  18. package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.d.ts.map +1 -0
  19. package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.js +36 -0
  20. package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.js.map +1 -0
  21. package/lib/components/settings/company-email-reply-to/index.d.ts +7 -0
  22. package/lib/components/settings/company-email-reply-to/index.d.ts.map +1 -0
  23. package/lib/components/settings/company-email-reply-to/index.js +12 -0
  24. package/lib/components/settings/company-email-reply-to/index.js.map +1 -0
  25. package/lib/components/settings/company-email-sender/company-email-sender.module.less +7 -0
  26. package/lib/components/settings/company-email-sender/company-email-sender.stories.d.ts +9 -0
  27. package/lib/components/settings/company-email-sender/company-email-sender.stories.d.ts.map +1 -0
  28. package/lib/components/settings/company-email-sender/company-email-sender.stories.js +38 -0
  29. package/lib/components/settings/company-email-sender/company-email-sender.stories.js.map +1 -0
  30. package/lib/components/settings/company-email-sender/index.d.ts +12 -0
  31. package/lib/components/settings/company-email-sender/index.d.ts.map +1 -0
  32. package/lib/components/settings/company-email-sender/index.js +29 -0
  33. package/lib/components/settings/company-email-sender/index.js.map +1 -0
  34. package/lib/components/settings/company-trade-checkbox/company-trade-checkbox.module.less +13 -0
  35. package/lib/components/settings/company-trade-checkbox/index.d.ts +10 -0
  36. package/lib/components/settings/company-trade-checkbox/index.d.ts.map +1 -0
  37. package/lib/components/settings/company-trade-checkbox/index.js +14 -0
  38. package/lib/components/settings/company-trade-checkbox/index.js.map +1 -0
  39. package/lib/components/settings/company-trades-picker/company-trades-picker.stories.d.ts +10 -0
  40. package/lib/components/settings/company-trades-picker/company-trades-picker.stories.d.ts.map +1 -0
  41. package/lib/components/settings/company-trades-picker/company-trades-picker.stories.js +68 -0
  42. package/lib/components/settings/company-trades-picker/company-trades-picker.stories.js.map +1 -0
  43. package/lib/components/settings/company-trades-picker/index.d.ts +19 -0
  44. package/lib/components/settings/company-trades-picker/index.d.ts.map +1 -0
  45. package/lib/components/settings/company-trades-picker/index.js +16 -0
  46. package/lib/components/settings/company-trades-picker/index.js.map +1 -0
  47. package/lib/components/settings/double-opt-in/double-opt-in.module.less +3 -0
  48. package/lib/components/settings/double-opt-in/double-opt-in.stories.d.ts +9 -0
  49. package/lib/components/settings/double-opt-in/double-opt-in.stories.d.ts.map +1 -0
  50. package/lib/components/settings/double-opt-in/double-opt-in.stories.js +42 -0
  51. package/lib/components/settings/double-opt-in/double-opt-in.stories.js.map +1 -0
  52. package/lib/components/settings/double-opt-in/index.d.ts +16 -0
  53. package/lib/components/settings/double-opt-in/index.d.ts.map +1 -0
  54. package/lib/components/settings/double-opt-in/index.js +23 -0
  55. package/lib/components/settings/double-opt-in/index.js.map +1 -0
  56. package/lib/components/settings/email-preview/email-preview.d.ts +13 -0
  57. package/lib/components/settings/email-preview/email-preview.d.ts.map +1 -0
  58. package/lib/components/settings/email-preview/email-preview.js +9 -0
  59. package/lib/components/settings/email-preview/email-preview.js.map +1 -0
  60. package/lib/components/settings/email-preview/email-preview.module.less +62 -0
  61. package/lib/components/settings/email-preview/opt-in-email-preview.d.ts +10 -0
  62. package/lib/components/settings/email-preview/opt-in-email-preview.d.ts.map +1 -0
  63. package/lib/components/settings/email-preview/opt-in-email-preview.js +10 -0
  64. package/lib/components/settings/email-preview/opt-in-email-preview.js.map +1 -0
  65. package/lib/components/settings/email-preview/opt-out-email-preview.d.ts +9 -0
  66. package/lib/components/settings/email-preview/opt-out-email-preview.d.ts.map +1 -0
  67. package/lib/components/settings/email-preview/opt-out-email-preview.js +9 -0
  68. package/lib/components/settings/email-preview/opt-out-email-preview.js.map +1 -0
  69. package/lib/components/settings/index.d.ts +10 -0
  70. package/lib/components/settings/index.d.ts.map +1 -0
  71. package/lib/components/settings/index.js +10 -0
  72. package/lib/components/settings/index.js.map +1 -0
  73. package/lib/components/settings/logo-picker/index.d.ts +32 -0
  74. package/lib/components/settings/logo-picker/index.d.ts.map +1 -0
  75. package/lib/components/settings/logo-picker/index.js +88 -0
  76. package/lib/components/settings/logo-picker/index.js.map +1 -0
  77. package/lib/components/settings/logo-picker/logo-picker.module.less +21 -0
  78. package/lib/components/settings/logo-picker/logo-picker.stories.d.ts +9 -0
  79. package/lib/components/settings/logo-picker/logo-picker.stories.d.ts.map +1 -0
  80. package/lib/components/settings/logo-picker/logo-picker.stories.js +13 -0
  81. package/lib/components/settings/logo-picker/logo-picker.stories.js.map +1 -0
  82. package/lib/components/settings/opt-out-message/index.d.ts +17 -0
  83. package/lib/components/settings/opt-out-message/index.d.ts.map +1 -0
  84. package/lib/components/settings/opt-out-message/index.js +22 -0
  85. package/lib/components/settings/opt-out-message/index.js.map +1 -0
  86. package/lib/components/settings/opt-out-message/opt-out-message.module.less +20 -0
  87. package/lib/components/settings/opt-out-message/opt-out-message.stories.d.ts +9 -0
  88. package/lib/components/settings/opt-out-message/opt-out-message.stories.d.ts.map +1 -0
  89. package/lib/components/settings/opt-out-message/opt-out-message.stories.js +44 -0
  90. package/lib/components/settings/opt-out-message/opt-out-message.stories.js.map +1 -0
  91. package/lib/components/settings/settings-section/index.d.ts +11 -0
  92. package/lib/components/settings/settings-section/index.d.ts.map +1 -0
  93. package/lib/components/settings/settings-section/index.js +6 -0
  94. package/lib/components/settings/settings-section/index.js.map +1 -0
  95. package/lib/index.d.ts +3 -0
  96. package/lib/index.d.ts.map +1 -0
  97. package/lib/index.js +3 -0
  98. package/lib/index.js.map +1 -0
  99. package/lib/utils/helpers.d.ts +7 -0
  100. package/lib/utils/helpers.d.ts.map +1 -0
  101. package/lib/utils/helpers.js +24 -0
  102. package/lib/utils/helpers.js.map +1 -0
  103. package/package.json +36 -0
  104. package/src/components/settings/company-details/company-details-form.stories.tsx +39 -0
  105. package/src/components/settings/company-details/index.tsx +157 -0
  106. package/src/components/settings/company-email-footer/company-email-footer.stories.tsx +26 -0
  107. package/src/components/settings/company-email-footer/index.tsx +79 -0
  108. package/src/components/settings/company-email-reply-to/company-email-reply-to.stories.tsx +23 -0
  109. package/src/components/settings/company-email-reply-to/index.tsx +38 -0
  110. package/src/components/settings/company-email-sender/company-email-sender.module.less +7 -0
  111. package/src/components/settings/company-email-sender/company-email-sender.module.less.d.ts +3 -0
  112. package/src/components/settings/company-email-sender/company-email-sender.stories.tsx +26 -0
  113. package/src/components/settings/company-email-sender/index.tsx +129 -0
  114. package/src/components/settings/company-trade-checkbox/company-trade-checkbox.module.less +13 -0
  115. package/src/components/settings/company-trade-checkbox/company-trade-checkbox.module.less.d.ts +4 -0
  116. package/src/components/settings/company-trade-checkbox/index.tsx +43 -0
  117. package/src/components/settings/company-trades-picker/company-trades-picker.stories.tsx +78 -0
  118. package/src/components/settings/company-trades-picker/index.tsx +78 -0
  119. package/src/components/settings/double-opt-in/double-opt-in.module.less +3 -0
  120. package/src/components/settings/double-opt-in/double-opt-in.module.less.d.ts +3 -0
  121. package/src/components/settings/double-opt-in/double-opt-in.stories.tsx +28 -0
  122. package/src/components/settings/double-opt-in/index.tsx +143 -0
  123. package/src/components/settings/email-preview/email-preview.module.less +62 -0
  124. package/src/components/settings/email-preview/email-preview.module.less.d.ts +8 -0
  125. package/src/components/settings/email-preview/email-preview.tsx +69 -0
  126. package/src/components/settings/email-preview/opt-in-email-preview.tsx +30 -0
  127. package/src/components/settings/email-preview/opt-out-email-preview.tsx +31 -0
  128. package/src/components/settings/index.ts +9 -0
  129. package/src/components/settings/logo-picker/index.tsx +256 -0
  130. package/src/components/settings/logo-picker/logo-picker.module.less +21 -0
  131. package/src/components/settings/logo-picker/logo-picker.module.less.d.ts +4 -0
  132. package/src/components/settings/logo-picker/logo-picker.stories.tsx +21 -0
  133. package/src/components/settings/opt-out-message/index.tsx +154 -0
  134. package/src/components/settings/opt-out-message/opt-out-message.module.less +20 -0
  135. package/src/components/settings/opt-out-message/opt-out-message.module.less.d.ts +5 -0
  136. package/src/components/settings/opt-out-message/opt-out-message.stories.tsx +31 -0
  137. package/src/components/settings/settings-section/index.tsx +35 -0
  138. package/src/index.ts +3 -0
  139. package/src/utils/helpers.ts +31 -0
  140. package/tsconfig.json +11 -0
  141. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import chunk from 'lodash/chunk';
4
+ import { Grid, Text } from '@servicetitan/design-system';
5
+ import { SettingsSection } from '../settings-section';
6
+ import { CompanyTradeCheckbox } from '../company-trade-checkbox';
7
+ export function CompanyTradesPicker({ trades, onTradeChange, }) {
8
+ const rows = useMemo(() => chunk(trades, 4).map((row, idx) => ({ row, key: `row=${idx}` })), [trades]);
9
+ return (_jsx(SettingsSection, Object.assign({ qaPrefix: "qa-settings-select-your-trades", title: "Select Your Trades", text: "Choose which trades describe your business so we can give you relevant content and merge tags." }, { children: _jsx(Grid, Object.assign({ columns: 4 }, { children: rows.map(({ row, key }) => {
10
+ return (_jsx(Grid.Row, Object.assign({ stretched: true, className: "p-0" }, { children: row.map(trade => {
11
+ var _a, _b;
12
+ return (_jsx(Grid.Column, { children: _jsx(CompanyTradeCheckbox, { className: `qa-settings-select-your-trades-${(_a = trade.qaKey) !== null && _a !== void 0 ? _a : trade.value}`, active: trade.active, onClick: onTradeChange, value: trade.value, label: _jsxs("div", Object.assign({ className: "ta-center" }, { children: [_jsx("img", { src: trade.asset.main, srcSet: `${trade.asset.x3} 3x, ${trade.asset.x2} 2x`, alt: (_b = trade.asset.alt) !== null && _b !== void 0 ? _b : '' }, void 0), _jsx(Text, Object.assign({ bold: true, className: "m-t-2", size: 2 }, { children: trade.name }), void 0)] }), void 0) }, void 0) }, trade.value));
13
+ }) }), key));
14
+ }) }), void 0) }), void 0));
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/settings/company-trades-picker/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAoBjE,MAAM,UAAU,mBAAmB,CAA4B,EAC3D,MAAM,EACN,aAAa,GACa;IAC1B,MAAM,IAAI,GAAG,OAAO,CAChB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,EACtE,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,OAAO,CACH,KAAC,eAAe,kBACZ,QAAQ,EAAC,gCAAgC,EACzC,KAAK,EAAC,oBAAoB,EAC1B,IAAI,EAAC,gGAAgG,gBAErG,KAAC,IAAI,kBAAC,OAAO,EAAE,CAAC,gBACX,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE;gBACvB,OAAO,CACH,KAAC,IAAI,CAAC,GAAG,kBAAW,SAAS,QAAC,SAAS,EAAC,KAAK,gBACxC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;;wBACb,OAAO,CACH,KAAC,IAAI,CAAC,MAAM,cACR,KAAC,oBAAoB,IACjB,SAAS,EAAE,kCACP,MAAA,KAAK,CAAC,KAAK,mCAAI,KAAK,CAAC,KACzB,EAAE,EACF,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,KAAK,EACD,6BAAK,SAAS,EAAC,WAAW,iBACtB,cACI,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EACrB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EACpD,GAAG,EAAE,MAAA,KAAK,CAAC,KAAK,CAAC,GAAG,mCAAI,EAAE,WAC5B,EACF,KAAC,IAAI,kBAAC,IAAI,QAAC,SAAS,EAAC,OAAO,EAAC,IAAI,EAAE,CAAC,gBAC/B,KAAK,CAAC,IAAI,YACR,aACL,WAEZ,IApBY,KAAK,CAAC,KAAK,CAqBf,CACjB,CAAC;oBACN,CAAC,CAAC,KA1BS,GAAG,CA2BP,CACd,CAAC;YACN,CAAC,CAAC,YACC,YACO,CACrB,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ .button-input {
2
+ width: 160px;
3
+ }
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ declare const _default: {
3
+ title: string;
4
+ component: import("react").FC<import(".").DoubleOptInProps>;
5
+ parameters: {};
6
+ };
7
+ export default _default;
8
+ export declare const DoubleOptIn: (() => JSX.Element) & import("@servicetitan/react-ioc/dist/provide").WrappedComponent<() => JSX.Element>;
9
+ //# sourceMappingURL=double-opt-in.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-opt-in.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/double-opt-in/double-opt-in.stories.tsx"],"names":[],"mappings":";;;;;;AAKA,wBAIE;AAaF,eAAO,MAAM,WAAW,0GAKtB,CAAC"}
@@ -0,0 +1,42 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ import { CheckboxFieldState, InputFieldState } from '@servicetitan/form';
9
+ import { injectable, provide, useDependencies } from '@servicetitan/react-ioc';
10
+ import { FormState } from 'formstate';
11
+ import { DoubleOptIn as Component } from '.';
12
+ export default {
13
+ title: 'MPA Components/settings/DoubleOptIn',
14
+ component: Component,
15
+ parameters: {},
16
+ };
17
+ let DoubleOptInStore = class DoubleOptInStore {
18
+ constructor() {
19
+ Object.defineProperty(this, "form", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: new FormState({
24
+ emailSubject: new InputFieldState('Jump in'),
25
+ emailHeader: new InputFieldState('Right now'),
26
+ emailBody: new InputFieldState('Jump in right now! Please!'),
27
+ emailButtonText: new InputFieldState('JUMP IN'),
28
+ enabled: new CheckboxFieldState(true),
29
+ })
30
+ });
31
+ }
32
+ };
33
+ DoubleOptInStore = __decorate([
34
+ injectable()
35
+ ], DoubleOptInStore);
36
+ export const DoubleOptIn = provide({
37
+ singletons: [DoubleOptInStore],
38
+ })(() => {
39
+ const [store] = useDependencies(DoubleOptInStore);
40
+ return _jsx(Component, { formState: store.form.$ }, void 0);
41
+ });
42
+ //# sourceMappingURL=double-opt-in.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-opt-in.stories.js","sourceRoot":"","sources":["../../../../src/components/settings/double-opt-in/double-opt-in.stories.tsx"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC;AAE7C,eAAe;IACX,KAAK,EAAE,qCAAqC;IAC5C,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,EAAE;CACjB,CAAC;AAGF,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QACI;;;;mBAAO,IAAI,SAAS,CAAC;gBACjB,YAAY,EAAE,IAAI,eAAe,CAAC,SAAS,CAAC;gBAC5C,WAAW,EAAE,IAAI,eAAe,CAAC,WAAW,CAAC;gBAC7C,SAAS,EAAE,IAAI,eAAe,CAAC,4BAA4B,CAAC;gBAC5D,eAAe,EAAE,IAAI,eAAe,CAAC,SAAS,CAAC;gBAC/C,OAAO,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC;aACxC,CAAC;WAAC;IACP,CAAC;CAAA,CAAA;AARK,gBAAgB;IADrB,UAAU,EAAE;GACP,gBAAgB,CAQrB;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;IAC/B,UAAU,EAAE,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC,GAAG,EAAE;IACJ,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAClD,OAAO,KAAC,SAAS,IAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,WAAI,CAAC;AAClD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { FC } from 'react';
2
+ import { CheckboxFieldState, InputFieldState } from '@servicetitan/form';
3
+ export declare const footerText = "If you\u2019ve received this email by mistake, no action is needed, just delete this message.";
4
+ export interface DoubleOptInPropsFormState {
5
+ emailSubject: InputFieldState<string>;
6
+ emailHeader: InputFieldState<string>;
7
+ emailBody: InputFieldState<string>;
8
+ emailButtonText: InputFieldState<string>;
9
+ enabled: CheckboxFieldState;
10
+ }
11
+ export interface DoubleOptInProps {
12
+ formState: DoubleOptInPropsFormState;
13
+ onHandleClickEnable?(checkd: boolean): void;
14
+ }
15
+ export declare const DoubleOptIn: FC<DoubleOptInProps>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/double-opt-in/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAmC,MAAM,OAAO,CAAC;AAI5D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AASzE,eAAO,MAAM,UAAU,kGACuE,CAAC;AAE/F,MAAM,WAAW,yBAAyB;IACtC,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,EAAE,kBAAkB,CAAC;CAC/B;AACD,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,yBAAyB,CAAC;IACrC,mBAAmB,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/C;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAkH3C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment, useCallback, useState } from 'react';
3
+ import { observer } from 'mobx-react';
4
+ import classnames from 'classnames';
5
+ import { Form, Text, ToggleSwitch, Button } from '@servicetitan/design-system';
6
+ import { useConfirm } from '@servicetitan/confirm';
7
+ import { SettingsSection } from '../settings-section';
8
+ import { OptInEmailPreview } from '../email-preview/opt-in-email-preview';
9
+ import * as Styles from './double-opt-in.module.less';
10
+ export const footerText = 'If you’ve received this email by mistake, no action is needed, just delete this message.';
11
+ export const DoubleOptIn = observer(({ onHandleClickEnable, formState }) => {
12
+ const { emailSubject, emailHeader, emailBody, emailButtonText, enabled } = formState;
13
+ const [isPreviewOpen, setIsPreviewOpen] = useState(false);
14
+ const openPreview = useCallback(() => setIsPreviewOpen(true), [setIsPreviewOpen]);
15
+ const closePreview = useCallback(() => setIsPreviewOpen(false), [setIsPreviewOpen]);
16
+ const handleClickEnable = useCallback((_0, checked) => {
17
+ onHandleClickEnable === null || onHandleClickEnable === void 0 ? void 0 : onHandleClickEnable(checked);
18
+ enabled.onChange(checked);
19
+ }, [enabled, onHandleClickEnable]);
20
+ const [Confirm, handleConfirmed] = useConfirm(handleClickEnable);
21
+ return (_jsxs(SettingsSection, Object.assign({ qaPrefix: "qa-double-opt-in", title: "Double Opt-In", text: _jsxs(Fragment, { children: [_jsx("div", { children: "Double opt-in ensures that your emails will go to SPAM at a much lower rate. The opt-in confirmation happens after a job has been completed." }, void 0), _jsx(ToggleSwitch, { label: "Enable", onChange: handleConfirmed, checked: enabled.value, className: "m-t-2 qa-double-opt-in-enable" }, void 0)] }, void 0) }, { children: [_jsx(Text, Object.assign({ bold: true, className: "m-b-2" }, { children: "Double Opt-In Email Content" }), void 0), _jsxs(Form, Object.assign({ className: "m-b-0-i" }, { children: [_jsx(Form.Input, { className: "m-b-2-i qa-double-opt-in-subject-line", value: emailSubject.value, onChange: emailSubject.onChangeHandler, error: emailSubject.hasError, label: "Subject Line", fluid: true, disabled: !enabled.value }, void 0), _jsx(Form.Input, { className: "m-b-2-i qa-double-opt-in-header", value: emailHeader.value, onChange: emailHeader.onChangeHandler, error: emailHeader.hasError, label: "Header", fluid: true, disabled: !enabled.value }, void 0), _jsx(Form.TextArea, { className: "m-b-2-i qa-double-opt-in-body-copy", label: "Body Copy", value: emailBody.value, onChange: emailBody.onChangeHandler, error: emailBody.hasError, rows: 2, disabled: !enabled.value }, void 0), _jsx(Form.Input, { className: classnames(Styles.buttonInput, 'm-b-2-i qa-double-opt-in-button-text'), value: emailButtonText.value, onChange: emailButtonText.onChangeHandler, error: emailButtonText.hasError, label: "Button Text", disabled: !enabled.value }, void 0), _jsx(Form.Field, Object.assign({ className: "m-b-3-i", label: _jsxs(Fragment, { children: ["Footer\u00A0", _jsx(Text, Object.assign({ inline: true, size: 2, subdued: true }, { children: "(automatically added)" }), void 0)] }, void 0) }, { children: _jsx(Text, { children: footerText }, void 0) }), void 0), _jsx(Button, Object.assign({ className: "qa-double-opt-in-preview-email", primary: true, onClick: openPreview, outline: true, small: true, disabled: !enabled.value }, { children: "Preview Email" }), void 0)] }), void 0), _jsx(Confirm, { title: "Disable Double Opt-In", message: "Disabling double opt-in could potentially lead to worse email performance and higher spam rates. Are you sure?", when: enabled.value }, void 0), _jsx(OptInEmailPreview, Object.assign({}, formState, { open: isPreviewOpen, footerText: footerText, onClose: closePreview }), void 0)] }), void 0));
22
+ });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/settings/double-opt-in/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { FC } from 'react';
2
+ import { ModalProps } from '@servicetitan/design-system';
3
+ interface EmailPreviewProps {
4
+ title: string;
5
+ header?: string;
6
+ body?: string;
7
+ buttonText?: string;
8
+ footer?: string;
9
+ onClose: ModalProps['onClose'];
10
+ }
11
+ export declare const EmailPreview: FC<EmailPreviewProps>;
12
+ export {};
13
+ //# sourceMappingURL=email-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-preview.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/email-preview/email-preview.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAG3B,OAAO,EAAS,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAIhE,UAAU,iBAAiB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAoD9C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import classnames from 'classnames';
3
+ import { Modal } from '@servicetitan/design-system';
4
+ import * as Styles from './email-preview.module.less';
5
+ export const EmailPreview = ({ title, header, body, buttonText, footer, onClose, }) => {
6
+ const isCardEmpty = !header && !body && !buttonText;
7
+ return (_jsx(Modal, Object.assign({ open: true, size: Modal.Sizes.M, closable: true, title: title, onClose: onClose, className: "qa-email-preview" }, { children: _jsx("div", Object.assign({ className: Styles.preview }, { children: !isCardEmpty && (_jsxs("div", Object.assign({ className: Styles.card }, { children: [header && (_jsx("h1", Object.assign({ className: classnames(Styles.title, 'qa-email-preview-header') }, { children: header }), void 0)), body && (_jsx("p", Object.assign({ className: classnames(Styles.text, 'qa-email-preview-body-copy') }, { children: body }), void 0)), buttonText && (_jsx("a", Object.assign({ className: classnames(Styles.button, 'qa-email-preview-button-text') }, { children: buttonText }), void 0)), footer && (_jsx("p", Object.assign({ className: classnames(Styles.footer, 'qa-email-preview-footer') }, { children: footer }), void 0))] }), void 0)) }), void 0) }), void 0));
8
+ };
9
+ //# sourceMappingURL=email-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-preview.js","sourceRoot":"","sources":["../../../../src/components/settings/email-preview/email-preview.tsx"],"names":[],"mappings":";AACA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAc,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAWtD,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAChD,KAAK,EACL,MAAM,EACN,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,GACV,EAAE,EAAE;IACD,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;IAEpD,OAAO,CACH,KAAC,KAAK,kBACF,IAAI,QACJ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EACnB,QAAQ,QACR,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,kBAAkB,gBAE5B,4BAAK,SAAS,EAAE,MAAM,CAAC,OAAO,gBACzB,CAAC,WAAW,IAAI,CACb,6BAAK,SAAS,EAAE,MAAM,CAAC,IAAI,iBACtB,MAAM,IAAI,CACP,2BAAI,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,yBAAyB,CAAC,gBAC7D,MAAM,YACN,CACR,EACA,IAAI,IAAI,CACL,0BAAG,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,gBAC9D,IAAI,YACL,CACP,EACA,UAAU,IAAI,CACX,0BACI,SAAS,EAAE,UAAU,CACjB,MAAM,CAAC,MAAM,EACb,8BAA8B,CACjC,gBAEA,UAAU,YACX,CACP,EACA,MAAM,IAAI,CACP,0BAAG,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,gBAC7D,MAAM,YACP,CACP,aACC,CACT,YACC,YACF,CACX,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,62 @@
1
+ @import (reference) '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .preview {
4
+ max-width: 600px;
5
+ margin: @spacing-0 auto;
6
+ display: flex;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ padding: @spacing-2 @spacing-0;
10
+ min-height: 400px;
11
+ max-height: 70vh;
12
+
13
+ .card {
14
+ background: @color-neutral-10;
15
+ border: 1px solid @color-neutral-60;
16
+ border-radius: @border-radius-2;
17
+ padding: @spacing-5;
18
+ width: 100%;
19
+ box-sizing: border-box;
20
+
21
+ .title {
22
+ font-family: Arial, sans-serif;
23
+ font-weight: bold;
24
+ font-size: 30px;
25
+ line-height: 34px;
26
+ color: @color-neutral-400;
27
+ margin-bottom: @spacing-0;
28
+ }
29
+
30
+ .text {
31
+ font-family: Helvetica, sans-serif;
32
+ font-size: @typescale-4;
33
+ line-height: 23px;
34
+ color: @color-neutral-200;
35
+ margin-top: 20px;
36
+ margin-bottom: @spacing-0;
37
+ }
38
+
39
+ .button {
40
+ background: @color-blue-400;
41
+ border-radius: 4px;
42
+ font-family: Helvetica, sans-serif;
43
+ font-size: @typescale-4;
44
+ line-height: 23px;
45
+ text-align: center;
46
+ color: @color-neutral-0;
47
+ padding: 13px @spacing-2;
48
+ cursor: pointer;
49
+ margin-top: 30px;
50
+ display: inline-block;
51
+ }
52
+
53
+ .footer {
54
+ font-family: Helvetica, sans-serif;
55
+ font-size: @typescale-3;
56
+ line-height: 18px;
57
+ color: @color-neutral-200;
58
+ margin-top: 30px;
59
+ margin-bottom: @spacing-0;
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+ import type { DoubleOptInPropsFormState } from '../double-opt-in';
3
+ interface OptInEmailPreviewProps extends DoubleOptInPropsFormState {
4
+ open: boolean;
5
+ footerText: string;
6
+ onClose(): void;
7
+ }
8
+ export declare const OptInEmailPreview: FC<OptInEmailPreviewProps>;
9
+ export {};
10
+ //# sourceMappingURL=opt-in-email-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opt-in-email-preview.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/email-preview/opt-in-email-preview.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAI3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElE,UAAU,sBAAuB,SAAQ,yBAAyB;IAC9D,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAiBxD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { observer } from 'mobx-react';
3
+ import { EmailPreview } from './email-preview';
4
+ export const OptInEmailPreview = observer(({ open, footerText, onClose, emailHeader, emailBody, emailButtonText }) => {
5
+ if (!open) {
6
+ return null;
7
+ }
8
+ return (_jsx(EmailPreview, { title: "Double Opt-In Email Preview", onClose: onClose, header: emailHeader.value, body: emailBody.value, buttonText: emailButtonText.value, footer: footerText }, void 0));
9
+ });
10
+ //# sourceMappingURL=opt-in-email-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opt-in-email-preview.js","sourceRoot":"","sources":["../../../../src/components/settings/email-preview/opt-in-email-preview.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C,MAAM,CAAC,MAAM,iBAAiB,GAA+B,QAAQ,CACjE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE;IACvE,IAAI,CAAC,IAAI,EAAE;QACP,OAAO,IAAI,CAAC;KACf;IAED,OAAO,CACH,KAAC,YAAY,IACT,KAAK,EAAC,6BAA6B,EACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,CAAC,KAAK,EACzB,IAAI,EAAE,SAAS,CAAC,KAAK,EACrB,UAAU,EAAE,eAAe,CAAC,KAAK,EACjC,MAAM,EAAE,UAAU,WACpB,CACL,CAAC;AACN,CAAC,CACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { OptOutMessageState } from '../opt-out-message';
3
+ interface OptOutMessagePreviewProps extends OptOutMessageState {
4
+ open: boolean;
5
+ onClose(): void;
6
+ }
7
+ export declare const OptOutEmailPreview: FC<OptOutMessagePreviewProps>;
8
+ export {};
9
+ //# sourceMappingURL=opt-out-email-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opt-out-email-preview.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/email-preview/opt-out-email-preview.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,UAAU,yBAA0B,SAAQ,kBAAkB;IAC1D,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,yBAAyB,CAoB5D,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { EmailPreview } from './email-preview';
3
+ export const OptOutEmailPreview = ({ open, onClose, header, body, buttonText, }) => {
4
+ if (!open) {
5
+ return null;
6
+ }
7
+ return (_jsx(EmailPreview, { title: "Opt-Out Email Preview", onClose: onClose, header: header.value, body: body.value, buttonText: buttonText.value }, void 0));
8
+ };
9
+ //# sourceMappingURL=opt-out-email-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opt-out-email-preview.js","sourceRoot":"","sources":["../../../../src/components/settings/email-preview/opt-out-email-preview.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQ/C,MAAM,CAAC,MAAM,kBAAkB,GAAkC,CAAC,EAC9D,IAAI,EACJ,OAAO,EACP,MAAM,EACN,IAAI,EACJ,UAAU,GACb,EAAE,EAAE;IACD,IAAI,CAAC,IAAI,EAAE;QACP,OAAO,IAAI,CAAC;KACf;IAED,OAAO,CACH,KAAC,YAAY,IACT,KAAK,EAAC,uBAAuB,EAC7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,KAAK,EACpB,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,UAAU,EAAE,UAAU,CAAC,KAAK,WAC9B,CACL,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './company-details';
2
+ export * from './company-email-footer';
3
+ export * from './company-email-reply-to';
4
+ export * from './company-email-sender';
5
+ export * from './company-trades-picker';
6
+ export * from './double-opt-in';
7
+ export * from './logo-picker';
8
+ export * from './opt-out-message';
9
+ export * from './settings-section';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/settings/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './company-details';
2
+ export * from './company-email-footer';
3
+ export * from './company-email-reply-to';
4
+ export * from './company-email-sender';
5
+ export * from './company-trades-picker';
6
+ export * from './double-opt-in';
7
+ export * from './logo-picker';
8
+ export * from './opt-out-message';
9
+ export * from './settings-section';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/settings/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { ReactNode, FC } from 'react';
2
+ export declare const LOGO_MIN_SIZE = 180;
3
+ export declare const DEFAULT_MIN_DIMENSIONS: {
4
+ width: number;
5
+ height: number;
6
+ };
7
+ export declare const DEFAULT_LOGO_TIPS: JSX.Element;
8
+ export interface LogoPickerProps {
9
+ error?: string;
10
+ image?: File;
11
+ imageUrl?: string;
12
+ loaded?: boolean;
13
+ maxSize?: number;
14
+ minDimensions?: {
15
+ width: number;
16
+ height: number;
17
+ };
18
+ tips?: ReactNode;
19
+ deleteImage(): void;
20
+ downloadImage?(): void;
21
+ onBadImage?(opts: {
22
+ category: string;
23
+ error: string;
24
+ data: {
25
+ imageUrl: string;
26
+ };
27
+ }): void;
28
+ onFileChange(files: FileList | null): void;
29
+ setError?(error: string): void;
30
+ }
31
+ export declare const LogoPicker: FC<LogoPickerProps>;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/logo-picker/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAE,EAAE,EAAU,MAAM,OAAO,CAAC;AAgBnE,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,sBAAsB;;;CAAkD,CAAC;AACtF,eAAO,MAAM,iBAAiB,aAY7B,CAAC;AAIF,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,WAAW,IAAI,IAAI,CAAC;IACpB,aAAa,CAAC,IAAI,IAAI,CAAC;IACvB,UAAU,CAAC,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACzF,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA6M1C,CAAC"}
@@ -0,0 +1,88 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import { useEffect, useState, useRef } from 'react';
12
+ import { observer } from 'mobx-react';
13
+ import { FilePicker, ButtonGroup, Tooltip, Button, Card, Banner, Grid, } from '@servicetitan/design-system';
14
+ import { Label } from '@servicetitan/form';
15
+ import { getImageSize, formatBytes } from '../../../utils/helpers';
16
+ export const LOGO_MIN_SIZE = 180;
17
+ export const DEFAULT_MIN_DIMENSIONS = { width: LOGO_MIN_SIZE, height: LOGO_MIN_SIZE };
18
+ export const DEFAULT_LOGO_TIPS = (_jsxs("ul", { children: [_jsx("li", { children: "PNGs with a transparent background work best, but aren't required." }, void 0), _jsx("li", { children: "Don't know where your logo is? Your social media profile would be a good place to look." }, void 0), _jsx("li", { children: "Use a logo that is at least 180x180px in size." }, void 0), _jsx("li", { children: "Avoid using a screenshot of your logo, right click and \u201Csave as\u201D if you're pulling it from somewhere else." }, void 0)] }, void 0));
19
+ import * as Styles from './logo-picker.module.less';
20
+ export const LogoPicker = observer(({ deleteImage, downloadImage, error, image, imageUrl, loaded = true, maxSize, minDimensions = DEFAULT_MIN_DIMENSIONS, onBadImage, onFileChange, setError, tips = DEFAULT_LOGO_TIPS, }) => {
21
+ const [recommendLargerImage, setRecommendLargerImage] = useState(false);
22
+ const [localError, setLocalError] = useState('');
23
+ const [isLoading, setIsLoading] = useState(false);
24
+ const [sizeError, setSizeError] = useState('');
25
+ const fileRef = useRef(null);
26
+ const formattedMaxSize = useRef(formatBytes(maxSize, 2, false));
27
+ const handleClick = () => { var _a; return (_a = fileRef.current) === null || _a === void 0 ? void 0 : _a.click(); };
28
+ useEffect(() => {
29
+ const handleImageUrlChange = () => __awaiter(void 0, void 0, void 0, function* () {
30
+ if (!imageUrl || !minDimensions) {
31
+ return;
32
+ }
33
+ setIsLoading(true);
34
+ try {
35
+ const size = yield getImageSize(imageUrl);
36
+ setRecommendLargerImage(size.height < minDimensions.height || size.width < minDimensions.width);
37
+ setLocalError('');
38
+ if (setError) {
39
+ setError('');
40
+ }
41
+ }
42
+ catch (_a) {
43
+ onBadImage === null || onBadImage === void 0 ? void 0 : onBadImage({
44
+ category: 'LogoPicker',
45
+ error: 'Got a bad image',
46
+ data: { imageUrl },
47
+ });
48
+ deleteImage();
49
+ setLocalError('File is not a valid image');
50
+ setRecommendLargerImage(false);
51
+ if (setError) {
52
+ setError('File is not a valid image');
53
+ }
54
+ }
55
+ finally {
56
+ setIsLoading(false);
57
+ }
58
+ });
59
+ handleImageUrlChange();
60
+ }, [imageUrl, minDimensions, setError, deleteImage, onBadImage]);
61
+ useEffect(() => {
62
+ if (!(image === null || image === void 0 ? void 0 : image.size) || !maxSize) {
63
+ return;
64
+ }
65
+ setIsLoading(true);
66
+ if (image && image.size > maxSize) {
67
+ deleteImage();
68
+ setSizeError(`File size should be less than ${formattedMaxSize.current}.`);
69
+ if (setError) {
70
+ setError(`File size should be less than ${formattedMaxSize.current}.`);
71
+ }
72
+ }
73
+ else {
74
+ setSizeError('');
75
+ if (setError) {
76
+ setError('');
77
+ }
78
+ }
79
+ setIsLoading(false);
80
+ }, [image, maxSize, setError, deleteImage]);
81
+ if (!loaded || isLoading) {
82
+ return null;
83
+ }
84
+ return (_jsxs("div", Object.assign({ className: "field" }, { children: [_jsx(Label, { label: "Logo", hasError: !!error || !!localError || !!sizeError }, void 0), (error || localError) && (_jsx(Banner, { className: "m-b-2 qa-settings-logo-error", title: error !== null && error !== void 0 ? error : localError, status: "critical", icon: true }, void 0)), sizeError && (_jsx(Banner, { className: "m-b-2 qa-settings-logo-error", title: sizeError, status: "critical", icon: true }, void 0)), imageUrl === undefined ? (_jsx(FilePicker, { typesNote: "Allowed file types: jpeg, png, jpg", className: "qa-settings-logo-file-picker", accept: "image/png, image/jpeg", onSelected: onFileChange }, void 0)) : (_jsx(Grid, { children: _jsx(Grid.Column, Object.assign({ width: 4 }, { children: _jsx(Card, Object.assign({ raised: true, padding: "none", className: Styles.logoCard }, { children: _jsxs(Card.Section, { children: [_jsx("img", { className: "qa-settings-logo-image", src: imageUrl, alt: "logo" }, void 0), _jsx("div", Object.assign({ className: Styles.logoAction }, { children: _jsxs(ButtonGroup, { children: [_jsxs(Tooltip, Object.assign({ el: "div", text: "Replace" }, { children: [_jsx(Button, { outline: true, iconName: "sync", onClick: handleClick, className: "qa-settings-logo-replace shadow-1-i bg-white-i" }, void 0), _jsx("input", { hidden: true, type: "file", accept: "image/png, image/jpeg", ref: fileRef, onChange: ({ currentTarget: { files } }) => onFileChange(files) }, void 0)] }), void 0), _jsx(Tooltip, Object.assign({ el: "div", text: "Download" }, { children: downloadImage || image !== undefined ? (_jsx(Button, { className: "qa-settings-logo-download shadow-1-i bg-white-i", disabled: image !== undefined, onClick: downloadImage, iconName: "file_download", outline: true }, void 0)) : (_jsx("a", Object.assign({ download: `logo.${imageUrl
85
+ .split('.')
86
+ .pop()}`, rel: "noreferrer", target: "_blank", href: imageUrl }, { children: _jsx(Button, { className: "qa-settings-logo-download shadow-1-i bg-white-i", iconName: "file_download", outline: true }, void 0) }), void 0)) }), void 0), _jsx(Tooltip, Object.assign({ el: "div", text: "Delete" }, { children: _jsx(Button, { className: "qa-settings-logo-delete shadow-1-i bg-white-i", onClick: deleteImage, iconName: "delete", outline: true }, void 0) }), void 0)] }, void 0) }), void 0)] }, void 0) }), void 0) }), void 0) }, void 0)), recommendLargerImage && minDimensions && (imageUrl || image) && (_jsx(Banner, { title: `We strongly recommend using a logo that is at least ${minDimensions.width}x${minDimensions.height}px in size. Using a lower-resolution image may result in logo pixelation in your templates.`, className: "m-t-2", status: "warning", icon: true }, void 0)), (imageUrl === undefined || recommendLargerImage || localError || sizeError) && (_jsx(Banner, Object.assign({ icon: true, title: "Tips on Uploading Your Logo:", className: "m-t-2" }, { children: tips }), void 0))] }), void 0));
87
+ });
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/settings/logo-picker/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ @import (reference) '~@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .logo-card {
4
+ position: relative;
5
+
6
+ .logo-action {
7
+ position: absolute;
8
+ right: 0;
9
+ top: 0;
10
+ padding: @spacing-2;
11
+ }
12
+
13
+ &:not(:hover) .logo-action {
14
+ display: none;
15
+ }
16
+
17
+ img {
18
+ width: 100%;
19
+ height: auto;
20
+ }
21
+ }
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ declare const _default: {
3
+ title: string;
4
+ component: typeof LogoPicker;
5
+ parameters: {};
6
+ };
7
+ export default _default;
8
+ export declare function LogoPicker(): JSX.Element;
9
+ //# sourceMappingURL=logo-picker.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo-picker.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/logo-picker/logo-picker.stories.tsx"],"names":[],"mappings":";;;;;;AAGA,wBAIE;AAEF,wBAAgB,UAAU,gBAWzB"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { LogoPicker as Component } from '.';
4
+ export default {
5
+ title: 'MPA Components/settings/LogoPicker',
6
+ component: LogoPicker,
7
+ parameters: {},
8
+ };
9
+ export function LogoPicker() {
10
+ const [url, setUrl] = useState();
11
+ return (_jsx(Component, { imageUrl: url, minDimensions: { height: 300, width: 300 }, onFileChange: () => setUrl('https://place-hold.it/300x300'), deleteImage: () => alert('image deleted') }, void 0));
12
+ }
13
+ //# sourceMappingURL=logo-picker.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo-picker.stories.js","sourceRoot":"","sources":["../../../../src/components/settings/logo-picker/logo-picker.stories.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC;AAE5C,eAAe;IACX,KAAK,EAAE,oCAAoC;IAC3C,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,EAAE;CACjB,CAAC;AAEF,MAAM,UAAU,UAAU;IACtB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAsB,CAAC;IAErD,OAAO,CACH,KAAC,SAAS,IACN,QAAQ,EAAE,GAAG,EACb,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1C,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,+BAA+B,CAAC,EAC3D,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,WAC3C,CACL,CAAC;AACN,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { FC } from 'react';
2
+ import { CheckboxFieldState, InputFieldState } from '@servicetitan/form';
3
+ export interface OptOutMessageState {
4
+ subjectLine: InputFieldState<string>;
5
+ header: InputFieldState<string>;
6
+ body: InputFieldState<string>;
7
+ buttonText: InputFieldState<string>;
8
+ monthsLimit: InputFieldState<number>;
9
+ enabled: CheckboxFieldState;
10
+ autoSuppressionEnabled: CheckboxFieldState;
11
+ }
12
+ export interface OptOutMessageProps {
13
+ formState: OptOutMessageState;
14
+ onHandleClickEnable?(checked: boolean): void;
15
+ }
16
+ export declare const OptOutMessage: FC<OptOutMessageProps>;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/opt-out-message/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAmC,MAAM,OAAO,CAAC;AAG5D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AASzE,MAAM,WAAW,kBAAkB;IAC/B,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,sBAAsB,EAAE,kBAAkB,CAAC;CAC9C;AACD,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,mBAAmB,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAChD;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA8HhD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { observer } from 'mobx-react';
3
+ import { Fragment, useCallback, useState } from 'react';
4
+ import classnames from 'classnames';
5
+ import { Button, Form, Stack, Text, ToggleSwitch } from '@servicetitan/design-system';
6
+ import { useConfirm } from '@servicetitan/confirm';
7
+ import { SettingsSection } from '../settings-section';
8
+ import { OptOutEmailPreview } from '../email-preview/opt-out-email-preview';
9
+ import * as Styles from './opt-out-message.module.less';
10
+ export const OptOutMessage = observer(({ onHandleClickEnable, formState }) => {
11
+ const { subjectLine, header, body, buttonText, monthsLimit, enabled, autoSuppressionEnabled, } = formState;
12
+ const [isPreviewOpen, setIsPreviewOpen] = useState(false);
13
+ const openPreview = useCallback(() => setIsPreviewOpen(true), [setIsPreviewOpen]);
14
+ const closePreview = useCallback(() => setIsPreviewOpen(false), [setIsPreviewOpen]);
15
+ const handleClickEnable = (_0, checked) => {
16
+ onHandleClickEnable === null || onHandleClickEnable === void 0 ? void 0 : onHandleClickEnable(checked);
17
+ enabled.onChange(checked);
18
+ };
19
+ const [Confirm, handleConfirmed] = useConfirm(handleClickEnable);
20
+ return (_jsxs(SettingsSection, Object.assign({ className: Styles.outOutMessage, qaPrefix: "qa-opt-out-message", title: "Opt-Out Message", text: _jsxs(Fragment, { children: [_jsxs("div", { children: ["If customers haven\u2019t ", _jsx("b", { children: "opened" }, void 0), " one of your emails in a set time frame, you can send an opt-out message to allow them to set their email preferences."] }, void 0), _jsx(ToggleSwitch, { label: "Enable", onChange: handleConfirmed, checked: enabled.value, className: "m-t-2 qa-opt-out-message-enable" }, void 0)] }, void 0) }, { children: [_jsx(Text, Object.assign({ bold: true, className: "m-b-2" }, { children: "Opt-Out Email Content" }), void 0), _jsxs(Form, Object.assign({ className: "m-b-0-i" }, { children: [_jsx(Form.Input, { className: "m-b-2-i qa-opt-out-message-subject-line", value: subjectLine.value, onChange: subjectLine.onChangeHandler, error: subjectLine.hasError, label: "Subject Line", fluid: true, disabled: !enabled.value }, void 0), _jsx(Form.Input, { className: "m-b-2-i qa-opt-out-message-header", value: header.value, onChange: header.onChangeHandler, error: header.hasError, label: "Header", fluid: true, disabled: !enabled.value }, void 0), _jsx(Form.TextArea, { className: "m-b-2-i qa-opt-out-message-body-copy", label: "Body Copy", value: body.value, onChange: body.onChangeHandler, error: body.hasError, rows: 2, disabled: !enabled.value }, void 0), _jsx(Form.Input, { className: classnames(Styles.buttonInput, 'm-b-3-i qa-opt-out-message-button-text'), value: buttonText.value, onChange: buttonText.onChangeHandler, error: buttonText.hasError, label: "Button Text", disabled: !enabled.value }, void 0), _jsx(Button, Object.assign({ className: "qa-opt-out-message-preview-email", primary: true, onClick: openPreview, outline: true, small: true, disabled: !enabled.value }, { children: "Preview Email" }), void 0), _jsx("hr", {}, void 0)] }), void 0), _jsxs(Stack, Object.assign({ alignItems: "center", wrap: "wrap" }, { children: [_jsx(Text, Object.assign({ className: "m-b-1" }, { children: "Send when a recipient hasn\u2019t opened an email in" }), void 0), _jsx(Form.Input, { className: classnames(Styles.input, 'qa-opt-out-message-months', 'm-b-0'), value: monthsLimit.value, onChange: monthsLimit.onChangeHandler, error: monthsLimit.hasError, disabled: !enabled.value }, void 0), _jsx(Text, Object.assign({ className: "m-b-1" }, { children: "months." }), void 0)] }), void 0), _jsx(Form.Checkbox, { className: classnames('m-t-2-i', 'qa-opt-out-message-auto-suppress'), checked: autoSuppressionEnabled.value, onChange: autoSuppressionEnabled.onChangeHandler, disabled: !enabled.value, label: "Auto-suppress dormant emails" }, void 0), _jsx(Confirm, { title: "Disable Opt-Out Messaging", message: "Opt-Out messaging helps you keep dormant emails out of your audiences. Disabling it could potentially lead to worse email performance. Are you sure?", when: enabled.value }, void 0), _jsx(OptOutEmailPreview, Object.assign({}, formState, { open: isPreviewOpen, onClose: closePreview }), void 0)] }), void 0));
21
+ });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/settings/opt-out-message/index.tsx"],"names":[],"mappings":"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"}