@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.
- package/lib/components/settings/company-details/company-details-form.stories.d.ts +9 -0
- package/lib/components/settings/company-details/company-details-form.stories.d.ts.map +1 -0
- package/lib/components/settings/company-details/company-details-form.stories.js +45 -0
- package/lib/components/settings/company-details/company-details-form.stories.js.map +1 -0
- package/lib/components/settings/company-details/index.d.ts +20 -0
- package/lib/components/settings/company-details/index.d.ts.map +1 -0
- package/lib/components/settings/company-details/index.js +11 -0
- package/lib/components/settings/company-details/index.js.map +1 -0
- package/lib/components/settings/company-email-footer/company-email-footer.stories.d.ts +9 -0
- package/lib/components/settings/company-email-footer/company-email-footer.stories.d.ts.map +1 -0
- package/lib/components/settings/company-email-footer/company-email-footer.stories.js +38 -0
- package/lib/components/settings/company-email-footer/company-email-footer.stories.js.map +1 -0
- package/lib/components/settings/company-email-footer/index.d.ts +11 -0
- package/lib/components/settings/company-email-footer/index.d.ts.map +1 -0
- package/lib/components/settings/company-email-footer/index.js +10 -0
- package/lib/components/settings/company-email-footer/index.js.map +1 -0
- package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.d.ts +9 -0
- package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.d.ts.map +1 -0
- package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.js +36 -0
- package/lib/components/settings/company-email-reply-to/company-email-reply-to.stories.js.map +1 -0
- package/lib/components/settings/company-email-reply-to/index.d.ts +7 -0
- package/lib/components/settings/company-email-reply-to/index.d.ts.map +1 -0
- package/lib/components/settings/company-email-reply-to/index.js +12 -0
- package/lib/components/settings/company-email-reply-to/index.js.map +1 -0
- package/lib/components/settings/company-email-sender/company-email-sender.module.less +7 -0
- package/lib/components/settings/company-email-sender/company-email-sender.stories.d.ts +9 -0
- package/lib/components/settings/company-email-sender/company-email-sender.stories.d.ts.map +1 -0
- package/lib/components/settings/company-email-sender/company-email-sender.stories.js +38 -0
- package/lib/components/settings/company-email-sender/company-email-sender.stories.js.map +1 -0
- package/lib/components/settings/company-email-sender/index.d.ts +12 -0
- package/lib/components/settings/company-email-sender/index.d.ts.map +1 -0
- package/lib/components/settings/company-email-sender/index.js +29 -0
- package/lib/components/settings/company-email-sender/index.js.map +1 -0
- package/lib/components/settings/company-trade-checkbox/company-trade-checkbox.module.less +13 -0
- package/lib/components/settings/company-trade-checkbox/index.d.ts +10 -0
- package/lib/components/settings/company-trade-checkbox/index.d.ts.map +1 -0
- package/lib/components/settings/company-trade-checkbox/index.js +14 -0
- package/lib/components/settings/company-trade-checkbox/index.js.map +1 -0
- package/lib/components/settings/company-trades-picker/company-trades-picker.stories.d.ts +10 -0
- package/lib/components/settings/company-trades-picker/company-trades-picker.stories.d.ts.map +1 -0
- package/lib/components/settings/company-trades-picker/company-trades-picker.stories.js +68 -0
- package/lib/components/settings/company-trades-picker/company-trades-picker.stories.js.map +1 -0
- package/lib/components/settings/company-trades-picker/index.d.ts +19 -0
- package/lib/components/settings/company-trades-picker/index.d.ts.map +1 -0
- package/lib/components/settings/company-trades-picker/index.js +16 -0
- package/lib/components/settings/company-trades-picker/index.js.map +1 -0
- package/lib/components/settings/double-opt-in/double-opt-in.module.less +3 -0
- package/lib/components/settings/double-opt-in/double-opt-in.stories.d.ts +9 -0
- package/lib/components/settings/double-opt-in/double-opt-in.stories.d.ts.map +1 -0
- package/lib/components/settings/double-opt-in/double-opt-in.stories.js +42 -0
- package/lib/components/settings/double-opt-in/double-opt-in.stories.js.map +1 -0
- package/lib/components/settings/double-opt-in/index.d.ts +16 -0
- package/lib/components/settings/double-opt-in/index.d.ts.map +1 -0
- package/lib/components/settings/double-opt-in/index.js +23 -0
- package/lib/components/settings/double-opt-in/index.js.map +1 -0
- package/lib/components/settings/email-preview/email-preview.d.ts +13 -0
- package/lib/components/settings/email-preview/email-preview.d.ts.map +1 -0
- package/lib/components/settings/email-preview/email-preview.js +9 -0
- package/lib/components/settings/email-preview/email-preview.js.map +1 -0
- package/lib/components/settings/email-preview/email-preview.module.less +62 -0
- package/lib/components/settings/email-preview/opt-in-email-preview.d.ts +10 -0
- package/lib/components/settings/email-preview/opt-in-email-preview.d.ts.map +1 -0
- package/lib/components/settings/email-preview/opt-in-email-preview.js +10 -0
- package/lib/components/settings/email-preview/opt-in-email-preview.js.map +1 -0
- package/lib/components/settings/email-preview/opt-out-email-preview.d.ts +9 -0
- package/lib/components/settings/email-preview/opt-out-email-preview.d.ts.map +1 -0
- package/lib/components/settings/email-preview/opt-out-email-preview.js +9 -0
- package/lib/components/settings/email-preview/opt-out-email-preview.js.map +1 -0
- package/lib/components/settings/index.d.ts +10 -0
- package/lib/components/settings/index.d.ts.map +1 -0
- package/lib/components/settings/index.js +10 -0
- package/lib/components/settings/index.js.map +1 -0
- package/lib/components/settings/logo-picker/index.d.ts +32 -0
- package/lib/components/settings/logo-picker/index.d.ts.map +1 -0
- package/lib/components/settings/logo-picker/index.js +88 -0
- package/lib/components/settings/logo-picker/index.js.map +1 -0
- package/lib/components/settings/logo-picker/logo-picker.module.less +21 -0
- package/lib/components/settings/logo-picker/logo-picker.stories.d.ts +9 -0
- package/lib/components/settings/logo-picker/logo-picker.stories.d.ts.map +1 -0
- package/lib/components/settings/logo-picker/logo-picker.stories.js +13 -0
- package/lib/components/settings/logo-picker/logo-picker.stories.js.map +1 -0
- package/lib/components/settings/opt-out-message/index.d.ts +17 -0
- package/lib/components/settings/opt-out-message/index.d.ts.map +1 -0
- package/lib/components/settings/opt-out-message/index.js +22 -0
- package/lib/components/settings/opt-out-message/index.js.map +1 -0
- package/lib/components/settings/opt-out-message/opt-out-message.module.less +20 -0
- package/lib/components/settings/opt-out-message/opt-out-message.stories.d.ts +9 -0
- package/lib/components/settings/opt-out-message/opt-out-message.stories.d.ts.map +1 -0
- package/lib/components/settings/opt-out-message/opt-out-message.stories.js +44 -0
- package/lib/components/settings/opt-out-message/opt-out-message.stories.js.map +1 -0
- package/lib/components/settings/settings-section/index.d.ts +11 -0
- package/lib/components/settings/settings-section/index.d.ts.map +1 -0
- package/lib/components/settings/settings-section/index.js +6 -0
- package/lib/components/settings/settings-section/index.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -0
- package/lib/utils/helpers.d.ts +7 -0
- package/lib/utils/helpers.d.ts.map +1 -0
- package/lib/utils/helpers.js +24 -0
- package/lib/utils/helpers.js.map +1 -0
- package/package.json +36 -0
- package/src/components/settings/company-details/company-details-form.stories.tsx +39 -0
- package/src/components/settings/company-details/index.tsx +157 -0
- package/src/components/settings/company-email-footer/company-email-footer.stories.tsx +26 -0
- package/src/components/settings/company-email-footer/index.tsx +79 -0
- package/src/components/settings/company-email-reply-to/company-email-reply-to.stories.tsx +23 -0
- package/src/components/settings/company-email-reply-to/index.tsx +38 -0
- package/src/components/settings/company-email-sender/company-email-sender.module.less +7 -0
- package/src/components/settings/company-email-sender/company-email-sender.module.less.d.ts +3 -0
- package/src/components/settings/company-email-sender/company-email-sender.stories.tsx +26 -0
- package/src/components/settings/company-email-sender/index.tsx +129 -0
- package/src/components/settings/company-trade-checkbox/company-trade-checkbox.module.less +13 -0
- package/src/components/settings/company-trade-checkbox/company-trade-checkbox.module.less.d.ts +4 -0
- package/src/components/settings/company-trade-checkbox/index.tsx +43 -0
- package/src/components/settings/company-trades-picker/company-trades-picker.stories.tsx +78 -0
- package/src/components/settings/company-trades-picker/index.tsx +78 -0
- package/src/components/settings/double-opt-in/double-opt-in.module.less +3 -0
- package/src/components/settings/double-opt-in/double-opt-in.module.less.d.ts +3 -0
- package/src/components/settings/double-opt-in/double-opt-in.stories.tsx +28 -0
- package/src/components/settings/double-opt-in/index.tsx +143 -0
- package/src/components/settings/email-preview/email-preview.module.less +62 -0
- package/src/components/settings/email-preview/email-preview.module.less.d.ts +8 -0
- package/src/components/settings/email-preview/email-preview.tsx +69 -0
- package/src/components/settings/email-preview/opt-in-email-preview.tsx +30 -0
- package/src/components/settings/email-preview/opt-out-email-preview.tsx +31 -0
- package/src/components/settings/index.ts +9 -0
- package/src/components/settings/logo-picker/index.tsx +256 -0
- package/src/components/settings/logo-picker/logo-picker.module.less +21 -0
- package/src/components/settings/logo-picker/logo-picker.module.less.d.ts +4 -0
- package/src/components/settings/logo-picker/logo-picker.stories.tsx +21 -0
- package/src/components/settings/opt-out-message/index.tsx +154 -0
- package/src/components/settings/opt-out-message/opt-out-message.module.less +20 -0
- package/src/components/settings/opt-out-message/opt-out-message.module.less.d.ts +5 -0
- package/src/components/settings/opt-out-message/opt-out-message.stories.tsx +31 -0
- package/src/components/settings/settings-section/index.tsx +35 -0
- package/src/index.ts +3 -0
- package/src/utils/helpers.ts +31 -0
- package/tsconfig.json +11 -0
- 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,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 @@
|
|
|
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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"}
|