@saasquatch/mint-components 1.13.2 → 1.13.3

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 (99) hide show
  1. package/dist/cjs/{ShadowViewAddon-cf0ee0a0.js → ShadowViewAddon-14a02da4.js} +133 -98
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/mint-components.cjs.js +1 -1
  4. package/dist/cjs/{sqm-big-stat_39.cjs.entry.js → sqm-big-stat_41.cjs.entry.js} +220 -2
  5. package/dist/cjs/sqm-portal-email-verification.cjs.entry.js +1 -1
  6. package/dist/cjs/sqm-portal-forgot-password.cjs.entry.js +1 -1
  7. package/dist/cjs/sqm-portal-google-registration-form.cjs.entry.js +1 -1
  8. package/dist/cjs/{sqm-portal-registration-form-view-ebf355a6.js → sqm-portal-registration-form-view-637a4bf4.js} +1 -0
  9. package/dist/cjs/sqm-portal-registration-form.cjs.entry.js +2 -1
  10. package/dist/cjs/sqm-portal-reset-password.cjs.entry.js +1 -1
  11. package/dist/cjs/sqm-portal-verify-email.cjs.entry.js +1 -1
  12. package/dist/cjs/sqm-stencilbook.cjs.entry.js +469 -381
  13. package/dist/collection/collection-manifest.json +2 -0
  14. package/dist/collection/components/sqm-checkbox-field/CheckboxField.stories.js +1 -1
  15. package/dist/collection/components/sqm-checkbox-field/sqm-checkbox-field-view.js +6 -15
  16. package/dist/collection/components/sqm-checkbox-field/sqm-checkbox-field.js +5 -5
  17. package/dist/collection/components/sqm-marketing-emails-checkbox/MarketingEmailsCheckbox.stories.js +11 -0
  18. package/dist/collection/components/sqm-marketing-emails-checkbox/sqm-marketing-emails-checkbox.js +129 -0
  19. package/dist/collection/components/sqm-portal-change-marketing/ChangeMarketing.stories.js +54 -0
  20. package/dist/collection/components/sqm-portal-change-marketing/sqm-portal-change-marketing-view.js +47 -0
  21. package/dist/collection/components/sqm-portal-change-marketing/sqm-portal-change-marketing.js +217 -0
  22. package/dist/collection/components/sqm-portal-change-marketing/usePortalChangeMarketing.js +115 -0
  23. package/dist/collection/components/sqm-portal-email-verification/sqm-portal-email-verification.js +3 -3
  24. package/dist/collection/components/sqm-portal-forgot-password/sqm-portal-forgot-password.js +3 -3
  25. package/dist/collection/components/sqm-portal-google-registration-form/sqm-portal-google-registration-form.js +2 -2
  26. package/dist/collection/components/sqm-portal-login/sqm-portal-login.js +3 -3
  27. package/dist/collection/components/sqm-portal-registration-form/PortalRegistrationForm.stories.js +4 -0
  28. package/dist/collection/components/sqm-portal-registration-form/sqm-portal-registration-form-view.js +1 -0
  29. package/dist/collection/components/sqm-portal-registration-form/sqm-portal-registration-form.js +3 -2
  30. package/dist/collection/components/sqm-portal-reset-password/sqm-portal-reset-password.js +3 -3
  31. package/dist/collection/components/sqm-portal-verify-email/sqm-portal-verify-email.js +3 -3
  32. package/dist/collection/components/sqm-stencilbook/sqm-stencilbook.js +6 -0
  33. package/dist/esm/{ShadowViewAddon-fd07e6e1.js → ShadowViewAddon-23a6afab.js} +133 -99
  34. package/dist/esm/loader.js +1 -1
  35. package/dist/esm/mint-components.js +1 -1
  36. package/dist/esm/{sqm-big-stat_39.entry.js → sqm-big-stat_41.entry.js} +219 -3
  37. package/dist/esm/sqm-portal-email-verification.entry.js +1 -1
  38. package/dist/esm/sqm-portal-forgot-password.entry.js +1 -1
  39. package/dist/esm/sqm-portal-google-registration-form.entry.js +1 -1
  40. package/dist/esm/{sqm-portal-registration-form-view-32c4b488.js → sqm-portal-registration-form-view-3c1f6000.js} +1 -0
  41. package/dist/esm/sqm-portal-registration-form.entry.js +2 -1
  42. package/dist/esm/sqm-portal-reset-password.entry.js +1 -1
  43. package/dist/esm/sqm-portal-verify-email.entry.js +1 -1
  44. package/dist/esm/sqm-stencilbook.entry.js +469 -381
  45. package/dist/esm-es5/ShadowViewAddon-23a6afab.js +1 -0
  46. package/dist/esm-es5/loader.js +1 -1
  47. package/dist/esm-es5/mint-components.js +1 -1
  48. package/dist/esm-es5/sqm-big-stat_41.entry.js +1 -0
  49. package/dist/esm-es5/sqm-portal-google-registration-form.entry.js +1 -1
  50. package/dist/esm-es5/{sqm-portal-registration-form-view-32c4b488.js → sqm-portal-registration-form-view-3c1f6000.js} +1 -1
  51. package/dist/esm-es5/sqm-portal-registration-form.entry.js +1 -1
  52. package/dist/esm-es5/sqm-stencilbook.entry.js +1 -1
  53. package/dist/mint-components/mint-components.esm.js +1 -1
  54. package/dist/mint-components/p-01010af0.entry.js +258 -0
  55. package/dist/mint-components/{p-079405ff.entry.js → p-0d2d0b6d.entry.js} +1 -1
  56. package/dist/mint-components/p-33ed6f1c.system.entry.js +1 -0
  57. package/dist/mint-components/p-37996351.system.js +1 -1
  58. package/dist/mint-components/p-38b5f028.system.entry.js +1 -0
  59. package/dist/mint-components/p-7e7cbccf.system.js +1 -0
  60. package/dist/mint-components/{p-e6045498.entry.js → p-7f80a9d7.entry.js} +1 -1
  61. package/dist/mint-components/{p-793d2130.js → p-91ab3da1.js} +1 -1
  62. package/dist/mint-components/{p-51d3cde7.system.entry.js → p-9386ad84.system.entry.js} +1 -1
  63. package/dist/mint-components/{p-54adee71.system.entry.js → p-9bfd9bed.system.entry.js} +1 -1
  64. package/dist/mint-components/p-d3d74266.js +394 -0
  65. package/dist/mint-components/{p-bb0f585c.system.js → p-e5d0375e.system.js} +1 -1
  66. package/dist/mint-components/p-f2cc6a6f.entry.js +9 -0
  67. package/dist/types/components/sqm-checkbox-field/sqm-checkbox-field-view.d.ts +1 -1
  68. package/dist/types/components/sqm-checkbox-field/sqm-checkbox-field.d.ts +4 -4
  69. package/dist/types/components/sqm-marketing-emails-checkbox/MarketingEmailsCheckbox.stories.d.ts +8 -0
  70. package/dist/types/components/sqm-marketing-emails-checkbox/sqm-marketing-emails-checkbox.d.ts +27 -0
  71. package/dist/types/components/sqm-portal-change-marketing/ChangeMarketing.stories.d.ts +8 -0
  72. package/dist/types/components/sqm-portal-change-marketing/sqm-portal-change-marketing-view.d.ts +28 -0
  73. package/dist/types/components/sqm-portal-change-marketing/sqm-portal-change-marketing.d.ts +39 -0
  74. package/dist/types/components/sqm-portal-change-marketing/usePortalChangeMarketing.d.ts +3 -0
  75. package/dist/types/components/sqm-portal-email-verification/sqm-portal-email-verification.d.ts +1 -1
  76. package/dist/types/components/sqm-portal-forgot-password/sqm-portal-forgot-password.d.ts +1 -1
  77. package/dist/types/components/sqm-portal-login/sqm-portal-login.d.ts +1 -1
  78. package/dist/types/components/sqm-portal-registration-form/PortalRegistrationForm.stories.d.ts +1 -0
  79. package/dist/types/components/sqm-portal-registration-form/sqm-portal-registration-form-view.d.ts +1 -0
  80. package/dist/types/components/sqm-portal-registration-form/sqm-portal-registration-form.d.ts +1 -1
  81. package/dist/types/components/sqm-portal-reset-password/sqm-portal-reset-password.d.ts +1 -1
  82. package/dist/types/components/sqm-portal-verify-email/sqm-portal-verify-email.d.ts +1 -1
  83. package/dist/types/components.d.ts +130 -13
  84. package/docs/docs.docx +0 -0
  85. package/docs/raisins.json +1 -1
  86. package/grapesjs/grapesjs.js +1 -1
  87. package/package.json +1 -1
  88. package/dist/esm-es5/ShadowViewAddon-fd07e6e1.js +0 -1
  89. package/dist/esm-es5/sqm-big-stat_39.entry.js +0 -1
  90. package/dist/mint-components/p-57e2c2fa.system.js +0 -1
  91. package/dist/mint-components/p-87d385d8.entry.js +0 -241
  92. package/dist/mint-components/p-abedbbf3.system.entry.js +0 -1
  93. package/dist/mint-components/p-bc83460e.system.entry.js +0 -1
  94. package/dist/mint-components/p-d12fc50f.js +0 -394
  95. package/dist/mint-components/p-da932ca2.entry.js +0 -9
  96. package/dist/types/global/android.d.ts +0 -7
  97. package/dist/types/global/demo.d.ts +0 -2
  98. package/dist/types/stories/features.d.ts +0 -4
  99. package/dist/types/stories/templates.d.ts +0 -4
@@ -46,12 +46,14 @@
46
46
  "./components/sqm-leaderboard-rank/sqm-leaderboard-rank.js",
47
47
  "./components/sqm-link-button/sqm-link-button.js",
48
48
  "./components/sqm-logout-current-user/sqm-logout-current-user.js",
49
+ "./components/sqm-marketing-emails-checkbox/sqm-marketing-emails-checkbox.js",
49
50
  "./components/sqm-name-fields/sqm-name-fields.js",
50
51
  "./components/sqm-navigation-menu/sqm-navigation-menu.js",
51
52
  "./components/sqm-navigation-sidebar/sqm-navigation-sidebar.js",
52
53
  "./components/sqm-navigation-sidebar-item/sqm-navigation-sidebar-item.js",
53
54
  "./components/sqm-payout-button-scroll/sqm-payout-button-scroll.js",
54
55
  "./components/sqm-popup-container/sqm-popup-container.js",
56
+ "./components/sqm-portal-change-marketing/sqm-portal-change-marketing.js",
55
57
  "./components/sqm-portal-change-password/sqm-portal-change-password.js",
56
58
  "./components/sqm-portal-container/sqm-portal-container.js",
57
59
  "./components/sqm-portal-email-verification/sqm-portal-email-verification.js",
@@ -17,7 +17,7 @@ const defaultProps = {
17
17
  checked: false,
18
18
  },
19
19
  content: {
20
- checkboxName: "agree",
20
+ checkboxName: "terms",
21
21
  checkboxLabel: "By signing up you agree to the {labelLink}",
22
22
  checkboxLabelLink: "https://example.com",
23
23
  checkboxLabelLinkText: "Terms and Conditions",
@@ -54,19 +54,10 @@ export function CheckboxFieldView(props) {
54
54
  h("sl-checkbox", Object.assign({ exportparts: "label: input-label, base: input-base", name: `/${content.checkboxName}`, checked: states.checked, "onSl-change": (e) => {
55
55
  e.target.value = e.target.checked;
56
56
  callbacks.setChecked(e.target.value);
57
- } }, (!content.checkboxOptional ? { required: true } : []), { disabled: ((_b = states.registrationFormState) === null || _b === void 0 ? void 0 : _b.loading) || ((_c = states.registrationFormState) === null || _c === void 0 ? void 0 : _c.disabled) }, (!states.checked && (validationErrors === null || validationErrors === void 0 ? void 0 : validationErrors[content.checkboxName])
58
- ? {
59
- class: sheet.classes.ErrorStyle,
60
- }
61
- : [])),
62
- intl.formatMessage({
63
- id: content.checkboxName + "-message",
64
- defaultMessage: content.checkboxLabel,
65
- }, {
66
- labelLink: (h("a", { href: content.checkboxLabelLink, target: "_blank" }, content.checkboxLabelLinkText || content.checkboxLabelLink)),
67
- }),
68
- !states.checked && (validationErrors === null || validationErrors === void 0 ? void 0 : validationErrors[content.checkboxName]) && (h("p", { class: sheet.classes.ErrorMessageStyle }, intl.formatMessage({
69
- id: `errorMessage-${content.checkboxName}`,
70
- defaultMessage: content.errorMessage,
71
- }))))));
57
+ } }, (!content.checkboxOptional ? { required: false } : []), { disabled: ((_b = states.registrationFormState) === null || _b === void 0 ? void 0 : _b.loading) || ((_c = states.registrationFormState) === null || _c === void 0 ? void 0 : _c.disabled), required: false }), intl.formatMessage({
58
+ id: content.checkboxName + "-message",
59
+ defaultMessage: content.checkboxLabel,
60
+ }, {
61
+ labelLink: (h("a", { href: content.checkboxLabelLink, target: "_blank" }, content.checkboxLabelLinkText || content.checkboxLabelLink)),
62
+ }))));
72
63
  }
@@ -10,7 +10,7 @@ import { useCheckboxField } from "./useCheckboxField";
10
10
  * @uiName Form Checkbox Field
11
11
  * @validParents ["sqm-portal-register","sqm-portal-registration-form"]
12
12
  * @exampleGroup Microsite Components
13
- * @example Form Checkbox Field - <sqm-checkbox-field checkbox-label="By signing up you agree to the {labelLink}" checkbox-label-link="https://example.com" checkbox-label-link-text="Terms and Conditions" error-message="Must be checked" ></sqm-checkbox-field>
13
+ * @example Form Checkbox Field - <sqm-checkbox-field checkbox-name="terms" checkbox-label="By signing up you agree to the {labelLink}" checkbox-label-link="https://example.com" checkbox-label-link-text="Terms and Conditions" error-message="Must be checked" ></sqm-checkbox-field>
14
14
  */
15
15
  export class CheckboxField {
16
16
  constructor() {
@@ -117,7 +117,7 @@ export class CheckboxField {
117
117
  "references": {}
118
118
  },
119
119
  "required": false,
120
- "optional": false,
120
+ "optional": true,
121
121
  "docs": {
122
122
  "tags": [{
123
123
  "text": "Checkbox label link",
@@ -138,7 +138,7 @@ export class CheckboxField {
138
138
  "references": {}
139
139
  },
140
140
  "required": false,
141
- "optional": false,
141
+ "optional": true,
142
142
  "docs": {
143
143
  "tags": [{
144
144
  "text": "Checkbox label link lext",
@@ -159,7 +159,7 @@ export class CheckboxField {
159
159
  "references": {}
160
160
  },
161
161
  "required": false,
162
- "optional": false,
162
+ "optional": true,
163
163
  "docs": {
164
164
  "tags": [{
165
165
  "text": "Unchecked error message",
@@ -197,7 +197,7 @@ export class CheckboxField {
197
197
  "mutable": false,
198
198
  "complexType": {
199
199
  "original": "DemoData<CheckboxFieldViewProps>",
200
- "resolved": "{ states?: { registrationFormState?: RegistrationFormState; checked: boolean; }; content?: { checkboxName: string; checkboxLabel: string; checkboxLabelLink?: string; checkboxLabelLinkText?: string; checkboxOptional?: boolean; errorMessage: string; }; }",
200
+ "resolved": "{ states?: { registrationFormState?: RegistrationFormState; checked: boolean; }; content?: { checkboxName: string; checkboxLabel: string; checkboxLabelLink?: string; checkboxLabelLinkText?: string; checkboxOptional?: boolean; errorMessage?: string; }; }",
201
201
  "references": {
202
202
  "DemoData": {
203
203
  "location": "import",
@@ -0,0 +1,11 @@
1
+ import { h } from "@stencil/core";
2
+ import scenario from "./sqm-marketing-emails-checkbox.feature";
3
+ export default {
4
+ title: "Components/Marketing Emails Checkbox",
5
+ parameters: {
6
+ scenario,
7
+ },
8
+ };
9
+ export const Default = () => {
10
+ return h("sqm-marketing-emails-checkbox", null);
11
+ };
@@ -0,0 +1,129 @@
1
+ import { isDemo } from "@saasquatch/component-boilerplate";
2
+ import { withHooks } from "@saasquatch/stencil-hooks";
3
+ import { Component, h, Prop, State } from "@stencil/core";
4
+ import deepmerge from "deepmerge";
5
+ import { getProps } from "../../utils/utils";
6
+ import { CheckboxFieldView, } from "../sqm-checkbox-field/sqm-checkbox-field-view";
7
+ import { useCheckboxField } from "../sqm-checkbox-field/useCheckboxField";
8
+ /**
9
+ * @uiName Marketing Emails Checkbox Field
10
+ * @validParents ["sqm-portal-register","sqm-portal-registration-form"]
11
+ * @requiredFeatures ["MARKETING_EMAILS"]
12
+ */
13
+ export class MarketingEmailsCheckbox {
14
+ constructor() {
15
+ this.ignored = true;
16
+ /**
17
+ * @uiName Checkbox label
18
+ * @uiWidget textArea
19
+ */
20
+ this.checkboxLabel = "I would like to receive marketing and promotional emails for this referral program";
21
+ /**
22
+ * @undocumented
23
+ */
24
+ this.checkboxName = "marketingEmailOptIn";
25
+ withHooks(this);
26
+ }
27
+ disconnectedCallback() { }
28
+ render() {
29
+ const content = {
30
+ ...getProps(this),
31
+ };
32
+ const { states, callbacks } = isDemo()
33
+ ? useCheckboxFieldDemo(this)
34
+ : useCheckboxField(this);
35
+ return (h(CheckboxFieldView, { states: states, content: content, callbacks: callbacks }));
36
+ }
37
+ static get is() { return "sqm-marketing-emails-checkbox"; }
38
+ static get properties() { return {
39
+ "checkboxLabel": {
40
+ "type": "string",
41
+ "mutable": false,
42
+ "complexType": {
43
+ "original": "string",
44
+ "resolved": "string",
45
+ "references": {}
46
+ },
47
+ "required": false,
48
+ "optional": false,
49
+ "docs": {
50
+ "tags": [{
51
+ "text": "Checkbox label",
52
+ "name": "uiName"
53
+ }, {
54
+ "text": "textArea",
55
+ "name": "uiWidget"
56
+ }],
57
+ "text": ""
58
+ },
59
+ "attribute": "checkbox-label",
60
+ "reflect": false,
61
+ "defaultValue": "\"I would like to receive marketing and promotional emails for this referral program\""
62
+ },
63
+ "checkboxName": {
64
+ "type": "string",
65
+ "mutable": false,
66
+ "complexType": {
67
+ "original": "string",
68
+ "resolved": "string",
69
+ "references": {}
70
+ },
71
+ "required": false,
72
+ "optional": false,
73
+ "docs": {
74
+ "tags": [{
75
+ "text": undefined,
76
+ "name": "undocumented"
77
+ }],
78
+ "text": ""
79
+ },
80
+ "attribute": "checkbox-name",
81
+ "reflect": false,
82
+ "defaultValue": "\"marketingEmailOptIn\""
83
+ },
84
+ "demoData": {
85
+ "type": "unknown",
86
+ "mutable": false,
87
+ "complexType": {
88
+ "original": "DemoData<CheckboxFieldViewProps>",
89
+ "resolved": "{ states?: { registrationFormState?: RegistrationFormState; checked: boolean; }; content?: { checkboxName: string; checkboxLabel: string; checkboxLabelLink?: string; checkboxLabelLinkText?: string; checkboxOptional?: boolean; errorMessage?: string; }; }",
90
+ "references": {
91
+ "DemoData": {
92
+ "location": "import",
93
+ "path": "../../global/demo"
94
+ },
95
+ "CheckboxFieldViewProps": {
96
+ "location": "import",
97
+ "path": "../sqm-checkbox-field/sqm-checkbox-field-view"
98
+ }
99
+ }
100
+ },
101
+ "required": false,
102
+ "optional": true,
103
+ "docs": {
104
+ "tags": [{
105
+ "text": undefined,
106
+ "name": "undocumented"
107
+ }, {
108
+ "text": "object",
109
+ "name": "uiType"
110
+ }],
111
+ "text": ""
112
+ }
113
+ }
114
+ }; }
115
+ static get states() { return {
116
+ "ignored": {}
117
+ }; }
118
+ }
119
+ function useCheckboxFieldDemo(props) {
120
+ return deepmerge({
121
+ states: {
122
+ registrationFormState: {},
123
+ checked: false,
124
+ },
125
+ callbacks: {
126
+ setChecked: () => { },
127
+ },
128
+ }, props.demoData || {}, { arrayMerge: (_, a) => a });
129
+ }
@@ -0,0 +1,54 @@
1
+ import { h } from "@stencil/core";
2
+ import { ChangeMarktingView } from "./sqm-portal-change-marketing-view";
3
+ export default {
4
+ title: "Components/Change Marketing Emails Status",
5
+ };
6
+ const defaultProps = {
7
+ states: {
8
+ success: false,
9
+ loading: false,
10
+ submitDisabled: false,
11
+ formState: {
12
+ marketingEmailOptIn: false,
13
+ errors: null,
14
+ error: "",
15
+ },
16
+ user: {
17
+ id: "zach",
18
+ accountId: "zach",
19
+ marketingEmailOptIn: false,
20
+ },
21
+ text: {
22
+ emailPreferencesHeader: "Email preferences",
23
+ marketingCheckboxLabel: "I want to receive marketing emails and promotions for this referral program from impact.com",
24
+ submitChangeButtonText: "Save",
25
+ successMessage: "Opt-in preference has been changed.",
26
+ },
27
+ },
28
+ callbacks: {
29
+ onSubmit: (props) => console.log(props),
30
+ setChecked: (value) => console.log(value),
31
+ },
32
+ };
33
+ export const Default = () => {
34
+ return h("sqm-portal-change-marketing", null);
35
+ };
36
+ export const Loading = () => {
37
+ return (h(ChangeMarktingView, Object.assign({}, defaultProps, { states: { ...defaultProps.states, loading: true } })));
38
+ };
39
+ export const Error = () => {
40
+ return (h(ChangeMarktingView, Object.assign({}, defaultProps, { states: {
41
+ ...defaultProps.states,
42
+ formState: {
43
+ ...defaultProps.states.formState,
44
+ errors: { error: true },
45
+ error: "An error string",
46
+ },
47
+ } })));
48
+ };
49
+ export const Success = () => {
50
+ return (h(ChangeMarktingView, Object.assign({}, defaultProps, { states: {
51
+ ...defaultProps.states,
52
+ success: true,
53
+ } })));
54
+ };
@@ -0,0 +1,47 @@
1
+ import { h } from "@stencil/core";
2
+ import { createStyleSheet } from "../../styling/JSS";
3
+ import { CheckboxFieldView } from "../sqm-checkbox-field/sqm-checkbox-field-view";
4
+ import { TextSpanView } from "../sqm-text-span/sqm-text-span-view";
5
+ export function ChangeMarktingView(props) {
6
+ const { states, callbacks } = props;
7
+ const { text, formState } = states;
8
+ const { error } = formState;
9
+ const style = {
10
+ Container: {
11
+ display: "flex",
12
+ flexDirection: "column",
13
+ gap: "var(--sl-spacing-x-small)",
14
+ padding: "0 var(--sl-spacing-xxx-large) var(--sl-spacing-xxx-large)",
15
+ },
16
+ SubmitButton: { marginBottom: "var(--sl-spacing-medium)" },
17
+ Error: {
18
+ "&::part(erroralert-base)": {
19
+ "margin-bottom": "15px",
20
+ },
21
+ },
22
+ Success: {
23
+ "&::part(successalert-base)": {
24
+ "margin-bottom": "15px",
25
+ },
26
+ },
27
+ };
28
+ const sheet = createStyleSheet(style);
29
+ const styleString = sheet.toString();
30
+ return (h("div", { class: sheet.classes.Container, part: "sqm-base" },
31
+ h("style", { type: "text/css" }, styleString),
32
+ h(TextSpanView, Object.assign({}, { type: "h2" }), text.emailPreferencesHeader),
33
+ h("sl-form", { "onSl-submit": callbacks.onSubmit },
34
+ h(CheckboxFieldView, { states: {
35
+ checked: states.formState.marketingEmailOptIn,
36
+ }, content: {
37
+ checkboxLabel: text.marketingCheckboxLabel,
38
+ checkboxName: "marketingEmailOptIn",
39
+ }, callbacks: {
40
+ setChecked: callbacks.setChecked,
41
+ } }),
42
+ h("sl-button", { class: sheet.classes.SubmitButton, type: "primary", submit: true, loading: states.loading, disabled: states.submitDisabled }, text.submitChangeButtonText),
43
+ error && (h("sqm-form-message", { class: sheet.classes.Error, type: "error", exportparts: "erroralert-icon" },
44
+ h("div", { part: "erroralert-text" }, error))),
45
+ states.success && (h("sqm-form-message", { class: sheet.classes.Success, type: "success", exportparts: "successalert-icon" },
46
+ h("div", { part: "successalert-text" }, states.text.successMessage))))));
47
+ }
@@ -0,0 +1,217 @@
1
+ import { Component, h, Prop, State } from "@stencil/core";
2
+ import { withHooks } from "@saasquatch/stencil-hooks";
3
+ import { ChangeMarktingView, } from "./sqm-portal-change-marketing-view";
4
+ import { usePortalProfile } from "./usePortalChangeMarketing";
5
+ import { getProps } from "../../utils/utils";
6
+ import { isDemo } from "@saasquatch/component-boilerplate";
7
+ import deepmerge from "deepmerge";
8
+ /**
9
+ * @uiName Change Marketing Opt in Status
10
+ * @requiredFeatures ["MARKETING_EMAILS"]
11
+ */
12
+ export class PortalChangeMarketing {
13
+ constructor() {
14
+ this.ignored = true;
15
+ /**
16
+ * @uiName Email preferences header
17
+ */
18
+ this.emailPreferencesHeader = "Email preferences";
19
+ /**
20
+ * @uiName Marketing checkbox label
21
+ */
22
+ this.marketingCheckboxLabel = "I want to receive marketing emails and promotions for this referral program from impact.com";
23
+ /**
24
+ * @uiName Submit changes button text
25
+ */
26
+ this.submitChangeButtonText = "Save";
27
+ /**
28
+ * Displayed when the page fails to load due to a network error. The participant can try refreshing the page.
29
+ *
30
+ * @uiName Network request error message
31
+ */
32
+ this.networkRequestMessage = "An error occurred while loading this page. Please refresh the page.";
33
+ /**
34
+ * @uiName Successful update message
35
+ */
36
+ this.successMessage = "Opt-in preference has been changed.";
37
+ withHooks(this);
38
+ }
39
+ disconnectedCallback() { }
40
+ render() {
41
+ const props = isDemo()
42
+ ? usePortalProfileDemo(getProps(this))
43
+ : usePortalProfile(getProps(this));
44
+ return h(ChangeMarktingView, Object.assign({}, props));
45
+ }
46
+ static get is() { return "sqm-portal-change-marketing"; }
47
+ static get encapsulation() { return "shadow"; }
48
+ static get properties() { return {
49
+ "emailPreferencesHeader": {
50
+ "type": "string",
51
+ "mutable": false,
52
+ "complexType": {
53
+ "original": "string",
54
+ "resolved": "string",
55
+ "references": {}
56
+ },
57
+ "required": false,
58
+ "optional": false,
59
+ "docs": {
60
+ "tags": [{
61
+ "text": "Email preferences header",
62
+ "name": "uiName"
63
+ }],
64
+ "text": ""
65
+ },
66
+ "attribute": "email-preferences-header",
67
+ "reflect": false,
68
+ "defaultValue": "\"Email preferences\""
69
+ },
70
+ "marketingCheckboxLabel": {
71
+ "type": "string",
72
+ "mutable": false,
73
+ "complexType": {
74
+ "original": "string",
75
+ "resolved": "string",
76
+ "references": {}
77
+ },
78
+ "required": false,
79
+ "optional": false,
80
+ "docs": {
81
+ "tags": [{
82
+ "text": "Marketing checkbox label",
83
+ "name": "uiName"
84
+ }],
85
+ "text": ""
86
+ },
87
+ "attribute": "marketing-checkbox-label",
88
+ "reflect": false,
89
+ "defaultValue": "\"I want to receive marketing emails and promotions for this referral program from impact.com\""
90
+ },
91
+ "submitChangeButtonText": {
92
+ "type": "string",
93
+ "mutable": false,
94
+ "complexType": {
95
+ "original": "string",
96
+ "resolved": "string",
97
+ "references": {}
98
+ },
99
+ "required": false,
100
+ "optional": false,
101
+ "docs": {
102
+ "tags": [{
103
+ "text": "Submit changes button text",
104
+ "name": "uiName"
105
+ }],
106
+ "text": ""
107
+ },
108
+ "attribute": "submit-change-button-text",
109
+ "reflect": false,
110
+ "defaultValue": "\"Save\""
111
+ },
112
+ "networkRequestMessage": {
113
+ "type": "string",
114
+ "mutable": false,
115
+ "complexType": {
116
+ "original": "string",
117
+ "resolved": "string",
118
+ "references": {}
119
+ },
120
+ "required": false,
121
+ "optional": false,
122
+ "docs": {
123
+ "tags": [{
124
+ "text": "Network request error message",
125
+ "name": "uiName"
126
+ }],
127
+ "text": "Displayed when the page fails to load due to a network error. The participant can try refreshing the page."
128
+ },
129
+ "attribute": "network-request-message",
130
+ "reflect": false,
131
+ "defaultValue": "\"An error occurred while loading this page. Please refresh the page.\""
132
+ },
133
+ "successMessage": {
134
+ "type": "string",
135
+ "mutable": false,
136
+ "complexType": {
137
+ "original": "string",
138
+ "resolved": "string",
139
+ "references": {}
140
+ },
141
+ "required": false,
142
+ "optional": false,
143
+ "docs": {
144
+ "tags": [{
145
+ "text": "Successful update message",
146
+ "name": "uiName"
147
+ }],
148
+ "text": ""
149
+ },
150
+ "attribute": "success-message",
151
+ "reflect": false,
152
+ "defaultValue": "\"Opt-in preference has been changed.\""
153
+ },
154
+ "demoData": {
155
+ "type": "unknown",
156
+ "mutable": false,
157
+ "complexType": {
158
+ "original": "DemoData<ChangeMarketingViewProps>",
159
+ "resolved": "{ states?: { success: boolean; loading: boolean; submitDisabled: boolean; formState: { marketingEmailOptIn: boolean; errors: any; error: string; }; user: { id: string; accountId: string; marketingEmailOptIn: boolean; }; text: { emailPreferencesHeader: string; marketingCheckboxLabel: string; submitChangeButtonText: string; successMessage: string; }; }; }",
160
+ "references": {
161
+ "DemoData": {
162
+ "location": "import",
163
+ "path": "../../global/demo"
164
+ },
165
+ "ChangeMarketingViewProps": {
166
+ "location": "import",
167
+ "path": "./sqm-portal-change-marketing-view"
168
+ }
169
+ }
170
+ },
171
+ "required": false,
172
+ "optional": true,
173
+ "docs": {
174
+ "tags": [{
175
+ "text": undefined,
176
+ "name": "undocumented"
177
+ }, {
178
+ "text": "object",
179
+ "name": "uiType"
180
+ }],
181
+ "text": ""
182
+ }
183
+ }
184
+ }; }
185
+ static get states() { return {
186
+ "ignored": {}
187
+ }; }
188
+ }
189
+ function usePortalProfileDemo(props) {
190
+ return deepmerge({
191
+ states: {
192
+ success: false,
193
+ loading: false,
194
+ submitDisabled: false,
195
+ user: {
196
+ id: "01",
197
+ accountId: "111100000",
198
+ marketingEmailOptIn: false,
199
+ },
200
+ text: {
201
+ emailPreferencesHeader: props.emailPreferencesHeader,
202
+ marketingCheckboxLabel: props.marketingCheckboxLabel,
203
+ submitChangeButtonText: props.submitChangeButtonText,
204
+ successMessage: props.successMessage,
205
+ },
206
+ formState: {
207
+ marketingEmailOptIn: false,
208
+ errors: null,
209
+ error: "",
210
+ },
211
+ },
212
+ callbacks: {
213
+ onSubmit: (e) => console.log(e),
214
+ setChecked: () => { },
215
+ },
216
+ }, props.demoData || {}, { arrayMerge: (_, a) => a });
217
+ }
@@ -0,0 +1,115 @@
1
+ import { useMutation, useQuery, useUserIdentity, } from "@saasquatch/component-boilerplate";
2
+ import { useEffect, useState } from "@saasquatch/universal-hooks";
3
+ import { gql } from "graphql-request";
4
+ import jsonpointer from "jsonpointer";
5
+ const GET_USER = gql `
6
+ query {
7
+ viewer {
8
+ ... on User {
9
+ id
10
+ accountId
11
+ marketingEmailOptIn
12
+ }
13
+ }
14
+ }
15
+ `;
16
+ const UPSERT_USER = gql `
17
+ mutation ($userInput: UserInput!) {
18
+ upsertUser(userInput: $userInput) {
19
+ id
20
+ marketingEmailOptIn
21
+ }
22
+ }
23
+ `;
24
+ // view doesn't tolerate undefined, even when we're loading
25
+ const defaultFormState = {
26
+ marketingEmailOptIn: false,
27
+ errors: {},
28
+ error: "",
29
+ };
30
+ export function usePortalProfile(props) {
31
+ const userIdent = useUserIdentity();
32
+ const [success, setSuccess] = useState(false);
33
+ const [userData, setUserData] = useState(undefined);
34
+ const [formState, setFormState] = useState(defaultFormState);
35
+ const userDataResponse = useQuery(GET_USER, {}, !(userIdent === null || userIdent === void 0 ? void 0 : userIdent.jwt));
36
+ const [upsertUser, upsertUserResponse] = useMutation(UPSERT_USER);
37
+ useEffect(() => {
38
+ if (upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.loading)
39
+ return;
40
+ if (upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.errors) {
41
+ setFormState((state) => {
42
+ var _a, _b, _c;
43
+ return ({
44
+ ...state,
45
+ error: (_c = (_b = (_a = upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.errors) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.errors) === null || _c === void 0 ? void 0 : _c[0].message,
46
+ });
47
+ });
48
+ }
49
+ else {
50
+ setUserData((state) => {
51
+ var _a;
52
+ return ({
53
+ ...state,
54
+ ...(_a = upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.data) === null || _a === void 0 ? void 0 : _a.upsertUser,
55
+ });
56
+ });
57
+ if (upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.data)
58
+ setSuccess(true);
59
+ }
60
+ }, [upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.loading]);
61
+ useEffect(() => {
62
+ var _a, _b;
63
+ setUserData((data) => { var _a; return ({ ...data, ...(_a = userDataResponse === null || userDataResponse === void 0 ? void 0 : userDataResponse.data) === null || _a === void 0 ? void 0 : _a.viewer }); });
64
+ setFormState({
65
+ ...defaultFormState,
66
+ ...(_a = userDataResponse.data) === null || _a === void 0 ? void 0 : _a.viewer,
67
+ ...(_b = upsertUserResponse.data) === null || _b === void 0 ? void 0 : _b.upsertUser,
68
+ });
69
+ }, [userDataResponse === null || userDataResponse === void 0 ? void 0 : userDataResponse.data]);
70
+ useEffect(() => {
71
+ var _a, _b;
72
+ if ((_a = upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.errors) === null || _a === void 0 ? void 0 : _a.message) {
73
+ setFormState({
74
+ ...(_b = userDataResponse.data) === null || _b === void 0 ? void 0 : _b.viewer,
75
+ error: props.networkRequestMessage,
76
+ });
77
+ }
78
+ }, [upsertUserResponse === null || upsertUserResponse === void 0 ? void 0 : upsertUserResponse.errors]);
79
+ const onSubmit = (event) => {
80
+ var _a;
81
+ setSuccess(false);
82
+ const formData = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.formData;
83
+ formData === null || formData === void 0 ? void 0 : formData.forEach((value, key) => {
84
+ jsonpointer.set(formData, key, value);
85
+ });
86
+ upsertUser({
87
+ userInput: {
88
+ id: userIdent === null || userIdent === void 0 ? void 0 : userIdent.id,
89
+ accountId: userIdent === null || userIdent === void 0 ? void 0 : userIdent.accountId,
90
+ marketingEmailOptIn: Boolean(formData.marketingEmailOptIn),
91
+ },
92
+ });
93
+ setFormState((s) => ({ ...s, errors: {}, error: "" }));
94
+ return;
95
+ };
96
+ return {
97
+ states: {
98
+ success,
99
+ loading: (userDataResponse === null || userDataResponse === void 0 ? void 0 : userDataResponse.loading) || upsertUserResponse.loading,
100
+ submitDisabled: false,
101
+ formState,
102
+ user: userData,
103
+ text: {
104
+ emailPreferencesHeader: props.emailPreferencesHeader,
105
+ marketingCheckboxLabel: props.marketingCheckboxLabel,
106
+ submitChangeButtonText: props.submitChangeButtonText,
107
+ successMessage: props.successMessage,
108
+ },
109
+ },
110
+ callbacks: {
111
+ onSubmit,
112
+ setChecked: (value) => setFormState({ ...formState, marketingEmailOptIn: value }),
113
+ },
114
+ };
115
+ }