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