@volr/react-ui 0.2.7 → 0.3.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/index.cjs +402 -275
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +59 -2
- package/dist/index.d.ts +59 -2
- package/dist/index.js +159 -35
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React16 = require('react');
|
|
4
4
|
var reactDom = require('react-dom');
|
|
5
5
|
var react = require('@volr/react');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -10,7 +10,7 @@ var qrcode_react = require('qrcode.react');
|
|
|
10
10
|
|
|
11
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var React16__default = /*#__PURE__*/_interopDefault(React16);
|
|
14
14
|
|
|
15
15
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
16
16
|
var __esm = (fn, res) => function __init() {
|
|
@@ -592,7 +592,32 @@ var en = {
|
|
|
592
592
|
later: "Do it later",
|
|
593
593
|
inProgress: "Setting up...",
|
|
594
594
|
success: "Passkey set up successfully!",
|
|
595
|
-
|
|
595
|
+
successTitle: "Migration complete!",
|
|
596
|
+
successMessage: "Your passkey is set up for this site.",
|
|
597
|
+
waitingHint: "Complete the setup in the popup window.",
|
|
598
|
+
error: "Failed to set up passkey. Please try again.",
|
|
599
|
+
// Source popup (domain-a.com)
|
|
600
|
+
source: {
|
|
601
|
+
title: "Verify with existing passkey",
|
|
602
|
+
description: "Verify your identity to move your wallet to {{targetDomain}}.",
|
|
603
|
+
ready: "Ready to verify",
|
|
604
|
+
authenticating: "Verifying...",
|
|
605
|
+
decrypting: "Decrypting wallet data...",
|
|
606
|
+
waiting: "Waiting for registration on the new site...",
|
|
607
|
+
done: "Verification complete!",
|
|
608
|
+
waitingHint: "Complete passkey registration in the new window."
|
|
609
|
+
},
|
|
610
|
+
// Target popup (domain-b.com)
|
|
611
|
+
target: {
|
|
612
|
+
title: "Register a passkey for this site",
|
|
613
|
+
description: "Register a passkey for secure login on {{currentDomain}}.",
|
|
614
|
+
ready: "Ready to register",
|
|
615
|
+
connecting: "Connecting to the original site...",
|
|
616
|
+
registering: "Registering new passkey...",
|
|
617
|
+
completing: "Finishing setup...",
|
|
618
|
+
success: "Passkey registration complete!",
|
|
619
|
+
closing: "Closing window..."
|
|
620
|
+
}
|
|
596
621
|
}
|
|
597
622
|
},
|
|
598
623
|
success: {
|
|
@@ -1082,13 +1107,13 @@ var translations = {
|
|
|
1082
1107
|
function getTranslations(locale = "en") {
|
|
1083
1108
|
return translations[locale] || translations.en;
|
|
1084
1109
|
}
|
|
1085
|
-
var I18nContext =
|
|
1110
|
+
var I18nContext = React16.createContext(null);
|
|
1086
1111
|
function interpolate(text, params) {
|
|
1087
1112
|
if (!params) return text;
|
|
1088
1113
|
return text.replace(/\{\{(\w+)\}\}/g, (_, key) => params[key] ?? `{{${key}}}`);
|
|
1089
1114
|
}
|
|
1090
1115
|
function useI18n() {
|
|
1091
|
-
const context =
|
|
1116
|
+
const context = React16.useContext(I18nContext);
|
|
1092
1117
|
if (!context) {
|
|
1093
1118
|
return {
|
|
1094
1119
|
locale: "en",
|
|
@@ -1132,25 +1157,25 @@ function detectLocale(allowedLocales) {
|
|
|
1132
1157
|
return resolveLocale(detected, allowedLocales);
|
|
1133
1158
|
}
|
|
1134
1159
|
function I18nProvider({ children, allowedLocales }) {
|
|
1135
|
-
const [locale, setLocaleState] =
|
|
1136
|
-
const resolveAllowedLocale =
|
|
1160
|
+
const [locale, setLocaleState] = React16.useState(() => detectLocale(allowedLocales));
|
|
1161
|
+
const resolveAllowedLocale = React16.useCallback(
|
|
1137
1162
|
(next) => resolveLocale(next, allowedLocales),
|
|
1138
1163
|
[allowedLocales]
|
|
1139
1164
|
);
|
|
1140
|
-
const setLocale =
|
|
1165
|
+
const setLocale = React16.useCallback(
|
|
1141
1166
|
(next) => {
|
|
1142
1167
|
setLocaleState(resolveAllowedLocale(next));
|
|
1143
1168
|
},
|
|
1144
1169
|
[resolveAllowedLocale]
|
|
1145
1170
|
);
|
|
1146
|
-
|
|
1171
|
+
React16.useEffect(() => {
|
|
1147
1172
|
setLocaleState((current) => {
|
|
1148
1173
|
const resolved = resolveAllowedLocale(current);
|
|
1149
1174
|
return current === resolved ? current : resolved;
|
|
1150
1175
|
});
|
|
1151
1176
|
}, [resolveAllowedLocale]);
|
|
1152
|
-
const translations2 =
|
|
1153
|
-
const t =
|
|
1177
|
+
const translations2 = React16.useMemo(() => getTranslations(locale), [locale]);
|
|
1178
|
+
const t = React16.useMemo(() => {
|
|
1154
1179
|
return (key, params) => {
|
|
1155
1180
|
const keys = key.split(".");
|
|
1156
1181
|
let value2 = translations2;
|
|
@@ -1167,7 +1192,7 @@ function I18nProvider({ children, allowedLocales }) {
|
|
|
1167
1192
|
return typeof value2 === "string" ? interpolate(value2, params) : key;
|
|
1168
1193
|
};
|
|
1169
1194
|
}, [translations2]);
|
|
1170
|
-
const value =
|
|
1195
|
+
const value = React16.useMemo(
|
|
1171
1196
|
() => ({
|
|
1172
1197
|
locale,
|
|
1173
1198
|
translations: translations2,
|
|
@@ -1179,9 +1204,9 @@ function I18nProvider({ children, allowedLocales }) {
|
|
|
1179
1204
|
return /* @__PURE__ */ jsxRuntime.jsx(I18nContext.Provider, { value, children });
|
|
1180
1205
|
}
|
|
1181
1206
|
var useTranslation = useI18n;
|
|
1182
|
-
var VolrModalContext =
|
|
1207
|
+
var VolrModalContext = React16.createContext(null);
|
|
1183
1208
|
var useVolrModal = () => {
|
|
1184
|
-
const context =
|
|
1209
|
+
const context = React16.useContext(VolrModalContext);
|
|
1185
1210
|
if (!context) {
|
|
1186
1211
|
throw new Error("useVolrModal must be used within VolrUIProvider");
|
|
1187
1212
|
}
|
|
@@ -1190,17 +1215,17 @@ var useVolrModal = () => {
|
|
|
1190
1215
|
var VolrModalProvider = ({
|
|
1191
1216
|
children
|
|
1192
1217
|
}) => {
|
|
1193
|
-
const [isOpen, setIsOpen] =
|
|
1194
|
-
const [mode, setMode] =
|
|
1195
|
-
const [asset, setAsset] =
|
|
1196
|
-
const [paymentOptions, setPaymentOptions] =
|
|
1197
|
-
const open =
|
|
1218
|
+
const [isOpen, setIsOpen] = React16.useState(false);
|
|
1219
|
+
const [mode, setMode] = React16.useState("account");
|
|
1220
|
+
const [asset, setAsset] = React16.useState(null);
|
|
1221
|
+
const [paymentOptions, setPaymentOptions] = React16.useState(null);
|
|
1222
|
+
const open = React16.useCallback((options) => {
|
|
1198
1223
|
setMode(options?.mode ?? "account");
|
|
1199
1224
|
setAsset(options?.asset ?? null);
|
|
1200
1225
|
setPaymentOptions(options?.payment ?? null);
|
|
1201
1226
|
setIsOpen(true);
|
|
1202
1227
|
}, []);
|
|
1203
|
-
const close =
|
|
1228
|
+
const close = React16.useCallback(() => {
|
|
1204
1229
|
setIsOpen(false);
|
|
1205
1230
|
setAsset(null);
|
|
1206
1231
|
setPaymentOptions(null);
|
|
@@ -1214,11 +1239,11 @@ function cn(...inputs) {
|
|
|
1214
1239
|
return twMerge(clsx.clsx(inputs));
|
|
1215
1240
|
}
|
|
1216
1241
|
function useMediaQuery(query) {
|
|
1217
|
-
const [matches, setMatches] =
|
|
1242
|
+
const [matches, setMatches] = React16.useState(() => {
|
|
1218
1243
|
if (typeof window === "undefined") return false;
|
|
1219
1244
|
return window.matchMedia(query).matches;
|
|
1220
1245
|
});
|
|
1221
|
-
|
|
1246
|
+
React16.useEffect(() => {
|
|
1222
1247
|
if (typeof window === "undefined") return;
|
|
1223
1248
|
const mql = window.matchMedia(query);
|
|
1224
1249
|
const handler = (event) => setMatches(event.matches);
|
|
@@ -1232,12 +1257,12 @@ function useMediaQuery(query) {
|
|
|
1232
1257
|
// src/generated/volr-sdk-css.ts
|
|
1233
1258
|
var VOLR_SDK_CSS = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--volr-tw-translate-x:0;--volr-tw-translate-y:0;--volr-tw-translate-z:0;--volr-tw-space-y-reverse:0;--volr-tw-border-style:solid;--volr-tw-gradient-position:initial;--volr-tw-gradient-from:#0000;--volr-tw-gradient-via:#0000;--volr-tw-gradient-to:#0000;--volr-tw-gradient-stops:initial;--volr-tw-gradient-via-stops:initial;--volr-tw-gradient-from-position:0%;--volr-tw-gradient-via-position:50%;--volr-tw-gradient-to-position:100%;--volr-tw-leading:initial;--volr-tw-font-weight:initial;--volr-tw-tracking:initial;--volr-tw-shadow:0 0 #0000;--volr-tw-shadow-color:initial;--volr-tw-shadow-alpha:100%;--volr-tw-inset-shadow:0 0 #0000;--volr-tw-inset-shadow-color:initial;--volr-tw-inset-shadow-alpha:100%;--volr-tw-ring-color:initial;--volr-tw-ring-shadow:0 0 #0000;--volr-tw-inset-ring-color:initial;--volr-tw-inset-ring-shadow:0 0 #0000;--volr-tw-ring-inset:initial;--volr-tw-ring-offset-width:0px;--volr-tw-ring-offset-color:#fff;--volr-tw-ring-offset-shadow:0 0 #0000;--volr-tw-blur:initial;--volr-tw-brightness:initial;--volr-tw-contrast:initial;--volr-tw-grayscale:initial;--volr-tw-hue-rotate:initial;--volr-tw-invert:initial;--volr-tw-opacity:initial;--volr-tw-saturate:initial;--volr-tw-sepia:initial;--volr-tw-drop-shadow:initial;--volr-tw-drop-shadow-color:initial;--volr-tw-drop-shadow-alpha:100%;--volr-tw-drop-shadow-size:initial;--volr-tw-duration:initial;--volr-tw-ease:initial}}}@layer theme{:root,:host{--volr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--volr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--volr-color-red-50:oklch(97.1% .013 17.38);--volr-color-red-100:oklch(93.6% .032 17.717);--volr-color-red-200:oklch(88.5% .062 18.334);--volr-color-red-500:oklch(63.7% .237 25.331);--volr-color-red-600:oklch(57.7% .245 27.325);--volr-color-red-700:oklch(50.5% .213 27.518);--volr-color-amber-50:oklch(98.7% .022 95.277);--volr-color-amber-200:oklch(92.4% .12 95.746);--volr-color-amber-700:oklch(55.5% .163 48.998);--volr-color-yellow-100:oklch(97.3% .071 103.193);--volr-color-yellow-700:oklch(55.4% .135 66.442);--volr-color-green-50:oklch(98.2% .018 155.826);--volr-color-green-100:oklch(96.2% .044 156.743);--volr-color-green-600:oklch(62.7% .194 149.214);--volr-color-green-700:oklch(52.7% .154 150.069);--volr-color-emerald-300:oklch(84.5% .143 164.978);--volr-color-emerald-400:oklch(76.5% .177 163.223);--volr-color-emerald-500:oklch(69.6% .17 162.48);--volr-color-emerald-600:oklch(59.6% .145 163.225);--volr-color-teal-400:oklch(77.7% .152 181.912);--volr-color-teal-500:oklch(70.4% .14 182.503);--volr-color-cyan-400:oklch(78.9% .154 211.53);--volr-color-blue-100:oklch(93.2% .032 255.585);--volr-color-blue-700:oklch(48.8% .243 264.376);--volr-color-slate-50:oklch(98.4% .003 247.858);--volr-color-slate-100:oklch(96.8% .007 247.896);--volr-color-slate-200:oklch(92.9% .013 255.508);--volr-color-slate-300:oklch(86.9% .022 252.894);--volr-color-slate-400:oklch(70.4% .04 256.788);--volr-color-slate-500:oklch(55.4% .046 257.417);--volr-color-slate-600:oklch(44.6% .043 257.281);--volr-color-slate-700:oklch(37.2% .044 257.287);--volr-color-slate-800:oklch(27.9% .041 260.031);--volr-color-slate-900:oklch(20.8% .042 265.755);--volr-color-gray-500:oklch(55.1% .027 264.364);--volr-color-black:#000;--volr-color-white:#fff;--volr-spacing:.25rem;--volr-container-md:28rem;--volr-container-4xl:56rem;--volr-text-xs:.75rem;--volr-text-xs--line-height:calc(1/.75);--volr-text-sm:.875rem;--volr-text-sm--line-height:calc(1.25/.875);--volr-text-base:1rem;--volr-text-base--line-height:calc(1.5/1);--volr-text-lg:1.125rem;--volr-text-lg--line-height:calc(1.75/1.125);--volr-text-xl:1.25rem;--volr-text-xl--line-height:calc(1.75/1.25);--volr-text-2xl:1.5rem;--volr-text-2xl--line-height:calc(2/1.5);--volr-text-8xl:6rem;--volr-text-8xl--line-height:1;--volr-font-weight-medium:500;--volr-font-weight-semibold:600;--volr-font-weight-bold:700;--volr-tracking-tight:-.025em;--volr-tracking-wide:.025em;--volr-tracking-wider:.05em;--volr-leading-relaxed:1.625;--volr-radius-md:.375rem;--volr-radius-lg:.5rem;--volr-radius-xl:.75rem;--volr-radius-2xl:1rem;--volr-radius-3xl:1.5rem;--volr-ease-out:cubic-bezier(0,0,.2,1);--volr-animate-spin:spin 1s linear infinite;--volr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--volr-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--volr-blur-2xl:40px;--volr-default-transition-duration:.15s;--volr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--volr-default-font-family:var(--volr-font-sans);--volr-default-mono-font-family:var(--volr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--volr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--volr-default-font-feature-settings,normal);font-variation-settings:var(--volr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--volr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--volr-default-mono-font-feature-settings,normal);font-variation-settings:var(--volr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{--volr-primary-color:var(--volr-accent-color,#303030);--volr-font-family:var(--volr-custom-font,inherit);--volr-bg:#fff;--volr-bg-secondary:#f8fafc;--volr-bg-tertiary:#f1f5f9;--volr-text:#0f172a;--volr-text-secondary:#475569;--volr-text-muted:#94a3b8;--volr-border:#e2e8f0;--volr-border-strong:#cbd5e1;--volr-hover-bg:#f8fafc;--volr-error-bg:#fef2f2;--volr-error-border:#fecaca;--volr-error-text:#991b1b;--volr-hint-bg:#f8fafc;--volr-hint-border:#e2e8f0;--volr-hint-text:#334155}:host([data-theme=dark]){--volr-bg:#1c1c1e;--volr-bg-secondary:#2c2c2e;--volr-bg-tertiary:#3a3a3c;--volr-text:#f5f5f7;--volr-text-secondary:#c7c7cc;--volr-text-muted:#8e8e93;--volr-border:#3a3a3c;--volr-border-strong:#48484a;--volr-hover-bg:#2c2c2e;--volr-error-bg:#3c1f1f;--volr-error-border:#7f1d1d;--volr-error-text:#fca5a5;--volr-hint-bg:#2c2c2e;--volr-hint-border:#3a3a3c;--volr-hint-text:#c7c7cc}*,:before,:after{box-sizing:border-box}*{font-family:var(--volr-font-family);color:var(--volr-text)}button,input,select,textarea{color:var(--volr-text);background-color:#0000}button{cursor:pointer;background-color:#0000}input::placeholder{color:var(--volr-text-muted)}h1,h2,h3{color:var(--volr-text);margin:0;font-weight:700}h1{font-size:1.875rem;line-height:2.25rem}h2{font-size:1.5rem;line-height:2rem}h3{font-size:1.25rem;line-height:1.75rem}p{margin:0}}@layer components{.volr-dialog-overlay{inset:calc(var(--volr-spacing)*0);z-index:40;background-color:var(--volr-color-black);position:fixed}@supports (color:color-mix(in lab, red, red)){.volr-dialog-overlay{background-color:color-mix(in oklab,var(--volr-color-black)45%,transparent)}}.volr-dialog-content{z-index:50;border-radius:var(--volr-radius-2xl);border-style:var(--volr-tw-border-style);padding:calc(var(--volr-spacing)*7);--volr-tw-shadow:0 20px 25px -5px var(--volr-tw-shadow-color,#0000001a),0 8px 10px -6px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow);background-color:var(--volr-bg);border-width:1px;border-color:var(--volr-border-strong);width:calc(100% - 2rem);max-width:28rem;max-height:85vh;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%)}@media (max-width:640px){.volr-dialog-content{top:auto;right:calc(var(--volr-spacing)*0);bottom:calc(var(--volr-spacing)*0);left:calc(var(--volr-spacing)*0);border-radius:1.25rem 1.25rem 0 0;width:100%;max-width:100%;margin:0 auto;transform:translateY(0)}}.volr-dialog-close{top:calc(var(--volr-spacing)*4);right:calc(var(--volr-spacing)*4);height:calc(var(--volr-spacing)*8);width:calc(var(--volr-spacing)*8);color:var(--volr-text-muted);cursor:pointer;background-color:#0000;border:none;border-radius:3.40282e38px;justify-content:center;align-items:center;display:inline-flex;position:absolute}.volr-dialog-close:hover{background-color:var(--volr-hover-bg);color:var(--volr-text-secondary)}.volr-dialog-close:focus-visible{box-shadow:0 0 0 2px var(--volr-border-strong);outline:none}.volr-dialog-close-icon{height:calc(var(--volr-spacing)*4);width:calc(var(--volr-spacing)*4)}.volr-email-input{border:1px solid var(--volr-border-strong);background-color:var(--volr-bg);width:100%;color:var(--volr-text);border-radius:.5rem;outline:none;padding:.75rem .75rem .75rem 2.75rem;font-size:1rem;line-height:1.5}.volr-email-input::placeholder{color:var(--volr-text-muted)}.volr-email-input:focus{border-color:var(--volr-border-strong);box-shadow:0 0 0 2px var(--volr-border-strong)}.volr-option-button{border:1px solid var(--volr-border);background-color:var(--volr-bg);width:100%;color:var(--volr-text);cursor:pointer;border-radius:.5rem;align-items:center;gap:.75rem;padding:.75rem;transition:background-color .15s ease-out,border-color .15s ease-out,box-shadow .15s ease-out;display:flex}.volr-option-button:hover{background-color:var(--volr-hover-bg);border-color:var(--volr-border)}.volr-option-button:focus-visible{box-shadow:0 0 0 2px var(--volr-border-strong);outline:none}}@layer utilities{.volr\\:pointer-events-auto{pointer-events:auto}.volr\\:pointer-events-none{pointer-events:none}.volr\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.volr\\:absolute{position:absolute}.volr\\:fixed{position:fixed}.volr\\:relative{position:relative}.volr\\:inset-0{inset:calc(var(--volr-spacing)*0)}.volr\\:-top-3{top:calc(var(--volr-spacing)*-3)}.volr\\:top-1\\/2{top:50%}.volr\\:-right-3{right:calc(var(--volr-spacing)*-3)}.volr\\:right-0{right:calc(var(--volr-spacing)*0)}.volr\\:right-2{right:calc(var(--volr-spacing)*2)}.volr\\:right-3{right:calc(var(--volr-spacing)*3)}.volr\\:bottom-0{bottom:calc(var(--volr-spacing)*0)}.volr\\:left-0{left:calc(var(--volr-spacing)*0)}.volr\\:left-3{left:calc(var(--volr-spacing)*3)}.volr\\:-z-10{z-index:calc(10*-1)}.volr\\:z-10{z-index:10}.volr\\:z-20{z-index:20}.volr\\:z-40{z-index:40}.volr\\:z-50{z-index:50}.volr\\:mx-auto{margin-inline:auto}.volr\\:my-6{margin-block:calc(var(--volr-spacing)*6)}.volr\\:mt-0\\.5{margin-top:calc(var(--volr-spacing)*.5)}.volr\\:mt-1{margin-top:calc(var(--volr-spacing)*1)}.volr\\:mt-2{margin-top:calc(var(--volr-spacing)*2)}.volr\\:mt-3{margin-top:calc(var(--volr-spacing)*3)}.volr\\:mt-4{margin-top:calc(var(--volr-spacing)*4)}.volr\\:mt-6{margin-top:calc(var(--volr-spacing)*6)}.volr\\:mt-8{margin-top:calc(var(--volr-spacing)*8)}.volr\\:mb-1{margin-bottom:calc(var(--volr-spacing)*1)}.volr\\:mb-2{margin-bottom:calc(var(--volr-spacing)*2)}.volr\\:mb-3{margin-bottom:calc(var(--volr-spacing)*3)}.volr\\:mb-4{margin-bottom:calc(var(--volr-spacing)*4)}.volr\\:mb-5{margin-bottom:calc(var(--volr-spacing)*5)}.volr\\:mb-6{margin-bottom:calc(var(--volr-spacing)*6)}.volr\\:mb-8{margin-bottom:calc(var(--volr-spacing)*8)}.volr\\:-ml-2{margin-left:calc(var(--volr-spacing)*-2)}.volr\\:ml-6{margin-left:calc(var(--volr-spacing)*6)}.volr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.volr\\:block{display:block}.volr\\:flex{display:flex}.volr\\:grid{display:grid}.volr\\:inline-block{display:inline-block}.volr\\:inline-flex{display:inline-flex}.volr\\:h-1{height:calc(var(--volr-spacing)*1)}.volr\\:h-1\\.5{height:calc(var(--volr-spacing)*1.5)}.volr\\:h-2{height:calc(var(--volr-spacing)*2)}.volr\\:h-3{height:calc(var(--volr-spacing)*3)}.volr\\:h-3\\.5{height:calc(var(--volr-spacing)*3.5)}.volr\\:h-4{height:calc(var(--volr-spacing)*4)}.volr\\:h-5{height:calc(var(--volr-spacing)*5)}.volr\\:h-6{height:calc(var(--volr-spacing)*6)}.volr\\:h-7{height:calc(var(--volr-spacing)*7)}.volr\\:h-8{height:calc(var(--volr-spacing)*8)}.volr\\:h-10{height:calc(var(--volr-spacing)*10)}.volr\\:h-12{height:calc(var(--volr-spacing)*12)}.volr\\:h-14{height:calc(var(--volr-spacing)*14)}.volr\\:h-16{height:calc(var(--volr-spacing)*16)}.volr\\:h-20{height:calc(var(--volr-spacing)*20)}.volr\\:h-24{height:calc(var(--volr-spacing)*24)}.volr\\:h-40{height:calc(var(--volr-spacing)*40)}.volr\\:h-44{height:calc(var(--volr-spacing)*44)}.volr\\:h-48{height:calc(var(--volr-spacing)*48)}.volr\\:h-\\[0\\.8em\\]{height:.8em}.volr\\:h-\\[200px\\]{height:200px}.volr\\:h-full{height:100%}.volr\\:h-px{height:1px}.volr\\:max-h-48{max-height:calc(var(--volr-spacing)*48)}.volr\\:max-h-60{max-height:calc(var(--volr-spacing)*60)}.volr\\:max-h-64{max-height:calc(var(--volr-spacing)*64)}.volr\\:max-h-\\[85vh\\]{max-height:85vh}.volr\\:max-h-\\[90vh\\]{max-height:90vh}.volr\\:min-h-\\[100px\\]{min-height:100px}.volr\\:min-h-\\[120px\\]{min-height:120px}.volr\\:min-h-\\[500px\\]{min-height:500px}.volr\\:w-1\\.5{width:calc(var(--volr-spacing)*1.5)}.volr\\:w-2{width:calc(var(--volr-spacing)*2)}.volr\\:w-3{width:calc(var(--volr-spacing)*3)}.volr\\:w-3\\.5{width:calc(var(--volr-spacing)*3.5)}.volr\\:w-4{width:calc(var(--volr-spacing)*4)}.volr\\:w-5{width:calc(var(--volr-spacing)*5)}.volr\\:w-6{width:calc(var(--volr-spacing)*6)}.volr\\:w-7{width:calc(var(--volr-spacing)*7)}.volr\\:w-8{width:calc(var(--volr-spacing)*8)}.volr\\:w-10{width:calc(var(--volr-spacing)*10)}.volr\\:w-12{width:calc(var(--volr-spacing)*12)}.volr\\:w-14{width:calc(var(--volr-spacing)*14)}.volr\\:w-16{width:calc(var(--volr-spacing)*16)}.volr\\:w-20{width:calc(var(--volr-spacing)*20)}.volr\\:w-24{width:calc(var(--volr-spacing)*24)}.volr\\:w-32{width:calc(var(--volr-spacing)*32)}.volr\\:w-36{width:calc(var(--volr-spacing)*36)}.volr\\:w-40{width:calc(var(--volr-spacing)*40)}.volr\\:w-44{width:calc(var(--volr-spacing)*44)}.volr\\:w-48{width:calc(var(--volr-spacing)*48)}.volr\\:w-\\[200px\\]{width:200px}.volr\\:w-auto{width:auto}.volr\\:w-full{width:100%}.volr\\:max-w-4xl{max-width:var(--volr-container-4xl)}.volr\\:max-w-full{max-width:100%}.volr\\:max-w-md{max-width:var(--volr-container-md)}.volr\\:max-w-none{max-width:none}.volr\\:min-w-0{min-width:calc(var(--volr-spacing)*0)}.volr\\:flex-1{flex:1}.volr\\:flex-shrink-0,.volr\\:shrink-0{flex-shrink:0}.volr\\:-translate-y-1\\/2{--volr-tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--volr-tw-translate-x)var(--volr-tw-translate-y)}.volr\\:rotate-90{rotate:90deg}.volr\\:rotate-180{rotate:180deg}.volr\\:animate-ping{animation:var(--volr-animate-ping)}.volr\\:animate-pulse{animation:var(--volr-animate-pulse)}.volr\\:animate-spin{animation:var(--volr-animate-spin)}.volr\\:cursor-not-allowed{cursor:not-allowed}.volr\\:cursor-pointer{cursor:pointer}.volr\\:list-inside{list-style-position:inside}.volr\\:list-decimal{list-style-type:decimal}.volr\\:grid-cols-\\[minmax\\(0\\,1\\.1fr\\)_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr)}.volr\\:flex-col{flex-direction:column}.volr\\:items-baseline{align-items:baseline}.volr\\:items-center{align-items:center}.volr\\:items-end{align-items:flex-end}.volr\\:items-start{align-items:flex-start}.volr\\:justify-between{justify-content:space-between}.volr\\:justify-center{justify-content:center}.volr\\:gap-1{gap:calc(var(--volr-spacing)*1)}.volr\\:gap-2{gap:calc(var(--volr-spacing)*2)}.volr\\:gap-3{gap:calc(var(--volr-spacing)*3)}.volr\\:gap-4{gap:calc(var(--volr-spacing)*4)}:where(.volr\\:space-y-1>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*1)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*1)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-2>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*2)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*2)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-3>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*3)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*3)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-4>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*4)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*4)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-5>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*5)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*5)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-6>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*6)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*6)*calc(1 - var(--volr-tw-space-y-reverse)))}.volr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.volr\\:overflow-auto{overflow:auto}.volr\\:overflow-hidden{overflow:hidden}.volr\\:overflow-visible{overflow:visible}.volr\\:overflow-x-auto{overflow-x:auto}.volr\\:overflow-y-auto{overflow-y:auto}.volr\\:rounded{border-radius:.25rem}.volr\\:rounded-2xl{border-radius:var(--volr-radius-2xl)}.volr\\:rounded-full{border-radius:3.40282e38px}.volr\\:rounded-lg{border-radius:var(--volr-radius-lg)}.volr\\:rounded-md{border-radius:var(--volr-radius-md)}.volr\\:rounded-xl{border-radius:var(--volr-radius-xl)}.volr\\:rounded-t-2xl{border-top-left-radius:var(--volr-radius-2xl);border-top-right-radius:var(--volr-radius-2xl)}.volr\\:rounded-t-3xl{border-top-left-radius:var(--volr-radius-3xl);border-top-right-radius:var(--volr-radius-3xl)}.volr\\:border{border-style:var(--volr-tw-border-style);border-width:1px}.volr\\:border-2{border-style:var(--volr-tw-border-style);border-width:2px}.volr\\:border-4{border-style:var(--volr-tw-border-style);border-width:4px}.volr\\:border-y{border-block-style:var(--volr-tw-border-style);border-block-width:1px}.volr\\:border-t{border-top-style:var(--volr-tw-border-style);border-top-width:1px}.volr\\:border-b{border-bottom-style:var(--volr-tw-border-style);border-bottom-width:1px}.volr\\:border-amber-200{border-color:var(--volr-color-amber-200)}.volr\\:border-red-200{border-color:var(--volr-color-red-200)}.volr\\:border-red-500{border-color:var(--volr-color-red-500)}.volr\\:border-slate-100{border-color:var(--volr-color-slate-100)}.volr\\:border-slate-200{border-color:var(--volr-color-slate-200)}.volr\\:border-slate-300{border-color:var(--volr-color-slate-300)}.volr\\:border-transparent{border-color:#0000}.volr\\:border-white{border-color:var(--volr-color-white)}.volr\\:border-t-slate-600{border-top-color:var(--volr-color-slate-600)}.volr\\:border-t-slate-900{border-top-color:var(--volr-color-slate-900)}.volr\\:bg-amber-50{background-color:var(--volr-color-amber-50)}.volr\\:bg-black\\/45{background-color:var(--volr-color-black)}@supports (color:color-mix(in lab, red, red)){.volr\\:bg-black\\/45{background-color:color-mix(in oklab,var(--volr-color-black)45%,transparent)}}.volr\\:bg-blue-100{background-color:var(--volr-color-blue-100)}.volr\\:bg-cyan-400{background-color:var(--volr-color-cyan-400)}.volr\\:bg-emerald-300{background-color:var(--volr-color-emerald-300)}.volr\\:bg-emerald-400{background-color:var(--volr-color-emerald-400)}.volr\\:bg-emerald-500{background-color:var(--volr-color-emerald-500)}.volr\\:bg-green-50{background-color:var(--volr-color-green-50)}.volr\\:bg-green-100{background-color:var(--volr-color-green-100)}.volr\\:bg-red-50{background-color:var(--volr-color-red-50)}.volr\\:bg-red-100{background-color:var(--volr-color-red-100)}.volr\\:bg-slate-50{background-color:var(--volr-color-slate-50)}.volr\\:bg-slate-100{background-color:var(--volr-color-slate-100)}.volr\\:bg-slate-200{background-color:var(--volr-color-slate-200)}.volr\\:bg-slate-900{background-color:var(--volr-color-slate-900)}.volr\\:bg-teal-400{background-color:var(--volr-color-teal-400)}.volr\\:bg-white{background-color:var(--volr-color-white)}.volr\\:bg-yellow-100{background-color:var(--volr-color-yellow-100)}.volr\\:bg-linear-to-br{--volr-tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab, red, red)){.volr\\:bg-linear-to-br{--volr-tw-gradient-position:to bottom right in oklab}}.volr\\:bg-linear-to-br{background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:bg-linear-to-r{--volr-tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.volr\\:bg-linear-to-r{--volr-tw-gradient-position:to right in oklab}}.volr\\:bg-linear-to-r{background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:from-emerald-400{--volr-tw-gradient-from:var(--volr-color-emerald-400);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:to-teal-500{--volr-tw-gradient-to:var(--volr-color-teal-500);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:object-cover{object-fit:cover}.volr\\:p-1{padding:calc(var(--volr-spacing)*1)}.volr\\:p-2{padding:calc(var(--volr-spacing)*2)}.volr\\:p-3{padding:calc(var(--volr-spacing)*3)}.volr\\:p-4{padding:calc(var(--volr-spacing)*4)}.volr\\:p-5{padding:calc(var(--volr-spacing)*5)}.volr\\:p-8{padding:calc(var(--volr-spacing)*8)}.volr\\:px-1\\.5{padding-inline:calc(var(--volr-spacing)*1.5)}.volr\\:px-2{padding-inline:calc(var(--volr-spacing)*2)}.volr\\:px-3{padding-inline:calc(var(--volr-spacing)*3)}.volr\\:px-4{padding-inline:calc(var(--volr-spacing)*4)}.volr\\:px-5{padding-inline:calc(var(--volr-spacing)*5)}.volr\\:px-6{padding-inline:calc(var(--volr-spacing)*6)}.volr\\:py-0\\.5{padding-block:calc(var(--volr-spacing)*.5)}.volr\\:py-1{padding-block:calc(var(--volr-spacing)*1)}.volr\\:py-1\\.5{padding-block:calc(var(--volr-spacing)*1.5)}.volr\\:py-2{padding-block:calc(var(--volr-spacing)*2)}.volr\\:py-2\\.5{padding-block:calc(var(--volr-spacing)*2.5)}.volr\\:py-3{padding-block:calc(var(--volr-spacing)*3)}.volr\\:py-4{padding-block:calc(var(--volr-spacing)*4)}.volr\\:py-6{padding-block:calc(var(--volr-spacing)*6)}.volr\\:py-7{padding-block:calc(var(--volr-spacing)*7)}.volr\\:py-8{padding-block:calc(var(--volr-spacing)*8)}.volr\\:py-12{padding-block:calc(var(--volr-spacing)*12)}.volr\\:pt-1{padding-top:calc(var(--volr-spacing)*1)}.volr\\:pt-2{padding-top:calc(var(--volr-spacing)*2)}.volr\\:pt-3{padding-top:calc(var(--volr-spacing)*3)}.volr\\:pt-4{padding-top:calc(var(--volr-spacing)*4)}.volr\\:pr-3{padding-right:calc(var(--volr-spacing)*3)}.volr\\:pr-16{padding-right:calc(var(--volr-spacing)*16)}.volr\\:pl-11{padding-left:calc(var(--volr-spacing)*11)}.volr\\:text-center{text-align:center}.volr\\:text-left{text-align:left}.volr\\:text-right{text-align:right}.volr\\:align-baseline{vertical-align:baseline}.volr\\:font-mono{font-family:var(--volr-font-mono)}.volr\\:text-2xl{font-size:var(--volr-text-2xl);line-height:var(--volr-tw-leading,var(--volr-text-2xl--line-height))}.volr\\:text-8xl{font-size:var(--volr-text-8xl);line-height:var(--volr-tw-leading,var(--volr-text-8xl--line-height))}.volr\\:text-base{font-size:var(--volr-text-base);line-height:var(--volr-tw-leading,var(--volr-text-base--line-height))}.volr\\:text-lg{font-size:var(--volr-text-lg);line-height:var(--volr-tw-leading,var(--volr-text-lg--line-height))}.volr\\:text-sm{font-size:var(--volr-text-sm);line-height:var(--volr-tw-leading,var(--volr-text-sm--line-height))}.volr\\:text-xl{font-size:var(--volr-text-xl);line-height:var(--volr-tw-leading,var(--volr-text-xl--line-height))}.volr\\:text-xs{font-size:var(--volr-text-xs);line-height:var(--volr-tw-leading,var(--volr-text-xs--line-height))}.volr\\:leading-relaxed{--volr-tw-leading:var(--volr-leading-relaxed);line-height:var(--volr-leading-relaxed)}.volr\\:font-bold{--volr-tw-font-weight:var(--volr-font-weight-bold);font-weight:var(--volr-font-weight-bold)}.volr\\:font-medium{--volr-tw-font-weight:var(--volr-font-weight-medium);font-weight:var(--volr-font-weight-medium)}.volr\\:font-semibold{--volr-tw-font-weight:var(--volr-font-weight-semibold);font-weight:var(--volr-font-weight-semibold)}.volr\\:tracking-tight{--volr-tw-tracking:var(--volr-tracking-tight);letter-spacing:var(--volr-tracking-tight)}.volr\\:tracking-wide{--volr-tw-tracking:var(--volr-tracking-wide);letter-spacing:var(--volr-tracking-wide)}.volr\\:tracking-wider{--volr-tw-tracking:var(--volr-tracking-wider);letter-spacing:var(--volr-tracking-wider)}.volr\\:break-all{word-break:break-all}.volr\\:text-amber-700{color:var(--volr-color-amber-700)}.volr\\:text-blue-700{color:var(--volr-color-blue-700)}.volr\\:text-emerald-600{color:var(--volr-color-emerald-600)}.volr\\:text-gray-500{color:var(--volr-color-gray-500)}.volr\\:text-green-600{color:var(--volr-color-green-600)}.volr\\:text-green-700{color:var(--volr-color-green-700)}.volr\\:text-red-500{color:var(--volr-color-red-500)}.volr\\:text-red-600{color:var(--volr-color-red-600)}.volr\\:text-red-700{color:var(--volr-color-red-700)}.volr\\:text-slate-300{color:var(--volr-color-slate-300)}.volr\\:text-slate-400{color:var(--volr-color-slate-400)}.volr\\:text-slate-500{color:var(--volr-color-slate-500)}.volr\\:text-slate-600{color:var(--volr-color-slate-600)}.volr\\:text-slate-700{color:var(--volr-color-slate-700)}.volr\\:text-slate-800{color:var(--volr-color-slate-800)}.volr\\:text-slate-900{color:var(--volr-color-slate-900)}.volr\\:text-white{color:var(--volr-color-white)}.volr\\:text-yellow-700{color:var(--volr-color-yellow-700)}.volr\\:capitalize{text-transform:capitalize}.volr\\:uppercase{text-transform:uppercase}.volr\\:underline{text-decoration-line:underline}.volr\\:underline-offset-4{text-underline-offset:4px}.volr\\:opacity-0{opacity:0}.volr\\:opacity-25{opacity:.25}.volr\\:opacity-30{opacity:.3}.volr\\:opacity-50{opacity:.5}.volr\\:opacity-70{opacity:.7}.volr\\:opacity-75{opacity:.75}.volr\\:opacity-80{opacity:.8}.volr\\:shadow-2xl{--volr-tw-shadow:0 25px 50px -12px var(--volr-tw-shadow-color,#00000040);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-lg{--volr-tw-shadow:0 10px 15px -3px var(--volr-tw-shadow-color,#0000001a),0 4px 6px -4px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-sm{--volr-tw-shadow:0 1px 3px 0 var(--volr-tw-shadow-color,#0000001a),0 1px 2px -1px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-xl{--volr-tw-shadow:0 20px 25px -5px var(--volr-tw-shadow-color,#0000001a),0 8px 10px -6px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-emerald-500\\/50{--volr-tw-shadow-color:var(--volr-color-emerald-500)}@supports (color:color-mix(in lab, red, red)){.volr\\:shadow-emerald-500\\/50{--volr-tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--volr-color-emerald-500)50%,transparent)var(--volr-tw-shadow-alpha),transparent)}}.volr\\:blur-2xl{--volr-tw-blur:blur(var(--volr-blur-2xl));filter:var(--volr-tw-blur,)var(--volr-tw-brightness,)var(--volr-tw-contrast,)var(--volr-tw-grayscale,)var(--volr-tw-hue-rotate,)var(--volr-tw-invert,)var(--volr-tw-saturate,)var(--volr-tw-sepia,)var(--volr-tw-drop-shadow,)}.volr\\:transition-all{transition-property:all;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--volr-tw-gradient-from,--volr-tw-gradient-via,--volr-tw-gradient-to;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:duration-200{--volr-tw-duration:.2s;transition-duration:.2s}.volr\\:duration-300{--volr-tw-duration:.3s;transition-duration:.3s}.volr\\:duration-500{--volr-tw-duration:.5s;transition-duration:.5s}.volr\\:ease-out{--volr-tw-ease:var(--volr-ease-out);transition-timing-function:var(--volr-ease-out)}.volr\\:outline-none{--volr-tw-outline-style:none;outline-style:none}@media (hover:hover){.volr\\:hover\\:border-slate-300:hover{border-color:var(--volr-color-slate-300)}.volr\\:hover\\:bg-slate-50:hover{background-color:var(--volr-color-slate-50)}.volr\\:hover\\:bg-slate-200:hover{background-color:var(--volr-color-slate-200)}.volr\\:hover\\:text-slate-700:hover{color:var(--volr-color-slate-700)}}.volr\\:focus\\:ring-2:focus{--volr-tw-ring-shadow:var(--volr-tw-ring-inset,)0 0 0 calc(2px + var(--volr-tw-ring-offset-width))var(--volr-tw-ring-color,currentcolor);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:focus\\:ring-slate-300:focus{--volr-tw-ring-color:var(--volr-color-slate-300)}.volr\\:focus\\:outline-none:focus{--volr-tw-outline-style:none;outline-style:none}.volr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.volr\\:disabled\\:bg-slate-100:disabled{background-color:var(--volr-color-slate-100)}.volr\\:disabled\\:text-slate-400:disabled{color:var(--volr-color-slate-400)}.volr\\:disabled\\:opacity-50:disabled{opacity:.5}.volr-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.volr-text-secondary{color:var(--volr-text-secondary)}.volr-text-muted{color:var(--volr-text-muted)}.volr-bg-secondary{background-color:var(--volr-bg-secondary)}.volr-bg-tertiary{background-color:var(--volr-bg-tertiary)}.volr-border{border-color:var(--volr-border)}.volr-border-strong{border-color:var(--volr-border-strong)}.volr-divider-line{background-color:var(--volr-border)}.volr-error{background-color:var(--volr-error-bg);border-color:var(--volr-error-border);color:var(--volr-error-text)}.volr-hint{background-color:var(--volr-hint-bg);border:1px solid var(--volr-hint-border);color:var(--volr-hint-text)}.volr-hover:hover{background-color:var(--volr-hover-bg)}.volr-surface{background-color:var(--volr-bg)}}@property --volr-tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --volr-tw-gradient-position{syntax:"*";inherits:false}@property --volr-tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-stops{syntax:"*";inherits:false}@property --volr-tw-gradient-via-stops{syntax:"*";inherits:false}@property --volr-tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --volr-tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --volr-tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --volr-tw-leading{syntax:"*";inherits:false}@property --volr-tw-font-weight{syntax:"*";inherits:false}@property --volr-tw-tracking{syntax:"*";inherits:false}@property --volr-tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-shadow-color{syntax:"*";inherits:false}@property --volr-tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-inset-shadow-color{syntax:"*";inherits:false}@property --volr-tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-ring-color{syntax:"*";inherits:false}@property --volr-tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-inset-ring-color{syntax:"*";inherits:false}@property --volr-tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-ring-inset{syntax:"*";inherits:false}@property --volr-tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --volr-tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --volr-tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-blur{syntax:"*";inherits:false}@property --volr-tw-brightness{syntax:"*";inherits:false}@property --volr-tw-contrast{syntax:"*";inherits:false}@property --volr-tw-grayscale{syntax:"*";inherits:false}@property --volr-tw-hue-rotate{syntax:"*";inherits:false}@property --volr-tw-invert{syntax:"*";inherits:false}@property --volr-tw-opacity{syntax:"*";inherits:false}@property --volr-tw-saturate{syntax:"*";inherits:false}@property --volr-tw-sepia{syntax:"*";inherits:false}@property --volr-tw-drop-shadow{syntax:"*";inherits:false}@property --volr-tw-drop-shadow-color{syntax:"*";inherits:false}@property --volr-tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-drop-shadow-size{syntax:"*";inherits:false}@property --volr-tw-duration{syntax:"*";inherits:false}@property --volr-tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}';
|
|
1234
1259
|
function useResolvedTheme(theme = "light") {
|
|
1235
|
-
const [resolvedTheme, setResolvedTheme] =
|
|
1260
|
+
const [resolvedTheme, setResolvedTheme] = React16.useState(() => {
|
|
1236
1261
|
if (theme !== "system") return theme;
|
|
1237
1262
|
if (typeof window === "undefined") return "light";
|
|
1238
1263
|
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
1239
1264
|
});
|
|
1240
|
-
|
|
1265
|
+
React16.useEffect(() => {
|
|
1241
1266
|
if (theme !== "system") {
|
|
1242
1267
|
setResolvedTheme(theme);
|
|
1243
1268
|
return;
|
|
@@ -1253,10 +1278,10 @@ function useResolvedTheme(theme = "light") {
|
|
|
1253
1278
|
return resolvedTheme;
|
|
1254
1279
|
}
|
|
1255
1280
|
function ShadowPortal({ children, theme = "light" }) {
|
|
1256
|
-
const [mountNode, setMountNode] =
|
|
1257
|
-
const hostRef =
|
|
1281
|
+
const [mountNode, setMountNode] = React16.useState(null);
|
|
1282
|
+
const hostRef = React16.useRef(null);
|
|
1258
1283
|
const resolvedTheme = useResolvedTheme(theme);
|
|
1259
|
-
|
|
1284
|
+
React16.useEffect(() => {
|
|
1260
1285
|
const host = document.createElement("div");
|
|
1261
1286
|
host.id = "volr-shadow-portal";
|
|
1262
1287
|
host.style.position = "fixed";
|
|
@@ -1280,7 +1305,7 @@ function ShadowPortal({ children, theme = "light" }) {
|
|
|
1280
1305
|
hostRef.current = null;
|
|
1281
1306
|
};
|
|
1282
1307
|
}, []);
|
|
1283
|
-
|
|
1308
|
+
React16.useEffect(() => {
|
|
1284
1309
|
if (hostRef.current) {
|
|
1285
1310
|
hostRef.current.setAttribute("data-theme", resolvedTheme);
|
|
1286
1311
|
}
|
|
@@ -1289,7 +1314,7 @@ function ShadowPortal({ children, theme = "light" }) {
|
|
|
1289
1314
|
return reactDom.createPortal(children, mountNode);
|
|
1290
1315
|
}
|
|
1291
1316
|
function useFocusTrap(isActive, containerRef) {
|
|
1292
|
-
const previousActiveElement =
|
|
1317
|
+
const previousActiveElement = React16.useRef(null);
|
|
1293
1318
|
const focusableSelector = [
|
|
1294
1319
|
"button:not([disabled])",
|
|
1295
1320
|
"input:not([disabled])",
|
|
@@ -1298,7 +1323,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1298
1323
|
"a[href]",
|
|
1299
1324
|
'[tabindex]:not([tabindex="-1"])'
|
|
1300
1325
|
].join(", ");
|
|
1301
|
-
const getFocusableElements =
|
|
1326
|
+
const getFocusableElements = React16.useCallback(() => {
|
|
1302
1327
|
if (!containerRef.current) return [];
|
|
1303
1328
|
return Array.from(
|
|
1304
1329
|
containerRef.current.querySelectorAll(focusableSelector)
|
|
@@ -1306,7 +1331,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1306
1331
|
return el.offsetParent !== null;
|
|
1307
1332
|
});
|
|
1308
1333
|
}, [containerRef, focusableSelector]);
|
|
1309
|
-
const handleKeyDown =
|
|
1334
|
+
const handleKeyDown = React16.useCallback(
|
|
1310
1335
|
(event) => {
|
|
1311
1336
|
if (event.key !== "Tab") return;
|
|
1312
1337
|
const focusableElements = getFocusableElements();
|
|
@@ -1327,7 +1352,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1327
1352
|
},
|
|
1328
1353
|
[getFocusableElements]
|
|
1329
1354
|
);
|
|
1330
|
-
|
|
1355
|
+
React16.useEffect(() => {
|
|
1331
1356
|
if (!isActive) return;
|
|
1332
1357
|
previousActiveElement.current = document.activeElement;
|
|
1333
1358
|
const focusableElements = getFocusableElements();
|
|
@@ -1358,12 +1383,12 @@ var Modal = ({
|
|
|
1358
1383
|
}) => {
|
|
1359
1384
|
const isMobile2 = useMediaQuery("(max-width: 500px)");
|
|
1360
1385
|
const variant = explicitVariant ?? (isMobile2 ? "bottom-sheet" : "centered");
|
|
1361
|
-
const dialogRef =
|
|
1362
|
-
const dialogId =
|
|
1386
|
+
const dialogRef = React16.useRef(null);
|
|
1387
|
+
const dialogId = React16.useId();
|
|
1363
1388
|
const uiContext = useVolrUIOptional();
|
|
1364
1389
|
const theme = uiContext?.theme ?? "light";
|
|
1365
1390
|
useFocusTrap(open, dialogRef);
|
|
1366
|
-
|
|
1391
|
+
React16.useEffect(() => {
|
|
1367
1392
|
const handleEscape = (e) => {
|
|
1368
1393
|
if (e.key === "Escape" && open) {
|
|
1369
1394
|
if (onEscapeKeyDown) {
|
|
@@ -1946,7 +1971,7 @@ var variantMap = {
|
|
|
1946
1971
|
ghost: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "none" },
|
|
1947
1972
|
outline: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "1px solid var(--volr-border)" }
|
|
1948
1973
|
};
|
|
1949
|
-
var Button =
|
|
1974
|
+
var Button = React16__default.default.forwardRef(
|
|
1950
1975
|
({ variant = "primary", size = "md", fullWidth, className, style, disabled, children, ...props }, ref) => {
|
|
1951
1976
|
const { accentColor } = useVolrUI();
|
|
1952
1977
|
const sizeStyle = sizeMap[size];
|
|
@@ -2147,11 +2172,11 @@ function PasskeyMigrationView({
|
|
|
2147
2172
|
wrapInModal = true
|
|
2148
2173
|
}) {
|
|
2149
2174
|
const { t } = useI18n();
|
|
2150
|
-
const [isMigrating, setIsMigrating] =
|
|
2151
|
-
const [isComplete, setIsComplete] =
|
|
2152
|
-
const [error, setError] =
|
|
2175
|
+
const [isMigrating, setIsMigrating] = React16.useState(false);
|
|
2176
|
+
const [isComplete, setIsComplete] = React16.useState(false);
|
|
2177
|
+
const [error, setError] = React16.useState(null);
|
|
2153
2178
|
const biometricType = getBiometricType();
|
|
2154
|
-
|
|
2179
|
+
React16.useEffect(() => {
|
|
2155
2180
|
if (typeof window === "undefined") return;
|
|
2156
2181
|
const handler = (event) => {
|
|
2157
2182
|
if (event.data?.type === "VOLR_MIGRATION_DONE") {
|
|
@@ -2162,7 +2187,7 @@ function PasskeyMigrationView({
|
|
|
2162
2187
|
window.addEventListener("message", handler);
|
|
2163
2188
|
return () => window.removeEventListener("message", handler);
|
|
2164
2189
|
}, []);
|
|
2165
|
-
|
|
2190
|
+
React16.useEffect(() => {
|
|
2166
2191
|
if (isComplete) {
|
|
2167
2192
|
const timer = setTimeout(() => {
|
|
2168
2193
|
if (onComplete) {
|
|
@@ -2186,7 +2211,7 @@ function PasskeyMigrationView({
|
|
|
2186
2211
|
}
|
|
2187
2212
|
}
|
|
2188
2213
|
};
|
|
2189
|
-
const handleDone =
|
|
2214
|
+
const handleDone = React16.useCallback(() => {
|
|
2190
2215
|
if (onComplete) {
|
|
2191
2216
|
onComplete();
|
|
2192
2217
|
}
|
|
@@ -2283,22 +2308,22 @@ function PasskeyEnrollView({
|
|
|
2283
2308
|
isEnrolling,
|
|
2284
2309
|
error: enrollmentError
|
|
2285
2310
|
} = react.usePasskeyEnrollment();
|
|
2286
|
-
const [hasStarted, setHasStarted] =
|
|
2287
|
-
const [errorMessage, setErrorMessage] =
|
|
2288
|
-
const [isRefreshing, setIsRefreshing] =
|
|
2311
|
+
const [hasStarted, setHasStarted] = React16.useState(false);
|
|
2312
|
+
const [errorMessage, setErrorMessage] = React16.useState(null);
|
|
2313
|
+
const [isRefreshing, setIsRefreshing] = React16.useState(false);
|
|
2289
2314
|
const biometricType = getBiometricType();
|
|
2290
|
-
const compatibility =
|
|
2291
|
-
const [hasPrfError, setHasPrfError] =
|
|
2292
|
-
const platformHint =
|
|
2315
|
+
const compatibility = React16.useMemo(() => react.checkPrfCompatibility(), []);
|
|
2316
|
+
const [hasPrfError, setHasPrfError] = React16.useState(false);
|
|
2317
|
+
const platformHint = React16.useMemo(
|
|
2293
2318
|
() => hasPrfError ? react.getPlatformHint(compatibility.platform) : { hintKey: "", noteKey: "" },
|
|
2294
2319
|
[compatibility.platform, hasPrfError]
|
|
2295
2320
|
);
|
|
2296
2321
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
2297
|
-
const currentDomain =
|
|
2322
|
+
const currentDomain = React16.useMemo(() => {
|
|
2298
2323
|
if (typeof window === "undefined") return "localhost";
|
|
2299
2324
|
return window.location.hostname;
|
|
2300
2325
|
}, []);
|
|
2301
|
-
const migrationInfo =
|
|
2326
|
+
const migrationInfo = React16.useMemo(() => {
|
|
2302
2327
|
if (!user?.registeredPasskeys || user.registeredPasskeys.length === 0) {
|
|
2303
2328
|
return { needsMigration: false, sourcePasskey: null };
|
|
2304
2329
|
}
|
|
@@ -2311,7 +2336,7 @@ function PasskeyEnrollView({
|
|
|
2311
2336
|
const sourcePasskey = user.registeredPasskeys[0];
|
|
2312
2337
|
return { needsMigration: true, sourcePasskey };
|
|
2313
2338
|
}, [user?.registeredPasskeys, currentDomain]);
|
|
2314
|
-
|
|
2339
|
+
React16.useEffect(() => {
|
|
2315
2340
|
console.log("[PasskeyEnrollView] User state:", {
|
|
2316
2341
|
user,
|
|
2317
2342
|
keyStorageType: user?.keyStorageType,
|
|
@@ -2322,7 +2347,7 @@ function PasskeyEnrollView({
|
|
|
2322
2347
|
migrationInfo
|
|
2323
2348
|
});
|
|
2324
2349
|
}, [user, hasPasskey, currentDomain, migrationInfo]);
|
|
2325
|
-
|
|
2350
|
+
React16.useEffect(() => {
|
|
2326
2351
|
if (hasPasskey && !user?.evmAddress && !isRefreshing) {
|
|
2327
2352
|
const refreshUserData = async () => {
|
|
2328
2353
|
try {
|
|
@@ -2353,7 +2378,7 @@ function PasskeyEnrollView({
|
|
|
2353
2378
|
refreshUserData();
|
|
2354
2379
|
}
|
|
2355
2380
|
}, [hasPasskey, user?.evmAddress, isRefreshing, client, setUser, user]);
|
|
2356
|
-
|
|
2381
|
+
React16.useEffect(() => {
|
|
2357
2382
|
if (!user?.id) {
|
|
2358
2383
|
const error = new Error("User ID is required for passkey enrollment");
|
|
2359
2384
|
setErrorMessage(getUserFriendlyError(error, t));
|
|
@@ -2362,7 +2387,7 @@ function PasskeyEnrollView({
|
|
|
2362
2387
|
}
|
|
2363
2388
|
}
|
|
2364
2389
|
}, [user, onError, t]);
|
|
2365
|
-
|
|
2390
|
+
React16.useEffect(() => {
|
|
2366
2391
|
if (enrollmentError) {
|
|
2367
2392
|
const friendlyMessage = getUserFriendlyError(enrollmentError, t);
|
|
2368
2393
|
setErrorMessage(friendlyMessage);
|
|
@@ -2641,7 +2666,7 @@ function MigrationTargetView({
|
|
|
2641
2666
|
const biometricType = getBiometricType();
|
|
2642
2667
|
const isProcessing = step !== "ready" && step !== "error" && step !== "success";
|
|
2643
2668
|
const progress = STEP_PROGRESS2[step];
|
|
2644
|
-
|
|
2669
|
+
React16.useEffect(() => {
|
|
2645
2670
|
if (step === "success" && onAutoClose) {
|
|
2646
2671
|
const timer = setTimeout(() => {
|
|
2647
2672
|
onAutoClose();
|
|
@@ -2721,8 +2746,8 @@ function MpcConnectView({
|
|
|
2721
2746
|
isConnecting,
|
|
2722
2747
|
error: connectionError
|
|
2723
2748
|
} = react.useMpcConnection();
|
|
2724
|
-
const [errorMessage, setErrorMessage] =
|
|
2725
|
-
|
|
2749
|
+
const [errorMessage, setErrorMessage] = React16.useState(null);
|
|
2750
|
+
React16.useEffect(() => {
|
|
2726
2751
|
if (connectionError) {
|
|
2727
2752
|
setErrorMessage(connectionError.message);
|
|
2728
2753
|
if (onError) {
|
|
@@ -2730,7 +2755,7 @@ function MpcConnectView({
|
|
|
2730
2755
|
}
|
|
2731
2756
|
}
|
|
2732
2757
|
}, [connectionError, onError]);
|
|
2733
|
-
|
|
2758
|
+
React16.useEffect(() => {
|
|
2734
2759
|
handleConnect();
|
|
2735
2760
|
}, []);
|
|
2736
2761
|
const handleConnect = async () => {
|
|
@@ -2961,9 +2986,9 @@ function PoweredBy() {
|
|
|
2961
2986
|
}
|
|
2962
2987
|
function EmailInlineInput({ onSubmit, accentColor }) {
|
|
2963
2988
|
const { t } = useI18n();
|
|
2964
|
-
const [email, setEmail] =
|
|
2965
|
-
const [error, setError] =
|
|
2966
|
-
const [isLoading, setIsLoading] =
|
|
2989
|
+
const [email, setEmail] = React16.useState("");
|
|
2990
|
+
const [error, setError] = React16.useState(null);
|
|
2991
|
+
const [isLoading, setIsLoading] = React16.useState(false);
|
|
2967
2992
|
const handleSubmit = async (e) => {
|
|
2968
2993
|
e.preventDefault();
|
|
2969
2994
|
setError(null);
|
|
@@ -3087,14 +3112,14 @@ function SigninSelectScreen({
|
|
|
3087
3112
|
function CodeInputScreen({ email, onSubmit, onResend }) {
|
|
3088
3113
|
const { t } = useI18n();
|
|
3089
3114
|
const { accentColor } = useVolrUI();
|
|
3090
|
-
const [digits, setDigits] =
|
|
3091
|
-
const [error, setError] =
|
|
3092
|
-
const [isLoading, setIsLoading] =
|
|
3093
|
-
const inputRefs =
|
|
3094
|
-
|
|
3115
|
+
const [digits, setDigits] = React16.useState(Array(6).fill(""));
|
|
3116
|
+
const [error, setError] = React16.useState(null);
|
|
3117
|
+
const [isLoading, setIsLoading] = React16.useState(false);
|
|
3118
|
+
const inputRefs = React16.useRef([]);
|
|
3119
|
+
React16.useEffect(() => {
|
|
3095
3120
|
inputRefs.current[0]?.focus();
|
|
3096
3121
|
}, []);
|
|
3097
|
-
|
|
3122
|
+
React16.useEffect(() => {
|
|
3098
3123
|
const code = digits.join("");
|
|
3099
3124
|
if (code.length === 6 && !isLoading) {
|
|
3100
3125
|
handleSubmit(code);
|
|
@@ -3206,7 +3231,7 @@ function CodeInputScreen({ email, onSubmit, onResend }) {
|
|
|
3206
3231
|
] });
|
|
3207
3232
|
}
|
|
3208
3233
|
var CopyButton = ({ text, className, onCopy }) => {
|
|
3209
|
-
const [copied, setCopied] =
|
|
3234
|
+
const [copied, setCopied] = React16.useState(false);
|
|
3210
3235
|
const handleCopy = async () => {
|
|
3211
3236
|
try {
|
|
3212
3237
|
await navigator.clipboard.writeText(text);
|
|
@@ -3285,23 +3310,23 @@ function SiweLoginScreen({
|
|
|
3285
3310
|
checkSiweSession,
|
|
3286
3311
|
getSiweSignUrl
|
|
3287
3312
|
} = react.useVolrLogin();
|
|
3288
|
-
const [isLoading, setIsLoading] =
|
|
3289
|
-
const [loadingWallet, setLoadingWallet] =
|
|
3290
|
-
const [error, setError] =
|
|
3291
|
-
const [providers, setProviders] =
|
|
3292
|
-
const [isDetecting, setIsDetecting] =
|
|
3293
|
-
const [hasLegacyWallet, setHasLegacyWallet] =
|
|
3294
|
-
const [showOtherWallet, setShowOtherWallet] =
|
|
3295
|
-
const [sessionUrl, setSessionUrl] =
|
|
3296
|
-
const [isPolling, setIsPolling] =
|
|
3297
|
-
const pollingRef =
|
|
3298
|
-
const sessionCreatedRef =
|
|
3299
|
-
|
|
3313
|
+
const [isLoading, setIsLoading] = React16.useState(false);
|
|
3314
|
+
const [loadingWallet, setLoadingWallet] = React16.useState(null);
|
|
3315
|
+
const [error, setError] = React16.useState(null);
|
|
3316
|
+
const [providers, setProviders] = React16.useState([]);
|
|
3317
|
+
const [isDetecting, setIsDetecting] = React16.useState(true);
|
|
3318
|
+
const [hasLegacyWallet, setHasLegacyWallet] = React16.useState(false);
|
|
3319
|
+
const [showOtherWallet, setShowOtherWallet] = React16.useState(false);
|
|
3320
|
+
const [sessionUrl, setSessionUrl] = React16.useState(null);
|
|
3321
|
+
const [isPolling, setIsPolling] = React16.useState(false);
|
|
3322
|
+
const pollingRef = React16.useRef(null);
|
|
3323
|
+
const sessionCreatedRef = React16.useRef(false);
|
|
3324
|
+
React16.useEffect(() => {
|
|
3300
3325
|
return () => {
|
|
3301
3326
|
if (pollingRef.current) clearInterval(pollingRef.current);
|
|
3302
3327
|
};
|
|
3303
3328
|
}, []);
|
|
3304
|
-
|
|
3329
|
+
React16.useEffect(() => {
|
|
3305
3330
|
if (typeof window === "undefined") {
|
|
3306
3331
|
setIsDetecting(false);
|
|
3307
3332
|
return;
|
|
@@ -3327,7 +3352,7 @@ function SiweLoginScreen({
|
|
|
3327
3352
|
};
|
|
3328
3353
|
}, []);
|
|
3329
3354
|
const hasAnyWallet = providers.length > 0 || hasLegacyWallet;
|
|
3330
|
-
const createSession =
|
|
3355
|
+
const createSession = React16.useCallback(async () => {
|
|
3331
3356
|
if (sessionCreatedRef.current || sessionUrl) return;
|
|
3332
3357
|
sessionCreatedRef.current = true;
|
|
3333
3358
|
try {
|
|
@@ -3369,17 +3394,17 @@ function SiweLoginScreen({
|
|
|
3369
3394
|
onError(err instanceof Error ? err : new Error("Failed to create session"));
|
|
3370
3395
|
}
|
|
3371
3396
|
}, [createSiweSession, getSiweSignUrl, checkSiweSession, onSuccess, onError, t, sessionUrl]);
|
|
3372
|
-
|
|
3397
|
+
React16.useEffect(() => {
|
|
3373
3398
|
if (!isDetecting && !hasAnyWallet && !sessionUrl) {
|
|
3374
3399
|
createSession();
|
|
3375
3400
|
}
|
|
3376
3401
|
}, [isDetecting, hasAnyWallet, sessionUrl, createSession]);
|
|
3377
|
-
|
|
3402
|
+
React16.useEffect(() => {
|
|
3378
3403
|
if (showOtherWallet && !sessionUrl) {
|
|
3379
3404
|
createSession();
|
|
3380
3405
|
}
|
|
3381
3406
|
}, [showOtherWallet, sessionUrl, createSession]);
|
|
3382
|
-
const handleWalletClick =
|
|
3407
|
+
const handleWalletClick = React16.useCallback(async (provider, walletName, walletConnector) => {
|
|
3383
3408
|
setError(null);
|
|
3384
3409
|
setIsLoading(true);
|
|
3385
3410
|
setLoadingWallet(walletName);
|
|
@@ -3403,7 +3428,7 @@ function SiweLoginScreen({
|
|
|
3403
3428
|
setLoadingWallet(null);
|
|
3404
3429
|
}
|
|
3405
3430
|
}, [signWithWallet, onSuccess, onError]);
|
|
3406
|
-
const handleLegacyWalletClick =
|
|
3431
|
+
const handleLegacyWalletClick = React16.useCallback(async () => {
|
|
3407
3432
|
if (typeof window === "undefined" || !window.ethereum) return;
|
|
3408
3433
|
const ethereum = window.ethereum;
|
|
3409
3434
|
let walletName = "Wallet";
|
|
@@ -3412,7 +3437,7 @@ function SiweLoginScreen({
|
|
|
3412
3437
|
else if (ethereum.isRabby) walletName = "Rabby";
|
|
3413
3438
|
await handleWalletClick(ethereum, walletName);
|
|
3414
3439
|
}, [handleWalletClick]);
|
|
3415
|
-
const cancelOtherWallet =
|
|
3440
|
+
const cancelOtherWallet = React16.useCallback(() => {
|
|
3416
3441
|
if (pollingRef.current) {
|
|
3417
3442
|
clearInterval(pollingRef.current);
|
|
3418
3443
|
pollingRef.current = null;
|
|
@@ -3559,13 +3584,13 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3559
3584
|
const { client } = react.useInternalAuth();
|
|
3560
3585
|
const { appName, branding } = useVolrUI();
|
|
3561
3586
|
const { requestEmailCode, verifyEmailCode, handleSocialLogin } = react.useVolrLogin();
|
|
3562
|
-
const [currentScreen, setCurrentScreen] =
|
|
3563
|
-
const [email, setEmail] =
|
|
3587
|
+
const [currentScreen, setCurrentScreen] = React16.useState("method-select");
|
|
3588
|
+
const [email, setEmail] = React16.useState("");
|
|
3564
3589
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
3565
3590
|
const isMobile2 = useMediaQuery("(max-width: 500px)");
|
|
3566
3591
|
const isWideViewport = useMediaQuery("(min-width: 864px)");
|
|
3567
3592
|
const shouldUseWideLayout = !isMobile2 && isWideViewport && Boolean(branding) && currentScreen === "method-select";
|
|
3568
|
-
|
|
3593
|
+
React16.useEffect(() => {
|
|
3569
3594
|
if (!isOpen) {
|
|
3570
3595
|
setCurrentScreen("method-select");
|
|
3571
3596
|
setEmail("");
|
|
@@ -3790,7 +3815,7 @@ function AssetSelectView({
|
|
|
3790
3815
|
}) })
|
|
3791
3816
|
] });
|
|
3792
3817
|
}
|
|
3793
|
-
var TextLinkButton =
|
|
3818
|
+
var TextLinkButton = React16__default.default.forwardRef(({ showArrow = false, className, children, ...props }, ref) => {
|
|
3794
3819
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3795
3820
|
"button",
|
|
3796
3821
|
{
|
|
@@ -3919,23 +3944,23 @@ function WalletTransferView({
|
|
|
3919
3944
|
const { config } = react.useVolrContext();
|
|
3920
3945
|
const { client } = react.useInternalAuth();
|
|
3921
3946
|
const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
|
|
3922
|
-
const [viewState, setViewState] =
|
|
3923
|
-
const [selectedWallet, setSelectedWallet] =
|
|
3924
|
-
const [connectedAddress, setConnectedAddress] =
|
|
3925
|
-
const [balance, setBalance] =
|
|
3926
|
-
const [amount, setAmount] =
|
|
3927
|
-
const [isConnecting, setIsConnecting] =
|
|
3928
|
-
const [isTransferring, setIsTransferring] =
|
|
3929
|
-
const [error, setError] =
|
|
3930
|
-
const [chainName, setChainName] =
|
|
3931
|
-
const [currentChainId, setCurrentChainId] =
|
|
3947
|
+
const [viewState, setViewState] = React16.useState("select-wallet");
|
|
3948
|
+
const [selectedWallet, setSelectedWallet] = React16.useState(null);
|
|
3949
|
+
const [connectedAddress, setConnectedAddress] = React16.useState(null);
|
|
3950
|
+
const [balance, setBalance] = React16.useState(null);
|
|
3951
|
+
const [amount, setAmount] = React16.useState("");
|
|
3952
|
+
const [isConnecting, setIsConnecting] = React16.useState(false);
|
|
3953
|
+
const [isTransferring, setIsTransferring] = React16.useState(false);
|
|
3954
|
+
const [error, setError] = React16.useState(null);
|
|
3955
|
+
const [chainName, setChainName] = React16.useState(null);
|
|
3956
|
+
const [currentChainId, setCurrentChainId] = React16.useState(null);
|
|
3932
3957
|
const tokenSymbol = asset === "native" ? "ETH" : asset.symbol;
|
|
3933
3958
|
const decimals = asset === "native" ? 18 : asset.decimals;
|
|
3934
|
-
const getNetworkInfo =
|
|
3959
|
+
const getNetworkInfo = React16.useCallback(
|
|
3935
3960
|
react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
|
|
3936
3961
|
[client, config.rpcOverrides]
|
|
3937
3962
|
);
|
|
3938
|
-
|
|
3963
|
+
React16.useEffect(() => {
|
|
3939
3964
|
let cancelled = false;
|
|
3940
3965
|
const loadChainName = async () => {
|
|
3941
3966
|
try {
|
|
@@ -3950,7 +3975,7 @@ function WalletTransferView({
|
|
|
3950
3975
|
cancelled = true;
|
|
3951
3976
|
};
|
|
3952
3977
|
}, [getNetworkInfo, chainId]);
|
|
3953
|
-
const connectWallet =
|
|
3978
|
+
const connectWallet = React16.useCallback(async (wallet) => {
|
|
3954
3979
|
setIsConnecting(true);
|
|
3955
3980
|
setError(null);
|
|
3956
3981
|
try {
|
|
@@ -3974,7 +3999,7 @@ function WalletTransferView({
|
|
|
3974
3999
|
setIsConnecting(false);
|
|
3975
4000
|
}
|
|
3976
4001
|
}, [chainId, asset]);
|
|
3977
|
-
const fetchBalance =
|
|
4002
|
+
const fetchBalance = React16.useCallback(async (provider, address, currentChain) => {
|
|
3978
4003
|
try {
|
|
3979
4004
|
if (currentChain !== chainId) {
|
|
3980
4005
|
setBalance(null);
|
|
@@ -3999,7 +4024,7 @@ function WalletTransferView({
|
|
|
3999
4024
|
setBalance(BigInt(0));
|
|
4000
4025
|
}
|
|
4001
4026
|
}, [chainId, asset]);
|
|
4002
|
-
const switchNetwork =
|
|
4027
|
+
const switchNetwork = React16.useCallback(async () => {
|
|
4003
4028
|
if (!selectedWallet?.provider) return;
|
|
4004
4029
|
try {
|
|
4005
4030
|
await selectedWallet.provider.request({
|
|
@@ -4017,7 +4042,7 @@ function WalletTransferView({
|
|
|
4017
4042
|
setError(err instanceof Error ? err.message : "Failed to switch network");
|
|
4018
4043
|
}
|
|
4019
4044
|
}, [selectedWallet, chainId, connectedAddress, fetchBalance]);
|
|
4020
|
-
const executeTransfer =
|
|
4045
|
+
const executeTransfer = React16.useCallback(async () => {
|
|
4021
4046
|
if (!selectedWallet?.provider || !connectedAddress || !amount) return;
|
|
4022
4047
|
setIsTransferring(true);
|
|
4023
4048
|
setError(null);
|
|
@@ -4060,7 +4085,7 @@ function WalletTransferView({
|
|
|
4060
4085
|
setIsTransferring(false);
|
|
4061
4086
|
}
|
|
4062
4087
|
}, [selectedWallet, connectedAddress, amount, decimals, balance, asset, destinationAddress, onSuccess, t]);
|
|
4063
|
-
const setMaxAmount =
|
|
4088
|
+
const setMaxAmount = React16.useCallback(() => {
|
|
4064
4089
|
if (balance !== null) {
|
|
4065
4090
|
const formatted = formatUnits(balance, decimals);
|
|
4066
4091
|
setAmount(formatted);
|
|
@@ -4426,7 +4451,7 @@ var DepositCompletedToast = ({
|
|
|
4426
4451
|
symbol
|
|
4427
4452
|
}) => {
|
|
4428
4453
|
const { t } = useI18n();
|
|
4429
|
-
const [expanded, setExpanded] =
|
|
4454
|
+
const [expanded, setExpanded] = React16.useState(false);
|
|
4430
4455
|
const formatAmount = (amount) => {
|
|
4431
4456
|
const divisor = BigInt(10 ** decimals);
|
|
4432
4457
|
const whole = amount / divisor;
|
|
@@ -4586,11 +4611,11 @@ function DepositQRView(props) {
|
|
|
4586
4611
|
const { t } = useI18n();
|
|
4587
4612
|
const { config } = react.useVolrContext();
|
|
4588
4613
|
const { client } = react.useInternalAuth();
|
|
4589
|
-
const [chainName, setChainName] =
|
|
4590
|
-
const [showOtherTokenModal, setShowOtherTokenModal] =
|
|
4591
|
-
const [showToast, setShowToast] =
|
|
4592
|
-
const [toastData, setToastData] =
|
|
4593
|
-
const [viewMode, setViewMode] =
|
|
4614
|
+
const [chainName, setChainName] = React16.useState(null);
|
|
4615
|
+
const [showOtherTokenModal, setShowOtherTokenModal] = React16.useState(false);
|
|
4616
|
+
const [showToast, setShowToast] = React16.useState(false);
|
|
4617
|
+
const [toastData, setToastData] = React16.useState(null);
|
|
4618
|
+
const [viewMode, setViewMode] = React16.useState("qr");
|
|
4594
4619
|
const eip681 = `ethereum:${props.address}`;
|
|
4595
4620
|
const status = react.useDepositListener({
|
|
4596
4621
|
chainId: props.chainId,
|
|
@@ -4603,7 +4628,7 @@ function DepositQRView(props) {
|
|
|
4603
4628
|
},
|
|
4604
4629
|
address: props.address
|
|
4605
4630
|
});
|
|
4606
|
-
|
|
4631
|
+
React16.useEffect(() => {
|
|
4607
4632
|
if (status.state === "detected") {
|
|
4608
4633
|
setToastData({
|
|
4609
4634
|
previousBalance: status.previousBalance,
|
|
@@ -4614,11 +4639,11 @@ function DepositQRView(props) {
|
|
|
4614
4639
|
props.onDepositDetected?.();
|
|
4615
4640
|
}
|
|
4616
4641
|
}, [status, props.onDepositDetected]);
|
|
4617
|
-
const getNetworkInfo =
|
|
4642
|
+
const getNetworkInfo = React16.useCallback(
|
|
4618
4643
|
react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
|
|
4619
4644
|
[client, config.rpcOverrides]
|
|
4620
4645
|
);
|
|
4621
|
-
|
|
4646
|
+
React16.useEffect(() => {
|
|
4622
4647
|
let cancelled = false;
|
|
4623
4648
|
const loadChainName = async () => {
|
|
4624
4649
|
try {
|
|
@@ -4858,6 +4883,111 @@ function DepositModalBody({
|
|
|
4858
4883
|
}
|
|
4859
4884
|
);
|
|
4860
4885
|
}
|
|
4886
|
+
var STORAGE_KEY = "volr:preferred-currency";
|
|
4887
|
+
var PreferredCurrencyContext = React16.createContext(null);
|
|
4888
|
+
function PreferredCurrencyProvider({
|
|
4889
|
+
children,
|
|
4890
|
+
apiUrl,
|
|
4891
|
+
defaultCurrency
|
|
4892
|
+
}) {
|
|
4893
|
+
const [currency, setCurrencyState] = React16.useState(() => {
|
|
4894
|
+
if (typeof window !== "undefined") {
|
|
4895
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
4896
|
+
if (stored) return stored;
|
|
4897
|
+
}
|
|
4898
|
+
return defaultCurrency || react.detectPreferredCurrency();
|
|
4899
|
+
});
|
|
4900
|
+
const [supportedCurrencies, setSupportedCurrencies] = React16.useState([]);
|
|
4901
|
+
const [isLoading, setIsLoading] = React16.useState(true);
|
|
4902
|
+
React16.useEffect(() => {
|
|
4903
|
+
const fetchCurrencies = async () => {
|
|
4904
|
+
if (!apiUrl) {
|
|
4905
|
+
setSupportedCurrencies([
|
|
4906
|
+
{ code: "USD", symbol: "$", name: "US Dollar", decimalPlaces: 2 },
|
|
4907
|
+
{ code: "KRW", symbol: "\u20A9", name: "Korean Won", decimalPlaces: 0 },
|
|
4908
|
+
{ code: "EUR", symbol: "\u20AC", name: "Euro", decimalPlaces: 2 }
|
|
4909
|
+
]);
|
|
4910
|
+
setIsLoading(false);
|
|
4911
|
+
return;
|
|
4912
|
+
}
|
|
4913
|
+
try {
|
|
4914
|
+
const response = await fetch(`${apiUrl}/public/fiat-currencies`);
|
|
4915
|
+
if (!response.ok) throw new Error("Failed to fetch currencies");
|
|
4916
|
+
const data = await response.json();
|
|
4917
|
+
if (data.ok && Array.isArray(data.data)) {
|
|
4918
|
+
setSupportedCurrencies(data.data);
|
|
4919
|
+
const currentSupported = data.data.some(
|
|
4920
|
+
(c) => c.code === currency
|
|
4921
|
+
);
|
|
4922
|
+
if (!currentSupported && data.data.length > 0) {
|
|
4923
|
+
const detected = react.detectPreferredCurrency();
|
|
4924
|
+
const detectedSupported = data.data.find(
|
|
4925
|
+
(c) => c.code === detected
|
|
4926
|
+
);
|
|
4927
|
+
setCurrencyState(detectedSupported?.code || data.data[0].code);
|
|
4928
|
+
}
|
|
4929
|
+
}
|
|
4930
|
+
} catch (error) {
|
|
4931
|
+
console.warn("[PreferredCurrencyProvider] Failed to fetch currencies:", error);
|
|
4932
|
+
setSupportedCurrencies([
|
|
4933
|
+
{ code: "USD", symbol: "$", name: "US Dollar", decimalPlaces: 2 },
|
|
4934
|
+
{ code: "KRW", symbol: "\u20A9", name: "Korean Won", decimalPlaces: 0 },
|
|
4935
|
+
{ code: "EUR", symbol: "\u20AC", name: "Euro", decimalPlaces: 2 }
|
|
4936
|
+
]);
|
|
4937
|
+
} finally {
|
|
4938
|
+
setIsLoading(false);
|
|
4939
|
+
}
|
|
4940
|
+
};
|
|
4941
|
+
fetchCurrencies();
|
|
4942
|
+
}, [apiUrl, currency]);
|
|
4943
|
+
const setCurrency = React16.useCallback((code) => {
|
|
4944
|
+
const normalizedCode = code.toUpperCase();
|
|
4945
|
+
setCurrencyState(normalizedCode);
|
|
4946
|
+
if (typeof window !== "undefined") {
|
|
4947
|
+
localStorage.setItem(STORAGE_KEY, normalizedCode);
|
|
4948
|
+
}
|
|
4949
|
+
}, []);
|
|
4950
|
+
const formatAmount = React16.useCallback(
|
|
4951
|
+
(amount) => {
|
|
4952
|
+
return react.formatCurrency(amount, currency);
|
|
4953
|
+
},
|
|
4954
|
+
[currency]
|
|
4955
|
+
);
|
|
4956
|
+
const formatInCurrency = React16.useCallback((amount, currencyCode) => {
|
|
4957
|
+
return react.formatCurrency(amount, currencyCode);
|
|
4958
|
+
}, []);
|
|
4959
|
+
const getCurrencyInfo = React16.useCallback(
|
|
4960
|
+
(code) => {
|
|
4961
|
+
return supportedCurrencies.find((c) => c.code === code.toUpperCase());
|
|
4962
|
+
},
|
|
4963
|
+
[supportedCurrencies]
|
|
4964
|
+
);
|
|
4965
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4966
|
+
PreferredCurrencyContext.Provider,
|
|
4967
|
+
{
|
|
4968
|
+
value: {
|
|
4969
|
+
currency,
|
|
4970
|
+
setCurrency,
|
|
4971
|
+
supportedCurrencies,
|
|
4972
|
+
isLoading,
|
|
4973
|
+
formatAmount,
|
|
4974
|
+
formatInCurrency,
|
|
4975
|
+
getCurrencyInfo
|
|
4976
|
+
},
|
|
4977
|
+
children
|
|
4978
|
+
}
|
|
4979
|
+
);
|
|
4980
|
+
}
|
|
4981
|
+
function usePreferredCurrency() {
|
|
4982
|
+
const context = React16.useContext(PreferredCurrencyContext);
|
|
4983
|
+
if (!context) {
|
|
4984
|
+
throw new Error("usePreferredCurrency must be used within PreferredCurrencyProvider");
|
|
4985
|
+
}
|
|
4986
|
+
return context;
|
|
4987
|
+
}
|
|
4988
|
+
function usePreferredCurrencyOptional() {
|
|
4989
|
+
return React16.useContext(PreferredCurrencyContext);
|
|
4990
|
+
}
|
|
4861
4991
|
function DepositIcon() {
|
|
4862
4992
|
return /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "volr:w-5 volr:h-5 volr:text-slate-800", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4863
4993
|
"path",
|
|
@@ -4913,12 +5043,8 @@ function AccountMainView({
|
|
|
4913
5043
|
isRefreshing
|
|
4914
5044
|
}) {
|
|
4915
5045
|
const { t } = useI18n();
|
|
4916
|
-
const
|
|
4917
|
-
|
|
4918
|
-
currency: "USD",
|
|
4919
|
-
minimumFractionDigits: 2,
|
|
4920
|
-
maximumFractionDigits: 2
|
|
4921
|
-
});
|
|
5046
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
5047
|
+
const formattedUsd = isLoading ? "\u2014" : currencyCtx ? currencyCtx.formatAmount(totalUsd) : react.formatCurrency(totalUsd, "USD");
|
|
4922
5048
|
const lastUpdatedLabel = lastUpdatedAt ? lastUpdatedAt.toLocaleTimeString(void 0, {
|
|
4923
5049
|
hour: "2-digit",
|
|
4924
5050
|
minute: "2-digit"
|
|
@@ -5011,6 +5137,8 @@ function AccountMainView({
|
|
|
5011
5137
|
] });
|
|
5012
5138
|
}
|
|
5013
5139
|
function TokenRow({ token }) {
|
|
5140
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
5141
|
+
const formattedBalanceUsd = token.balanceUsd !== void 0 && token.balanceUsd > 0 ? currencyCtx ? currencyCtx.formatAmount(token.balanceUsd) : react.formatCurrency(token.balanceUsd, "USD") : null;
|
|
5014
5142
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:items-center volr:justify-between volr:py-3 volr:border-b volr:border-slate-100 last:volr:border-b-0", children: [
|
|
5015
5143
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:items-center volr:gap-3", children: [
|
|
5016
5144
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:w-8 volr:h-8 volr:rounded-full volr:bg-slate-100 volr:flex volr:items-center volr:justify-center volr:overflow-hidden volr:shrink-0", children: token.iconUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -5031,10 +5159,7 @@ function TokenRow({ token }) {
|
|
|
5031
5159
|
] }),
|
|
5032
5160
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:text-right", children: token.isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:animate-pulse", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:h-4 volr:w-16 volr:bg-slate-200 volr:rounded" }) }) : token.error ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-red-500", children: "Error" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5033
5161
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-sm volr:font-medium volr:text-slate-900", children: token.balance }),
|
|
5034
|
-
|
|
5035
|
-
"$",
|
|
5036
|
-
token.balanceUsd.toFixed(2)
|
|
5037
|
-
] })
|
|
5162
|
+
formattedBalanceUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedBalanceUsd })
|
|
5038
5163
|
] }) })
|
|
5039
5164
|
] });
|
|
5040
5165
|
}
|
|
@@ -5061,7 +5186,7 @@ function BalanceDetailView({
|
|
|
5061
5186
|
/* @__PURE__ */ jsxRuntime.jsx("div", { children: balances.map((token) => /* @__PURE__ */ jsxRuntime.jsx(TokenRow, { token }, token.id)) })
|
|
5062
5187
|
] });
|
|
5063
5188
|
}
|
|
5064
|
-
var Input =
|
|
5189
|
+
var Input = React16__default.default.forwardRef(
|
|
5065
5190
|
({ leftIcon, error, className, style, disabled, ...props }, ref) => {
|
|
5066
5191
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:relative", children: [
|
|
5067
5192
|
leftIcon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:absolute volr:left-3 volr:top-1/2 volr:-translate-y-1/2 volr:pointer-events-none volr-text-muted", children: leftIcon }),
|
|
@@ -5093,23 +5218,23 @@ function WithdrawView({
|
|
|
5093
5218
|
const { t } = useI18n();
|
|
5094
5219
|
const { withdraw, isWithdrawing, result, error, reset } = react.useWithdraw();
|
|
5095
5220
|
const { client } = react.useInternalAuth();
|
|
5096
|
-
const [step, setStep] =
|
|
5097
|
-
const [selectedTokenId, setSelectedTokenId] =
|
|
5098
|
-
const [toAddress, setToAddress] =
|
|
5099
|
-
const [amount, setAmount] =
|
|
5100
|
-
const [useConnectedWallet, setUseConnectedWallet] =
|
|
5101
|
-
const [blockExplorerUrl, setBlockExplorerUrl] =
|
|
5102
|
-
const selectedToken =
|
|
5221
|
+
const [step, setStep] = React16.useState("select");
|
|
5222
|
+
const [selectedTokenId, setSelectedTokenId] = React16.useState(null);
|
|
5223
|
+
const [toAddress, setToAddress] = React16.useState("");
|
|
5224
|
+
const [amount, setAmount] = React16.useState("");
|
|
5225
|
+
const [useConnectedWallet, setUseConnectedWallet] = React16.useState(false);
|
|
5226
|
+
const [blockExplorerUrl, setBlockExplorerUrl] = React16.useState(null);
|
|
5227
|
+
const selectedToken = React16.useMemo(
|
|
5103
5228
|
() => balances.find((b) => b.id === selectedTokenId),
|
|
5104
5229
|
[balances, selectedTokenId]
|
|
5105
5230
|
);
|
|
5106
5231
|
const selectedChainId = selectedToken?.chainId ?? null;
|
|
5107
|
-
const connectedAddress =
|
|
5232
|
+
const connectedAddress = React16.useMemo(() => {
|
|
5108
5233
|
if (!connectedWallet) return null;
|
|
5109
5234
|
const parts = connectedWallet.split(":");
|
|
5110
5235
|
return parts.length >= 2 ? parts[1] : null;
|
|
5111
5236
|
}, [connectedWallet]);
|
|
5112
|
-
|
|
5237
|
+
React16.useEffect(() => {
|
|
5113
5238
|
if (!selectedChainId) {
|
|
5114
5239
|
setBlockExplorerUrl(null);
|
|
5115
5240
|
return;
|
|
@@ -5130,7 +5255,7 @@ function WithdrawView({
|
|
|
5130
5255
|
cancelled = true;
|
|
5131
5256
|
};
|
|
5132
5257
|
}, [client, selectedChainId]);
|
|
5133
|
-
const explorerTxUrl =
|
|
5258
|
+
const explorerTxUrl = React16.useMemo(() => {
|
|
5134
5259
|
if (!blockExplorerUrl || !result?.txHash) return null;
|
|
5135
5260
|
const trimmedBase = blockExplorerUrl.replace(/\/$/, "");
|
|
5136
5261
|
return `${trimmedBase}/tx/${result.txHash}`;
|
|
@@ -5169,7 +5294,7 @@ function WithdrawView({
|
|
|
5169
5294
|
setAmount("");
|
|
5170
5295
|
setUseConnectedWallet(false);
|
|
5171
5296
|
};
|
|
5172
|
-
const isAmountValid =
|
|
5297
|
+
const isAmountValid = React16.useMemo(() => {
|
|
5173
5298
|
if (!amount || !selectedToken) return false;
|
|
5174
5299
|
const num = parseFloat(amount);
|
|
5175
5300
|
if (isNaN(num) || num <= 0) return false;
|
|
@@ -5449,6 +5574,7 @@ function ChevronRightIcon({ className }) {
|
|
|
5449
5574
|
}
|
|
5450
5575
|
function PaymentRow({ payment, onClick }) {
|
|
5451
5576
|
const { t } = useI18n();
|
|
5577
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
5452
5578
|
const date = new Date(payment.createdAt);
|
|
5453
5579
|
const formattedDate = date.toLocaleDateString(void 0, {
|
|
5454
5580
|
month: "short",
|
|
@@ -5463,6 +5589,7 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5463
5589
|
CANCELLED: "volr:bg-slate-100 volr:text-slate-500",
|
|
5464
5590
|
EXPIRED: "volr:bg-slate-100 volr:text-slate-500"
|
|
5465
5591
|
};
|
|
5592
|
+
const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
|
|
5466
5593
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5467
5594
|
"button",
|
|
5468
5595
|
{
|
|
@@ -5490,10 +5617,7 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5490
5617
|
" ",
|
|
5491
5618
|
payment.token.symbol
|
|
5492
5619
|
] }),
|
|
5493
|
-
|
|
5494
|
-
"$",
|
|
5495
|
-
parseFloat(payment.totalUsd).toFixed(2)
|
|
5496
|
-
] })
|
|
5620
|
+
formattedUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedUsd })
|
|
5497
5621
|
] }),
|
|
5498
5622
|
/* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-300" })
|
|
5499
5623
|
] })
|
|
@@ -5504,10 +5628,10 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5504
5628
|
function PaymentHistoryView({ onSelectPayment }) {
|
|
5505
5629
|
const { t } = useI18n();
|
|
5506
5630
|
const { getPaymentHistory, isLoading: isApiLoading } = react.useVolrPaymentApi();
|
|
5507
|
-
const [payments, setPayments] =
|
|
5508
|
-
const [isLoading, setIsLoading] =
|
|
5509
|
-
const [error, setError] =
|
|
5510
|
-
|
|
5631
|
+
const [payments, setPayments] = React16.useState([]);
|
|
5632
|
+
const [isLoading, setIsLoading] = React16.useState(true);
|
|
5633
|
+
const [error, setError] = React16.useState(null);
|
|
5634
|
+
React16.useEffect(() => {
|
|
5511
5635
|
setIsLoading(true);
|
|
5512
5636
|
setError(null);
|
|
5513
5637
|
getPaymentHistory({ take: 20 }).then((result) => {
|
|
@@ -5563,6 +5687,8 @@ function DetailRow({ label, value, copyable, mono, copyText }) {
|
|
|
5563
5687
|
}
|
|
5564
5688
|
function PaymentDetailView({ payment }) {
|
|
5565
5689
|
const { t } = useI18n();
|
|
5690
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
5691
|
+
const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
|
|
5566
5692
|
const createdDate = new Date(payment.createdAt);
|
|
5567
5693
|
const formattedCreatedAt = createdDate.toLocaleString(void 0, {
|
|
5568
5694
|
year: "numeric",
|
|
@@ -5611,10 +5737,9 @@ function PaymentDetailView({ payment }) {
|
|
|
5611
5737
|
" ",
|
|
5612
5738
|
payment.token.symbol
|
|
5613
5739
|
] }),
|
|
5614
|
-
|
|
5615
|
-
"\u2248
|
|
5616
|
-
|
|
5617
|
-
" USD"
|
|
5740
|
+
formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-sm volr:text-slate-500", children: [
|
|
5741
|
+
"\u2248 ",
|
|
5742
|
+
formattedUsd
|
|
5618
5743
|
] })
|
|
5619
5744
|
] }),
|
|
5620
5745
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-1", children: [
|
|
@@ -5747,21 +5872,21 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5747
5872
|
const { user, logout } = react.useVolrContext();
|
|
5748
5873
|
const { balances, totalUsd, isLoading, paymentEnabled, refresh } = react.useUserBalances();
|
|
5749
5874
|
const { client } = react.useInternalAuth();
|
|
5750
|
-
const [currentView, setCurrentView] =
|
|
5751
|
-
const [selectedPayment, setSelectedPayment] =
|
|
5752
|
-
const [isLoggingOut, setIsLoggingOut] =
|
|
5753
|
-
const [lastUpdatedAt, setLastUpdatedAt] =
|
|
5754
|
-
const [isRefreshing, setIsRefreshing] =
|
|
5755
|
-
const prevUserRef =
|
|
5756
|
-
const refreshInFlightRef =
|
|
5757
|
-
const lastRefreshRef =
|
|
5758
|
-
const [closingAfterLogin, setClosingAfterLogin] =
|
|
5759
|
-
const [setupStep, setSetupStep] =
|
|
5760
|
-
const [depositAssets, setDepositAssets] =
|
|
5761
|
-
const [depositLoading, setDepositLoading] =
|
|
5762
|
-
const [depositError, setDepositError] =
|
|
5763
|
-
const [depositSelectedIdx, setDepositSelectedIdx] =
|
|
5764
|
-
const refreshBalances =
|
|
5875
|
+
const [currentView, setCurrentView] = React16.useState("main");
|
|
5876
|
+
const [selectedPayment, setSelectedPayment] = React16.useState(null);
|
|
5877
|
+
const [isLoggingOut, setIsLoggingOut] = React16.useState(false);
|
|
5878
|
+
const [lastUpdatedAt, setLastUpdatedAt] = React16.useState(null);
|
|
5879
|
+
const [isRefreshing, setIsRefreshing] = React16.useState(false);
|
|
5880
|
+
const prevUserRef = React16.useRef(user ?? null);
|
|
5881
|
+
const refreshInFlightRef = React16.useRef(false);
|
|
5882
|
+
const lastRefreshRef = React16.useRef(0);
|
|
5883
|
+
const [closingAfterLogin, setClosingAfterLogin] = React16.useState(false);
|
|
5884
|
+
const [setupStep, setSetupStep] = React16.useState("prompt");
|
|
5885
|
+
const [depositAssets, setDepositAssets] = React16.useState([]);
|
|
5886
|
+
const [depositLoading, setDepositLoading] = React16.useState(false);
|
|
5887
|
+
const [depositError, setDepositError] = React16.useState(null);
|
|
5888
|
+
const [depositSelectedIdx, setDepositSelectedIdx] = React16.useState(-1);
|
|
5889
|
+
const refreshBalances = React16.useCallback(async () => {
|
|
5765
5890
|
if (!isOpen) return;
|
|
5766
5891
|
const now = Date.now();
|
|
5767
5892
|
if (refreshInFlightRef.current) return;
|
|
@@ -5781,10 +5906,10 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5781
5906
|
setIsRefreshing(false);
|
|
5782
5907
|
}
|
|
5783
5908
|
}, [isOpen, refresh]);
|
|
5784
|
-
const handleManualRefresh =
|
|
5909
|
+
const handleManualRefresh = React16.useCallback(() => {
|
|
5785
5910
|
void refreshBalances();
|
|
5786
5911
|
}, [refreshBalances]);
|
|
5787
|
-
|
|
5912
|
+
React16.useEffect(() => {
|
|
5788
5913
|
if (currentView !== "deposit" || !isOpen) return;
|
|
5789
5914
|
setDepositLoading(true);
|
|
5790
5915
|
setDepositError(null);
|
|
@@ -5801,11 +5926,11 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5801
5926
|
setDepositLoading(false);
|
|
5802
5927
|
});
|
|
5803
5928
|
}, [currentView, isOpen, client]);
|
|
5804
|
-
|
|
5929
|
+
React16.useEffect(() => {
|
|
5805
5930
|
if (!isOpen) return;
|
|
5806
5931
|
void refreshBalances();
|
|
5807
5932
|
}, [isOpen, currentView, refreshBalances]);
|
|
5808
|
-
|
|
5933
|
+
React16.useEffect(() => {
|
|
5809
5934
|
if (!isOpen || typeof document === "undefined") return;
|
|
5810
5935
|
const handleFocus = () => {
|
|
5811
5936
|
if (document.visibilityState === "visible") {
|
|
@@ -5819,7 +5944,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5819
5944
|
document.removeEventListener("visibilitychange", handleFocus);
|
|
5820
5945
|
};
|
|
5821
5946
|
}, [isOpen, refreshBalances]);
|
|
5822
|
-
|
|
5947
|
+
React16.useEffect(() => {
|
|
5823
5948
|
if (!isOpen) return;
|
|
5824
5949
|
const intervalId = window.setInterval(() => {
|
|
5825
5950
|
void refreshBalances();
|
|
@@ -5828,7 +5953,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5828
5953
|
clearInterval(intervalId);
|
|
5829
5954
|
};
|
|
5830
5955
|
}, [isOpen, refreshBalances]);
|
|
5831
|
-
const handleOpenChange =
|
|
5956
|
+
const handleOpenChange = React16.useCallback((open) => {
|
|
5832
5957
|
if (!open) {
|
|
5833
5958
|
onClose();
|
|
5834
5959
|
setTimeout(() => {
|
|
@@ -5838,7 +5963,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5838
5963
|
}, 200);
|
|
5839
5964
|
}
|
|
5840
5965
|
}, [onClose]);
|
|
5841
|
-
|
|
5966
|
+
React16.useEffect(() => {
|
|
5842
5967
|
if (!isOpen) {
|
|
5843
5968
|
setClosingAfterLogin(false);
|
|
5844
5969
|
prevUserRef.current = user ?? null;
|
|
@@ -6009,11 +6134,11 @@ var DepositModal = ({
|
|
|
6009
6134
|
}) => {
|
|
6010
6135
|
const { user } = react.useVolrContext();
|
|
6011
6136
|
const { client } = react.useInternalAuth();
|
|
6012
|
-
const [depositAssets, setDepositAssets] =
|
|
6013
|
-
const [isLoading, setIsLoading] =
|
|
6014
|
-
const [error, setError] =
|
|
6015
|
-
const [selectedIdx, setSelectedIdx] =
|
|
6016
|
-
|
|
6137
|
+
const [depositAssets, setDepositAssets] = React16.useState([]);
|
|
6138
|
+
const [isLoading, setIsLoading] = React16.useState(true);
|
|
6139
|
+
const [error, setError] = React16.useState(null);
|
|
6140
|
+
const [selectedIdx, setSelectedIdx] = React16.useState(-1);
|
|
6141
|
+
React16.useEffect(() => {
|
|
6017
6142
|
if (!open) return;
|
|
6018
6143
|
setIsLoading(true);
|
|
6019
6144
|
setError(null);
|
|
@@ -6040,12 +6165,12 @@ var DepositModal = ({
|
|
|
6040
6165
|
if (depositAssets.length === 1) return 0;
|
|
6041
6166
|
return -1;
|
|
6042
6167
|
};
|
|
6043
|
-
|
|
6168
|
+
React16.useEffect(() => {
|
|
6044
6169
|
if (open && !isLoading && depositAssets.length > 0) {
|
|
6045
6170
|
setSelectedIdx(getInitialIndex());
|
|
6046
6171
|
}
|
|
6047
6172
|
}, [open, isLoading, depositAssets.length, asset]);
|
|
6048
|
-
|
|
6173
|
+
React16.useEffect(() => {
|
|
6049
6174
|
if (!open) {
|
|
6050
6175
|
setSelectedIdx(-1);
|
|
6051
6176
|
}
|
|
@@ -6203,7 +6328,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6203
6328
|
const { evm } = react.useVolr();
|
|
6204
6329
|
const { paymentOptions } = useVolrModal();
|
|
6205
6330
|
const { createPayment, updatePaymentToProcessing, pollPaymentStatus, failPendingPayment } = react.useVolrPaymentApi();
|
|
6206
|
-
const [state, dispatch] =
|
|
6331
|
+
const [state, dispatch] = React16.useReducer(paymentModalReducer, initialState);
|
|
6207
6332
|
const tokensWithBalances = state.tokens.map((token) => {
|
|
6208
6333
|
const balanceData = state.tokenBalances.get(token.id);
|
|
6209
6334
|
return {
|
|
@@ -6215,7 +6340,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6215
6340
|
});
|
|
6216
6341
|
const selectedToken = state.selectedTokenId ? tokensWithBalances.find((t) => t.id === state.selectedTokenId) ?? null : null;
|
|
6217
6342
|
const isBalanceLoading = tokensWithBalances.some((t) => t.isBalanceLoading);
|
|
6218
|
-
const fetchTokenBalance =
|
|
6343
|
+
const fetchTokenBalance = React16.useCallback(
|
|
6219
6344
|
async (token) => {
|
|
6220
6345
|
if (!user?.evmAddress) {
|
|
6221
6346
|
dispatch({
|
|
@@ -6263,20 +6388,20 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6263
6388
|
},
|
|
6264
6389
|
[user, evm]
|
|
6265
6390
|
);
|
|
6266
|
-
const fetchAllBalances =
|
|
6391
|
+
const fetchAllBalances = React16.useCallback(
|
|
6267
6392
|
async (tokens) => {
|
|
6268
6393
|
await Promise.all(tokens.map((token) => fetchTokenBalance(token)));
|
|
6269
6394
|
},
|
|
6270
6395
|
[fetchTokenBalance]
|
|
6271
6396
|
);
|
|
6272
|
-
const fetchBranding =
|
|
6397
|
+
const fetchBranding = React16.useCallback(async () => {
|
|
6273
6398
|
try {
|
|
6274
6399
|
const response = await client.get("/auth/branding");
|
|
6275
6400
|
dispatch({ type: "SET_LOGO_URL", logoUrl: response.logoUrl });
|
|
6276
6401
|
} catch {
|
|
6277
6402
|
}
|
|
6278
6403
|
}, [client]);
|
|
6279
|
-
const fetchPaymentConfig =
|
|
6404
|
+
const fetchPaymentConfig = React16.useCallback(async () => {
|
|
6280
6405
|
dispatch({ type: "SET_CONFIG_LOADING", loading: true });
|
|
6281
6406
|
try {
|
|
6282
6407
|
const response = await client.get("/payments/config");
|
|
@@ -6293,7 +6418,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6293
6418
|
dispatch({ type: "SET_CONFIG_LOADING", loading: false });
|
|
6294
6419
|
}
|
|
6295
6420
|
}, [client, fetchAllBalances]);
|
|
6296
|
-
const selectBestToken =
|
|
6421
|
+
const selectBestToken = React16.useCallback(() => {
|
|
6297
6422
|
if (state.tokens.length === 0) return;
|
|
6298
6423
|
if (state.selectedTokenId) return;
|
|
6299
6424
|
let bestTokenId = state.tokens[0].id;
|
|
@@ -6307,7 +6432,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6307
6432
|
}
|
|
6308
6433
|
dispatch({ type: "SELECT_TOKEN", tokenId: bestTokenId });
|
|
6309
6434
|
}, [state.tokens, state.tokenBalances, state.selectedTokenId]);
|
|
6310
|
-
|
|
6435
|
+
React16.useEffect(() => {
|
|
6311
6436
|
if (open && paymentOptions?.options) {
|
|
6312
6437
|
if (state.step === "processing" || state.step === "result") {
|
|
6313
6438
|
return;
|
|
@@ -6319,15 +6444,15 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6319
6444
|
dispatch({ type: "RESET" });
|
|
6320
6445
|
}
|
|
6321
6446
|
}, [open, paymentOptions?.options?.amount]);
|
|
6322
|
-
|
|
6447
|
+
React16.useEffect(() => {
|
|
6323
6448
|
if (!isBalanceLoading && state.tokens.length > 0 && !state.selectedTokenId) {
|
|
6324
6449
|
selectBestToken();
|
|
6325
6450
|
}
|
|
6326
6451
|
}, [isBalanceLoading, state.tokens.length, state.selectedTokenId, selectBestToken]);
|
|
6327
|
-
const handleSelectToken =
|
|
6452
|
+
const handleSelectToken = React16.useCallback((tokenId) => {
|
|
6328
6453
|
dispatch({ type: "SELECT_TOKEN", tokenId });
|
|
6329
6454
|
}, []);
|
|
6330
|
-
const handleWalletBack =
|
|
6455
|
+
const handleWalletBack = React16.useCallback(() => {
|
|
6331
6456
|
if (state.step !== "wallet") {
|
|
6332
6457
|
return;
|
|
6333
6458
|
}
|
|
@@ -6337,10 +6462,10 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6337
6462
|
}
|
|
6338
6463
|
dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
|
|
6339
6464
|
}, [state.step, state.walletStep]);
|
|
6340
|
-
const handleChooseCreateAccount =
|
|
6465
|
+
const handleChooseCreateAccount = React16.useCallback(() => {
|
|
6341
6466
|
dispatch({ type: "SHOW_WALLET", walletStep: "create-account" });
|
|
6342
6467
|
}, []);
|
|
6343
|
-
const saveExternalWalletPreference =
|
|
6468
|
+
const saveExternalWalletPreference = React16.useCallback(async () => {
|
|
6344
6469
|
if (!user?.id) return;
|
|
6345
6470
|
if (user.externalWalletPreferred) return;
|
|
6346
6471
|
try {
|
|
@@ -6355,11 +6480,11 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6355
6480
|
setUser({ ...user, externalWalletPreferred: true });
|
|
6356
6481
|
}
|
|
6357
6482
|
}, [client, user, setUser]);
|
|
6358
|
-
const handleChooseExternalWallet =
|
|
6483
|
+
const handleChooseExternalWallet = React16.useCallback(() => {
|
|
6359
6484
|
void saveExternalWalletPreference();
|
|
6360
6485
|
dispatch({ type: "SHOW_WALLET", walletStep: "external-wallet" });
|
|
6361
6486
|
}, [saveExternalWalletPreference]);
|
|
6362
|
-
const handlePay =
|
|
6487
|
+
const handlePay = React16.useCallback(async () => {
|
|
6363
6488
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6364
6489
|
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
6365
6490
|
return;
|
|
@@ -6481,7 +6606,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6481
6606
|
pollPaymentStatus,
|
|
6482
6607
|
failPendingPayment
|
|
6483
6608
|
]);
|
|
6484
|
-
const handleExternalWalletConnected =
|
|
6609
|
+
const handleExternalWalletConnected = React16.useCallback(
|
|
6485
6610
|
async ({ provider, address }) => {
|
|
6486
6611
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6487
6612
|
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
@@ -6626,10 +6751,10 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6626
6751
|
failPendingPayment
|
|
6627
6752
|
]
|
|
6628
6753
|
);
|
|
6629
|
-
const handleDeposit =
|
|
6754
|
+
const handleDeposit = React16.useCallback(() => {
|
|
6630
6755
|
dispatch({ type: "SHOW_DEPOSIT" });
|
|
6631
6756
|
}, []);
|
|
6632
|
-
const handleDepositClose =
|
|
6757
|
+
const handleDepositClose = React16.useCallback(
|
|
6633
6758
|
(depositOpen) => {
|
|
6634
6759
|
if (!depositOpen) {
|
|
6635
6760
|
dispatch({ type: "HIDE_DEPOSIT" });
|
|
@@ -6640,19 +6765,19 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6640
6765
|
},
|
|
6641
6766
|
[state.tokens, fetchAllBalances]
|
|
6642
6767
|
);
|
|
6643
|
-
const handleDone =
|
|
6768
|
+
const handleDone = React16.useCallback(() => {
|
|
6644
6769
|
if (state.createdPayment?.status === "CONFIRMED") {
|
|
6645
6770
|
paymentOptions?.onComplete?.(state.createdPayment);
|
|
6646
6771
|
}
|
|
6647
6772
|
onOpenChange(false);
|
|
6648
6773
|
}, [state.createdPayment, paymentOptions, onOpenChange]);
|
|
6649
|
-
const handleRetry =
|
|
6774
|
+
const handleRetry = React16.useCallback(() => {
|
|
6650
6775
|
dispatch({ type: "RETRY" });
|
|
6651
6776
|
if (state.tokens.length > 0) {
|
|
6652
6777
|
fetchAllBalances(state.tokens);
|
|
6653
6778
|
}
|
|
6654
6779
|
}, [state.tokens, fetchAllBalances]);
|
|
6655
|
-
const handleClose =
|
|
6780
|
+
const handleClose = React16.useCallback(() => {
|
|
6656
6781
|
if (state.step === "processing") {
|
|
6657
6782
|
return;
|
|
6658
6783
|
}
|
|
@@ -6661,7 +6786,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6661
6786
|
}
|
|
6662
6787
|
onOpenChange(false);
|
|
6663
6788
|
}, [state.step, paymentOptions, onOpenChange]);
|
|
6664
|
-
const handleReport =
|
|
6789
|
+
const handleReport = React16.useCallback(async () => {
|
|
6665
6790
|
const { createdPayment, error, step, txHash, selectedTokenId } = state;
|
|
6666
6791
|
const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
|
|
6667
6792
|
if (!createdPayment || !error) return;
|
|
@@ -6820,10 +6945,10 @@ var TokenSelector = ({
|
|
|
6820
6945
|
onSelect,
|
|
6821
6946
|
disabled = false
|
|
6822
6947
|
}) => {
|
|
6823
|
-
const [isOpen, setIsOpen] =
|
|
6824
|
-
const dropdownRef =
|
|
6948
|
+
const [isOpen, setIsOpen] = React16.useState(false);
|
|
6949
|
+
const dropdownRef = React16.useRef(null);
|
|
6825
6950
|
const selectedToken = tokens.find((t) => t.id === selectedTokenId);
|
|
6826
|
-
|
|
6951
|
+
React16.useEffect(() => {
|
|
6827
6952
|
const handleClickOutside = (event) => {
|
|
6828
6953
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
6829
6954
|
setIsOpen(false);
|
|
@@ -7190,9 +7315,11 @@ var PaymentResultView = ({
|
|
|
7190
7315
|
onReport
|
|
7191
7316
|
}) => {
|
|
7192
7317
|
const { t } = useI18n();
|
|
7318
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
7193
7319
|
const isSuccess = payment.status === "CONFIRMED";
|
|
7194
7320
|
payment.status === "FAILED" || !!error;
|
|
7195
7321
|
const isInAppBrowserError = error?.code === "INAPP_BROWSER_NOT_SUPPORTED";
|
|
7322
|
+
const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
|
|
7196
7323
|
const handleOpenExternalBrowser = () => {
|
|
7197
7324
|
if (typeof window === "undefined") return;
|
|
7198
7325
|
window.open(window.location.href, "_system");
|
|
@@ -7246,12 +7373,9 @@ var PaymentResultView = ({
|
|
|
7246
7373
|
payment.token.symbol
|
|
7247
7374
|
] })
|
|
7248
7375
|
] }),
|
|
7249
|
-
|
|
7376
|
+
formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
|
|
7250
7377
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.usdValueLabel") }),
|
|
7251
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7252
|
-
"$",
|
|
7253
|
-
parseFloat(payment.totalUsd).toFixed(2)
|
|
7254
|
-
] })
|
|
7378
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-600", children: formattedUsd })
|
|
7255
7379
|
] }),
|
|
7256
7380
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
|
|
7257
7381
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.transactionLabel") }),
|
|
@@ -7360,9 +7484,9 @@ function PaymentExternalWalletView({
|
|
|
7360
7484
|
}) {
|
|
7361
7485
|
const { t } = useI18n();
|
|
7362
7486
|
const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
|
|
7363
|
-
const wallets =
|
|
7364
|
-
const [isConnecting, setIsConnecting] =
|
|
7365
|
-
const [error, setError] =
|
|
7487
|
+
const wallets = React16.useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
|
|
7488
|
+
const [isConnecting, setIsConnecting] = React16.useState(false);
|
|
7489
|
+
const [error, setError] = React16.useState(null);
|
|
7366
7490
|
const connect = async (wallet) => {
|
|
7367
7491
|
setIsConnecting(true);
|
|
7368
7492
|
setError(null);
|
|
@@ -7468,8 +7592,8 @@ var PaymentModal = ({
|
|
|
7468
7592
|
const resolvedPermitType = selectedToken?.permitType ?? (selectedToken?.permitSupported ? "EIP2612" : "NONE");
|
|
7469
7593
|
const externalWalletTokenSupported = selectedToken && selectedToken.address !== "native" && resolvedPermitType === "EIP2612";
|
|
7470
7594
|
const showExternalWalletOption = externalWalletAllowed && externalWalletTokenSupported;
|
|
7471
|
-
const permit2WarnedRef =
|
|
7472
|
-
|
|
7595
|
+
const permit2WarnedRef = React16__default.default.useRef(false);
|
|
7596
|
+
React16__default.default.useEffect(() => {
|
|
7473
7597
|
if (!permit2WarnedRef.current && externalWalletAllowed && resolvedPermitType === "PERMIT2" && !selectedToken?.permit2Address) {
|
|
7474
7598
|
console.warn(
|
|
7475
7599
|
`[volr/react-ui] External wallet payment hidden: permit2Address is not configured for chain ${selectedToken?.chainId}.`
|
|
@@ -7583,19 +7707,19 @@ var PaymentModal = ({
|
|
|
7583
7707
|
)
|
|
7584
7708
|
] });
|
|
7585
7709
|
};
|
|
7586
|
-
var SignRequestContext =
|
|
7710
|
+
var SignRequestContext = React16.createContext(null);
|
|
7587
7711
|
function SignRequestProvider({ children }) {
|
|
7588
|
-
const [pendingRequest, setPendingRequest] =
|
|
7589
|
-
const resolveRef =
|
|
7590
|
-
const rejectRef =
|
|
7591
|
-
const requestSign =
|
|
7712
|
+
const [pendingRequest, setPendingRequest] = React16.useState(null);
|
|
7713
|
+
const resolveRef = React16.useRef(null);
|
|
7714
|
+
const rejectRef = React16.useRef(null);
|
|
7715
|
+
const requestSign = React16.useCallback((request) => {
|
|
7592
7716
|
return new Promise((resolve, reject2) => {
|
|
7593
7717
|
setPendingRequest(request);
|
|
7594
7718
|
resolveRef.current = resolve;
|
|
7595
7719
|
rejectRef.current = reject2;
|
|
7596
7720
|
});
|
|
7597
7721
|
}, []);
|
|
7598
|
-
const approve =
|
|
7722
|
+
const approve = React16.useCallback(() => {
|
|
7599
7723
|
if (resolveRef.current) {
|
|
7600
7724
|
resolveRef.current();
|
|
7601
7725
|
resolveRef.current = null;
|
|
@@ -7603,7 +7727,7 @@ function SignRequestProvider({ children }) {
|
|
|
7603
7727
|
}
|
|
7604
7728
|
setPendingRequest(null);
|
|
7605
7729
|
}, []);
|
|
7606
|
-
const reject =
|
|
7730
|
+
const reject = React16.useCallback(() => {
|
|
7607
7731
|
if (rejectRef.current) {
|
|
7608
7732
|
rejectRef.current(new Error("Sign request cancelled by user"));
|
|
7609
7733
|
resolveRef.current = null;
|
|
@@ -7625,7 +7749,7 @@ function SignRequestProvider({ children }) {
|
|
|
7625
7749
|
);
|
|
7626
7750
|
}
|
|
7627
7751
|
function useSignRequest() {
|
|
7628
|
-
const context =
|
|
7752
|
+
const context = React16.useContext(SignRequestContext);
|
|
7629
7753
|
if (!context) {
|
|
7630
7754
|
throw new Error("useSignRequest must be used within SignRequestProvider");
|
|
7631
7755
|
}
|
|
@@ -7634,7 +7758,7 @@ function useSignRequest() {
|
|
|
7634
7758
|
};
|
|
7635
7759
|
}
|
|
7636
7760
|
function useSignRequestInternal() {
|
|
7637
|
-
const context =
|
|
7761
|
+
const context = React16.useContext(SignRequestContext);
|
|
7638
7762
|
if (!context) {
|
|
7639
7763
|
throw new Error("useSignRequestInternal must be used within SignRequestProvider");
|
|
7640
7764
|
}
|
|
@@ -7669,7 +7793,7 @@ function MessageSignView({ message }) {
|
|
|
7669
7793
|
] });
|
|
7670
7794
|
}
|
|
7671
7795
|
function TypedDataSignView({ typedData }) {
|
|
7672
|
-
const [showRawData, setShowRawData] =
|
|
7796
|
+
const [showRawData, setShowRawData] = React16.useState(false);
|
|
7673
7797
|
const { domain, message } = typedData;
|
|
7674
7798
|
const appName = domain.name;
|
|
7675
7799
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-4", children: [
|
|
@@ -7815,12 +7939,12 @@ function SignRequestModal({ open, onOpenChange }) {
|
|
|
7815
7939
|
}
|
|
7816
7940
|
);
|
|
7817
7941
|
}
|
|
7818
|
-
var WalletRequiredContext =
|
|
7942
|
+
var WalletRequiredContext = React16.createContext(null);
|
|
7819
7943
|
function WalletRequiredProvider({ children }) {
|
|
7820
|
-
const [pendingRequest, setPendingRequest] =
|
|
7821
|
-
const resolveRef =
|
|
7822
|
-
const rejectRef =
|
|
7823
|
-
const requestWallet =
|
|
7944
|
+
const [pendingRequest, setPendingRequest] = React16.useState(null);
|
|
7945
|
+
const resolveRef = React16.useRef(null);
|
|
7946
|
+
const rejectRef = React16.useRef(null);
|
|
7947
|
+
const requestWallet = React16.useCallback(
|
|
7824
7948
|
(request) => {
|
|
7825
7949
|
return new Promise((resolve2, reject2) => {
|
|
7826
7950
|
setPendingRequest(request);
|
|
@@ -7830,7 +7954,7 @@ function WalletRequiredProvider({ children }) {
|
|
|
7830
7954
|
},
|
|
7831
7955
|
[]
|
|
7832
7956
|
);
|
|
7833
|
-
const resolve =
|
|
7957
|
+
const resolve = React16.useCallback((provider) => {
|
|
7834
7958
|
if (resolveRef.current) {
|
|
7835
7959
|
resolveRef.current(provider);
|
|
7836
7960
|
resolveRef.current = null;
|
|
@@ -7838,7 +7962,7 @@ function WalletRequiredProvider({ children }) {
|
|
|
7838
7962
|
}
|
|
7839
7963
|
setPendingRequest(null);
|
|
7840
7964
|
}, []);
|
|
7841
|
-
const reject =
|
|
7965
|
+
const reject = React16.useCallback((error) => {
|
|
7842
7966
|
if (rejectRef.current) {
|
|
7843
7967
|
rejectRef.current(error);
|
|
7844
7968
|
resolveRef.current = null;
|
|
@@ -7855,14 +7979,14 @@ function WalletRequiredProvider({ children }) {
|
|
|
7855
7979
|
);
|
|
7856
7980
|
}
|
|
7857
7981
|
function useWalletRequired() {
|
|
7858
|
-
const ctx =
|
|
7982
|
+
const ctx = React16.useContext(WalletRequiredContext);
|
|
7859
7983
|
if (!ctx) {
|
|
7860
7984
|
throw new Error("useWalletRequired must be used within WalletRequiredProvider");
|
|
7861
7985
|
}
|
|
7862
7986
|
return { requestWallet: ctx.requestWallet };
|
|
7863
7987
|
}
|
|
7864
7988
|
function useWalletRequiredInternal() {
|
|
7865
|
-
const ctx =
|
|
7989
|
+
const ctx = React16.useContext(WalletRequiredContext);
|
|
7866
7990
|
if (!ctx) {
|
|
7867
7991
|
throw new Error(
|
|
7868
7992
|
"useWalletRequiredInternal must be used within WalletRequiredProvider"
|
|
@@ -7875,17 +7999,17 @@ function WalletRequiredModal() {
|
|
|
7875
7999
|
const { pendingRequest, resolve, reject } = useWalletRequiredInternal();
|
|
7876
8000
|
const { user, provider } = react.useVolrContext();
|
|
7877
8001
|
const { keyStorageType } = useVolrUI();
|
|
7878
|
-
const [step, setStep] =
|
|
7879
|
-
const providerRef =
|
|
7880
|
-
|
|
8002
|
+
const [step, setStep] = React16.useState("notice");
|
|
8003
|
+
const providerRef = React16.useRef(provider);
|
|
8004
|
+
React16.useEffect(() => {
|
|
7881
8005
|
providerRef.current = provider;
|
|
7882
8006
|
}, [provider]);
|
|
7883
|
-
|
|
8007
|
+
React16.useEffect(() => {
|
|
7884
8008
|
if (pendingRequest) {
|
|
7885
8009
|
setStep("notice");
|
|
7886
8010
|
}
|
|
7887
8011
|
}, [pendingRequest]);
|
|
7888
|
-
const title =
|
|
8012
|
+
const title = React16.useMemo(() => {
|
|
7889
8013
|
if (!pendingRequest) return "";
|
|
7890
8014
|
if (pendingRequest.type === "transaction") return t("walletRequired.titleTx");
|
|
7891
8015
|
if (pendingRequest.type === "typedData") return t("walletRequired.titleTypedData");
|
|
@@ -7951,7 +8075,7 @@ function WalletRequiredModal() {
|
|
|
7951
8075
|
}
|
|
7952
8076
|
);
|
|
7953
8077
|
}
|
|
7954
|
-
var VolrUIContext =
|
|
8078
|
+
var VolrUIContext = React16__default.default.createContext(null);
|
|
7955
8079
|
function getCurrentRpId() {
|
|
7956
8080
|
if (typeof window === "undefined") return "localhost";
|
|
7957
8081
|
return window.location.hostname;
|
|
@@ -7964,14 +8088,14 @@ function isPasskeyDomainMismatch(user) {
|
|
|
7964
8088
|
return !registered.some((p) => p?.rpId === currentRpId);
|
|
7965
8089
|
}
|
|
7966
8090
|
var useVolrUI = () => {
|
|
7967
|
-
const context =
|
|
8091
|
+
const context = React16.useContext(VolrUIContext);
|
|
7968
8092
|
if (!context) {
|
|
7969
8093
|
throw new Error("useVolrUI must be used within VolrUIProvider");
|
|
7970
8094
|
}
|
|
7971
8095
|
return context;
|
|
7972
8096
|
};
|
|
7973
8097
|
var useVolrUIOptional = () => {
|
|
7974
|
-
return
|
|
8098
|
+
return React16.useContext(VolrUIContext);
|
|
7975
8099
|
};
|
|
7976
8100
|
function OnboardingFlow({
|
|
7977
8101
|
keyStorageType,
|
|
@@ -8020,10 +8144,10 @@ var VolrUIProvider = ({
|
|
|
8020
8144
|
const walletPolicy = config.walletPolicy ?? {
|
|
8021
8145
|
requireVolrWalletOnLogin: true
|
|
8022
8146
|
};
|
|
8023
|
-
const [keyStorageTypeError, setKeyStorageTypeError] =
|
|
8147
|
+
const [keyStorageTypeError, setKeyStorageTypeError] = React16.useState(
|
|
8024
8148
|
null
|
|
8025
8149
|
);
|
|
8026
|
-
|
|
8150
|
+
React16.useEffect(() => {
|
|
8027
8151
|
if (walletPolicy.requireVolrWalletOnLogin !== false && !keyStorageType) {
|
|
8028
8152
|
const errorMessage = "keyStorageType must be specified in VolrUIProvider props. Please set keyStorageType prop in VolrUIProvider.";
|
|
8029
8153
|
console.error(errorMessage);
|
|
@@ -8071,7 +8195,7 @@ function VolrUIProviderInner({
|
|
|
8071
8195
|
allowExternalWalletPayment,
|
|
8072
8196
|
children
|
|
8073
8197
|
}) {
|
|
8074
|
-
const [showOnboarding, setShowOnboarding] =
|
|
8198
|
+
const [showOnboarding, setShowOnboarding] = React16.useState(false);
|
|
8075
8199
|
const { requestSign } = useSignRequest();
|
|
8076
8200
|
const { requestWallet } = useWalletRequired();
|
|
8077
8201
|
const configWithSignRequest = {
|
|
@@ -8165,15 +8289,15 @@ function MigrationCoordinator({
|
|
|
8165
8289
|
}) {
|
|
8166
8290
|
const { user, setUser } = react.useVolrContext();
|
|
8167
8291
|
const { client } = react.useInternalAuth();
|
|
8168
|
-
const [running, setRunning] =
|
|
8169
|
-
const [isSourcePopup, setIsSourcePopup] =
|
|
8170
|
-
const [isTargetPopup, setIsTargetPopup] =
|
|
8171
|
-
const [sourceStep, setSourceStep] =
|
|
8172
|
-
const [targetStep, setTargetStep] =
|
|
8173
|
-
const [targetDomain, setTargetDomain] =
|
|
8174
|
-
const [sourceDomain, setSourceDomain] =
|
|
8175
|
-
const [errorMessage, setErrorMessage] =
|
|
8176
|
-
|
|
8292
|
+
const [running, setRunning] = React16.useState(false);
|
|
8293
|
+
const [isSourcePopup, setIsSourcePopup] = React16.useState(false);
|
|
8294
|
+
const [isTargetPopup, setIsTargetPopup] = React16.useState(false);
|
|
8295
|
+
const [sourceStep, setSourceStep] = React16.useState("ready");
|
|
8296
|
+
const [targetStep, setTargetStep] = React16.useState("ready");
|
|
8297
|
+
const [targetDomain, setTargetDomain] = React16.useState("");
|
|
8298
|
+
const [sourceDomain, setSourceDomain] = React16.useState("");
|
|
8299
|
+
const [errorMessage, setErrorMessage] = React16.useState();
|
|
8300
|
+
React16.useEffect(() => {
|
|
8177
8301
|
if (typeof window === "undefined") return;
|
|
8178
8302
|
const params = new URLSearchParams(window.location.search);
|
|
8179
8303
|
const migrationToken = params.get("migration_token");
|
|
@@ -8197,7 +8321,7 @@ function MigrationCoordinator({
|
|
|
8197
8321
|
}
|
|
8198
8322
|
}
|
|
8199
8323
|
}, []);
|
|
8200
|
-
|
|
8324
|
+
React16.useEffect(() => {
|
|
8201
8325
|
if (typeof window === "undefined") return;
|
|
8202
8326
|
const handler = (event) => {
|
|
8203
8327
|
const data = event.data;
|
|
@@ -8209,7 +8333,7 @@ function MigrationCoordinator({
|
|
|
8209
8333
|
window.addEventListener("message", handler);
|
|
8210
8334
|
return () => window.removeEventListener("message", handler);
|
|
8211
8335
|
}, [client, setUser, onHideOnboarding]);
|
|
8212
|
-
|
|
8336
|
+
React16.useEffect(() => {
|
|
8213
8337
|
if (typeof window === "undefined") return;
|
|
8214
8338
|
if (running) return;
|
|
8215
8339
|
const params = new URLSearchParams(window.location.search);
|
|
@@ -8354,9 +8478,9 @@ function MigrationCoordinator({
|
|
|
8354
8478
|
}
|
|
8355
8479
|
function AccountModalPortal() {
|
|
8356
8480
|
const { isOpen, mode, close } = useVolrModal();
|
|
8357
|
-
const [portalRoot, setPortalRoot] =
|
|
8358
|
-
const [error, setError] =
|
|
8359
|
-
|
|
8481
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8482
|
+
const [error, setError] = React16.useState(null);
|
|
8483
|
+
React16.useEffect(() => {
|
|
8360
8484
|
if (typeof window === "undefined") return;
|
|
8361
8485
|
let root = document.getElementById("volr-modal-root");
|
|
8362
8486
|
if (!root) {
|
|
@@ -8415,9 +8539,9 @@ function AccountModalPortal() {
|
|
|
8415
8539
|
function DepositModalPortal() {
|
|
8416
8540
|
const { isOpen, mode, asset, close } = useVolrModal();
|
|
8417
8541
|
const { user } = react.useVolrContext();
|
|
8418
|
-
const [portalRoot, setPortalRoot] =
|
|
8419
|
-
const [showLogin, setShowLogin] =
|
|
8420
|
-
|
|
8542
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8543
|
+
const [showLogin, setShowLogin] = React16.useState(false);
|
|
8544
|
+
React16.useEffect(() => {
|
|
8421
8545
|
if (typeof window === "undefined") return;
|
|
8422
8546
|
let root = document.getElementById("volr-modal-root");
|
|
8423
8547
|
if (!root) {
|
|
@@ -8432,7 +8556,7 @@ function DepositModalPortal() {
|
|
|
8432
8556
|
}
|
|
8433
8557
|
};
|
|
8434
8558
|
}, []);
|
|
8435
|
-
|
|
8559
|
+
React16.useEffect(() => {
|
|
8436
8560
|
if (isOpen && mode === "deposit" && !user) {
|
|
8437
8561
|
setShowLogin(true);
|
|
8438
8562
|
} else {
|
|
@@ -8466,8 +8590,8 @@ function DepositModalPortal() {
|
|
|
8466
8590
|
}
|
|
8467
8591
|
function PaymentModalPortal() {
|
|
8468
8592
|
const { isOpen, mode, close } = useVolrModal();
|
|
8469
|
-
const [portalRoot, setPortalRoot] =
|
|
8470
|
-
|
|
8593
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8594
|
+
React16.useEffect(() => {
|
|
8471
8595
|
if (typeof window === "undefined") return;
|
|
8472
8596
|
let root = document.getElementById("volr-modal-root");
|
|
8473
8597
|
if (!root) {
|
|
@@ -8496,8 +8620,8 @@ function PaymentModalPortal() {
|
|
|
8496
8620
|
}
|
|
8497
8621
|
function SignRequestModalPortal() {
|
|
8498
8622
|
const { pendingRequest } = useSignRequestInternal();
|
|
8499
|
-
const [portalRoot, setPortalRoot] =
|
|
8500
|
-
|
|
8623
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8624
|
+
React16.useEffect(() => {
|
|
8501
8625
|
if (typeof window === "undefined") return;
|
|
8502
8626
|
let root = document.getElementById("volr-modal-root");
|
|
8503
8627
|
if (!root) {
|
|
@@ -8529,8 +8653,8 @@ function OAuthCallbackHandler({
|
|
|
8529
8653
|
enforceSelection,
|
|
8530
8654
|
onShowOnboarding
|
|
8531
8655
|
}) {
|
|
8532
|
-
const [hasCode, setHasCode] =
|
|
8533
|
-
|
|
8656
|
+
const [hasCode, setHasCode] = React16.useState(false);
|
|
8657
|
+
React16.useEffect(() => {
|
|
8534
8658
|
if (typeof window === "undefined") return;
|
|
8535
8659
|
const params = new URLSearchParams(window.location.search);
|
|
8536
8660
|
const code = params.get("code");
|
|
@@ -8579,14 +8703,14 @@ function OnboardingChecker({
|
|
|
8579
8703
|
}) {
|
|
8580
8704
|
const { user, provider, isLoading } = react.useVolrContext();
|
|
8581
8705
|
const { isOpen: isModalOpen } = useVolrModal();
|
|
8582
|
-
const modalWasOpened =
|
|
8583
|
-
const pendingMismatchOnboarding =
|
|
8584
|
-
|
|
8706
|
+
const modalWasOpened = React16__default.default.useRef(false);
|
|
8707
|
+
const pendingMismatchOnboarding = React16__default.default.useRef(false);
|
|
8708
|
+
React16.useEffect(() => {
|
|
8585
8709
|
if (isModalOpen) {
|
|
8586
8710
|
modalWasOpened.current = true;
|
|
8587
8711
|
}
|
|
8588
8712
|
}, [isModalOpen]);
|
|
8589
|
-
|
|
8713
|
+
React16.useEffect(() => {
|
|
8590
8714
|
if (isLoading) {
|
|
8591
8715
|
return;
|
|
8592
8716
|
}
|
|
@@ -8640,7 +8764,7 @@ function OnboardingChecker({
|
|
|
8640
8764
|
}
|
|
8641
8765
|
function useSwitchNetwork() {
|
|
8642
8766
|
const { client } = react.useInternalAuth();
|
|
8643
|
-
return
|
|
8767
|
+
return React16.useCallback(
|
|
8644
8768
|
async (chainId) => {
|
|
8645
8769
|
if (typeof window === "undefined" || !window.ethereum) {
|
|
8646
8770
|
throw new Error("No wallet found");
|
|
@@ -8704,8 +8828,8 @@ var paymentPromiseResolver = null;
|
|
|
8704
8828
|
function useVolrPay() {
|
|
8705
8829
|
const { open: openModal, close: closeModal } = useVolrModal();
|
|
8706
8830
|
const { checkPayment, getPaymentHistory } = react.useVolrPaymentApi();
|
|
8707
|
-
const isInProgressRef =
|
|
8708
|
-
const pay =
|
|
8831
|
+
const isInProgressRef = React16.useRef(false);
|
|
8832
|
+
const pay = React16.useCallback(
|
|
8709
8833
|
(options) => {
|
|
8710
8834
|
isInProgressRef.current = true;
|
|
8711
8835
|
const waitPromise = new Promise((resolve, reject) => {
|
|
@@ -8806,9 +8930,12 @@ exports.I18nContext = I18nContext;
|
|
|
8806
8930
|
exports.I18nProvider = I18nProvider;
|
|
8807
8931
|
exports.MpcConnectView = MpcConnectView;
|
|
8808
8932
|
exports.PasskeyEnrollView = PasskeyEnrollView;
|
|
8933
|
+
exports.PreferredCurrencyProvider = PreferredCurrencyProvider;
|
|
8809
8934
|
exports.VolrUIProvider = VolrUIProvider;
|
|
8810
8935
|
exports.getCurrentChainId = getCurrentChainId;
|
|
8811
8936
|
exports.useI18n = useI18n;
|
|
8937
|
+
exports.usePreferredCurrency = usePreferredCurrency;
|
|
8938
|
+
exports.usePreferredCurrencyOptional = usePreferredCurrencyOptional;
|
|
8812
8939
|
exports.useSwitchNetwork = useSwitchNetwork;
|
|
8813
8940
|
exports.useTranslation = useTranslation;
|
|
8814
8941
|
exports.useVolrModal = useVolrModal;
|