@volr/react-ui 0.2.8 → 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 +376 -274
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -2
- package/dist/index.d.ts +36 -2
- package/dist/index.js +133 -34
- 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() {
|
|
@@ -1107,13 +1107,13 @@ var translations = {
|
|
|
1107
1107
|
function getTranslations(locale = "en") {
|
|
1108
1108
|
return translations[locale] || translations.en;
|
|
1109
1109
|
}
|
|
1110
|
-
var I18nContext =
|
|
1110
|
+
var I18nContext = React16.createContext(null);
|
|
1111
1111
|
function interpolate(text, params) {
|
|
1112
1112
|
if (!params) return text;
|
|
1113
1113
|
return text.replace(/\{\{(\w+)\}\}/g, (_, key) => params[key] ?? `{{${key}}}`);
|
|
1114
1114
|
}
|
|
1115
1115
|
function useI18n() {
|
|
1116
|
-
const context =
|
|
1116
|
+
const context = React16.useContext(I18nContext);
|
|
1117
1117
|
if (!context) {
|
|
1118
1118
|
return {
|
|
1119
1119
|
locale: "en",
|
|
@@ -1157,25 +1157,25 @@ function detectLocale(allowedLocales) {
|
|
|
1157
1157
|
return resolveLocale(detected, allowedLocales);
|
|
1158
1158
|
}
|
|
1159
1159
|
function I18nProvider({ children, allowedLocales }) {
|
|
1160
|
-
const [locale, setLocaleState] =
|
|
1161
|
-
const resolveAllowedLocale =
|
|
1160
|
+
const [locale, setLocaleState] = React16.useState(() => detectLocale(allowedLocales));
|
|
1161
|
+
const resolveAllowedLocale = React16.useCallback(
|
|
1162
1162
|
(next) => resolveLocale(next, allowedLocales),
|
|
1163
1163
|
[allowedLocales]
|
|
1164
1164
|
);
|
|
1165
|
-
const setLocale =
|
|
1165
|
+
const setLocale = React16.useCallback(
|
|
1166
1166
|
(next) => {
|
|
1167
1167
|
setLocaleState(resolveAllowedLocale(next));
|
|
1168
1168
|
},
|
|
1169
1169
|
[resolveAllowedLocale]
|
|
1170
1170
|
);
|
|
1171
|
-
|
|
1171
|
+
React16.useEffect(() => {
|
|
1172
1172
|
setLocaleState((current) => {
|
|
1173
1173
|
const resolved = resolveAllowedLocale(current);
|
|
1174
1174
|
return current === resolved ? current : resolved;
|
|
1175
1175
|
});
|
|
1176
1176
|
}, [resolveAllowedLocale]);
|
|
1177
|
-
const translations2 =
|
|
1178
|
-
const t =
|
|
1177
|
+
const translations2 = React16.useMemo(() => getTranslations(locale), [locale]);
|
|
1178
|
+
const t = React16.useMemo(() => {
|
|
1179
1179
|
return (key, params) => {
|
|
1180
1180
|
const keys = key.split(".");
|
|
1181
1181
|
let value2 = translations2;
|
|
@@ -1192,7 +1192,7 @@ function I18nProvider({ children, allowedLocales }) {
|
|
|
1192
1192
|
return typeof value2 === "string" ? interpolate(value2, params) : key;
|
|
1193
1193
|
};
|
|
1194
1194
|
}, [translations2]);
|
|
1195
|
-
const value =
|
|
1195
|
+
const value = React16.useMemo(
|
|
1196
1196
|
() => ({
|
|
1197
1197
|
locale,
|
|
1198
1198
|
translations: translations2,
|
|
@@ -1204,9 +1204,9 @@ function I18nProvider({ children, allowedLocales }) {
|
|
|
1204
1204
|
return /* @__PURE__ */ jsxRuntime.jsx(I18nContext.Provider, { value, children });
|
|
1205
1205
|
}
|
|
1206
1206
|
var useTranslation = useI18n;
|
|
1207
|
-
var VolrModalContext =
|
|
1207
|
+
var VolrModalContext = React16.createContext(null);
|
|
1208
1208
|
var useVolrModal = () => {
|
|
1209
|
-
const context =
|
|
1209
|
+
const context = React16.useContext(VolrModalContext);
|
|
1210
1210
|
if (!context) {
|
|
1211
1211
|
throw new Error("useVolrModal must be used within VolrUIProvider");
|
|
1212
1212
|
}
|
|
@@ -1215,17 +1215,17 @@ var useVolrModal = () => {
|
|
|
1215
1215
|
var VolrModalProvider = ({
|
|
1216
1216
|
children
|
|
1217
1217
|
}) => {
|
|
1218
|
-
const [isOpen, setIsOpen] =
|
|
1219
|
-
const [mode, setMode] =
|
|
1220
|
-
const [asset, setAsset] =
|
|
1221
|
-
const [paymentOptions, setPaymentOptions] =
|
|
1222
|
-
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) => {
|
|
1223
1223
|
setMode(options?.mode ?? "account");
|
|
1224
1224
|
setAsset(options?.asset ?? null);
|
|
1225
1225
|
setPaymentOptions(options?.payment ?? null);
|
|
1226
1226
|
setIsOpen(true);
|
|
1227
1227
|
}, []);
|
|
1228
|
-
const close =
|
|
1228
|
+
const close = React16.useCallback(() => {
|
|
1229
1229
|
setIsOpen(false);
|
|
1230
1230
|
setAsset(null);
|
|
1231
1231
|
setPaymentOptions(null);
|
|
@@ -1239,11 +1239,11 @@ function cn(...inputs) {
|
|
|
1239
1239
|
return twMerge(clsx.clsx(inputs));
|
|
1240
1240
|
}
|
|
1241
1241
|
function useMediaQuery(query) {
|
|
1242
|
-
const [matches, setMatches] =
|
|
1242
|
+
const [matches, setMatches] = React16.useState(() => {
|
|
1243
1243
|
if (typeof window === "undefined") return false;
|
|
1244
1244
|
return window.matchMedia(query).matches;
|
|
1245
1245
|
});
|
|
1246
|
-
|
|
1246
|
+
React16.useEffect(() => {
|
|
1247
1247
|
if (typeof window === "undefined") return;
|
|
1248
1248
|
const mql = window.matchMedia(query);
|
|
1249
1249
|
const handler = (event) => setMatches(event.matches);
|
|
@@ -1257,12 +1257,12 @@ function useMediaQuery(query) {
|
|
|
1257
1257
|
// src/generated/volr-sdk-css.ts
|
|
1258
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}}';
|
|
1259
1259
|
function useResolvedTheme(theme = "light") {
|
|
1260
|
-
const [resolvedTheme, setResolvedTheme] =
|
|
1260
|
+
const [resolvedTheme, setResolvedTheme] = React16.useState(() => {
|
|
1261
1261
|
if (theme !== "system") return theme;
|
|
1262
1262
|
if (typeof window === "undefined") return "light";
|
|
1263
1263
|
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
1264
1264
|
});
|
|
1265
|
-
|
|
1265
|
+
React16.useEffect(() => {
|
|
1266
1266
|
if (theme !== "system") {
|
|
1267
1267
|
setResolvedTheme(theme);
|
|
1268
1268
|
return;
|
|
@@ -1278,10 +1278,10 @@ function useResolvedTheme(theme = "light") {
|
|
|
1278
1278
|
return resolvedTheme;
|
|
1279
1279
|
}
|
|
1280
1280
|
function ShadowPortal({ children, theme = "light" }) {
|
|
1281
|
-
const [mountNode, setMountNode] =
|
|
1282
|
-
const hostRef =
|
|
1281
|
+
const [mountNode, setMountNode] = React16.useState(null);
|
|
1282
|
+
const hostRef = React16.useRef(null);
|
|
1283
1283
|
const resolvedTheme = useResolvedTheme(theme);
|
|
1284
|
-
|
|
1284
|
+
React16.useEffect(() => {
|
|
1285
1285
|
const host = document.createElement("div");
|
|
1286
1286
|
host.id = "volr-shadow-portal";
|
|
1287
1287
|
host.style.position = "fixed";
|
|
@@ -1305,7 +1305,7 @@ function ShadowPortal({ children, theme = "light" }) {
|
|
|
1305
1305
|
hostRef.current = null;
|
|
1306
1306
|
};
|
|
1307
1307
|
}, []);
|
|
1308
|
-
|
|
1308
|
+
React16.useEffect(() => {
|
|
1309
1309
|
if (hostRef.current) {
|
|
1310
1310
|
hostRef.current.setAttribute("data-theme", resolvedTheme);
|
|
1311
1311
|
}
|
|
@@ -1314,7 +1314,7 @@ function ShadowPortal({ children, theme = "light" }) {
|
|
|
1314
1314
|
return reactDom.createPortal(children, mountNode);
|
|
1315
1315
|
}
|
|
1316
1316
|
function useFocusTrap(isActive, containerRef) {
|
|
1317
|
-
const previousActiveElement =
|
|
1317
|
+
const previousActiveElement = React16.useRef(null);
|
|
1318
1318
|
const focusableSelector = [
|
|
1319
1319
|
"button:not([disabled])",
|
|
1320
1320
|
"input:not([disabled])",
|
|
@@ -1323,7 +1323,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1323
1323
|
"a[href]",
|
|
1324
1324
|
'[tabindex]:not([tabindex="-1"])'
|
|
1325
1325
|
].join(", ");
|
|
1326
|
-
const getFocusableElements =
|
|
1326
|
+
const getFocusableElements = React16.useCallback(() => {
|
|
1327
1327
|
if (!containerRef.current) return [];
|
|
1328
1328
|
return Array.from(
|
|
1329
1329
|
containerRef.current.querySelectorAll(focusableSelector)
|
|
@@ -1331,7 +1331,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1331
1331
|
return el.offsetParent !== null;
|
|
1332
1332
|
});
|
|
1333
1333
|
}, [containerRef, focusableSelector]);
|
|
1334
|
-
const handleKeyDown =
|
|
1334
|
+
const handleKeyDown = React16.useCallback(
|
|
1335
1335
|
(event) => {
|
|
1336
1336
|
if (event.key !== "Tab") return;
|
|
1337
1337
|
const focusableElements = getFocusableElements();
|
|
@@ -1352,7 +1352,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1352
1352
|
},
|
|
1353
1353
|
[getFocusableElements]
|
|
1354
1354
|
);
|
|
1355
|
-
|
|
1355
|
+
React16.useEffect(() => {
|
|
1356
1356
|
if (!isActive) return;
|
|
1357
1357
|
previousActiveElement.current = document.activeElement;
|
|
1358
1358
|
const focusableElements = getFocusableElements();
|
|
@@ -1383,12 +1383,12 @@ var Modal = ({
|
|
|
1383
1383
|
}) => {
|
|
1384
1384
|
const isMobile2 = useMediaQuery("(max-width: 500px)");
|
|
1385
1385
|
const variant = explicitVariant ?? (isMobile2 ? "bottom-sheet" : "centered");
|
|
1386
|
-
const dialogRef =
|
|
1387
|
-
const dialogId =
|
|
1386
|
+
const dialogRef = React16.useRef(null);
|
|
1387
|
+
const dialogId = React16.useId();
|
|
1388
1388
|
const uiContext = useVolrUIOptional();
|
|
1389
1389
|
const theme = uiContext?.theme ?? "light";
|
|
1390
1390
|
useFocusTrap(open, dialogRef);
|
|
1391
|
-
|
|
1391
|
+
React16.useEffect(() => {
|
|
1392
1392
|
const handleEscape = (e) => {
|
|
1393
1393
|
if (e.key === "Escape" && open) {
|
|
1394
1394
|
if (onEscapeKeyDown) {
|
|
@@ -1971,7 +1971,7 @@ var variantMap = {
|
|
|
1971
1971
|
ghost: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "none" },
|
|
1972
1972
|
outline: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "1px solid var(--volr-border)" }
|
|
1973
1973
|
};
|
|
1974
|
-
var Button =
|
|
1974
|
+
var Button = React16__default.default.forwardRef(
|
|
1975
1975
|
({ variant = "primary", size = "md", fullWidth, className, style, disabled, children, ...props }, ref) => {
|
|
1976
1976
|
const { accentColor } = useVolrUI();
|
|
1977
1977
|
const sizeStyle = sizeMap[size];
|
|
@@ -2172,11 +2172,11 @@ function PasskeyMigrationView({
|
|
|
2172
2172
|
wrapInModal = true
|
|
2173
2173
|
}) {
|
|
2174
2174
|
const { t } = useI18n();
|
|
2175
|
-
const [isMigrating, setIsMigrating] =
|
|
2176
|
-
const [isComplete, setIsComplete] =
|
|
2177
|
-
const [error, setError] =
|
|
2175
|
+
const [isMigrating, setIsMigrating] = React16.useState(false);
|
|
2176
|
+
const [isComplete, setIsComplete] = React16.useState(false);
|
|
2177
|
+
const [error, setError] = React16.useState(null);
|
|
2178
2178
|
const biometricType = getBiometricType();
|
|
2179
|
-
|
|
2179
|
+
React16.useEffect(() => {
|
|
2180
2180
|
if (typeof window === "undefined") return;
|
|
2181
2181
|
const handler = (event) => {
|
|
2182
2182
|
if (event.data?.type === "VOLR_MIGRATION_DONE") {
|
|
@@ -2187,7 +2187,7 @@ function PasskeyMigrationView({
|
|
|
2187
2187
|
window.addEventListener("message", handler);
|
|
2188
2188
|
return () => window.removeEventListener("message", handler);
|
|
2189
2189
|
}, []);
|
|
2190
|
-
|
|
2190
|
+
React16.useEffect(() => {
|
|
2191
2191
|
if (isComplete) {
|
|
2192
2192
|
const timer = setTimeout(() => {
|
|
2193
2193
|
if (onComplete) {
|
|
@@ -2211,7 +2211,7 @@ function PasskeyMigrationView({
|
|
|
2211
2211
|
}
|
|
2212
2212
|
}
|
|
2213
2213
|
};
|
|
2214
|
-
const handleDone =
|
|
2214
|
+
const handleDone = React16.useCallback(() => {
|
|
2215
2215
|
if (onComplete) {
|
|
2216
2216
|
onComplete();
|
|
2217
2217
|
}
|
|
@@ -2308,22 +2308,22 @@ function PasskeyEnrollView({
|
|
|
2308
2308
|
isEnrolling,
|
|
2309
2309
|
error: enrollmentError
|
|
2310
2310
|
} = react.usePasskeyEnrollment();
|
|
2311
|
-
const [hasStarted, setHasStarted] =
|
|
2312
|
-
const [errorMessage, setErrorMessage] =
|
|
2313
|
-
const [isRefreshing, setIsRefreshing] =
|
|
2311
|
+
const [hasStarted, setHasStarted] = React16.useState(false);
|
|
2312
|
+
const [errorMessage, setErrorMessage] = React16.useState(null);
|
|
2313
|
+
const [isRefreshing, setIsRefreshing] = React16.useState(false);
|
|
2314
2314
|
const biometricType = getBiometricType();
|
|
2315
|
-
const compatibility =
|
|
2316
|
-
const [hasPrfError, setHasPrfError] =
|
|
2317
|
-
const platformHint =
|
|
2315
|
+
const compatibility = React16.useMemo(() => react.checkPrfCompatibility(), []);
|
|
2316
|
+
const [hasPrfError, setHasPrfError] = React16.useState(false);
|
|
2317
|
+
const platformHint = React16.useMemo(
|
|
2318
2318
|
() => hasPrfError ? react.getPlatformHint(compatibility.platform) : { hintKey: "", noteKey: "" },
|
|
2319
2319
|
[compatibility.platform, hasPrfError]
|
|
2320
2320
|
);
|
|
2321
2321
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
2322
|
-
const currentDomain =
|
|
2322
|
+
const currentDomain = React16.useMemo(() => {
|
|
2323
2323
|
if (typeof window === "undefined") return "localhost";
|
|
2324
2324
|
return window.location.hostname;
|
|
2325
2325
|
}, []);
|
|
2326
|
-
const migrationInfo =
|
|
2326
|
+
const migrationInfo = React16.useMemo(() => {
|
|
2327
2327
|
if (!user?.registeredPasskeys || user.registeredPasskeys.length === 0) {
|
|
2328
2328
|
return { needsMigration: false, sourcePasskey: null };
|
|
2329
2329
|
}
|
|
@@ -2336,7 +2336,7 @@ function PasskeyEnrollView({
|
|
|
2336
2336
|
const sourcePasskey = user.registeredPasskeys[0];
|
|
2337
2337
|
return { needsMigration: true, sourcePasskey };
|
|
2338
2338
|
}, [user?.registeredPasskeys, currentDomain]);
|
|
2339
|
-
|
|
2339
|
+
React16.useEffect(() => {
|
|
2340
2340
|
console.log("[PasskeyEnrollView] User state:", {
|
|
2341
2341
|
user,
|
|
2342
2342
|
keyStorageType: user?.keyStorageType,
|
|
@@ -2347,7 +2347,7 @@ function PasskeyEnrollView({
|
|
|
2347
2347
|
migrationInfo
|
|
2348
2348
|
});
|
|
2349
2349
|
}, [user, hasPasskey, currentDomain, migrationInfo]);
|
|
2350
|
-
|
|
2350
|
+
React16.useEffect(() => {
|
|
2351
2351
|
if (hasPasskey && !user?.evmAddress && !isRefreshing) {
|
|
2352
2352
|
const refreshUserData = async () => {
|
|
2353
2353
|
try {
|
|
@@ -2378,7 +2378,7 @@ function PasskeyEnrollView({
|
|
|
2378
2378
|
refreshUserData();
|
|
2379
2379
|
}
|
|
2380
2380
|
}, [hasPasskey, user?.evmAddress, isRefreshing, client, setUser, user]);
|
|
2381
|
-
|
|
2381
|
+
React16.useEffect(() => {
|
|
2382
2382
|
if (!user?.id) {
|
|
2383
2383
|
const error = new Error("User ID is required for passkey enrollment");
|
|
2384
2384
|
setErrorMessage(getUserFriendlyError(error, t));
|
|
@@ -2387,7 +2387,7 @@ function PasskeyEnrollView({
|
|
|
2387
2387
|
}
|
|
2388
2388
|
}
|
|
2389
2389
|
}, [user, onError, t]);
|
|
2390
|
-
|
|
2390
|
+
React16.useEffect(() => {
|
|
2391
2391
|
if (enrollmentError) {
|
|
2392
2392
|
const friendlyMessage = getUserFriendlyError(enrollmentError, t);
|
|
2393
2393
|
setErrorMessage(friendlyMessage);
|
|
@@ -2666,7 +2666,7 @@ function MigrationTargetView({
|
|
|
2666
2666
|
const biometricType = getBiometricType();
|
|
2667
2667
|
const isProcessing = step !== "ready" && step !== "error" && step !== "success";
|
|
2668
2668
|
const progress = STEP_PROGRESS2[step];
|
|
2669
|
-
|
|
2669
|
+
React16.useEffect(() => {
|
|
2670
2670
|
if (step === "success" && onAutoClose) {
|
|
2671
2671
|
const timer = setTimeout(() => {
|
|
2672
2672
|
onAutoClose();
|
|
@@ -2746,8 +2746,8 @@ function MpcConnectView({
|
|
|
2746
2746
|
isConnecting,
|
|
2747
2747
|
error: connectionError
|
|
2748
2748
|
} = react.useMpcConnection();
|
|
2749
|
-
const [errorMessage, setErrorMessage] =
|
|
2750
|
-
|
|
2749
|
+
const [errorMessage, setErrorMessage] = React16.useState(null);
|
|
2750
|
+
React16.useEffect(() => {
|
|
2751
2751
|
if (connectionError) {
|
|
2752
2752
|
setErrorMessage(connectionError.message);
|
|
2753
2753
|
if (onError) {
|
|
@@ -2755,7 +2755,7 @@ function MpcConnectView({
|
|
|
2755
2755
|
}
|
|
2756
2756
|
}
|
|
2757
2757
|
}, [connectionError, onError]);
|
|
2758
|
-
|
|
2758
|
+
React16.useEffect(() => {
|
|
2759
2759
|
handleConnect();
|
|
2760
2760
|
}, []);
|
|
2761
2761
|
const handleConnect = async () => {
|
|
@@ -2986,9 +2986,9 @@ function PoweredBy() {
|
|
|
2986
2986
|
}
|
|
2987
2987
|
function EmailInlineInput({ onSubmit, accentColor }) {
|
|
2988
2988
|
const { t } = useI18n();
|
|
2989
|
-
const [email, setEmail] =
|
|
2990
|
-
const [error, setError] =
|
|
2991
|
-
const [isLoading, setIsLoading] =
|
|
2989
|
+
const [email, setEmail] = React16.useState("");
|
|
2990
|
+
const [error, setError] = React16.useState(null);
|
|
2991
|
+
const [isLoading, setIsLoading] = React16.useState(false);
|
|
2992
2992
|
const handleSubmit = async (e) => {
|
|
2993
2993
|
e.preventDefault();
|
|
2994
2994
|
setError(null);
|
|
@@ -3112,14 +3112,14 @@ function SigninSelectScreen({
|
|
|
3112
3112
|
function CodeInputScreen({ email, onSubmit, onResend }) {
|
|
3113
3113
|
const { t } = useI18n();
|
|
3114
3114
|
const { accentColor } = useVolrUI();
|
|
3115
|
-
const [digits, setDigits] =
|
|
3116
|
-
const [error, setError] =
|
|
3117
|
-
const [isLoading, setIsLoading] =
|
|
3118
|
-
const inputRefs =
|
|
3119
|
-
|
|
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(() => {
|
|
3120
3120
|
inputRefs.current[0]?.focus();
|
|
3121
3121
|
}, []);
|
|
3122
|
-
|
|
3122
|
+
React16.useEffect(() => {
|
|
3123
3123
|
const code = digits.join("");
|
|
3124
3124
|
if (code.length === 6 && !isLoading) {
|
|
3125
3125
|
handleSubmit(code);
|
|
@@ -3231,7 +3231,7 @@ function CodeInputScreen({ email, onSubmit, onResend }) {
|
|
|
3231
3231
|
] });
|
|
3232
3232
|
}
|
|
3233
3233
|
var CopyButton = ({ text, className, onCopy }) => {
|
|
3234
|
-
const [copied, setCopied] =
|
|
3234
|
+
const [copied, setCopied] = React16.useState(false);
|
|
3235
3235
|
const handleCopy = async () => {
|
|
3236
3236
|
try {
|
|
3237
3237
|
await navigator.clipboard.writeText(text);
|
|
@@ -3310,23 +3310,23 @@ function SiweLoginScreen({
|
|
|
3310
3310
|
checkSiweSession,
|
|
3311
3311
|
getSiweSignUrl
|
|
3312
3312
|
} = react.useVolrLogin();
|
|
3313
|
-
const [isLoading, setIsLoading] =
|
|
3314
|
-
const [loadingWallet, setLoadingWallet] =
|
|
3315
|
-
const [error, setError] =
|
|
3316
|
-
const [providers, setProviders] =
|
|
3317
|
-
const [isDetecting, setIsDetecting] =
|
|
3318
|
-
const [hasLegacyWallet, setHasLegacyWallet] =
|
|
3319
|
-
const [showOtherWallet, setShowOtherWallet] =
|
|
3320
|
-
const [sessionUrl, setSessionUrl] =
|
|
3321
|
-
const [isPolling, setIsPolling] =
|
|
3322
|
-
const pollingRef =
|
|
3323
|
-
const sessionCreatedRef =
|
|
3324
|
-
|
|
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(() => {
|
|
3325
3325
|
return () => {
|
|
3326
3326
|
if (pollingRef.current) clearInterval(pollingRef.current);
|
|
3327
3327
|
};
|
|
3328
3328
|
}, []);
|
|
3329
|
-
|
|
3329
|
+
React16.useEffect(() => {
|
|
3330
3330
|
if (typeof window === "undefined") {
|
|
3331
3331
|
setIsDetecting(false);
|
|
3332
3332
|
return;
|
|
@@ -3352,7 +3352,7 @@ function SiweLoginScreen({
|
|
|
3352
3352
|
};
|
|
3353
3353
|
}, []);
|
|
3354
3354
|
const hasAnyWallet = providers.length > 0 || hasLegacyWallet;
|
|
3355
|
-
const createSession =
|
|
3355
|
+
const createSession = React16.useCallback(async () => {
|
|
3356
3356
|
if (sessionCreatedRef.current || sessionUrl) return;
|
|
3357
3357
|
sessionCreatedRef.current = true;
|
|
3358
3358
|
try {
|
|
@@ -3394,17 +3394,17 @@ function SiweLoginScreen({
|
|
|
3394
3394
|
onError(err instanceof Error ? err : new Error("Failed to create session"));
|
|
3395
3395
|
}
|
|
3396
3396
|
}, [createSiweSession, getSiweSignUrl, checkSiweSession, onSuccess, onError, t, sessionUrl]);
|
|
3397
|
-
|
|
3397
|
+
React16.useEffect(() => {
|
|
3398
3398
|
if (!isDetecting && !hasAnyWallet && !sessionUrl) {
|
|
3399
3399
|
createSession();
|
|
3400
3400
|
}
|
|
3401
3401
|
}, [isDetecting, hasAnyWallet, sessionUrl, createSession]);
|
|
3402
|
-
|
|
3402
|
+
React16.useEffect(() => {
|
|
3403
3403
|
if (showOtherWallet && !sessionUrl) {
|
|
3404
3404
|
createSession();
|
|
3405
3405
|
}
|
|
3406
3406
|
}, [showOtherWallet, sessionUrl, createSession]);
|
|
3407
|
-
const handleWalletClick =
|
|
3407
|
+
const handleWalletClick = React16.useCallback(async (provider, walletName, walletConnector) => {
|
|
3408
3408
|
setError(null);
|
|
3409
3409
|
setIsLoading(true);
|
|
3410
3410
|
setLoadingWallet(walletName);
|
|
@@ -3428,7 +3428,7 @@ function SiweLoginScreen({
|
|
|
3428
3428
|
setLoadingWallet(null);
|
|
3429
3429
|
}
|
|
3430
3430
|
}, [signWithWallet, onSuccess, onError]);
|
|
3431
|
-
const handleLegacyWalletClick =
|
|
3431
|
+
const handleLegacyWalletClick = React16.useCallback(async () => {
|
|
3432
3432
|
if (typeof window === "undefined" || !window.ethereum) return;
|
|
3433
3433
|
const ethereum = window.ethereum;
|
|
3434
3434
|
let walletName = "Wallet";
|
|
@@ -3437,7 +3437,7 @@ function SiweLoginScreen({
|
|
|
3437
3437
|
else if (ethereum.isRabby) walletName = "Rabby";
|
|
3438
3438
|
await handleWalletClick(ethereum, walletName);
|
|
3439
3439
|
}, [handleWalletClick]);
|
|
3440
|
-
const cancelOtherWallet =
|
|
3440
|
+
const cancelOtherWallet = React16.useCallback(() => {
|
|
3441
3441
|
if (pollingRef.current) {
|
|
3442
3442
|
clearInterval(pollingRef.current);
|
|
3443
3443
|
pollingRef.current = null;
|
|
@@ -3584,13 +3584,13 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3584
3584
|
const { client } = react.useInternalAuth();
|
|
3585
3585
|
const { appName, branding } = useVolrUI();
|
|
3586
3586
|
const { requestEmailCode, verifyEmailCode, handleSocialLogin } = react.useVolrLogin();
|
|
3587
|
-
const [currentScreen, setCurrentScreen] =
|
|
3588
|
-
const [email, setEmail] =
|
|
3587
|
+
const [currentScreen, setCurrentScreen] = React16.useState("method-select");
|
|
3588
|
+
const [email, setEmail] = React16.useState("");
|
|
3589
3589
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
3590
3590
|
const isMobile2 = useMediaQuery("(max-width: 500px)");
|
|
3591
3591
|
const isWideViewport = useMediaQuery("(min-width: 864px)");
|
|
3592
3592
|
const shouldUseWideLayout = !isMobile2 && isWideViewport && Boolean(branding) && currentScreen === "method-select";
|
|
3593
|
-
|
|
3593
|
+
React16.useEffect(() => {
|
|
3594
3594
|
if (!isOpen) {
|
|
3595
3595
|
setCurrentScreen("method-select");
|
|
3596
3596
|
setEmail("");
|
|
@@ -3815,7 +3815,7 @@ function AssetSelectView({
|
|
|
3815
3815
|
}) })
|
|
3816
3816
|
] });
|
|
3817
3817
|
}
|
|
3818
|
-
var TextLinkButton =
|
|
3818
|
+
var TextLinkButton = React16__default.default.forwardRef(({ showArrow = false, className, children, ...props }, ref) => {
|
|
3819
3819
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3820
3820
|
"button",
|
|
3821
3821
|
{
|
|
@@ -3944,23 +3944,23 @@ function WalletTransferView({
|
|
|
3944
3944
|
const { config } = react.useVolrContext();
|
|
3945
3945
|
const { client } = react.useInternalAuth();
|
|
3946
3946
|
const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
|
|
3947
|
-
const [viewState, setViewState] =
|
|
3948
|
-
const [selectedWallet, setSelectedWallet] =
|
|
3949
|
-
const [connectedAddress, setConnectedAddress] =
|
|
3950
|
-
const [balance, setBalance] =
|
|
3951
|
-
const [amount, setAmount] =
|
|
3952
|
-
const [isConnecting, setIsConnecting] =
|
|
3953
|
-
const [isTransferring, setIsTransferring] =
|
|
3954
|
-
const [error, setError] =
|
|
3955
|
-
const [chainName, setChainName] =
|
|
3956
|
-
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);
|
|
3957
3957
|
const tokenSymbol = asset === "native" ? "ETH" : asset.symbol;
|
|
3958
3958
|
const decimals = asset === "native" ? 18 : asset.decimals;
|
|
3959
|
-
const getNetworkInfo =
|
|
3959
|
+
const getNetworkInfo = React16.useCallback(
|
|
3960
3960
|
react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
|
|
3961
3961
|
[client, config.rpcOverrides]
|
|
3962
3962
|
);
|
|
3963
|
-
|
|
3963
|
+
React16.useEffect(() => {
|
|
3964
3964
|
let cancelled = false;
|
|
3965
3965
|
const loadChainName = async () => {
|
|
3966
3966
|
try {
|
|
@@ -3975,7 +3975,7 @@ function WalletTransferView({
|
|
|
3975
3975
|
cancelled = true;
|
|
3976
3976
|
};
|
|
3977
3977
|
}, [getNetworkInfo, chainId]);
|
|
3978
|
-
const connectWallet =
|
|
3978
|
+
const connectWallet = React16.useCallback(async (wallet) => {
|
|
3979
3979
|
setIsConnecting(true);
|
|
3980
3980
|
setError(null);
|
|
3981
3981
|
try {
|
|
@@ -3999,7 +3999,7 @@ function WalletTransferView({
|
|
|
3999
3999
|
setIsConnecting(false);
|
|
4000
4000
|
}
|
|
4001
4001
|
}, [chainId, asset]);
|
|
4002
|
-
const fetchBalance =
|
|
4002
|
+
const fetchBalance = React16.useCallback(async (provider, address, currentChain) => {
|
|
4003
4003
|
try {
|
|
4004
4004
|
if (currentChain !== chainId) {
|
|
4005
4005
|
setBalance(null);
|
|
@@ -4024,7 +4024,7 @@ function WalletTransferView({
|
|
|
4024
4024
|
setBalance(BigInt(0));
|
|
4025
4025
|
}
|
|
4026
4026
|
}, [chainId, asset]);
|
|
4027
|
-
const switchNetwork =
|
|
4027
|
+
const switchNetwork = React16.useCallback(async () => {
|
|
4028
4028
|
if (!selectedWallet?.provider) return;
|
|
4029
4029
|
try {
|
|
4030
4030
|
await selectedWallet.provider.request({
|
|
@@ -4042,7 +4042,7 @@ function WalletTransferView({
|
|
|
4042
4042
|
setError(err instanceof Error ? err.message : "Failed to switch network");
|
|
4043
4043
|
}
|
|
4044
4044
|
}, [selectedWallet, chainId, connectedAddress, fetchBalance]);
|
|
4045
|
-
const executeTransfer =
|
|
4045
|
+
const executeTransfer = React16.useCallback(async () => {
|
|
4046
4046
|
if (!selectedWallet?.provider || !connectedAddress || !amount) return;
|
|
4047
4047
|
setIsTransferring(true);
|
|
4048
4048
|
setError(null);
|
|
@@ -4085,7 +4085,7 @@ function WalletTransferView({
|
|
|
4085
4085
|
setIsTransferring(false);
|
|
4086
4086
|
}
|
|
4087
4087
|
}, [selectedWallet, connectedAddress, amount, decimals, balance, asset, destinationAddress, onSuccess, t]);
|
|
4088
|
-
const setMaxAmount =
|
|
4088
|
+
const setMaxAmount = React16.useCallback(() => {
|
|
4089
4089
|
if (balance !== null) {
|
|
4090
4090
|
const formatted = formatUnits(balance, decimals);
|
|
4091
4091
|
setAmount(formatted);
|
|
@@ -4451,7 +4451,7 @@ var DepositCompletedToast = ({
|
|
|
4451
4451
|
symbol
|
|
4452
4452
|
}) => {
|
|
4453
4453
|
const { t } = useI18n();
|
|
4454
|
-
const [expanded, setExpanded] =
|
|
4454
|
+
const [expanded, setExpanded] = React16.useState(false);
|
|
4455
4455
|
const formatAmount = (amount) => {
|
|
4456
4456
|
const divisor = BigInt(10 ** decimals);
|
|
4457
4457
|
const whole = amount / divisor;
|
|
@@ -4611,11 +4611,11 @@ function DepositQRView(props) {
|
|
|
4611
4611
|
const { t } = useI18n();
|
|
4612
4612
|
const { config } = react.useVolrContext();
|
|
4613
4613
|
const { client } = react.useInternalAuth();
|
|
4614
|
-
const [chainName, setChainName] =
|
|
4615
|
-
const [showOtherTokenModal, setShowOtherTokenModal] =
|
|
4616
|
-
const [showToast, setShowToast] =
|
|
4617
|
-
const [toastData, setToastData] =
|
|
4618
|
-
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");
|
|
4619
4619
|
const eip681 = `ethereum:${props.address}`;
|
|
4620
4620
|
const status = react.useDepositListener({
|
|
4621
4621
|
chainId: props.chainId,
|
|
@@ -4628,7 +4628,7 @@ function DepositQRView(props) {
|
|
|
4628
4628
|
},
|
|
4629
4629
|
address: props.address
|
|
4630
4630
|
});
|
|
4631
|
-
|
|
4631
|
+
React16.useEffect(() => {
|
|
4632
4632
|
if (status.state === "detected") {
|
|
4633
4633
|
setToastData({
|
|
4634
4634
|
previousBalance: status.previousBalance,
|
|
@@ -4639,11 +4639,11 @@ function DepositQRView(props) {
|
|
|
4639
4639
|
props.onDepositDetected?.();
|
|
4640
4640
|
}
|
|
4641
4641
|
}, [status, props.onDepositDetected]);
|
|
4642
|
-
const getNetworkInfo =
|
|
4642
|
+
const getNetworkInfo = React16.useCallback(
|
|
4643
4643
|
react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
|
|
4644
4644
|
[client, config.rpcOverrides]
|
|
4645
4645
|
);
|
|
4646
|
-
|
|
4646
|
+
React16.useEffect(() => {
|
|
4647
4647
|
let cancelled = false;
|
|
4648
4648
|
const loadChainName = async () => {
|
|
4649
4649
|
try {
|
|
@@ -4883,6 +4883,111 @@ function DepositModalBody({
|
|
|
4883
4883
|
}
|
|
4884
4884
|
);
|
|
4885
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
|
+
}
|
|
4886
4991
|
function DepositIcon() {
|
|
4887
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(
|
|
4888
4993
|
"path",
|
|
@@ -4938,12 +5043,8 @@ function AccountMainView({
|
|
|
4938
5043
|
isRefreshing
|
|
4939
5044
|
}) {
|
|
4940
5045
|
const { t } = useI18n();
|
|
4941
|
-
const
|
|
4942
|
-
|
|
4943
|
-
currency: "USD",
|
|
4944
|
-
minimumFractionDigits: 2,
|
|
4945
|
-
maximumFractionDigits: 2
|
|
4946
|
-
});
|
|
5046
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
5047
|
+
const formattedUsd = isLoading ? "\u2014" : currencyCtx ? currencyCtx.formatAmount(totalUsd) : react.formatCurrency(totalUsd, "USD");
|
|
4947
5048
|
const lastUpdatedLabel = lastUpdatedAt ? lastUpdatedAt.toLocaleTimeString(void 0, {
|
|
4948
5049
|
hour: "2-digit",
|
|
4949
5050
|
minute: "2-digit"
|
|
@@ -5036,6 +5137,8 @@ function AccountMainView({
|
|
|
5036
5137
|
] });
|
|
5037
5138
|
}
|
|
5038
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;
|
|
5039
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: [
|
|
5040
5143
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:items-center volr:gap-3", children: [
|
|
5041
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(
|
|
@@ -5056,10 +5159,7 @@ function TokenRow({ token }) {
|
|
|
5056
5159
|
] }),
|
|
5057
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: [
|
|
5058
5161
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-sm volr:font-medium volr:text-slate-900", children: token.balance }),
|
|
5059
|
-
|
|
5060
|
-
"$",
|
|
5061
|
-
token.balanceUsd.toFixed(2)
|
|
5062
|
-
] })
|
|
5162
|
+
formattedBalanceUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedBalanceUsd })
|
|
5063
5163
|
] }) })
|
|
5064
5164
|
] });
|
|
5065
5165
|
}
|
|
@@ -5086,7 +5186,7 @@ function BalanceDetailView({
|
|
|
5086
5186
|
/* @__PURE__ */ jsxRuntime.jsx("div", { children: balances.map((token) => /* @__PURE__ */ jsxRuntime.jsx(TokenRow, { token }, token.id)) })
|
|
5087
5187
|
] });
|
|
5088
5188
|
}
|
|
5089
|
-
var Input =
|
|
5189
|
+
var Input = React16__default.default.forwardRef(
|
|
5090
5190
|
({ leftIcon, error, className, style, disabled, ...props }, ref) => {
|
|
5091
5191
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:relative", children: [
|
|
5092
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 }),
|
|
@@ -5118,23 +5218,23 @@ function WithdrawView({
|
|
|
5118
5218
|
const { t } = useI18n();
|
|
5119
5219
|
const { withdraw, isWithdrawing, result, error, reset } = react.useWithdraw();
|
|
5120
5220
|
const { client } = react.useInternalAuth();
|
|
5121
|
-
const [step, setStep] =
|
|
5122
|
-
const [selectedTokenId, setSelectedTokenId] =
|
|
5123
|
-
const [toAddress, setToAddress] =
|
|
5124
|
-
const [amount, setAmount] =
|
|
5125
|
-
const [useConnectedWallet, setUseConnectedWallet] =
|
|
5126
|
-
const [blockExplorerUrl, setBlockExplorerUrl] =
|
|
5127
|
-
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(
|
|
5128
5228
|
() => balances.find((b) => b.id === selectedTokenId),
|
|
5129
5229
|
[balances, selectedTokenId]
|
|
5130
5230
|
);
|
|
5131
5231
|
const selectedChainId = selectedToken?.chainId ?? null;
|
|
5132
|
-
const connectedAddress =
|
|
5232
|
+
const connectedAddress = React16.useMemo(() => {
|
|
5133
5233
|
if (!connectedWallet) return null;
|
|
5134
5234
|
const parts = connectedWallet.split(":");
|
|
5135
5235
|
return parts.length >= 2 ? parts[1] : null;
|
|
5136
5236
|
}, [connectedWallet]);
|
|
5137
|
-
|
|
5237
|
+
React16.useEffect(() => {
|
|
5138
5238
|
if (!selectedChainId) {
|
|
5139
5239
|
setBlockExplorerUrl(null);
|
|
5140
5240
|
return;
|
|
@@ -5155,7 +5255,7 @@ function WithdrawView({
|
|
|
5155
5255
|
cancelled = true;
|
|
5156
5256
|
};
|
|
5157
5257
|
}, [client, selectedChainId]);
|
|
5158
|
-
const explorerTxUrl =
|
|
5258
|
+
const explorerTxUrl = React16.useMemo(() => {
|
|
5159
5259
|
if (!blockExplorerUrl || !result?.txHash) return null;
|
|
5160
5260
|
const trimmedBase = blockExplorerUrl.replace(/\/$/, "");
|
|
5161
5261
|
return `${trimmedBase}/tx/${result.txHash}`;
|
|
@@ -5194,7 +5294,7 @@ function WithdrawView({
|
|
|
5194
5294
|
setAmount("");
|
|
5195
5295
|
setUseConnectedWallet(false);
|
|
5196
5296
|
};
|
|
5197
|
-
const isAmountValid =
|
|
5297
|
+
const isAmountValid = React16.useMemo(() => {
|
|
5198
5298
|
if (!amount || !selectedToken) return false;
|
|
5199
5299
|
const num = parseFloat(amount);
|
|
5200
5300
|
if (isNaN(num) || num <= 0) return false;
|
|
@@ -5474,6 +5574,7 @@ function ChevronRightIcon({ className }) {
|
|
|
5474
5574
|
}
|
|
5475
5575
|
function PaymentRow({ payment, onClick }) {
|
|
5476
5576
|
const { t } = useI18n();
|
|
5577
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
5477
5578
|
const date = new Date(payment.createdAt);
|
|
5478
5579
|
const formattedDate = date.toLocaleDateString(void 0, {
|
|
5479
5580
|
month: "short",
|
|
@@ -5488,6 +5589,7 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5488
5589
|
CANCELLED: "volr:bg-slate-100 volr:text-slate-500",
|
|
5489
5590
|
EXPIRED: "volr:bg-slate-100 volr:text-slate-500"
|
|
5490
5591
|
};
|
|
5592
|
+
const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
|
|
5491
5593
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5492
5594
|
"button",
|
|
5493
5595
|
{
|
|
@@ -5515,10 +5617,7 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5515
5617
|
" ",
|
|
5516
5618
|
payment.token.symbol
|
|
5517
5619
|
] }),
|
|
5518
|
-
|
|
5519
|
-
"$",
|
|
5520
|
-
parseFloat(payment.totalUsd).toFixed(2)
|
|
5521
|
-
] })
|
|
5620
|
+
formattedUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedUsd })
|
|
5522
5621
|
] }),
|
|
5523
5622
|
/* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-300" })
|
|
5524
5623
|
] })
|
|
@@ -5529,10 +5628,10 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5529
5628
|
function PaymentHistoryView({ onSelectPayment }) {
|
|
5530
5629
|
const { t } = useI18n();
|
|
5531
5630
|
const { getPaymentHistory, isLoading: isApiLoading } = react.useVolrPaymentApi();
|
|
5532
|
-
const [payments, setPayments] =
|
|
5533
|
-
const [isLoading, setIsLoading] =
|
|
5534
|
-
const [error, setError] =
|
|
5535
|
-
|
|
5631
|
+
const [payments, setPayments] = React16.useState([]);
|
|
5632
|
+
const [isLoading, setIsLoading] = React16.useState(true);
|
|
5633
|
+
const [error, setError] = React16.useState(null);
|
|
5634
|
+
React16.useEffect(() => {
|
|
5536
5635
|
setIsLoading(true);
|
|
5537
5636
|
setError(null);
|
|
5538
5637
|
getPaymentHistory({ take: 20 }).then((result) => {
|
|
@@ -5588,6 +5687,8 @@ function DetailRow({ label, value, copyable, mono, copyText }) {
|
|
|
5588
5687
|
}
|
|
5589
5688
|
function PaymentDetailView({ payment }) {
|
|
5590
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;
|
|
5591
5692
|
const createdDate = new Date(payment.createdAt);
|
|
5592
5693
|
const formattedCreatedAt = createdDate.toLocaleString(void 0, {
|
|
5593
5694
|
year: "numeric",
|
|
@@ -5636,10 +5737,9 @@ function PaymentDetailView({ payment }) {
|
|
|
5636
5737
|
" ",
|
|
5637
5738
|
payment.token.symbol
|
|
5638
5739
|
] }),
|
|
5639
|
-
|
|
5640
|
-
"\u2248
|
|
5641
|
-
|
|
5642
|
-
" USD"
|
|
5740
|
+
formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-sm volr:text-slate-500", children: [
|
|
5741
|
+
"\u2248 ",
|
|
5742
|
+
formattedUsd
|
|
5643
5743
|
] })
|
|
5644
5744
|
] }),
|
|
5645
5745
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-1", children: [
|
|
@@ -5772,21 +5872,21 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5772
5872
|
const { user, logout } = react.useVolrContext();
|
|
5773
5873
|
const { balances, totalUsd, isLoading, paymentEnabled, refresh } = react.useUserBalances();
|
|
5774
5874
|
const { client } = react.useInternalAuth();
|
|
5775
|
-
const [currentView, setCurrentView] =
|
|
5776
|
-
const [selectedPayment, setSelectedPayment] =
|
|
5777
|
-
const [isLoggingOut, setIsLoggingOut] =
|
|
5778
|
-
const [lastUpdatedAt, setLastUpdatedAt] =
|
|
5779
|
-
const [isRefreshing, setIsRefreshing] =
|
|
5780
|
-
const prevUserRef =
|
|
5781
|
-
const refreshInFlightRef =
|
|
5782
|
-
const lastRefreshRef =
|
|
5783
|
-
const [closingAfterLogin, setClosingAfterLogin] =
|
|
5784
|
-
const [setupStep, setSetupStep] =
|
|
5785
|
-
const [depositAssets, setDepositAssets] =
|
|
5786
|
-
const [depositLoading, setDepositLoading] =
|
|
5787
|
-
const [depositError, setDepositError] =
|
|
5788
|
-
const [depositSelectedIdx, setDepositSelectedIdx] =
|
|
5789
|
-
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 () => {
|
|
5790
5890
|
if (!isOpen) return;
|
|
5791
5891
|
const now = Date.now();
|
|
5792
5892
|
if (refreshInFlightRef.current) return;
|
|
@@ -5806,10 +5906,10 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5806
5906
|
setIsRefreshing(false);
|
|
5807
5907
|
}
|
|
5808
5908
|
}, [isOpen, refresh]);
|
|
5809
|
-
const handleManualRefresh =
|
|
5909
|
+
const handleManualRefresh = React16.useCallback(() => {
|
|
5810
5910
|
void refreshBalances();
|
|
5811
5911
|
}, [refreshBalances]);
|
|
5812
|
-
|
|
5912
|
+
React16.useEffect(() => {
|
|
5813
5913
|
if (currentView !== "deposit" || !isOpen) return;
|
|
5814
5914
|
setDepositLoading(true);
|
|
5815
5915
|
setDepositError(null);
|
|
@@ -5826,11 +5926,11 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5826
5926
|
setDepositLoading(false);
|
|
5827
5927
|
});
|
|
5828
5928
|
}, [currentView, isOpen, client]);
|
|
5829
|
-
|
|
5929
|
+
React16.useEffect(() => {
|
|
5830
5930
|
if (!isOpen) return;
|
|
5831
5931
|
void refreshBalances();
|
|
5832
5932
|
}, [isOpen, currentView, refreshBalances]);
|
|
5833
|
-
|
|
5933
|
+
React16.useEffect(() => {
|
|
5834
5934
|
if (!isOpen || typeof document === "undefined") return;
|
|
5835
5935
|
const handleFocus = () => {
|
|
5836
5936
|
if (document.visibilityState === "visible") {
|
|
@@ -5844,7 +5944,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5844
5944
|
document.removeEventListener("visibilitychange", handleFocus);
|
|
5845
5945
|
};
|
|
5846
5946
|
}, [isOpen, refreshBalances]);
|
|
5847
|
-
|
|
5947
|
+
React16.useEffect(() => {
|
|
5848
5948
|
if (!isOpen) return;
|
|
5849
5949
|
const intervalId = window.setInterval(() => {
|
|
5850
5950
|
void refreshBalances();
|
|
@@ -5853,7 +5953,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5853
5953
|
clearInterval(intervalId);
|
|
5854
5954
|
};
|
|
5855
5955
|
}, [isOpen, refreshBalances]);
|
|
5856
|
-
const handleOpenChange =
|
|
5956
|
+
const handleOpenChange = React16.useCallback((open) => {
|
|
5857
5957
|
if (!open) {
|
|
5858
5958
|
onClose();
|
|
5859
5959
|
setTimeout(() => {
|
|
@@ -5863,7 +5963,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5863
5963
|
}, 200);
|
|
5864
5964
|
}
|
|
5865
5965
|
}, [onClose]);
|
|
5866
|
-
|
|
5966
|
+
React16.useEffect(() => {
|
|
5867
5967
|
if (!isOpen) {
|
|
5868
5968
|
setClosingAfterLogin(false);
|
|
5869
5969
|
prevUserRef.current = user ?? null;
|
|
@@ -6034,11 +6134,11 @@ var DepositModal = ({
|
|
|
6034
6134
|
}) => {
|
|
6035
6135
|
const { user } = react.useVolrContext();
|
|
6036
6136
|
const { client } = react.useInternalAuth();
|
|
6037
|
-
const [depositAssets, setDepositAssets] =
|
|
6038
|
-
const [isLoading, setIsLoading] =
|
|
6039
|
-
const [error, setError] =
|
|
6040
|
-
const [selectedIdx, setSelectedIdx] =
|
|
6041
|
-
|
|
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(() => {
|
|
6042
6142
|
if (!open) return;
|
|
6043
6143
|
setIsLoading(true);
|
|
6044
6144
|
setError(null);
|
|
@@ -6065,12 +6165,12 @@ var DepositModal = ({
|
|
|
6065
6165
|
if (depositAssets.length === 1) return 0;
|
|
6066
6166
|
return -1;
|
|
6067
6167
|
};
|
|
6068
|
-
|
|
6168
|
+
React16.useEffect(() => {
|
|
6069
6169
|
if (open && !isLoading && depositAssets.length > 0) {
|
|
6070
6170
|
setSelectedIdx(getInitialIndex());
|
|
6071
6171
|
}
|
|
6072
6172
|
}, [open, isLoading, depositAssets.length, asset]);
|
|
6073
|
-
|
|
6173
|
+
React16.useEffect(() => {
|
|
6074
6174
|
if (!open) {
|
|
6075
6175
|
setSelectedIdx(-1);
|
|
6076
6176
|
}
|
|
@@ -6228,7 +6328,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6228
6328
|
const { evm } = react.useVolr();
|
|
6229
6329
|
const { paymentOptions } = useVolrModal();
|
|
6230
6330
|
const { createPayment, updatePaymentToProcessing, pollPaymentStatus, failPendingPayment } = react.useVolrPaymentApi();
|
|
6231
|
-
const [state, dispatch] =
|
|
6331
|
+
const [state, dispatch] = React16.useReducer(paymentModalReducer, initialState);
|
|
6232
6332
|
const tokensWithBalances = state.tokens.map((token) => {
|
|
6233
6333
|
const balanceData = state.tokenBalances.get(token.id);
|
|
6234
6334
|
return {
|
|
@@ -6240,7 +6340,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6240
6340
|
});
|
|
6241
6341
|
const selectedToken = state.selectedTokenId ? tokensWithBalances.find((t) => t.id === state.selectedTokenId) ?? null : null;
|
|
6242
6342
|
const isBalanceLoading = tokensWithBalances.some((t) => t.isBalanceLoading);
|
|
6243
|
-
const fetchTokenBalance =
|
|
6343
|
+
const fetchTokenBalance = React16.useCallback(
|
|
6244
6344
|
async (token) => {
|
|
6245
6345
|
if (!user?.evmAddress) {
|
|
6246
6346
|
dispatch({
|
|
@@ -6288,20 +6388,20 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6288
6388
|
},
|
|
6289
6389
|
[user, evm]
|
|
6290
6390
|
);
|
|
6291
|
-
const fetchAllBalances =
|
|
6391
|
+
const fetchAllBalances = React16.useCallback(
|
|
6292
6392
|
async (tokens) => {
|
|
6293
6393
|
await Promise.all(tokens.map((token) => fetchTokenBalance(token)));
|
|
6294
6394
|
},
|
|
6295
6395
|
[fetchTokenBalance]
|
|
6296
6396
|
);
|
|
6297
|
-
const fetchBranding =
|
|
6397
|
+
const fetchBranding = React16.useCallback(async () => {
|
|
6298
6398
|
try {
|
|
6299
6399
|
const response = await client.get("/auth/branding");
|
|
6300
6400
|
dispatch({ type: "SET_LOGO_URL", logoUrl: response.logoUrl });
|
|
6301
6401
|
} catch {
|
|
6302
6402
|
}
|
|
6303
6403
|
}, [client]);
|
|
6304
|
-
const fetchPaymentConfig =
|
|
6404
|
+
const fetchPaymentConfig = React16.useCallback(async () => {
|
|
6305
6405
|
dispatch({ type: "SET_CONFIG_LOADING", loading: true });
|
|
6306
6406
|
try {
|
|
6307
6407
|
const response = await client.get("/payments/config");
|
|
@@ -6318,7 +6418,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6318
6418
|
dispatch({ type: "SET_CONFIG_LOADING", loading: false });
|
|
6319
6419
|
}
|
|
6320
6420
|
}, [client, fetchAllBalances]);
|
|
6321
|
-
const selectBestToken =
|
|
6421
|
+
const selectBestToken = React16.useCallback(() => {
|
|
6322
6422
|
if (state.tokens.length === 0) return;
|
|
6323
6423
|
if (state.selectedTokenId) return;
|
|
6324
6424
|
let bestTokenId = state.tokens[0].id;
|
|
@@ -6332,7 +6432,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6332
6432
|
}
|
|
6333
6433
|
dispatch({ type: "SELECT_TOKEN", tokenId: bestTokenId });
|
|
6334
6434
|
}, [state.tokens, state.tokenBalances, state.selectedTokenId]);
|
|
6335
|
-
|
|
6435
|
+
React16.useEffect(() => {
|
|
6336
6436
|
if (open && paymentOptions?.options) {
|
|
6337
6437
|
if (state.step === "processing" || state.step === "result") {
|
|
6338
6438
|
return;
|
|
@@ -6344,15 +6444,15 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6344
6444
|
dispatch({ type: "RESET" });
|
|
6345
6445
|
}
|
|
6346
6446
|
}, [open, paymentOptions?.options?.amount]);
|
|
6347
|
-
|
|
6447
|
+
React16.useEffect(() => {
|
|
6348
6448
|
if (!isBalanceLoading && state.tokens.length > 0 && !state.selectedTokenId) {
|
|
6349
6449
|
selectBestToken();
|
|
6350
6450
|
}
|
|
6351
6451
|
}, [isBalanceLoading, state.tokens.length, state.selectedTokenId, selectBestToken]);
|
|
6352
|
-
const handleSelectToken =
|
|
6452
|
+
const handleSelectToken = React16.useCallback((tokenId) => {
|
|
6353
6453
|
dispatch({ type: "SELECT_TOKEN", tokenId });
|
|
6354
6454
|
}, []);
|
|
6355
|
-
const handleWalletBack =
|
|
6455
|
+
const handleWalletBack = React16.useCallback(() => {
|
|
6356
6456
|
if (state.step !== "wallet") {
|
|
6357
6457
|
return;
|
|
6358
6458
|
}
|
|
@@ -6362,10 +6462,10 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6362
6462
|
}
|
|
6363
6463
|
dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
|
|
6364
6464
|
}, [state.step, state.walletStep]);
|
|
6365
|
-
const handleChooseCreateAccount =
|
|
6465
|
+
const handleChooseCreateAccount = React16.useCallback(() => {
|
|
6366
6466
|
dispatch({ type: "SHOW_WALLET", walletStep: "create-account" });
|
|
6367
6467
|
}, []);
|
|
6368
|
-
const saveExternalWalletPreference =
|
|
6468
|
+
const saveExternalWalletPreference = React16.useCallback(async () => {
|
|
6369
6469
|
if (!user?.id) return;
|
|
6370
6470
|
if (user.externalWalletPreferred) return;
|
|
6371
6471
|
try {
|
|
@@ -6380,11 +6480,11 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6380
6480
|
setUser({ ...user, externalWalletPreferred: true });
|
|
6381
6481
|
}
|
|
6382
6482
|
}, [client, user, setUser]);
|
|
6383
|
-
const handleChooseExternalWallet =
|
|
6483
|
+
const handleChooseExternalWallet = React16.useCallback(() => {
|
|
6384
6484
|
void saveExternalWalletPreference();
|
|
6385
6485
|
dispatch({ type: "SHOW_WALLET", walletStep: "external-wallet" });
|
|
6386
6486
|
}, [saveExternalWalletPreference]);
|
|
6387
|
-
const handlePay =
|
|
6487
|
+
const handlePay = React16.useCallback(async () => {
|
|
6388
6488
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6389
6489
|
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
6390
6490
|
return;
|
|
@@ -6506,7 +6606,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6506
6606
|
pollPaymentStatus,
|
|
6507
6607
|
failPendingPayment
|
|
6508
6608
|
]);
|
|
6509
|
-
const handleExternalWalletConnected =
|
|
6609
|
+
const handleExternalWalletConnected = React16.useCallback(
|
|
6510
6610
|
async ({ provider, address }) => {
|
|
6511
6611
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6512
6612
|
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
@@ -6651,10 +6751,10 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6651
6751
|
failPendingPayment
|
|
6652
6752
|
]
|
|
6653
6753
|
);
|
|
6654
|
-
const handleDeposit =
|
|
6754
|
+
const handleDeposit = React16.useCallback(() => {
|
|
6655
6755
|
dispatch({ type: "SHOW_DEPOSIT" });
|
|
6656
6756
|
}, []);
|
|
6657
|
-
const handleDepositClose =
|
|
6757
|
+
const handleDepositClose = React16.useCallback(
|
|
6658
6758
|
(depositOpen) => {
|
|
6659
6759
|
if (!depositOpen) {
|
|
6660
6760
|
dispatch({ type: "HIDE_DEPOSIT" });
|
|
@@ -6665,19 +6765,19 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6665
6765
|
},
|
|
6666
6766
|
[state.tokens, fetchAllBalances]
|
|
6667
6767
|
);
|
|
6668
|
-
const handleDone =
|
|
6768
|
+
const handleDone = React16.useCallback(() => {
|
|
6669
6769
|
if (state.createdPayment?.status === "CONFIRMED") {
|
|
6670
6770
|
paymentOptions?.onComplete?.(state.createdPayment);
|
|
6671
6771
|
}
|
|
6672
6772
|
onOpenChange(false);
|
|
6673
6773
|
}, [state.createdPayment, paymentOptions, onOpenChange]);
|
|
6674
|
-
const handleRetry =
|
|
6774
|
+
const handleRetry = React16.useCallback(() => {
|
|
6675
6775
|
dispatch({ type: "RETRY" });
|
|
6676
6776
|
if (state.tokens.length > 0) {
|
|
6677
6777
|
fetchAllBalances(state.tokens);
|
|
6678
6778
|
}
|
|
6679
6779
|
}, [state.tokens, fetchAllBalances]);
|
|
6680
|
-
const handleClose =
|
|
6780
|
+
const handleClose = React16.useCallback(() => {
|
|
6681
6781
|
if (state.step === "processing") {
|
|
6682
6782
|
return;
|
|
6683
6783
|
}
|
|
@@ -6686,7 +6786,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6686
6786
|
}
|
|
6687
6787
|
onOpenChange(false);
|
|
6688
6788
|
}, [state.step, paymentOptions, onOpenChange]);
|
|
6689
|
-
const handleReport =
|
|
6789
|
+
const handleReport = React16.useCallback(async () => {
|
|
6690
6790
|
const { createdPayment, error, step, txHash, selectedTokenId } = state;
|
|
6691
6791
|
const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
|
|
6692
6792
|
if (!createdPayment || !error) return;
|
|
@@ -6845,10 +6945,10 @@ var TokenSelector = ({
|
|
|
6845
6945
|
onSelect,
|
|
6846
6946
|
disabled = false
|
|
6847
6947
|
}) => {
|
|
6848
|
-
const [isOpen, setIsOpen] =
|
|
6849
|
-
const dropdownRef =
|
|
6948
|
+
const [isOpen, setIsOpen] = React16.useState(false);
|
|
6949
|
+
const dropdownRef = React16.useRef(null);
|
|
6850
6950
|
const selectedToken = tokens.find((t) => t.id === selectedTokenId);
|
|
6851
|
-
|
|
6951
|
+
React16.useEffect(() => {
|
|
6852
6952
|
const handleClickOutside = (event) => {
|
|
6853
6953
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
6854
6954
|
setIsOpen(false);
|
|
@@ -7215,9 +7315,11 @@ var PaymentResultView = ({
|
|
|
7215
7315
|
onReport
|
|
7216
7316
|
}) => {
|
|
7217
7317
|
const { t } = useI18n();
|
|
7318
|
+
const currencyCtx = usePreferredCurrencyOptional();
|
|
7218
7319
|
const isSuccess = payment.status === "CONFIRMED";
|
|
7219
7320
|
payment.status === "FAILED" || !!error;
|
|
7220
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;
|
|
7221
7323
|
const handleOpenExternalBrowser = () => {
|
|
7222
7324
|
if (typeof window === "undefined") return;
|
|
7223
7325
|
window.open(window.location.href, "_system");
|
|
@@ -7271,12 +7373,9 @@ var PaymentResultView = ({
|
|
|
7271
7373
|
payment.token.symbol
|
|
7272
7374
|
] })
|
|
7273
7375
|
] }),
|
|
7274
|
-
|
|
7376
|
+
formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
|
|
7275
7377
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.usdValueLabel") }),
|
|
7276
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7277
|
-
"$",
|
|
7278
|
-
parseFloat(payment.totalUsd).toFixed(2)
|
|
7279
|
-
] })
|
|
7378
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-600", children: formattedUsd })
|
|
7280
7379
|
] }),
|
|
7281
7380
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
|
|
7282
7381
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.transactionLabel") }),
|
|
@@ -7385,9 +7484,9 @@ function PaymentExternalWalletView({
|
|
|
7385
7484
|
}) {
|
|
7386
7485
|
const { t } = useI18n();
|
|
7387
7486
|
const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
|
|
7388
|
-
const wallets =
|
|
7389
|
-
const [isConnecting, setIsConnecting] =
|
|
7390
|
-
const [error, setError] =
|
|
7487
|
+
const wallets = React16.useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
|
|
7488
|
+
const [isConnecting, setIsConnecting] = React16.useState(false);
|
|
7489
|
+
const [error, setError] = React16.useState(null);
|
|
7391
7490
|
const connect = async (wallet) => {
|
|
7392
7491
|
setIsConnecting(true);
|
|
7393
7492
|
setError(null);
|
|
@@ -7493,8 +7592,8 @@ var PaymentModal = ({
|
|
|
7493
7592
|
const resolvedPermitType = selectedToken?.permitType ?? (selectedToken?.permitSupported ? "EIP2612" : "NONE");
|
|
7494
7593
|
const externalWalletTokenSupported = selectedToken && selectedToken.address !== "native" && resolvedPermitType === "EIP2612";
|
|
7495
7594
|
const showExternalWalletOption = externalWalletAllowed && externalWalletTokenSupported;
|
|
7496
|
-
const permit2WarnedRef =
|
|
7497
|
-
|
|
7595
|
+
const permit2WarnedRef = React16__default.default.useRef(false);
|
|
7596
|
+
React16__default.default.useEffect(() => {
|
|
7498
7597
|
if (!permit2WarnedRef.current && externalWalletAllowed && resolvedPermitType === "PERMIT2" && !selectedToken?.permit2Address) {
|
|
7499
7598
|
console.warn(
|
|
7500
7599
|
`[volr/react-ui] External wallet payment hidden: permit2Address is not configured for chain ${selectedToken?.chainId}.`
|
|
@@ -7608,19 +7707,19 @@ var PaymentModal = ({
|
|
|
7608
7707
|
)
|
|
7609
7708
|
] });
|
|
7610
7709
|
};
|
|
7611
|
-
var SignRequestContext =
|
|
7710
|
+
var SignRequestContext = React16.createContext(null);
|
|
7612
7711
|
function SignRequestProvider({ children }) {
|
|
7613
|
-
const [pendingRequest, setPendingRequest] =
|
|
7614
|
-
const resolveRef =
|
|
7615
|
-
const rejectRef =
|
|
7616
|
-
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) => {
|
|
7617
7716
|
return new Promise((resolve, reject2) => {
|
|
7618
7717
|
setPendingRequest(request);
|
|
7619
7718
|
resolveRef.current = resolve;
|
|
7620
7719
|
rejectRef.current = reject2;
|
|
7621
7720
|
});
|
|
7622
7721
|
}, []);
|
|
7623
|
-
const approve =
|
|
7722
|
+
const approve = React16.useCallback(() => {
|
|
7624
7723
|
if (resolveRef.current) {
|
|
7625
7724
|
resolveRef.current();
|
|
7626
7725
|
resolveRef.current = null;
|
|
@@ -7628,7 +7727,7 @@ function SignRequestProvider({ children }) {
|
|
|
7628
7727
|
}
|
|
7629
7728
|
setPendingRequest(null);
|
|
7630
7729
|
}, []);
|
|
7631
|
-
const reject =
|
|
7730
|
+
const reject = React16.useCallback(() => {
|
|
7632
7731
|
if (rejectRef.current) {
|
|
7633
7732
|
rejectRef.current(new Error("Sign request cancelled by user"));
|
|
7634
7733
|
resolveRef.current = null;
|
|
@@ -7650,7 +7749,7 @@ function SignRequestProvider({ children }) {
|
|
|
7650
7749
|
);
|
|
7651
7750
|
}
|
|
7652
7751
|
function useSignRequest() {
|
|
7653
|
-
const context =
|
|
7752
|
+
const context = React16.useContext(SignRequestContext);
|
|
7654
7753
|
if (!context) {
|
|
7655
7754
|
throw new Error("useSignRequest must be used within SignRequestProvider");
|
|
7656
7755
|
}
|
|
@@ -7659,7 +7758,7 @@ function useSignRequest() {
|
|
|
7659
7758
|
};
|
|
7660
7759
|
}
|
|
7661
7760
|
function useSignRequestInternal() {
|
|
7662
|
-
const context =
|
|
7761
|
+
const context = React16.useContext(SignRequestContext);
|
|
7663
7762
|
if (!context) {
|
|
7664
7763
|
throw new Error("useSignRequestInternal must be used within SignRequestProvider");
|
|
7665
7764
|
}
|
|
@@ -7694,7 +7793,7 @@ function MessageSignView({ message }) {
|
|
|
7694
7793
|
] });
|
|
7695
7794
|
}
|
|
7696
7795
|
function TypedDataSignView({ typedData }) {
|
|
7697
|
-
const [showRawData, setShowRawData] =
|
|
7796
|
+
const [showRawData, setShowRawData] = React16.useState(false);
|
|
7698
7797
|
const { domain, message } = typedData;
|
|
7699
7798
|
const appName = domain.name;
|
|
7700
7799
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-4", children: [
|
|
@@ -7840,12 +7939,12 @@ function SignRequestModal({ open, onOpenChange }) {
|
|
|
7840
7939
|
}
|
|
7841
7940
|
);
|
|
7842
7941
|
}
|
|
7843
|
-
var WalletRequiredContext =
|
|
7942
|
+
var WalletRequiredContext = React16.createContext(null);
|
|
7844
7943
|
function WalletRequiredProvider({ children }) {
|
|
7845
|
-
const [pendingRequest, setPendingRequest] =
|
|
7846
|
-
const resolveRef =
|
|
7847
|
-
const rejectRef =
|
|
7848
|
-
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(
|
|
7849
7948
|
(request) => {
|
|
7850
7949
|
return new Promise((resolve2, reject2) => {
|
|
7851
7950
|
setPendingRequest(request);
|
|
@@ -7855,7 +7954,7 @@ function WalletRequiredProvider({ children }) {
|
|
|
7855
7954
|
},
|
|
7856
7955
|
[]
|
|
7857
7956
|
);
|
|
7858
|
-
const resolve =
|
|
7957
|
+
const resolve = React16.useCallback((provider) => {
|
|
7859
7958
|
if (resolveRef.current) {
|
|
7860
7959
|
resolveRef.current(provider);
|
|
7861
7960
|
resolveRef.current = null;
|
|
@@ -7863,7 +7962,7 @@ function WalletRequiredProvider({ children }) {
|
|
|
7863
7962
|
}
|
|
7864
7963
|
setPendingRequest(null);
|
|
7865
7964
|
}, []);
|
|
7866
|
-
const reject =
|
|
7965
|
+
const reject = React16.useCallback((error) => {
|
|
7867
7966
|
if (rejectRef.current) {
|
|
7868
7967
|
rejectRef.current(error);
|
|
7869
7968
|
resolveRef.current = null;
|
|
@@ -7880,14 +7979,14 @@ function WalletRequiredProvider({ children }) {
|
|
|
7880
7979
|
);
|
|
7881
7980
|
}
|
|
7882
7981
|
function useWalletRequired() {
|
|
7883
|
-
const ctx =
|
|
7982
|
+
const ctx = React16.useContext(WalletRequiredContext);
|
|
7884
7983
|
if (!ctx) {
|
|
7885
7984
|
throw new Error("useWalletRequired must be used within WalletRequiredProvider");
|
|
7886
7985
|
}
|
|
7887
7986
|
return { requestWallet: ctx.requestWallet };
|
|
7888
7987
|
}
|
|
7889
7988
|
function useWalletRequiredInternal() {
|
|
7890
|
-
const ctx =
|
|
7989
|
+
const ctx = React16.useContext(WalletRequiredContext);
|
|
7891
7990
|
if (!ctx) {
|
|
7892
7991
|
throw new Error(
|
|
7893
7992
|
"useWalletRequiredInternal must be used within WalletRequiredProvider"
|
|
@@ -7900,17 +7999,17 @@ function WalletRequiredModal() {
|
|
|
7900
7999
|
const { pendingRequest, resolve, reject } = useWalletRequiredInternal();
|
|
7901
8000
|
const { user, provider } = react.useVolrContext();
|
|
7902
8001
|
const { keyStorageType } = useVolrUI();
|
|
7903
|
-
const [step, setStep] =
|
|
7904
|
-
const providerRef =
|
|
7905
|
-
|
|
8002
|
+
const [step, setStep] = React16.useState("notice");
|
|
8003
|
+
const providerRef = React16.useRef(provider);
|
|
8004
|
+
React16.useEffect(() => {
|
|
7906
8005
|
providerRef.current = provider;
|
|
7907
8006
|
}, [provider]);
|
|
7908
|
-
|
|
8007
|
+
React16.useEffect(() => {
|
|
7909
8008
|
if (pendingRequest) {
|
|
7910
8009
|
setStep("notice");
|
|
7911
8010
|
}
|
|
7912
8011
|
}, [pendingRequest]);
|
|
7913
|
-
const title =
|
|
8012
|
+
const title = React16.useMemo(() => {
|
|
7914
8013
|
if (!pendingRequest) return "";
|
|
7915
8014
|
if (pendingRequest.type === "transaction") return t("walletRequired.titleTx");
|
|
7916
8015
|
if (pendingRequest.type === "typedData") return t("walletRequired.titleTypedData");
|
|
@@ -7976,7 +8075,7 @@ function WalletRequiredModal() {
|
|
|
7976
8075
|
}
|
|
7977
8076
|
);
|
|
7978
8077
|
}
|
|
7979
|
-
var VolrUIContext =
|
|
8078
|
+
var VolrUIContext = React16__default.default.createContext(null);
|
|
7980
8079
|
function getCurrentRpId() {
|
|
7981
8080
|
if (typeof window === "undefined") return "localhost";
|
|
7982
8081
|
return window.location.hostname;
|
|
@@ -7989,14 +8088,14 @@ function isPasskeyDomainMismatch(user) {
|
|
|
7989
8088
|
return !registered.some((p) => p?.rpId === currentRpId);
|
|
7990
8089
|
}
|
|
7991
8090
|
var useVolrUI = () => {
|
|
7992
|
-
const context =
|
|
8091
|
+
const context = React16.useContext(VolrUIContext);
|
|
7993
8092
|
if (!context) {
|
|
7994
8093
|
throw new Error("useVolrUI must be used within VolrUIProvider");
|
|
7995
8094
|
}
|
|
7996
8095
|
return context;
|
|
7997
8096
|
};
|
|
7998
8097
|
var useVolrUIOptional = () => {
|
|
7999
|
-
return
|
|
8098
|
+
return React16.useContext(VolrUIContext);
|
|
8000
8099
|
};
|
|
8001
8100
|
function OnboardingFlow({
|
|
8002
8101
|
keyStorageType,
|
|
@@ -8045,10 +8144,10 @@ var VolrUIProvider = ({
|
|
|
8045
8144
|
const walletPolicy = config.walletPolicy ?? {
|
|
8046
8145
|
requireVolrWalletOnLogin: true
|
|
8047
8146
|
};
|
|
8048
|
-
const [keyStorageTypeError, setKeyStorageTypeError] =
|
|
8147
|
+
const [keyStorageTypeError, setKeyStorageTypeError] = React16.useState(
|
|
8049
8148
|
null
|
|
8050
8149
|
);
|
|
8051
|
-
|
|
8150
|
+
React16.useEffect(() => {
|
|
8052
8151
|
if (walletPolicy.requireVolrWalletOnLogin !== false && !keyStorageType) {
|
|
8053
8152
|
const errorMessage = "keyStorageType must be specified in VolrUIProvider props. Please set keyStorageType prop in VolrUIProvider.";
|
|
8054
8153
|
console.error(errorMessage);
|
|
@@ -8096,7 +8195,7 @@ function VolrUIProviderInner({
|
|
|
8096
8195
|
allowExternalWalletPayment,
|
|
8097
8196
|
children
|
|
8098
8197
|
}) {
|
|
8099
|
-
const [showOnboarding, setShowOnboarding] =
|
|
8198
|
+
const [showOnboarding, setShowOnboarding] = React16.useState(false);
|
|
8100
8199
|
const { requestSign } = useSignRequest();
|
|
8101
8200
|
const { requestWallet } = useWalletRequired();
|
|
8102
8201
|
const configWithSignRequest = {
|
|
@@ -8190,15 +8289,15 @@ function MigrationCoordinator({
|
|
|
8190
8289
|
}) {
|
|
8191
8290
|
const { user, setUser } = react.useVolrContext();
|
|
8192
8291
|
const { client } = react.useInternalAuth();
|
|
8193
|
-
const [running, setRunning] =
|
|
8194
|
-
const [isSourcePopup, setIsSourcePopup] =
|
|
8195
|
-
const [isTargetPopup, setIsTargetPopup] =
|
|
8196
|
-
const [sourceStep, setSourceStep] =
|
|
8197
|
-
const [targetStep, setTargetStep] =
|
|
8198
|
-
const [targetDomain, setTargetDomain] =
|
|
8199
|
-
const [sourceDomain, setSourceDomain] =
|
|
8200
|
-
const [errorMessage, setErrorMessage] =
|
|
8201
|
-
|
|
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(() => {
|
|
8202
8301
|
if (typeof window === "undefined") return;
|
|
8203
8302
|
const params = new URLSearchParams(window.location.search);
|
|
8204
8303
|
const migrationToken = params.get("migration_token");
|
|
@@ -8222,7 +8321,7 @@ function MigrationCoordinator({
|
|
|
8222
8321
|
}
|
|
8223
8322
|
}
|
|
8224
8323
|
}, []);
|
|
8225
|
-
|
|
8324
|
+
React16.useEffect(() => {
|
|
8226
8325
|
if (typeof window === "undefined") return;
|
|
8227
8326
|
const handler = (event) => {
|
|
8228
8327
|
const data = event.data;
|
|
@@ -8234,7 +8333,7 @@ function MigrationCoordinator({
|
|
|
8234
8333
|
window.addEventListener("message", handler);
|
|
8235
8334
|
return () => window.removeEventListener("message", handler);
|
|
8236
8335
|
}, [client, setUser, onHideOnboarding]);
|
|
8237
|
-
|
|
8336
|
+
React16.useEffect(() => {
|
|
8238
8337
|
if (typeof window === "undefined") return;
|
|
8239
8338
|
if (running) return;
|
|
8240
8339
|
const params = new URLSearchParams(window.location.search);
|
|
@@ -8379,9 +8478,9 @@ function MigrationCoordinator({
|
|
|
8379
8478
|
}
|
|
8380
8479
|
function AccountModalPortal() {
|
|
8381
8480
|
const { isOpen, mode, close } = useVolrModal();
|
|
8382
|
-
const [portalRoot, setPortalRoot] =
|
|
8383
|
-
const [error, setError] =
|
|
8384
|
-
|
|
8481
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8482
|
+
const [error, setError] = React16.useState(null);
|
|
8483
|
+
React16.useEffect(() => {
|
|
8385
8484
|
if (typeof window === "undefined") return;
|
|
8386
8485
|
let root = document.getElementById("volr-modal-root");
|
|
8387
8486
|
if (!root) {
|
|
@@ -8440,9 +8539,9 @@ function AccountModalPortal() {
|
|
|
8440
8539
|
function DepositModalPortal() {
|
|
8441
8540
|
const { isOpen, mode, asset, close } = useVolrModal();
|
|
8442
8541
|
const { user } = react.useVolrContext();
|
|
8443
|
-
const [portalRoot, setPortalRoot] =
|
|
8444
|
-
const [showLogin, setShowLogin] =
|
|
8445
|
-
|
|
8542
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8543
|
+
const [showLogin, setShowLogin] = React16.useState(false);
|
|
8544
|
+
React16.useEffect(() => {
|
|
8446
8545
|
if (typeof window === "undefined") return;
|
|
8447
8546
|
let root = document.getElementById("volr-modal-root");
|
|
8448
8547
|
if (!root) {
|
|
@@ -8457,7 +8556,7 @@ function DepositModalPortal() {
|
|
|
8457
8556
|
}
|
|
8458
8557
|
};
|
|
8459
8558
|
}, []);
|
|
8460
|
-
|
|
8559
|
+
React16.useEffect(() => {
|
|
8461
8560
|
if (isOpen && mode === "deposit" && !user) {
|
|
8462
8561
|
setShowLogin(true);
|
|
8463
8562
|
} else {
|
|
@@ -8491,8 +8590,8 @@ function DepositModalPortal() {
|
|
|
8491
8590
|
}
|
|
8492
8591
|
function PaymentModalPortal() {
|
|
8493
8592
|
const { isOpen, mode, close } = useVolrModal();
|
|
8494
|
-
const [portalRoot, setPortalRoot] =
|
|
8495
|
-
|
|
8593
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8594
|
+
React16.useEffect(() => {
|
|
8496
8595
|
if (typeof window === "undefined") return;
|
|
8497
8596
|
let root = document.getElementById("volr-modal-root");
|
|
8498
8597
|
if (!root) {
|
|
@@ -8521,8 +8620,8 @@ function PaymentModalPortal() {
|
|
|
8521
8620
|
}
|
|
8522
8621
|
function SignRequestModalPortal() {
|
|
8523
8622
|
const { pendingRequest } = useSignRequestInternal();
|
|
8524
|
-
const [portalRoot, setPortalRoot] =
|
|
8525
|
-
|
|
8623
|
+
const [portalRoot, setPortalRoot] = React16.useState(null);
|
|
8624
|
+
React16.useEffect(() => {
|
|
8526
8625
|
if (typeof window === "undefined") return;
|
|
8527
8626
|
let root = document.getElementById("volr-modal-root");
|
|
8528
8627
|
if (!root) {
|
|
@@ -8554,8 +8653,8 @@ function OAuthCallbackHandler({
|
|
|
8554
8653
|
enforceSelection,
|
|
8555
8654
|
onShowOnboarding
|
|
8556
8655
|
}) {
|
|
8557
|
-
const [hasCode, setHasCode] =
|
|
8558
|
-
|
|
8656
|
+
const [hasCode, setHasCode] = React16.useState(false);
|
|
8657
|
+
React16.useEffect(() => {
|
|
8559
8658
|
if (typeof window === "undefined") return;
|
|
8560
8659
|
const params = new URLSearchParams(window.location.search);
|
|
8561
8660
|
const code = params.get("code");
|
|
@@ -8604,14 +8703,14 @@ function OnboardingChecker({
|
|
|
8604
8703
|
}) {
|
|
8605
8704
|
const { user, provider, isLoading } = react.useVolrContext();
|
|
8606
8705
|
const { isOpen: isModalOpen } = useVolrModal();
|
|
8607
|
-
const modalWasOpened =
|
|
8608
|
-
const pendingMismatchOnboarding =
|
|
8609
|
-
|
|
8706
|
+
const modalWasOpened = React16__default.default.useRef(false);
|
|
8707
|
+
const pendingMismatchOnboarding = React16__default.default.useRef(false);
|
|
8708
|
+
React16.useEffect(() => {
|
|
8610
8709
|
if (isModalOpen) {
|
|
8611
8710
|
modalWasOpened.current = true;
|
|
8612
8711
|
}
|
|
8613
8712
|
}, [isModalOpen]);
|
|
8614
|
-
|
|
8713
|
+
React16.useEffect(() => {
|
|
8615
8714
|
if (isLoading) {
|
|
8616
8715
|
return;
|
|
8617
8716
|
}
|
|
@@ -8665,7 +8764,7 @@ function OnboardingChecker({
|
|
|
8665
8764
|
}
|
|
8666
8765
|
function useSwitchNetwork() {
|
|
8667
8766
|
const { client } = react.useInternalAuth();
|
|
8668
|
-
return
|
|
8767
|
+
return React16.useCallback(
|
|
8669
8768
|
async (chainId) => {
|
|
8670
8769
|
if (typeof window === "undefined" || !window.ethereum) {
|
|
8671
8770
|
throw new Error("No wallet found");
|
|
@@ -8729,8 +8828,8 @@ var paymentPromiseResolver = null;
|
|
|
8729
8828
|
function useVolrPay() {
|
|
8730
8829
|
const { open: openModal, close: closeModal } = useVolrModal();
|
|
8731
8830
|
const { checkPayment, getPaymentHistory } = react.useVolrPaymentApi();
|
|
8732
|
-
const isInProgressRef =
|
|
8733
|
-
const pay =
|
|
8831
|
+
const isInProgressRef = React16.useRef(false);
|
|
8832
|
+
const pay = React16.useCallback(
|
|
8734
8833
|
(options) => {
|
|
8735
8834
|
isInProgressRef.current = true;
|
|
8736
8835
|
const waitPromise = new Promise((resolve, reject) => {
|
|
@@ -8831,9 +8930,12 @@ exports.I18nContext = I18nContext;
|
|
|
8831
8930
|
exports.I18nProvider = I18nProvider;
|
|
8832
8931
|
exports.MpcConnectView = MpcConnectView;
|
|
8833
8932
|
exports.PasskeyEnrollView = PasskeyEnrollView;
|
|
8933
|
+
exports.PreferredCurrencyProvider = PreferredCurrencyProvider;
|
|
8834
8934
|
exports.VolrUIProvider = VolrUIProvider;
|
|
8835
8935
|
exports.getCurrentChainId = getCurrentChainId;
|
|
8836
8936
|
exports.useI18n = useI18n;
|
|
8937
|
+
exports.usePreferredCurrency = usePreferredCurrency;
|
|
8938
|
+
exports.usePreferredCurrencyOptional = usePreferredCurrencyOptional;
|
|
8837
8939
|
exports.useSwitchNetwork = useSwitchNetwork;
|
|
8838
8940
|
exports.useTranslation = useTranslation;
|
|
8839
8941
|
exports.useVolrModal = useVolrModal;
|