@hashicorp/react-components 0.0.0-nightly.97eb452 → 0.0.0-nightly.9aa5827

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 (143) hide show
  1. package/.eslintrc.js +1 -2
  2. package/.stylelintrc.js +1 -1
  3. package/README.md +1 -1
  4. package/package.json +3 -8
  5. package/postcss.config.js +1 -1
  6. package/src/components/nav-panel/components/flight-icon/index.tsx +51 -0
  7. package/src/components/nav-panel/components/flight-icon/style.module.css +3 -0
  8. package/src/components/nav-panel/components/link/index.tsx +127 -0
  9. package/src/components/nav-panel/components/link/style.module.css +64 -0
  10. package/src/components/nav-panel/components/link-list/index.tsx +13 -65
  11. package/src/components/nav-panel/components/link-list/style.module.css +1 -50
  12. package/src/components/nav-panel/components/panel/column/style.module.css +2 -2
  13. package/src/components/nav-panel/components/panel/root/style.module.css +5 -5
  14. package/src/components/nav-panel/components/promo/index.tsx +31 -11
  15. package/src/components/nav-panel/components/promo/style.module.css +26 -12
  16. package/src/components/nav-panel/components/text/index.tsx +34 -0
  17. package/src/components/nav-panel/product-panel/index.tsx +54 -17
  18. package/src/components/nav-panel/product-panel/style.module.css +116 -36
  19. package/src/components/nav-panel/standard-panel/index.tsx +3 -0
  20. package/src/components/nav-panel/standard-panel/style.module.css +2 -2
  21. package/src/lib/get-localized-link-props/index.test.ts +30 -0
  22. package/src/lib/get-localized-link-props/index.ts +45 -0
  23. package/src/lib/parse-url/index.test.ts +30 -1
  24. package/src/lib/parse-url/index.ts +71 -8
  25. package/src/lib/send-posthog-event/index.ts +22 -0
  26. package/src/lib/supported-locales/index.ts +10 -0
  27. package/src/lib/track-nav-click-event/index.ts +4 -4
  28. package/src/components/actions/index.tsx +0 -107
  29. package/src/components/actions/style.module.css +0 -28
  30. package/src/components/actions/types.ts +0 -73
  31. package/src/components/call-to-action/index.tsx +0 -205
  32. package/src/components/call-to-action/styles/variant-centered.module.css +0 -93
  33. package/src/components/call-to-action/styles/variant-compact-grid.module.css +0 -88
  34. package/src/components/call-to-action/styles/variant-compact.module.css +0 -91
  35. package/src/components/call-to-action/styles/variant-links.module.css +0 -85
  36. package/src/components/card/README.md +0 -11
  37. package/src/components/card/card.tsx +0 -45
  38. package/src/components/card/index.test.tsx +0 -69
  39. package/src/components/card/index.tsx +0 -14
  40. package/src/components/card/newsroom-card/index.test.tsx +0 -39
  41. package/src/components/card/newsroom-card/index.tsx +0 -37
  42. package/src/components/card/newsroom-card/style.module.css +0 -12
  43. package/src/components/card/partner-card/index.test.tsx +0 -57
  44. package/src/components/card/partner-card/index.tsx +0 -69
  45. package/src/components/card/partner-card/style.module.css +0 -24
  46. package/src/components/card/person-card/index.test.tsx +0 -71
  47. package/src/components/card/person-card/index.tsx +0 -93
  48. package/src/components/card/person-card/style.module.css +0 -33
  49. package/src/components/card/primitives.tsx +0 -177
  50. package/src/components/card/promo-card/index.tsx +0 -51
  51. package/src/components/card/resource-card/index.test.tsx +0 -48
  52. package/src/components/card/resource-card/index.tsx +0 -37
  53. package/src/components/card/style.module.css +0 -145
  54. package/src/components/card/types.ts +0 -66
  55. package/src/components/card/unified-card/index.spec.tsx +0 -40
  56. package/src/components/card/unified-card/index.tsx +0 -58
  57. package/src/components/intro/index.tsx +0 -82
  58. package/src/components/intro/style.module.css +0 -67
  59. package/src/components/intro/types.ts +0 -44
  60. package/src/components/marketo-form/CHANGELOG.md +0 -122
  61. package/src/components/marketo-form/README.md +0 -1
  62. package/src/components/marketo-form/contexts/FormMetadata.ts +0 -13
  63. package/src/components/marketo-form/docs.mdx +0 -197
  64. package/src/components/marketo-form/fixtures/index.ts +0 -185
  65. package/src/components/marketo-form/form/index.tsx +0 -371
  66. package/src/components/marketo-form/index.test.tsx +0 -320
  67. package/src/components/marketo-form/index.ts +0 -11
  68. package/src/components/marketo-form/package.original.json +0 -30
  69. package/src/components/marketo-form/partials/error-message/index.tsx +0 -12
  70. package/src/components/marketo-form/partials/error-message/style.module.css +0 -13
  71. package/src/components/marketo-form/partials/field/index.tsx +0 -90
  72. package/src/components/marketo-form/partials/field-wrapper/index.tsx +0 -26
  73. package/src/components/marketo-form/partials/fields/checkbox-field/index.tsx +0 -32
  74. package/src/components/marketo-form/partials/fields/email-field/index.tsx +0 -35
  75. package/src/components/marketo-form/partials/fields/form-page-url-field/index.tsx +0 -23
  76. package/src/components/marketo-form/partials/fields/hidden-field/index.tsx +0 -38
  77. package/src/components/marketo-form/partials/fields/htmltext-field/index.tsx +0 -21
  78. package/src/components/marketo-form/partials/fields/htmltext-field/style.module.css +0 -18
  79. package/src/components/marketo-form/partials/fields/name-field/index.tsx +0 -19
  80. package/src/components/marketo-form/partials/fields/name-field/style.module.css +0 -13
  81. package/src/components/marketo-form/partials/fields/radio-buttons-field/index.tsx +0 -48
  82. package/src/components/marketo-form/partials/fields/select-field/index.tsx +0 -39
  83. package/src/components/marketo-form/partials/fields/select-field/style.module.css +0 -5
  84. package/src/components/marketo-form/partials/fields/telephone-field/index.tsx +0 -30
  85. package/src/components/marketo-form/partials/fields/text-field/index.tsx +0 -30
  86. package/src/components/marketo-form/partials/fields/textarea-field/index.tsx +0 -29
  87. package/src/components/marketo-form/partials/label/index.tsx +0 -24
  88. package/src/components/marketo-form/partials/label/style.module.css +0 -12
  89. package/src/components/marketo-form/partials/visibility-rule/index.tsx +0 -84
  90. package/src/components/marketo-form/props.js +0 -66
  91. package/src/components/marketo-form/server/api-routes.ts +0 -109
  92. package/src/components/marketo-form/server/client.ts +0 -98
  93. package/src/components/marketo-form/server/index.ts +0 -8
  94. package/src/components/marketo-form/types.ts +0 -268
  95. package/src/components/marketo-form/utils.test.tsx +0 -103
  96. package/src/components/marketo-form/utils.ts +0 -449
  97. package/src/components/next-steps/index.tsx +0 -138
  98. package/src/components/next-steps/style.module.css +0 -270
  99. package/src/components/next-steps/types.ts +0 -63
  100. package/src/components/product-badge/index.test.tsx +0 -11
  101. package/src/components/product-badge/index.tsx +0 -42
  102. package/src/components/product-badge/style.module.css +0 -76
  103. package/src/components/products-used/index.tsx +0 -84
  104. package/src/components/products-used/style.module.css +0 -87
  105. package/src/components/products-used/types.ts +0 -31
  106. package/src/components/related-content/index.test.tsx +0 -74
  107. package/src/components/related-content/index.tsx +0 -56
  108. package/src/components/related-content/style.module.css +0 -89
  109. package/src/components/related-content/types.ts +0 -21
  110. package/src/components/subnav/helpers/areBasePathsMatching.ts +0 -13
  111. package/src/components/subnav/helpers/traverse/index.ts +0 -42
  112. package/src/components/subnav/helpers/useHeightRef.ts +0 -42
  113. package/src/components/subnav/helpers/useNavRef.ts +0 -30
  114. package/src/components/subnav/helpers/useOverflowRef.ts +0 -85
  115. package/src/components/subnav/helpers/useStuckRef.ts +0 -51
  116. package/src/components/subnav/index.tsx +0 -203
  117. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.test.ts +0 -26
  118. package/src/components/subnav/partials/CtaLinks/github-stars-link/formatStarCount/index.ts +0 -22
  119. package/src/components/subnav/partials/CtaLinks/github-stars-link/index.tsx +0 -87
  120. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.test.ts +0 -29
  121. package/src/components/subnav/partials/CtaLinks/github-stars-link/parseGithubUrl/index.ts +0 -32
  122. package/src/components/subnav/partials/CtaLinks/github-stars-link/style.module.css +0 -81
  123. package/src/components/subnav/partials/CtaLinks/icons/github-logo.js +0 -20
  124. package/src/components/subnav/partials/CtaLinks/icons/github.svg.js +0 -7
  125. package/src/components/subnav/partials/CtaLinks/icons/star.js +0 -20
  126. package/src/components/subnav/partials/CtaLinks/index.tsx +0 -131
  127. package/src/components/subnav/partials/CtaLinks/style.module.css +0 -45
  128. package/src/components/subnav/partials/DropdownTrigger/index.tsx +0 -35
  129. package/src/components/subnav/partials/DropdownTrigger/style.module.css +0 -39
  130. package/src/components/subnav/partials/MenuItemsDefault/index.tsx +0 -158
  131. package/src/components/subnav/partials/MenuItemsDefault/style.module.css +0 -104
  132. package/src/components/subnav/partials/MenuItemsOverflow/index.tsx +0 -143
  133. package/src/components/subnav/partials/MenuItemsOverflow/style.module.css +0 -88
  134. package/src/components/subnav/partials/TitleLink/index.tsx +0 -113
  135. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-dark.ts +0 -10
  136. package/src/components/subnav/partials/TitleLink/mktg-logos/all-community-product-logos_on-light.ts +0 -10
  137. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-dark.ts +0 -23
  138. package/src/components/subnav/partials/TitleLink/mktg-logos/all-primary-logos_on-light.ts +0 -23
  139. package/src/components/subnav/partials/TitleLink/style.module.css +0 -43
  140. package/src/components/subnav/partials/nav-item-text/index.tsx +0 -37
  141. package/src/components/subnav/partials/nav-item-text/style.module.css +0 -13
  142. package/src/components/subnav/style.module.css +0 -66
  143. package/src/components/subnav/subnav-consts.ts +0 -1
@@ -1,185 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- import type { MarketoFormField } from '../types'
7
-
8
- const BASIC_FORM_PROPS = {
9
- metadata: {
10
- result: [
11
- {
12
- id: 9999,
13
- language: 'English',
14
- waitingLabel: 'Submitting...',
15
- buttonLabel: 'Submit',
16
- },
17
- ],
18
- },
19
- fields: {
20
- result: [
21
- {
22
- id: 'FirstName',
23
- label: 'First Name',
24
- dataType: 'text',
25
- validationMessage: 'This field is required.',
26
- rowNumber: 3,
27
- columnNumber: 0,
28
- required: true,
29
- visibilityRules: {
30
- ruleType: 'alwaysShow',
31
- },
32
- },
33
- {
34
- id: 'LastName',
35
- label: 'Last Name',
36
- dataType: 'text',
37
- validationMessage: 'This field is required.',
38
- rowNumber: 3,
39
- columnNumber: 0,
40
- required: true,
41
- formPrefill: true,
42
- visibilityRules: {
43
- ruleType: 'alwaysShow',
44
- },
45
- },
46
- ] as MarketoFormField[],
47
- },
48
- }
49
-
50
- const UTM_FORM_PROPS = {
51
- ...BASIC_FORM_PROPS,
52
- fields: {
53
- result: [
54
- ...BASIC_FORM_PROPS.fields.result,
55
- {
56
- id: 'utm_medium__c',
57
- label: 'utm_medium:',
58
- dataType: 'hidden',
59
- rowNumber: 7,
60
- columnNumber: 0,
61
- required: false,
62
- autoFill: {
63
- value: '',
64
- valueFrom: 'query',
65
- parameterName: 'utm_medium',
66
- },
67
- visibilityRules: {
68
- ruleType: 'alwaysShow',
69
- },
70
- },
71
- {
72
- id: 'form_page_url__c',
73
- label: 'form_page_url:',
74
- dataType: 'hidden',
75
- rowNumber: 7,
76
- columnNumber: 0,
77
- required: false,
78
- visibilityRules: {
79
- ruleType: 'alwaysShow',
80
- },
81
- },
82
- ] as MarketoFormField[],
83
- },
84
- }
85
-
86
- const COOKIE_UTM_FORM_PROPS = {
87
- ...BASIC_FORM_PROPS,
88
- fields: {
89
- result: [
90
- ...BASIC_FORM_PROPS.fields.result,
91
- {
92
- id: 'utm_content__c',
93
- label: 'utm_content:',
94
- dataType: 'hidden',
95
- rowNumber: 7,
96
- columnNumber: 0,
97
- required: false,
98
- autoFill: {
99
- value: '',
100
- valueFrom: 'query',
101
- parameterName: 'utm_content',
102
- },
103
- visibilityRules: {
104
- ruleType: 'alwaysShow',
105
- },
106
- },
107
- ] as MarketoFormField[],
108
- },
109
- }
110
-
111
- const VISIBILITY_RULE_FORM_PROPS = {
112
- ...BASIC_FORM_PROPS,
113
- fields: {
114
- result: [
115
- ...BASIC_FORM_PROPS.fields.result,
116
- {
117
- id: 'Phone',
118
- label: 'Phone Number',
119
- dataType: 'telephone',
120
- validationMessage: 'Must be a phone number.',
121
- rowNumber: 6,
122
- columnNumber: 0,
123
- required: false,
124
- formPrefill: true,
125
- visibilityRules: {
126
- rules: [
127
- {
128
- subjectField: 'fastTracktoSales',
129
- operator: 'is',
130
- values: ['yes'],
131
- altLabel: 'Phone Number:',
132
- },
133
- ],
134
- ruleType: 'show',
135
- },
136
- },
137
- {
138
- id: 'fastTracktoSales',
139
- label: 'Have salesperson contact me',
140
- dataType: 'checkbox',
141
- validationMessage: 'This field is required.',
142
- rowNumber: 7,
143
- columnNumber: 0,
144
- required: false,
145
- formPrefill: true,
146
- fieldMetaData: {
147
- initiallyChecked: false,
148
- },
149
- visibilityRules: {
150
- ruleType: 'alwaysShow',
151
- },
152
- },
153
- ] as MarketoFormField[],
154
- },
155
- }
156
-
157
- const HIDDEN_COOKIE_FIELD_FORM_PROPS = {
158
- ...BASIC_FORM_PROPS,
159
- fields: {
160
- result: [
161
- ...BASIC_FORM_PROPS.fields.result,
162
- {
163
- id: 'cookieHiddenField',
164
- label: 'Cookie Value',
165
- dataType: 'hidden',
166
- rowNumber: 20,
167
- columnNumber: 0,
168
- required: false,
169
- autoFill: {
170
- value: '',
171
- valueFrom: 'cookie',
172
- parameterName: 'hidden_cookie_field',
173
- },
174
- },
175
- ] as MarketoFormField[],
176
- },
177
- }
178
-
179
- export {
180
- BASIC_FORM_PROPS,
181
- UTM_FORM_PROPS,
182
- VISIBILITY_RULE_FORM_PROPS,
183
- COOKIE_UTM_FORM_PROPS,
184
- HIDDEN_COOKIE_FIELD_FORM_PROPS,
185
- }
@@ -1,371 +0,0 @@
1
- /**
2
- * Copyright (c) HashiCorp, Inc.
3
- * SPDX-License-Identifier: MPL-2.0
4
- */
5
-
6
- 'use client'
7
-
8
- import { useEffect, useMemo, useRef } from 'react'
9
- import { useForm, FormProvider } from 'react-hook-form'
10
- import { HDSPlusButton } from '@hashicorp/react-mds/src/hds-plus/button'
11
- import VisibilityRule from '../partials/visibility-rule'
12
- import NameField from '../partials/fields/name-field'
13
- import { FormMetadataContext } from '../contexts/FormMetadata'
14
- import {
15
- convertToRESTFields,
16
- groupFields,
17
- calculateDefaultValues,
18
- segmentIdentify,
19
- includesSkippedRecords,
20
- STORED_FIELD_NAMES,
21
- } from '../utils'
22
- import type {
23
- MarketoFormMetadataResponse,
24
- MarketoFormFieldsResponse,
25
- MarketoFormGroups,
26
- MarketoFormComponents,
27
- MarketoSubmissionResponse,
28
- } from '../types'
29
-
30
- interface Props {
31
- /**
32
- * The Marketo API response containing the metadata of the form.
33
- * See {@link MarketoFormMetadataResponse} for more details.
34
- */
35
- metadata: MarketoFormMetadataResponse
36
-
37
- /**
38
- * The Marketo API response containing the fields to render.
39
- * See {@link MarketoFormFieldsResponse} for more details.
40
- */
41
- fields: MarketoFormFieldsResponse
42
-
43
- /**
44
- * Configuration on which fields to render with a single component.
45
- * See {@link MarketoFormGroups} for more details.
46
- */
47
- groups?: MarketoFormGroups
48
-
49
- /**
50
- * Initial values to use for fields, primarily useful in setting values for
51
- * hidden fields that don't derive their values from URL parameters. Keys are
52
- * SOAP field names.
53
- */
54
- initialValues?: Record<string, any>
55
-
56
- /**
57
- * Custom components to be used in lieu of the default built-in components.
58
- * See {@link MarketoFormComponents} for more details.
59
- */
60
- components?: MarketoFormComponents
61
-
62
- /**
63
- * Text to use for the submit button. Defaults to "Submit".
64
- */
65
- submitTitle?: string
66
-
67
- /**
68
- * Additional class name to apply to the <form> element.
69
- */
70
- className?: string
71
-
72
- /**
73
- * Whether to reset the form after a successful submission.
74
- * Default: false
75
- */
76
- resetOnSubmission?: boolean
77
-
78
- /**
79
- * Callback called when form has started submission process.
80
- */
81
- onSubmitStart?: () => void
82
-
83
- /**
84
- * Callback called when form has been successfully submitted.
85
- */
86
- onSubmitSuccess?: () => void
87
-
88
- /**
89
- * Callback called when form submission results in an error.
90
- */
91
- onSubmitError?: () => void
92
-
93
- /**
94
- * Callback called after performing validation based on Marketo settings, but
95
- * before rendering error messages. Used to perform validations that aren't
96
- * supported by the Marketo API (such as checking if an email address is
97
- * correctly formatted).
98
- * @param values Map of field IDs to field values
99
- * @param errors Map of field IDs to error messages
100
- */
101
- validateFields?: (
102
- values: Record<string, string | boolean>,
103
- errors: Record<string, { message: string }>
104
- ) => Promise<{ values: any; errors: Record<string, { message: string }> }>
105
-
106
- /**
107
- * If false, the form will not persist field values in local storage.
108
- * Default: true
109
- */
110
- persistFieldValues?: boolean
111
-
112
- /**
113
- * Optional name of form to use for the forms aria-label.
114
- */
115
- formName?: string
116
- }
117
-
118
- const defaultFieldGroupings = {
119
- name: {
120
- fields: ['FirstName', 'LastName'],
121
- component: NameField,
122
- },
123
- }
124
-
125
- function isValidEmail(value: string): boolean {
126
- // Source: https://html.spec.whatwg.org/multipage/input.html#email-state-(type=email)
127
- // Slightly modified to require domains instead of bare TLDs
128
- /* eslint-disable-next-line no-useless-escape */
129
- return /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/i.test(
130
- value
131
- )
132
- }
133
-
134
- const Form = ({
135
- metadata,
136
- fields,
137
- groups = defaultFieldGroupings,
138
- initialValues,
139
- components,
140
- submitTitle,
141
- className,
142
- resetOnSubmission,
143
- onSubmitStart,
144
- onSubmitSuccess,
145
- onSubmitError,
146
- validateFields,
147
- persistFieldValues = true,
148
- formName,
149
- }: Props) => {
150
- // Track if the form has been rendered at least once, so that we know if
151
- // react-hook-form has already cached values.
152
- const hasBeenRendered = useRef(false)
153
-
154
- // memoized function that groups marketo fields based on supplied groups.
155
- // If a field doesn't belong to a group, it is placed in a group keyed by
156
- // field.Name.
157
- const groupedFields = useMemo(() => {
158
- if (!('result' in fields)) {
159
- return {}
160
- }
161
- return groupFields(fields.result, groups)
162
- }, [fields, groups])
163
-
164
- const methods = useForm({
165
- mode: 'onBlur',
166
- defaultValues:
167
- 'result' in fields
168
- ? calculateDefaultValues(fields.result, initialValues)
169
- : {},
170
- resolver: async (values: Record<string, string | boolean>) => {
171
- let errors: Record<string, { message: string }> = {}
172
-
173
- fields.result.forEach((field) => {
174
- if ('required' in field && field.required) {
175
- if (
176
- !(field.id in values) ||
177
- values[field.id] === '' ||
178
- values[field.id] === false ||
179
- values[field.id] === undefined ||
180
- values[field.id] === null ||
181
- (typeof values[field.id] === 'string' &&
182
- (values[field.id] as string).trim() === '')
183
- ) {
184
- errors[field.id] = {
185
- message: field.validationMessage ?? 'This field is required.',
186
- }
187
- }
188
- }
189
-
190
- // Validate that select field value is an allowed value
191
- if (field.dataType === 'select') {
192
- if (
193
- field.id in values &&
194
- field.fieldMetaData.values &&
195
- !field.fieldMetaData.values
196
- .map((v) => v.value)
197
- .includes(values[field.id] as string)
198
- ) {
199
- errors[field.id] = {
200
- message: field.validationMessage ?? 'Please select an option.',
201
- }
202
- }
203
- }
204
-
205
- if (field.dataType === 'email') {
206
- if (field.id in values && !isValidEmail(values[field.id] as string)) {
207
- errors[field.id] = {
208
- message:
209
- field.validationMessage ??
210
- 'Please enter a valid email address.',
211
- }
212
- }
213
- }
214
- })
215
-
216
- if (validateFields) {
217
- const additionalValidations = await validateFields(values, errors)
218
- values = additionalValidations.values
219
- errors = additionalValidations.errors
220
- }
221
-
222
- return { values, errors }
223
- },
224
- })
225
-
226
- // Reset form if initialValues changes since defaultValues is cached on the
227
- // first render. This handles the situation where initialValues is updated
228
- // after the form is rendered, primarily when using router state which is
229
- // resolved _after_ the initial render for SSG pages.
230
- useEffect(() => {
231
- if (hasBeenRendered.current) {
232
- const storedValues = persistFieldValues
233
- ? JSON.parse(localStorage.getItem('marketoFormData') || '{}')
234
- : null
235
- const newValues = calculateDefaultValues(fields.result, {
236
- ...storedValues,
237
- ...initialValues,
238
- })
239
- Object.entries(newValues).forEach(([fieldId, value]) => {
240
- if (!methods.getValues(fieldId)) {
241
- methods.setValue(fieldId, value)
242
- }
243
- })
244
- }
245
- }, [hasBeenRendered, methods, fields, initialValues])
246
-
247
- // Track that we've finished rendering.
248
- useEffect(() => {
249
- hasBeenRendered.current = true
250
- }, [hasBeenRendered])
251
-
252
- const onSubmit = async (data: Record<string, unknown>) => {
253
- if (onSubmitStart) {
254
- onSubmitStart()
255
- }
256
- const leadFormFields = convertToRESTFields(data)
257
-
258
- segmentIdentify(leadFormFields)
259
-
260
- const res = await fetch(`${window.location.origin}/api/marketo/submit`, {
261
- method: 'POST',
262
- headers: {
263
- 'Content-Type': 'application/json',
264
- },
265
- body: JSON.stringify({
266
- input: [
267
- {
268
- leadFormFields,
269
- visitorData: {
270
- pageURL: window.location.href,
271
- },
272
- },
273
- ],
274
- formId: metadata.result[0].id,
275
- }),
276
- })
277
- const marketoResponse = (await res.json()) as MarketoSubmissionResponse
278
- if (
279
- res.status === 200 &&
280
- marketoResponse.success &&
281
- !includesSkippedRecords(marketoResponse)
282
- ) {
283
- if (onSubmitSuccess) {
284
- onSubmitSuccess()
285
- }
286
-
287
- // Remove fields that shouldn't be stored in local storage
288
- const dataToPersist = Object.fromEntries(
289
- Object.entries(data).filter(([k]) => STORED_FIELD_NAMES.includes(k))
290
- )
291
- localStorage.setItem('marketoFormData', JSON.stringify(dataToPersist))
292
-
293
- if (resetOnSubmission) {
294
- methods.reset()
295
- }
296
- } else {
297
- console.error(marketoResponse)
298
- if (onSubmitError) {
299
- onSubmitError()
300
- }
301
-
302
- throw new Error('An error occurred while submitting form.')
303
- }
304
- }
305
-
306
- if (fields.success === false || metadata.success === false) {
307
- return (
308
- <div>
309
- <p>This form is currently unavailable. Please try again later.</p>
310
- </div>
311
- )
312
- }
313
-
314
- return (
315
- <FormMetadataContext.Provider value={metadata.result[0]}>
316
- <FormProvider {...methods}>
317
- <form
318
- className={className}
319
- onSubmit={methods.handleSubmit(onSubmit)}
320
- data-marketo-form-id={metadata.result[0].id}
321
- aria-label={formName}
322
- >
323
- {Object.entries(groupedFields).map(([groupName, fields]) => {
324
- // If this group name has a custom component defined, use that
325
- // instead of the default field components.
326
- if (groups && groupName in groups) {
327
- const Component = groups[groupName].component
328
- return (
329
- <Component
330
- key={fields.map((f) => f.id).join('-')}
331
- fields={fields}
332
- />
333
- )
334
- }
335
-
336
- if (fields.length > 1) {
337
- console.warn(
338
- `Multiple fields in group ${groupName} with no component defined.`
339
- )
340
- }
341
-
342
- return (
343
- <VisibilityRule
344
- key={fields[0].id}
345
- components={components}
346
- field={fields[0]}
347
- />
348
- )
349
- })}
350
- <HDSPlusButton
351
- type="submit"
352
- size="large"
353
- disabled={
354
- methods.formState.isSubmitting ||
355
- (methods.formState.isSubmitSuccessful && !resetOnSubmission)
356
- }
357
- text={
358
- methods.formState.isSubmitting ||
359
- (methods.formState.isSubmitSuccessful && !resetOnSubmission)
360
- ? metadata.result[0].waitingLabel
361
- : submitTitle ?? metadata.result[0].buttonLabel
362
- }
363
- />
364
- </form>
365
- </FormProvider>
366
- </FormMetadataContext.Provider>
367
- )
368
- }
369
-
370
- export { defaultFieldGroupings }
371
- export default Form