@xyo-network/react-xns 7.5.7 → 7.5.11
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/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.d.ts +1 -414
- package/dist/browser/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.d.ts.map +1 -1
- package/dist/browser/index.mjs +200 -186
- package/dist/browser/index.mjs.map +1 -1
- package/package.json +113 -33
- package/src/components/EstimateName/EstimateNameTextField.stories.tsx +0 -23
- package/src/components/EstimateName/EstimateNameTextField.tsx +0 -70
- package/src/components/EstimateName/index.ts +0 -1
- package/src/components/XnsNameCapture/Errors.tsx +0 -56
- package/src/components/XnsNameCapture/Props.ts +0 -48
- package/src/components/XnsNameCapture/SecondaryLink.stories.tsx +0 -18
- package/src/components/XnsNameCapture/SecondaryLink.tsx +0 -61
- package/src/components/XnsNameCapture/XnsNameCapture.stories.tsx +0 -19
- package/src/components/XnsNameCapture/XnsNameCapture.tsx +0 -116
- package/src/components/XnsNameCapture/XnsNameCaptureWithContext.stories.tsx +0 -61
- package/src/components/XnsNameCapture/XnsNameCaptureWithContext.tsx +0 -18
- package/src/components/XnsNameCapture/hooks/index.ts +0 -1
- package/src/components/XnsNameCapture/hooks/routing/index.ts +0 -2
- package/src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts +0 -21
- package/src/components/XnsNameCapture/hooks/routing/useXnsNameFromLocation.ts +0 -26
- package/src/components/XnsNameCapture/index.ts +0 -6
- package/src/components/XnsNameCapture/lib/index.ts +0 -1
- package/src/components/XnsNameCapture/lib/navigateWithUsername.ts +0 -21
- package/src/components/index.ts +0 -2
- package/src/global.d.ts +0 -1
- package/src/index.ts +0 -1
package/dist/browser/index.mjs
CHANGED
|
@@ -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
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
36
|
-
const handleBlur =
|
|
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
|
-
}
|
|
45
|
-
return /* @__PURE__ */
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
}
|
|
58
|
+
);
|
|
59
|
+
};
|
|
59
60
|
|
|
60
61
|
// src/components/XnsNameCapture/Errors.tsx
|
|
61
|
-
import {
|
|
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
|
|
64
|
-
var XnsNameCaptureErrors =
|
|
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__ */
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
horizontal: "center"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
return /* @__PURE__ */
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
}
|
|
93
|
-
})());
|
|
94
|
-
}
|
|
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 =
|
|
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
|
-
}
|
|
135
|
+
};
|
|
134
136
|
|
|
135
137
|
// src/components/XnsNameCapture/hooks/routing/useXnsNameCaptureRouting.ts
|
|
136
|
-
var useXnsNameCaptureRouting =
|
|
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
|
-
|
|
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
|
|
162
|
-
var XnsCaptureSecondaryLink =
|
|
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__ */
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
textUnderlineOffset: "5px"
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
196
|
-
}
|
|
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
|
|
209
|
+
import { useCallback, useState as useState2 } from "react";
|
|
205
210
|
|
|
206
211
|
// src/components/XnsNameCapture/lib/navigateWithUsername.ts
|
|
207
|
-
var navigateWithUsername =
|
|
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
|
-
}
|
|
226
|
+
};
|
|
222
227
|
|
|
223
228
|
// src/components/XnsNameCapture/XnsNameCapture.tsx
|
|
224
|
-
|
|
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 =
|
|
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
|
-
}
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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__ */
|
|
302
|
-
|
|
303
|
-
|
|
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
|
|
311
|
-
|
|
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
|
-
|
|
318
|
-
|
|
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"]}
|