@xyo-network/react-xns 7.5.8 → 7.5.12

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 (26) hide show
  1. package/dist/browser/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.d.ts +1 -414
  2. package/dist/browser/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.d.ts.map +1 -1
  3. package/dist/browser/index.mjs +200 -186
  4. package/dist/browser/index.mjs.map +1 -1
  5. package/package.json +113 -33
  6. package/src/components/EstimateName/EstimateNameTextField.stories.tsx +0 -23
  7. package/src/components/EstimateName/EstimateNameTextField.tsx +0 -70
  8. package/src/components/EstimateName/index.ts +0 -1
  9. package/src/components/XnsNameCapture/Errors.tsx +0 -56
  10. package/src/components/XnsNameCapture/Props.ts +0 -48
  11. package/src/components/XnsNameCapture/SecondaryLink.stories.tsx +0 -18
  12. package/src/components/XnsNameCapture/SecondaryLink.tsx +0 -61
  13. package/src/components/XnsNameCapture/XnsNameCapture.stories.tsx +0 -19
  14. package/src/components/XnsNameCapture/XnsNameCapture.tsx +0 -116
  15. package/src/components/XnsNameCapture/XnsNameCaptureWithContext.stories.tsx +0 -61
  16. package/src/components/XnsNameCapture/XnsNameCaptureWithContext.tsx +0 -18
  17. package/src/components/XnsNameCapture/hooks/index.ts +0 -1
  18. package/src/components/XnsNameCapture/hooks/routing/index.ts +0 -2
  19. package/src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts +0 -21
  20. package/src/components/XnsNameCapture/hooks/routing/useXnsNameFromLocation.ts +0 -26
  21. package/src/components/XnsNameCapture/index.ts +0 -6
  22. package/src/components/XnsNameCapture/lib/index.ts +0 -1
  23. package/src/components/XnsNameCapture/lib/navigateWithUsername.ts +0 -21
  24. package/src/components/index.ts +0 -2
  25. package/src/global.d.ts +0 -1
  26. package/src/index.ts +0 -1
@@ -1,12 +1,20 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/components/EstimateName/EstimateNameTextField.tsx
5
2
  import { TextField, useTheme } from "@mui/material";
6
3
  import { alphaCss } from "@xylabs/react-theme";
7
4
  import { MIN_DOMAIN_LENGTH, XnsNameHelper } from "@xyo-network/xns-record-payloadset-plugins";
8
- import React, { useLayoutEffect, useRef, useState } from "react";
9
- var XnsEstimateNameTextField = /* @__PURE__ */ __name(({ maskOutput = true, onChange: onChangeProp, onBlur: onBlurProp, value, ...props }) => {
5
+ import {
6
+ useLayoutEffect,
7
+ useRef,
8
+ useState
9
+ } from "react";
10
+ import { jsx } from "react/jsx-runtime";
11
+ var XnsEstimateNameTextField = ({
12
+ maskOutput = true,
13
+ onChange: onChangeProp,
14
+ onBlur: onBlurProp,
15
+ value,
16
+ ...props
17
+ }) => {
10
18
  const theme = useTheme();
11
19
  const [validLength, setValidLength] = useState(false);
12
20
  const inputRef = useRef(null);
@@ -20,10 +28,8 @@ var XnsEstimateNameTextField = /* @__PURE__ */ __name(({ maskOutput = true, onCh
20
28
  if (inputRef.current && typeof value === "string") {
21
29
  inputRef.current.value = value;
22
30
  }
23
- }, [
24
- value
25
- ]);
26
- const handleChange = /* @__PURE__ */ __name((event) => {
31
+ }, [value]);
32
+ const handleChange = (event) => {
27
33
  if (maskOutput) {
28
34
  const value2 = event.target.value;
29
35
  event.target.value = XnsNameHelper.mask(value2);
@@ -32,66 +38,74 @@ var XnsEstimateNameTextField = /* @__PURE__ */ __name(({ maskOutput = true, onCh
32
38
  if (inputRef.current) {
33
39
  setValidLength(inputRef.current.value.length >= MIN_DOMAIN_LENGTH);
34
40
  }
35
- }, "handleChange");
36
- const handleBlur = /* @__PURE__ */ __name((event) => {
41
+ };
42
+ const handleBlur = (event) => {
37
43
  if (maskOutput) {
38
44
  const value2 = event.target.value;
39
- event.target.value = XnsNameHelper.mask(value2, {
40
- maskStartEndHyphens: true
41
- });
45
+ event.target.value = XnsNameHelper.mask(value2, { maskStartEndHyphens: true });
42
46
  }
43
47
  onBlurProp?.(event);
44
- }, "handleBlur");
45
- return /* @__PURE__ */ React.createElement(TextField, {
46
- inputRef,
47
- onBlur: handleBlur,
48
- onChange: handleChange,
49
- ...props,
50
- slotProps: {
51
- htmlInput: {
52
- style: {
53
- color: validLength ? theme.vars.palette.text.primary : alphaCss(theme.vars.palette.text.primary, 0.5)
54
- }
55
- }
48
+ };
49
+ return /* @__PURE__ */ jsx(
50
+ TextField,
51
+ {
52
+ inputRef,
53
+ onBlur: handleBlur,
54
+ onChange: handleChange,
55
+ ...props,
56
+ slotProps: { htmlInput: { style: { color: validLength ? theme.vars.palette.text.primary : alphaCss(theme.vars.palette.text.primary, 0.5) } } }
56
57
  }
57
- });
58
- }, "XnsEstimateNameTextField");
58
+ );
59
+ };
59
60
 
60
61
  // src/components/XnsNameCapture/Errors.tsx
61
- import { Alert, Snackbar, useMediaQuery, useTheme as useTheme2 } from "@mui/material";
62
+ import {
63
+ Alert,
64
+ Snackbar,
65
+ useMediaQuery,
66
+ useTheme as useTheme2
67
+ } from "@mui/material";
62
68
  import { FlexRow } from "@xylabs/react-flexbox";
63
- import React2 from "react";
64
- var XnsNameCaptureErrors = /* @__PURE__ */ __name(({ error, errorUi, resetError }) => {
69
+ import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
70
+ var XnsNameCaptureErrors = ({
71
+ error,
72
+ errorUi,
73
+ resetError
74
+ }) => {
65
75
  const theme = useTheme2();
66
76
  const isMobile = useMediaQuery(theme.breakpoints.down("md"));
67
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, errorUi === "toast" ? /* @__PURE__ */ React2.createElement(Snackbar, {
68
- open: !!error,
69
- message: error?.toString(),
70
- autoHideDuration: 3e3,
71
- onClose: /* @__PURE__ */ __name(() => resetError?.(), "onClose"),
72
- anchorOrigin: {
73
- vertical: "bottom",
74
- horizontal: "center"
75
- }
76
- }, /* @__PURE__ */ React2.createElement(Alert, {
77
- severity: "error",
78
- sx: {
79
- width: "100%",
80
- display: isMobile && !error ? "none" : void 0,
81
- visibility: error ? "visible" : "hidden"
77
+ return /* @__PURE__ */ jsx2(Fragment, { children: errorUi === "toast" ? /* @__PURE__ */ jsx2(
78
+ Snackbar,
79
+ {
80
+ open: !!error,
81
+ message: error?.toString(),
82
+ autoHideDuration: 3e3,
83
+ onClose: () => resetError?.(),
84
+ anchorOrigin: { vertical: "bottom", horizontal: "center" },
85
+ children: /* @__PURE__ */ jsx2(
86
+ Alert,
87
+ {
88
+ severity: "error",
89
+ sx: {
90
+ width: "100%",
91
+ display: isMobile && !error ? "none" : void 0,
92
+ visibility: error ? "visible" : "hidden"
93
+ },
94
+ children: error?.message
95
+ }
96
+ )
82
97
  }
83
- }, error?.message)) : (() => {
84
- return /* @__PURE__ */ React2.createElement(FlexRow, {
85
- alignSelf: "stretch"
86
- }, /* @__PURE__ */ React2.createElement(Alert, {
87
- severity: "error",
88
- sx: {
89
- display: isMobile && !error ? "none" : void 0,
90
- visibility: error ? "visible" : "hidden"
98
+ ) : (() => {
99
+ return /* @__PURE__ */ jsx2(FlexRow, { alignSelf: "stretch", children: /* @__PURE__ */ jsx2(
100
+ Alert,
101
+ {
102
+ severity: "error",
103
+ sx: { display: isMobile && !error ? "none" : void 0, visibility: error ? "visible" : "hidden" },
104
+ children: error?.message
91
105
  }
92
- }, error?.message));
93
- })());
94
- }, "XnsNameCaptureErrors");
106
+ ) });
107
+ })() });
108
+ };
95
109
 
96
110
  // src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts
97
111
  import { useMemo } from "react";
@@ -99,41 +113,29 @@ import { useNavigate, useSearchParams } from "react-router-dom";
99
113
 
100
114
  // src/components/XnsNameCapture/hooks/routing/useXnsNameFromLocation.ts
101
115
  import { useLocation } from "react-router-dom";
102
- var useXnsNameFromLocation = /* @__PURE__ */ __name(() => {
116
+ var useXnsNameFromLocation = () => {
103
117
  const location = useLocation();
104
118
  const search = new URLSearchParams(location.search);
105
119
  const rawName = (search.get("xnsname") ?? search.get("name") ?? search.get("username") ?? "").toLowerCase();
106
120
  switch (rawName?.split(".").length) {
107
121
  case 1: {
108
- return [
109
- rawName,
110
- void 0
111
- ];
122
+ return [rawName, void 0];
112
123
  }
113
124
  case 2: {
114
125
  const rawNameParts = rawName.split(".");
115
126
  if (rawNameParts[1] !== "xyo") {
116
- return [
117
- ,
118
- new Error("Invalid xNS name [Bad root]")
119
- ];
127
+ return [void 0, new Error("Invalid xNS name [Bad root]")];
120
128
  }
121
- return [
122
- rawNameParts[0],
123
- void 0
124
- ];
129
+ return [rawNameParts[0], void 0];
125
130
  }
126
131
  default: {
127
- return [
128
- ,
129
- new Error("Invalid xNS name [Too many parts]")
130
- ];
132
+ return [void 0, new Error("Invalid xNS name [Too many parts]")];
131
133
  }
132
134
  }
133
- }, "useXnsNameFromLocation");
135
+ };
134
136
 
135
137
  // src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts
136
- var useXnsNameCaptureRouting = /* @__PURE__ */ __name((props) => {
138
+ var useXnsNameCaptureRouting = (props) => {
137
139
  const [params] = useSearchParams();
138
140
  const navigate = useNavigate();
139
141
  const [name, error] = useXnsNameFromLocation();
@@ -143,14 +145,8 @@ var useXnsNameCaptureRouting = /* @__PURE__ */ __name((props) => {
143
145
  routingError: error,
144
146
  navigate: props.navigate ?? ((to) => navigate(to)),
145
147
  paramsString: props.paramsString ? `${props.paramsString}${params.toString()}` : params.toString()
146
- }), [
147
- props,
148
- name,
149
- error,
150
- params,
151
- navigate
152
- ]);
153
- }, "useXnsNameCaptureRouting");
148
+ }), [props, name, error, params, navigate]);
149
+ };
154
150
 
155
151
  // src/components/XnsNameCapture/SecondaryLink.tsx
156
152
  import { ArrowForwardRounded } from "@mui/icons-material";
@@ -158,42 +154,51 @@ import { Stack } from "@mui/material";
158
154
  import { LinkEx } from "@xylabs/react-link";
159
155
  import { useUserEvents } from "@xylabs/react-pixel";
160
156
  import { XnsNameHelper as XnsNameHelper2 } from "@xyo-network/xns-record-payloadset-plugins";
161
- import React3 from "react";
162
- var XnsCaptureSecondaryLink = /* @__PURE__ */ __name(({ funnel = "xns", navigate, onCaptureName, paramsString = "", intent, placement = "", setError, text = "Or make a free reservation", to = "/xns/reservation", xnsName, ...props }) => {
157
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
158
+ var XnsCaptureSecondaryLink = ({
159
+ funnel = "xns",
160
+ navigate,
161
+ onCaptureName,
162
+ paramsString = "",
163
+ intent,
164
+ placement = "",
165
+ setError,
166
+ text = "Or make a free reservation",
167
+ to = "/xns/reservation",
168
+ xnsName,
169
+ ...props
170
+ }) => {
163
171
  const userEvents = useUserEvents("warn");
164
- return /* @__PURE__ */ React3.createElement(LinkEx, {
165
- paddingX: 0,
166
- color: "inherit",
167
- style: {
168
- textDecoration: "underline",
169
- textUnderlineOffset: "5px"
170
- },
171
- onClick: /* @__PURE__ */ __name(async () => {
172
- const formattedXnsName = `${xnsName}.xyo`;
173
- const helper = XnsNameHelper2.fromString(formattedXnsName);
174
- const [valid, errors] = await helper.validate();
175
- if (valid) {
176
- await userEvents?.userClick({
177
- funnel,
178
- placement,
179
- intent
180
- });
181
- navigate?.(`${to}?username=${xnsName}${paramsString}`);
182
- await onCaptureName?.(xnsName);
183
- } else {
184
- setError?.(new Error(errors.join(", ")));
185
- }
186
- }, "onClick"),
187
- ...props
188
- }, /* @__PURE__ */ React3.createElement(Stack, {
189
- flexDirection: "row",
190
- gap: 0.5,
191
- alignItems: "center",
192
- sx: {
193
- cursor: "pointer"
172
+ return /* @__PURE__ */ jsx3(
173
+ LinkEx,
174
+ {
175
+ paddingX: 0,
176
+ color: "inherit",
177
+ style: { textDecoration: "underline", textUnderlineOffset: "5px" },
178
+ onClick: async () => {
179
+ const formattedXnsName = `${xnsName}.xyo`;
180
+ const helper = XnsNameHelper2.fromString(formattedXnsName);
181
+ const [valid, errors] = await helper.validate();
182
+ if (valid) {
183
+ await userEvents?.userClick({
184
+ funnel,
185
+ placement,
186
+ intent
187
+ });
188
+ navigate?.(`${to}?username=${xnsName}${paramsString}`);
189
+ await onCaptureName?.(xnsName);
190
+ } else {
191
+ setError?.(new Error(errors.join(", ")));
192
+ }
193
+ },
194
+ ...props,
195
+ children: /* @__PURE__ */ jsxs(Stack, { flexDirection: "row", gap: 0.5, alignItems: "center", sx: { cursor: "pointer" }, children: [
196
+ text,
197
+ /* @__PURE__ */ jsx3(ArrowForwardRounded, {})
198
+ ] })
194
199
  }
195
- }, text, /* @__PURE__ */ React3.createElement(ArrowForwardRounded, null)));
196
- }, "XnsCaptureSecondaryLink");
200
+ );
201
+ };
197
202
 
198
203
  // src/components/XnsNameCapture/XnsNameCapture.tsx
199
204
  import { KeyboardArrowRightRounded } from "@mui/icons-material";
@@ -201,10 +206,10 @@ import { useMediaQuery as useMediaQuery2, useTheme as useTheme3 } from "@mui/mat
201
206
  import { ButtonEx } from "@xylabs/react-button";
202
207
  import { FlexCol, FlexRow as FlexRow2 } from "@xylabs/react-flexbox";
203
208
  import { MIN_DOMAIN_LENGTH as MIN_DOMAIN_LENGTH2, XnsNameHelper as XnsNameHelper3 } from "@xyo-network/xns-record-payloadset-plugins";
204
- import React4, { useCallback, useState as useState2 } from "react";
209
+ import { useCallback, useState as useState2 } from "react";
205
210
 
206
211
  // src/components/XnsNameCapture/lib/navigateWithUsername.ts
207
- var navigateWithUsername = /* @__PURE__ */ __name((xnsName, paramsString, navigate, to) => {
212
+ var navigateWithUsername = (xnsName, paramsString, navigate, to) => {
208
213
  const params = new URLSearchParams(paramsString);
209
214
  const usernameParam = params.get("username");
210
215
  if (usernameParam) {
@@ -218,21 +223,41 @@ var navigateWithUsername = /* @__PURE__ */ __name((xnsName, paramsString, naviga
218
223
  } else {
219
224
  navigate?.(`${to}?username=${xnsName}&${paramsString}`);
220
225
  }
221
- }, "navigateWithUsername");
226
+ };
222
227
 
223
228
  // src/components/XnsNameCapture/XnsNameCapture.tsx
224
- var XnsNameCapture = /* @__PURE__ */ __name(({ autoFocus = false, buttonText = "Buy My Name", children, defaultXnsName, disabled, errorUi = "alert", funnel = "xns", intent = "unset", mobileButtonText = "Buy", navigate, onCaptureName: onCaptureNameProp, onNameChange, paramsString = "", placement = "", routingError, showSecondary = false, to = "/xns/estimation", ...props }) => {
229
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
230
+ var XnsNameCapture = ({
231
+ autoFocus = false,
232
+ buttonText = "Buy My Name",
233
+ children,
234
+ defaultXnsName,
235
+ disabled,
236
+ errorUi = "alert",
237
+ funnel = "xns",
238
+ intent = "unset",
239
+ mobileButtonText = "Buy",
240
+ navigate,
241
+ onCaptureName: onCaptureNameProp,
242
+ onNameChange,
243
+ paramsString = "",
244
+ placement = "",
245
+ routingError,
246
+ showSecondary = false,
247
+ to = "/xns/estimation",
248
+ ...props
249
+ }) => {
225
250
  const [xnsName, setXnsName] = useState2(() => defaultXnsName ?? "");
226
251
  const [error, setError] = useState2(routingError);
227
252
  const theme = useTheme3();
228
253
  const isMobile = useMediaQuery2(theme.breakpoints.down("md"));
229
254
  const captureDisabled = !xnsName || xnsName.length < MIN_DOMAIN_LENGTH2;
230
- const handleChange = /* @__PURE__ */ __name((event) => {
255
+ const handleChange = (event) => {
231
256
  const NsName = XnsNameHelper3.mask(event.target.value);
232
257
  onNameChange?.(NsName);
233
258
  setXnsName(NsName);
234
259
  setError(void 0);
235
- }, "handleChange");
260
+ };
236
261
  const onCaptureName = useCallback(async () => {
237
262
  if (captureDisabled) return;
238
263
  const formattedXnsName = `${xnsName}.xyo`;
@@ -244,81 +269,70 @@ var XnsNameCapture = /* @__PURE__ */ __name(({ autoFocus = false, buttonText = "
244
269
  } else {
245
270
  setError(new Error(errors.join(", ")));
246
271
  }
247
- }, [
248
- captureDisabled,
249
- xnsName,
250
- onCaptureNameProp,
251
- paramsString,
252
- navigate,
253
- to
254
- ]);
272
+ }, [captureDisabled, xnsName, onCaptureNameProp, paramsString, navigate, to]);
255
273
  const onKeyDown = useCallback(async (event) => {
256
274
  if (event.key === "Enter" && !captureDisabled) {
257
275
  await onCaptureName?.();
258
276
  }
259
- }, [
260
- captureDisabled,
261
- onCaptureName
262
- ]);
263
- return /* @__PURE__ */ React4.createElement(
264
- FlexCol,
265
- {
266
- gap: showSecondary ? 1.5 : 0,
267
- alignItems: "center",
268
- ...props
269
- },
270
- /* @__PURE__ */ React4.createElement(FlexRow2, {
271
- gap: 1
272
- }, /* @__PURE__ */ React4.createElement(XnsEstimateNameTextField, {
273
- autoFocus,
274
- disabled,
275
- label: "xNS Name",
276
- variant: "outlined",
277
- size: "small",
278
- value: xnsName ?? "",
279
- onKeyDown,
280
- onChange: handleChange,
281
- onBlur: handleChange
282
- }), /* @__PURE__ */ React4.createElement(ButtonEx, {
283
- disabled: captureDisabled,
284
- funnel,
285
- intent,
286
- placement,
287
- variant: "contained",
288
- color: "success",
289
- endIcon: /* @__PURE__ */ React4.createElement(KeyboardArrowRightRounded, null),
290
- onClick: onCaptureName
291
- }, isMobile ? mobileButtonText : buttonText)),
292
- showSecondary === true ? /* @__PURE__ */ React4.createElement(XnsCaptureSecondaryLink, {
293
- xnsName,
294
- placement,
295
- funnel,
296
- setError
297
- }) : null,
277
+ }, [captureDisabled, onCaptureName]);
278
+ return /* @__PURE__ */ jsxs2(FlexCol, { gap: showSecondary ? 1.5 : 0, alignItems: "center", ...props, children: [
279
+ /* @__PURE__ */ jsxs2(FlexRow2, { gap: 1, children: [
280
+ /* @__PURE__ */ jsx4(
281
+ XnsEstimateNameTextField,
282
+ {
283
+ autoFocus,
284
+ disabled,
285
+ label: "xNS Name",
286
+ variant: "outlined",
287
+ size: "small",
288
+ value: xnsName ?? "",
289
+ onKeyDown,
290
+ onChange: handleChange,
291
+ onBlur: handleChange
292
+ }
293
+ ),
294
+ /* @__PURE__ */ jsx4(
295
+ ButtonEx,
296
+ {
297
+ disabled: captureDisabled,
298
+ funnel,
299
+ intent,
300
+ placement,
301
+ variant: "contained",
302
+ color: "success",
303
+ endIcon: /* @__PURE__ */ jsx4(KeyboardArrowRightRounded, {}),
304
+ onClick: onCaptureName,
305
+ children: isMobile ? mobileButtonText : buttonText
306
+ }
307
+ )
308
+ ] }),
309
+ showSecondary === true ? /* @__PURE__ */ jsx4(
310
+ XnsCaptureSecondaryLink,
311
+ {
312
+ xnsName,
313
+ placement,
314
+ funnel,
315
+ setError
316
+ }
317
+ ) : null,
298
318
  // eslint-disable-next-line unicorn/prefer-logical-operator-over-ternary
299
319
  showSecondary ? showSecondary : null,
300
320
  children,
301
- /* @__PURE__ */ React4.createElement(XnsNameCaptureErrors, {
302
- error,
303
- errorUi,
304
- resetError: /* @__PURE__ */ __name(() => setError(void 0), "resetError")
305
- })
306
- );
307
- }, "XnsNameCapture");
321
+ /* @__PURE__ */ jsx4(XnsNameCaptureErrors, { error, errorUi, resetError: () => setError(void 0) })
322
+ ] });
323
+ };
308
324
 
309
325
  // src/components/XnsNameCapture/XnsNameCaptureWithContext.tsx
310
- import React5, { useMemo as useMemo2 } from "react";
311
- var XnsNameCaptureWithContext = /* @__PURE__ */ __name((props) => {
326
+ import { useMemo as useMemo2 } from "react";
327
+ import { jsx as jsx5 } from "react/jsx-runtime";
328
+ var XnsNameCaptureWithContext = (props) => {
312
329
  const routingProps = useXnsNameCaptureRouting(props);
313
330
  const updatedProps = useMemo2(() => ({
314
331
  ...props,
315
332
  ...routingProps
316
- }), [
317
- routingProps,
318
- props
319
- ]);
320
- return /* @__PURE__ */ React5.createElement(XnsNameCapture, updatedProps);
321
- }, "XnsNameCaptureWithContext");
333
+ }), [routingProps, props]);
334
+ return /* @__PURE__ */ jsx5(XnsNameCapture, { ...updatedProps });
335
+ };
322
336
  export {
323
337
  XnsCaptureSecondaryLink,
324
338
  XnsEstimateNameTextField,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/EstimateName/EstimateNameTextField.tsx","../../src/components/XnsNameCapture/Errors.tsx","../../src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts","../../src/components/XnsNameCapture/hooks/routing/useXnsNameFromLocation.ts","../../src/components/XnsNameCapture/SecondaryLink.tsx","../../src/components/XnsNameCapture/XnsNameCapture.tsx","../../src/components/XnsNameCapture/lib/navigateWithUsername.ts","../../src/components/XnsNameCapture/XnsNameCaptureWithContext.tsx"],"sourcesContent":["import type { StandardTextFieldProps, TextFieldProps } from '@mui/material'\nimport { TextField, useTheme } from '@mui/material'\nimport { alphaCss } from '@xylabs/react-theme'\nimport { MIN_DOMAIN_LENGTH, XnsNameHelper } from '@xyo-network/xns-record-payloadset-plugins'\nimport React, {\n useLayoutEffect,\n useRef, useState,\n} from 'react'\n\nexport interface XnsEstimateNameTextFieldProps {\n maskOutput?: boolean\n}\n\nexport const XnsEstimateNameTextField: React.FC<XnsEstimateNameTextFieldProps & TextFieldProps> = ({\n maskOutput = true, onChange: onChangeProp, onBlur: onBlurProp, value, ...props\n}) => {\n const theme = useTheme()\n const [validLength, setValidLength] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n // watch for external changes to the value and update the validLength state\n const [previousValue, setPreviousValue] = useState<unknown>(value)\n if (value !== previousValue) {\n setPreviousValue(value)\n const validValueLength = !!(value && typeof value === 'string' && value.length >= MIN_DOMAIN_LENGTH)\n setValidLength(validValueLength)\n }\n\n // Update the input value when the value prop changes\n // The intent of this component is to remain uncontrolled to avoid the need to manage the value state\n // Therefore, we use useLayoutEffect to update the input value directly.\n useLayoutEffect(() => {\n if (inputRef.current && typeof value === 'string') {\n inputRef.current.value = value\n }\n }, [value])\n\n // override onChange to mask the input and update the event value\n const handleChange: StandardTextFieldProps['onChange'] = (event) => {\n if (maskOutput) {\n const value = event.target.value\n event.target.value = XnsNameHelper.mask(value)\n }\n onChangeProp?.(event)\n\n if (inputRef.current) {\n setValidLength(inputRef.current.value.length >= MIN_DOMAIN_LENGTH)\n }\n }\n\n // override onBlur to do a final mask of the input and update the event value\n const handleBlur: StandardTextFieldProps['onBlur'] = (event) => {\n if (maskOutput) {\n const value = event.target.value\n event.target.value = XnsNameHelper.mask(value, { maskStartEndHyphens: true })\n }\n onBlurProp?.(event)\n }\n\n return (\n <TextField\n inputRef={inputRef}\n onBlur={handleBlur}\n onChange={handleChange}\n {...props}\n slotProps={{ htmlInput: { style: { color: validLength ? theme.vars.palette.text.primary : alphaCss(theme.vars.palette.text.primary, 0.5) } } }}\n />\n )\n}\n","import {\n Alert, Snackbar, useMediaQuery, useTheme,\n} from '@mui/material'\nimport { FlexRow } from '@xylabs/react-flexbox'\nimport React from 'react'\n\nexport interface XnsNameCaptureErrorsProps {\n error?: Error\n errorUi?: 'alert' | 'toast'\n resetError?: () => void\n}\n\nexport const XnsNameCaptureErrors: React.FC<XnsNameCaptureErrorsProps> = ({\n error, errorUi, resetError,\n}) => {\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('md'))\n\n return (\n <>\n {(errorUi === 'toast')\n ? (\n <Snackbar\n open={!!error}\n message={error?.toString()}\n autoHideDuration={3000}\n onClose={() => resetError?.()}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n >\n <Alert\n severity=\"error\"\n sx={{\n width: '100%', display: (isMobile && !error) ? 'none' : undefined, visibility: error ? 'visible' : 'hidden',\n }}\n >\n {error?.message}\n </Alert>\n </Snackbar>\n )\n // eslint-disable-next-line react-x/unsupported-syntax\n : (() => {\n // setTimeout(() => setError(undefined), 1500)\n return (\n <FlexRow alignSelf=\"stretch\">\n <Alert\n severity=\"error\"\n sx={{ display: (isMobile && !error) ? 'none' : undefined, visibility: error ? 'visible' : 'hidden' }}\n >\n {error?.message}\n </Alert>\n </FlexRow>\n )\n })()}\n </>\n )\n}\n","import { useMemo } from 'react'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\n\nimport type { XnsNameCaptureProps } from '../../Props.ts'\nimport { useXnsNameFromLocation } from './useXnsNameFromLocation.ts'\n\nexport const useXnsNameCaptureRouting = (props: XnsNameCaptureProps) => {\n const [params] = useSearchParams()\n\n const navigate = useNavigate()\n\n const [name, error] = useXnsNameFromLocation()\n\n return useMemo(() => ({\n ...props,\n defaultXnsName: name,\n routingError: error,\n navigate: props.navigate ?? ((to: string) => navigate(to)),\n paramsString: props.paramsString ? `${props.paramsString}${params.toString()}` : params.toString(),\n }), [props, name, error, params, navigate])\n}\n","import { useLocation } from 'react-router-dom'\n\n/**\n * Assumes the user was redirected with a link that contains a username query parameter.\n * @returns The xNS name from the URI username query parameter.\n */\nexport const useXnsNameFromLocation = (): [name: string | undefined, error: Error | undefined] => {\n const location = useLocation()\n const search = new URLSearchParams(location.search)\n const rawName = (search.get('xnsname') ?? search.get('name') ?? search.get('username') ?? '').toLowerCase()\n switch (rawName?.split('.').length) {\n case 1: {\n return [rawName, undefined]\n }\n case 2: {\n const rawNameParts = rawName.split('.')\n if (rawNameParts[1] !== 'xyo') {\n return [, new Error('Invalid xNS name [Bad root]')]\n }\n return [rawNameParts[0], undefined]\n }\n default: {\n return [, new Error('Invalid xNS name [Too many parts]')]\n }\n }\n}\n","import { ArrowForwardRounded } from '@mui/icons-material'\nimport { Stack } from '@mui/material'\nimport type { LinkExProps } from '@xylabs/react-link'\nimport { LinkEx } from '@xylabs/react-link'\nimport { useUserEvents } from '@xylabs/react-pixel'\nimport { XnsNameHelper } from '@xyo-network/xns-record-payloadset-plugins'\nimport type { Dispatch } from 'react'\nimport React from 'react'\n\nimport type {\n XnsNameCaptureBuyCallbacks, XnsNameCaptureRoutingProps, XnsNameCaptureTrackingProps,\n} from './Props.ts'\n\nexport type XnsCaptureSecondaryLinkProps = XnsNameCaptureTrackingProps & XnsNameCaptureRoutingProps & XnsNameCaptureBuyCallbacks & LinkExProps & {\n setError?: Dispatch<Error | undefined>\n text?: string\n xnsName: string\n}\n\nexport const XnsCaptureSecondaryLink: React.FC<XnsCaptureSecondaryLinkProps> = ({\n funnel = 'xns',\n navigate,\n onCaptureName,\n paramsString = '',\n intent,\n placement = '',\n setError,\n text = 'Or make a free reservation',\n to = '/xns/reservation',\n xnsName,\n ...props\n}) => {\n const userEvents = useUserEvents('warn')\n return (\n <LinkEx\n paddingX={0}\n color=\"inherit\"\n style={{ textDecoration: 'underline', textUnderlineOffset: '5px' }}\n onClick={async () => {\n const formattedXnsName = `${xnsName}.xyo`\n const helper = XnsNameHelper.fromString(formattedXnsName)\n const [valid, errors] = await helper.validate()\n if (valid) {\n await userEvents?.userClick({\n funnel, placement, intent,\n })\n navigate?.(`${to}?username=${xnsName}${paramsString}`)\n await onCaptureName?.(xnsName)\n } else {\n setError?.(new Error(errors.join(', ')))\n }\n }}\n {...props}\n >\n <Stack flexDirection=\"row\" gap={0.5} alignItems=\"center\" sx={{ cursor: 'pointer' }}>\n {text}\n <ArrowForwardRounded />\n </Stack>\n </LinkEx>\n )\n}\n","import { KeyboardArrowRightRounded } from '@mui/icons-material'\nimport type { StandardTextFieldProps } from '@mui/material'\nimport { useMediaQuery, useTheme } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { FlexCol, FlexRow } from '@xylabs/react-flexbox'\nimport { MIN_DOMAIN_LENGTH, XnsNameHelper } from '@xyo-network/xns-record-payloadset-plugins'\nimport type { KeyboardEventHandler } from 'react'\nimport React, { useCallback, useState } from 'react'\n\nimport { XnsEstimateNameTextField } from '../EstimateName/index.ts'\nimport { XnsNameCaptureErrors } from './Errors.tsx'\nimport { navigateWithUsername } from './lib/index.ts'\nimport type { XnsNameCaptureProps } from './Props.ts'\nimport { XnsCaptureSecondaryLink } from './SecondaryLink.js'\n\nexport const XnsNameCapture: React.FC<XnsNameCaptureProps> = ({\n autoFocus = false,\n buttonText = 'Buy My Name',\n children,\n defaultXnsName,\n disabled,\n errorUi = 'alert',\n funnel = 'xns',\n intent = 'unset',\n mobileButtonText = 'Buy',\n navigate,\n onCaptureName: onCaptureNameProp,\n onNameChange,\n paramsString = '',\n placement = '',\n routingError,\n showSecondary = false,\n to = '/xns/estimation',\n ...props\n}) => {\n const [xnsName, setXnsName] = useState<string>(() => defaultXnsName ?? '')\n const [error, setError] = useState<Error | undefined>(routingError)\n\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('md'))\n\n const captureDisabled = !xnsName || xnsName.length < MIN_DOMAIN_LENGTH\n\n const handleChange: StandardTextFieldProps['onChange'] = (event) => {\n const NsName = XnsNameHelper.mask(event.target.value)\n onNameChange?.(NsName)\n setXnsName(NsName)\n setError(undefined)\n }\n\n const onCaptureName = useCallback(async () => {\n if (captureDisabled) return\n const formattedXnsName = `${xnsName}.xyo`\n const helper = XnsNameHelper.fromString(formattedXnsName)\n const [valid, errors] = await helper.validate()\n if (valid) {\n await onCaptureNameProp?.(xnsName)\n\n navigateWithUsername(xnsName, paramsString, navigate, to)\n } else {\n setError(new Error(errors.join(', ')))\n }\n }, [captureDisabled, xnsName, onCaptureNameProp, paramsString, navigate, to])\n\n const onKeyDown: KeyboardEventHandler<HTMLDivElement> = useCallback(async (event) => {\n if (event.key === 'Enter' && !captureDisabled) {\n await onCaptureName?.()\n }\n }, [captureDisabled, onCaptureName])\n\n return (\n <FlexCol gap={showSecondary ? 1.5 : 0} alignItems=\"center\" {...props}>\n <FlexRow gap={1}>\n <XnsEstimateNameTextField\n autoFocus={autoFocus}\n disabled={disabled}\n label=\"xNS Name\"\n variant=\"outlined\"\n size=\"small\"\n value={xnsName ?? ''}\n onKeyDown={onKeyDown}\n onChange={handleChange}\n onBlur={handleChange}\n />\n <ButtonEx\n disabled={captureDisabled}\n funnel={funnel}\n intent={intent}\n placement={placement}\n variant=\"contained\"\n color=\"success\"\n endIcon={<KeyboardArrowRightRounded />}\n onClick={onCaptureName}\n >\n {isMobile ? mobileButtonText : buttonText}\n </ButtonEx>\n </FlexRow>\n {(showSecondary === true)\n ? (\n <XnsCaptureSecondaryLink\n xnsName={xnsName}\n placement={placement}\n funnel={funnel}\n setError={setError}\n />\n )\n : null}\n {\n // eslint-disable-next-line unicorn/prefer-logical-operator-over-ternary\n showSecondary ? showSecondary : null\n }\n {children}\n <XnsNameCaptureErrors error={error} errorUi={errorUi} resetError={() => setError(undefined)} />\n </FlexCol>\n )\n}\n","import type { To } from 'react-router-dom'\n\nexport const navigateWithUsername = (xnsName: string, paramsString: string, navigate?: ((to: string) => void), to?: To) => {\n // avoid duplicating the username param\n const params = new URLSearchParams(paramsString)\n const usernameParam = params.get('username')\n if (usernameParam) {\n // if username param is the same as the xnsName, navigate\n if (usernameParam === xnsName) {\n navigate?.(`${to}?${paramsString}`)\n }\n if (usernameParam !== xnsName) {\n // if username param is different, replace it\n params.set('username', xnsName)\n navigate?.(`${to}?${params.toString()}`)\n }\n } else {\n // if no username param, include it\n navigate?.(`${to}?username=${xnsName}&${paramsString}`)\n }\n}\n","import React, { useMemo } from 'react'\n\nimport { useXnsNameCaptureRouting } from './hooks/index.ts'\nimport type { XnsNameCaptureProps } from './Props.ts'\nimport { XnsNameCapture } from './XnsNameCapture.tsx'\n\nexport const XnsNameCaptureWithContext: React.FC<XnsNameCaptureProps> = (props) => {\n const routingProps = useXnsNameCaptureRouting(props)\n\n const updatedProps = useMemo<XnsNameCaptureProps>(() => ({\n ...props,\n ...routingProps,\n }), [routingProps, props])\n\n return (\n <XnsNameCapture {...updatedProps} />\n )\n}\n"],"mappings":"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","names":["TextField","useTheme","alphaCss","MIN_DOMAIN_LENGTH","XnsNameHelper","React","useLayoutEffect","useRef","useState","XnsEstimateNameTextField","maskOutput","onChange","onChangeProp","onBlur","onBlurProp","value","props","theme","useTheme","validLength","setValidLength","useState","inputRef","useRef","previousValue","setPreviousValue","validValueLength","length","MIN_DOMAIN_LENGTH","useLayoutEffect","current","handleChange","event","target","XnsNameHelper","mask","handleBlur","maskStartEndHyphens","TextField","slotProps","htmlInput","style","color","vars","palette","text","primary","alphaCss","Alert","Snackbar","useMediaQuery","useTheme","FlexRow","React","XnsNameCaptureErrors","error","errorUi","resetError","theme","useTheme","isMobile","useMediaQuery","breakpoints","down","React","Snackbar","open","message","toString","autoHideDuration","onClose","anchorOrigin","vertical","horizontal","Alert","severity","sx","width","display","undefined","visibility","FlexRow","alignSelf","useMemo","useNavigate","useSearchParams","useLocation","useXnsNameFromLocation","location","useLocation","search","URLSearchParams","rawName","get","toLowerCase","split","length","undefined","rawNameParts","Error","useXnsNameCaptureRouting","props","params","useSearchParams","navigate","useNavigate","name","error","useXnsNameFromLocation","useMemo","defaultXnsName","routingError","to","paramsString","toString","ArrowForwardRounded","Stack","LinkEx","useUserEvents","XnsNameHelper","React","XnsCaptureSecondaryLink","funnel","navigate","onCaptureName","paramsString","intent","placement","setError","text","to","xnsName","props","userEvents","useUserEvents","React","LinkEx","paddingX","color","style","textDecoration","textUnderlineOffset","onClick","formattedXnsName","helper","XnsNameHelper","fromString","valid","errors","validate","userClick","Error","join","Stack","flexDirection","gap","alignItems","sx","cursor","ArrowForwardRounded","KeyboardArrowRightRounded","useMediaQuery","useTheme","ButtonEx","FlexCol","FlexRow","MIN_DOMAIN_LENGTH","XnsNameHelper","React","useCallback","useState","navigateWithUsername","xnsName","paramsString","navigate","to","params","URLSearchParams","usernameParam","get","set","toString","XnsNameCapture","autoFocus","buttonText","children","defaultXnsName","disabled","errorUi","funnel","intent","mobileButtonText","navigate","onCaptureName","onCaptureNameProp","onNameChange","paramsString","placement","routingError","showSecondary","to","props","xnsName","setXnsName","useState","error","setError","theme","useTheme","isMobile","useMediaQuery","breakpoints","down","captureDisabled","length","MIN_DOMAIN_LENGTH","handleChange","event","NsName","XnsNameHelper","mask","target","value","undefined","useCallback","formattedXnsName","helper","fromString","valid","errors","validate","navigateWithUsername","Error","join","onKeyDown","key","React","FlexCol","gap","alignItems","FlexRow","XnsEstimateNameTextField","label","variant","size","onChange","onBlur","ButtonEx","color","endIcon","KeyboardArrowRightRounded","onClick","XnsCaptureSecondaryLink","XnsNameCaptureErrors","resetError","React","useMemo","XnsNameCaptureWithContext","props","routingProps","useXnsNameCaptureRouting","updatedProps","useMemo","React","XnsNameCapture"]}
1
+ {"version":3,"sources":["../../src/components/EstimateName/EstimateNameTextField.tsx","../../src/components/XnsNameCapture/Errors.tsx","../../src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts","../../src/components/XnsNameCapture/hooks/routing/useXnsNameFromLocation.ts","../../src/components/XnsNameCapture/SecondaryLink.tsx","../../src/components/XnsNameCapture/XnsNameCapture.tsx","../../src/components/XnsNameCapture/lib/navigateWithUsername.ts","../../src/components/XnsNameCapture/XnsNameCaptureWithContext.tsx"],"sourcesContent":["import type { StandardTextFieldProps, TextFieldProps } from '@mui/material'\nimport { TextField, useTheme } from '@mui/material'\nimport { alphaCss } from '@xylabs/react-theme'\nimport { MIN_DOMAIN_LENGTH, XnsNameHelper } from '@xyo-network/xns-record-payloadset-plugins'\nimport React, {\n useLayoutEffect,\n useRef, useState,\n} from 'react'\n\nexport interface XnsEstimateNameTextFieldProps {\n maskOutput?: boolean\n}\n\nexport const XnsEstimateNameTextField: React.FC<XnsEstimateNameTextFieldProps & TextFieldProps> = ({\n maskOutput = true, onChange: onChangeProp, onBlur: onBlurProp, value, ...props\n}) => {\n const theme = useTheme()\n const [validLength, setValidLength] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n // watch for external changes to the value and update the validLength state\n const [previousValue, setPreviousValue] = useState<unknown>(value)\n if (value !== previousValue) {\n setPreviousValue(value)\n const validValueLength = !!(value && typeof value === 'string' && value.length >= MIN_DOMAIN_LENGTH)\n setValidLength(validValueLength)\n }\n\n // Update the input value when the value prop changes\n // The intent of this component is to remain uncontrolled to avoid the need to manage the value state\n // Therefore, we use useLayoutEffect to update the input value directly.\n useLayoutEffect(() => {\n if (inputRef.current && typeof value === 'string') {\n inputRef.current.value = value\n }\n }, [value])\n\n // override onChange to mask the input and update the event value\n const handleChange: StandardTextFieldProps['onChange'] = (event) => {\n if (maskOutput) {\n const value = event.target.value\n event.target.value = XnsNameHelper.mask(value)\n }\n onChangeProp?.(event)\n\n if (inputRef.current) {\n setValidLength(inputRef.current.value.length >= MIN_DOMAIN_LENGTH)\n }\n }\n\n // override onBlur to do a final mask of the input and update the event value\n const handleBlur: StandardTextFieldProps['onBlur'] = (event) => {\n if (maskOutput) {\n const value = event.target.value\n event.target.value = XnsNameHelper.mask(value, { maskStartEndHyphens: true })\n }\n onBlurProp?.(event)\n }\n\n return (\n <TextField\n inputRef={inputRef}\n onBlur={handleBlur}\n onChange={handleChange}\n {...props}\n slotProps={{ htmlInput: { style: { color: validLength ? theme.vars.palette.text.primary : alphaCss(theme.vars.palette.text.primary, 0.5) } } }}\n />\n )\n}\n","import {\n Alert, Snackbar, useMediaQuery, useTheme,\n} from '@mui/material'\nimport { FlexRow } from '@xylabs/react-flexbox'\nimport React from 'react'\n\nexport interface XnsNameCaptureErrorsProps {\n error?: Error\n errorUi?: 'alert' | 'toast'\n resetError?: () => void\n}\n\nexport const XnsNameCaptureErrors: React.FC<XnsNameCaptureErrorsProps> = ({\n error, errorUi, resetError,\n}) => {\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('md'))\n\n return (\n <>\n {(errorUi === 'toast')\n ? (\n <Snackbar\n open={!!error}\n message={error?.toString()}\n autoHideDuration={3000}\n onClose={() => resetError?.()}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n >\n <Alert\n severity=\"error\"\n sx={{\n width: '100%', display: (isMobile && !error) ? 'none' : undefined, visibility: error ? 'visible' : 'hidden',\n }}\n >\n {error?.message}\n </Alert>\n </Snackbar>\n )\n // eslint-disable-next-line react-x/unsupported-syntax\n : (() => {\n // setTimeout(() => setError(undefined), 1500)\n return (\n <FlexRow alignSelf=\"stretch\">\n <Alert\n severity=\"error\"\n sx={{ display: (isMobile && !error) ? 'none' : undefined, visibility: error ? 'visible' : 'hidden' }}\n >\n {error?.message}\n </Alert>\n </FlexRow>\n )\n })()}\n </>\n )\n}\n","import { useMemo } from 'react'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\n\nimport type { XnsNameCaptureProps } from '../../Props.ts'\nimport { useXnsNameFromLocation } from './useXnsNameFromLocation.ts'\n\nexport const useXnsNameCaptureRouting = (props: XnsNameCaptureProps): XnsNameCaptureProps => {\n const [params] = useSearchParams()\n\n const navigate = useNavigate()\n\n const [name, error] = useXnsNameFromLocation()\n\n return useMemo(() => ({\n ...props,\n defaultXnsName: name,\n routingError: error,\n navigate: props.navigate ?? ((to: string) => navigate(to)),\n paramsString: props.paramsString ? `${props.paramsString}${params.toString()}` : params.toString(),\n }), [props, name, error, params, navigate])\n}\n","import { useLocation } from 'react-router-dom'\n\n/**\n * Assumes the user was redirected with a link that contains a username query parameter.\n * @returns The xNS name from the URI username query parameter.\n */\nexport const useXnsNameFromLocation = (): [name: string | undefined, error: Error | undefined] => {\n const location = useLocation()\n const search = new URLSearchParams(location.search)\n const rawName = (search.get('xnsname') ?? search.get('name') ?? search.get('username') ?? '').toLowerCase()\n switch (rawName?.split('.').length) {\n case 1: {\n return [rawName, undefined]\n }\n case 2: {\n const rawNameParts = rawName.split('.')\n if (rawNameParts[1] !== 'xyo') {\n return [undefined, new Error('Invalid xNS name [Bad root]')]\n }\n return [rawNameParts[0], undefined]\n }\n default: {\n return [undefined, new Error('Invalid xNS name [Too many parts]')]\n }\n }\n}\n","import { ArrowForwardRounded } from '@mui/icons-material'\nimport { Stack } from '@mui/material'\nimport type { LinkExProps } from '@xylabs/react-link'\nimport { LinkEx } from '@xylabs/react-link'\nimport { useUserEvents } from '@xylabs/react-pixel'\nimport { XnsNameHelper } from '@xyo-network/xns-record-payloadset-plugins'\nimport type { Dispatch } from 'react'\nimport React from 'react'\n\nimport type {\n XnsNameCaptureBuyCallbacks, XnsNameCaptureRoutingProps, XnsNameCaptureTrackingProps,\n} from './Props.ts'\n\nexport type XnsCaptureSecondaryLinkProps = XnsNameCaptureTrackingProps & XnsNameCaptureRoutingProps & XnsNameCaptureBuyCallbacks & LinkExProps & {\n setError?: Dispatch<Error | undefined>\n text?: string\n xnsName: string\n}\n\nexport const XnsCaptureSecondaryLink: React.FC<XnsCaptureSecondaryLinkProps> = ({\n funnel = 'xns',\n navigate,\n onCaptureName,\n paramsString = '',\n intent,\n placement = '',\n setError,\n text = 'Or make a free reservation',\n to = '/xns/reservation',\n xnsName,\n ...props\n}) => {\n const userEvents = useUserEvents('warn')\n return (\n <LinkEx\n paddingX={0}\n color=\"inherit\"\n style={{ textDecoration: 'underline', textUnderlineOffset: '5px' }}\n onClick={async () => {\n const formattedXnsName = `${xnsName}.xyo`\n const helper = XnsNameHelper.fromString(formattedXnsName)\n const [valid, errors] = await helper.validate()\n if (valid) {\n await userEvents?.userClick({\n funnel, placement, intent,\n })\n navigate?.(`${to}?username=${xnsName}${paramsString}`)\n await onCaptureName?.(xnsName)\n } else {\n setError?.(new Error(errors.join(', ')))\n }\n }}\n {...props}\n >\n <Stack flexDirection=\"row\" gap={0.5} alignItems=\"center\" sx={{ cursor: 'pointer' }}>\n {text}\n <ArrowForwardRounded />\n </Stack>\n </LinkEx>\n )\n}\n","import { KeyboardArrowRightRounded } from '@mui/icons-material'\nimport type { StandardTextFieldProps } from '@mui/material'\nimport { useMediaQuery, useTheme } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { FlexCol, FlexRow } from '@xylabs/react-flexbox'\nimport { MIN_DOMAIN_LENGTH, XnsNameHelper } from '@xyo-network/xns-record-payloadset-plugins'\nimport type { KeyboardEventHandler } from 'react'\nimport React, { useCallback, useState } from 'react'\n\nimport { XnsEstimateNameTextField } from '../EstimateName/index.ts'\nimport { XnsNameCaptureErrors } from './Errors.tsx'\nimport { navigateWithUsername } from './lib/index.ts'\nimport type { XnsNameCaptureProps } from './Props.ts'\nimport { XnsCaptureSecondaryLink } from './SecondaryLink.js'\n\nexport const XnsNameCapture: React.FC<XnsNameCaptureProps> = ({\n autoFocus = false,\n buttonText = 'Buy My Name',\n children,\n defaultXnsName,\n disabled,\n errorUi = 'alert',\n funnel = 'xns',\n intent = 'unset',\n mobileButtonText = 'Buy',\n navigate,\n onCaptureName: onCaptureNameProp,\n onNameChange,\n paramsString = '',\n placement = '',\n routingError,\n showSecondary = false,\n to = '/xns/estimation',\n ...props\n}) => {\n const [xnsName, setXnsName] = useState<string>(() => defaultXnsName ?? '')\n const [error, setError] = useState<Error | undefined>(routingError)\n\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('md'))\n\n const captureDisabled = !xnsName || xnsName.length < MIN_DOMAIN_LENGTH\n\n const handleChange: StandardTextFieldProps['onChange'] = (event) => {\n const NsName = XnsNameHelper.mask(event.target.value)\n onNameChange?.(NsName)\n setXnsName(NsName)\n setError(undefined)\n }\n\n const onCaptureName = useCallback(async () => {\n if (captureDisabled) return\n const formattedXnsName = `${xnsName}.xyo`\n const helper = XnsNameHelper.fromString(formattedXnsName)\n const [valid, errors] = await helper.validate()\n if (valid) {\n await onCaptureNameProp?.(xnsName)\n\n navigateWithUsername(xnsName, paramsString, navigate, to)\n } else {\n setError(new Error(errors.join(', ')))\n }\n }, [captureDisabled, xnsName, onCaptureNameProp, paramsString, navigate, to])\n\n const onKeyDown: KeyboardEventHandler<HTMLDivElement> = useCallback(async (event) => {\n if (event.key === 'Enter' && !captureDisabled) {\n await onCaptureName?.()\n }\n }, [captureDisabled, onCaptureName])\n\n return (\n <FlexCol gap={showSecondary ? 1.5 : 0} alignItems=\"center\" {...props}>\n <FlexRow gap={1}>\n <XnsEstimateNameTextField\n autoFocus={autoFocus}\n disabled={disabled}\n label=\"xNS Name\"\n variant=\"outlined\"\n size=\"small\"\n value={xnsName ?? ''}\n onKeyDown={onKeyDown}\n onChange={handleChange}\n onBlur={handleChange}\n />\n <ButtonEx\n disabled={captureDisabled}\n funnel={funnel}\n intent={intent}\n placement={placement}\n variant=\"contained\"\n color=\"success\"\n endIcon={<KeyboardArrowRightRounded />}\n onClick={onCaptureName}\n >\n {isMobile ? mobileButtonText : buttonText}\n </ButtonEx>\n </FlexRow>\n {(showSecondary === true)\n ? (\n <XnsCaptureSecondaryLink\n xnsName={xnsName}\n placement={placement}\n funnel={funnel}\n setError={setError}\n />\n )\n : null}\n {\n // eslint-disable-next-line unicorn/prefer-logical-operator-over-ternary\n showSecondary ? showSecondary : null\n }\n {children}\n <XnsNameCaptureErrors error={error} errorUi={errorUi} resetError={() => setError(undefined)} />\n </FlexCol>\n )\n}\n","import type { To } from 'react-router-dom'\n\nexport const navigateWithUsername = (xnsName: string, paramsString: string, navigate?: ((to: string) => void), to?: To) => {\n // avoid duplicating the username param\n const params = new URLSearchParams(paramsString)\n const usernameParam = params.get('username')\n if (usernameParam) {\n // if username param is the same as the xnsName, navigate\n if (usernameParam === xnsName) {\n navigate?.(`${to}?${paramsString}`)\n }\n if (usernameParam !== xnsName) {\n // if username param is different, replace it\n params.set('username', xnsName)\n navigate?.(`${to}?${params.toString()}`)\n }\n } else {\n // if no username param, include it\n navigate?.(`${to}?username=${xnsName}&${paramsString}`)\n }\n}\n","import React, { useMemo } from 'react'\n\nimport { useXnsNameCaptureRouting } from './hooks/index.ts'\nimport type { XnsNameCaptureProps } from './Props.ts'\nimport { XnsNameCapture } from './XnsNameCapture.tsx'\n\nexport const XnsNameCaptureWithContext: React.FC<XnsNameCaptureProps> = (props) => {\n const routingProps = useXnsNameCaptureRouting(props)\n\n const updatedProps = useMemo<XnsNameCaptureProps>(() => ({\n ...props,\n ...routingProps,\n }), [routingProps, props])\n\n return (\n <XnsNameCapture {...updatedProps} />\n )\n}\n"],"mappings":"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","names":["value","useTheme","jsx","XnsNameHelper","jsx","useMediaQuery","useTheme","FlexRow","MIN_DOMAIN_LENGTH","XnsNameHelper","useState","jsx","jsxs","useState","useTheme","useMediaQuery","MIN_DOMAIN_LENGTH","XnsNameHelper","FlexRow","useMemo","jsx","useMemo"]}