@avalabs/avacloud-waas-react 1.0.6 → 1.0.8

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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/AvaCloudWalletProvider.tsx
2
- import { createContext as createContext4, useContext as useContext4, useEffect as useEffect5, useState as useState7, useCallback as useCallback5, useRef as useRef2 } from "react";
2
+ import { createContext as createContext4, useContext as useContext4, useEffect as useEffect5, useState as useState7, useCallback as useCallback5, useRef as useRef3 } from "react";
3
3
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4
4
  import { envs } from "@cubist-labs/cubesigner-sdk";
5
5
 
@@ -47,6 +47,19 @@ var CUBIST_USER_ID_KEY = "cubist_user_id";
47
47
  var ORG_CONFIG_CACHE_KEY = "avacloud-org-config-cache";
48
48
 
49
49
  // src/hooks/usePostMessage.ts
50
+ var globalAuthState = {
51
+ signupInProgress: false,
52
+ loginInProgress: false,
53
+ lastSignupTimestamp: 0,
54
+ lastLoginTimestamp: 0,
55
+ processingMessageIds: /* @__PURE__ */ new Set()
56
+ };
57
+ function cleanupProcessedMessageIds() {
58
+ if (globalAuthState.processingMessageIds.size > 100) {
59
+ const messageIds = Array.from(globalAuthState.processingMessageIds);
60
+ globalAuthState.processingMessageIds = new Set(messageIds.slice(-50));
61
+ }
62
+ }
50
63
  function usePostMessage({
51
64
  authServiceUrl,
52
65
  orgId,
@@ -97,10 +110,77 @@ function usePostMessage({
97
110
  const sendMessage = useCallback((message) => {
98
111
  if (iframe == null ? void 0 : iframe.contentWindow) {
99
112
  try {
113
+ if (message.type === "SIGNUP_REQUEST") {
114
+ if (globalAuthState.signupInProgress) {
115
+ console.log("Global signup already in progress, ignoring duplicate request");
116
+ return;
117
+ }
118
+ const now = Date.now();
119
+ if (now - globalAuthState.lastSignupTimestamp < 3e3) {
120
+ console.log("Ignoring duplicate signup attempt (global debounce)");
121
+ return;
122
+ }
123
+ globalAuthState.signupInProgress = true;
124
+ globalAuthState.lastSignupTimestamp = now;
125
+ let finalMessage = message;
126
+ if (!message.requestId) {
127
+ finalMessage = {
128
+ ...message,
129
+ requestId: `signup-${now}`
130
+ };
131
+ }
132
+ let messageToSend = finalMessage;
133
+ if (finalMessage.payload && typeof finalMessage.payload.email === "string" && typeof finalMessage.payload.password === "string") {
134
+ messageToSend = {
135
+ type: "SIGNUP_REQUEST",
136
+ email: finalMessage.payload.email,
137
+ password: finalMessage.payload.password,
138
+ requestId: finalMessage.requestId || `signup-${now}`
139
+ };
140
+ }
141
+ if ("requestId" in messageToSend && messageToSend.requestId) {
142
+ globalAuthState.processingMessageIds.add(messageToSend.requestId);
143
+ }
144
+ console.log("Sending message to auth iframe:", messageToSend);
145
+ iframe.contentWindow.postMessage(messageToSend, authServiceUrl);
146
+ return;
147
+ }
148
+ if (message.type === "LOGIN_REQUEST") {
149
+ if (globalAuthState.loginInProgress) {
150
+ console.log("Global login already in progress, ignoring duplicate request");
151
+ return;
152
+ }
153
+ const now = Date.now();
154
+ if (now - globalAuthState.lastLoginTimestamp < 3e3) {
155
+ console.log("Ignoring duplicate login attempt (global debounce)");
156
+ return;
157
+ }
158
+ globalAuthState.loginInProgress = true;
159
+ globalAuthState.lastLoginTimestamp = now;
160
+ let finalMessage = message;
161
+ if (!message.requestId) {
162
+ finalMessage = {
163
+ ...message,
164
+ requestId: `login-${now}`
165
+ };
166
+ }
167
+ if (finalMessage.requestId) {
168
+ globalAuthState.processingMessageIds.add(finalMessage.requestId);
169
+ }
170
+ console.log("Sending message to auth iframe:", finalMessage);
171
+ iframe.contentWindow.postMessage(finalMessage, authServiceUrl);
172
+ return;
173
+ }
100
174
  console.log("Sending message to auth iframe:", message);
101
175
  iframe.contentWindow.postMessage(message, authServiceUrl);
102
176
  } catch (error) {
103
177
  console.error("Error sending message to iframe:", error);
178
+ if (message.type === "SIGNUP_REQUEST") {
179
+ globalAuthState.signupInProgress = false;
180
+ }
181
+ if (message.type === "LOGIN_REQUEST") {
182
+ globalAuthState.loginInProgress = false;
183
+ }
104
184
  }
105
185
  } else {
106
186
  console.error("No iframe available to send message");
@@ -119,9 +199,24 @@ function usePostMessage({
119
199
  if (typeof ((_a = event.data) == null ? void 0 : _a.type) !== "string") {
120
200
  return;
121
201
  }
202
+ if (event.data.requestId && globalAuthState.processingMessageIds.has(event.data.requestId)) {
203
+ console.log(`Already processed message with requestId: ${event.data.requestId}, ignoring duplicate`);
204
+ return;
205
+ }
122
206
  try {
123
207
  isHandlingMessageRef.current = true;
124
208
  console.log("Received message from iframe:", event.data);
209
+ if (event.data.type === "ERROR") {
210
+ globalAuthState.signupInProgress = false;
211
+ globalAuthState.loginInProgress = false;
212
+ } else if (event.data.type === "AUTH_STATUS" && event.data.isAuthenticated) {
213
+ globalAuthState.signupInProgress = false;
214
+ globalAuthState.loginInProgress = false;
215
+ cleanupProcessedMessageIds();
216
+ } else if (event.data.type === "RECEIVE_OIDC") {
217
+ globalAuthState.signupInProgress = false;
218
+ globalAuthState.loginInProgress = false;
219
+ }
125
220
  switch (event.data.type) {
126
221
  case "IFRAME_READY":
127
222
  console.log("Iframe ready message received, setting isIframeReady to true");
@@ -223,6 +318,11 @@ function usePostMessage({
223
318
  break;
224
319
  }
225
320
  case "ERROR":
321
+ if (event.data.error === "User not authenticated in iframe") {
322
+ console.log("Ignoring expected auth iframe error:", event.data.error);
323
+ isHandlingMessageRef.current = false;
324
+ return;
325
+ }
226
326
  console.error("Error from auth service:", event.data.error);
227
327
  onAuthError == null ? void 0 : onAuthError(new Error((_g = event.data.error) != null ? _g : "Unknown error"));
228
328
  setIsLoading(false);
@@ -271,7 +371,7 @@ import { createContext, useContext, useState as useState3, useCallback as useCal
271
371
  import { Dialog as Dialog2, DialogContent as DialogContent2, DialogTitle } from "@avalabs/core-k2-components";
272
372
 
273
373
  // src/components/Modal.tsx
274
- import { useState as useState2, useEffect as useEffect2 } from "react";
374
+ import { useState as useState2, useEffect as useEffect2, useRef as useRef2 } from "react";
275
375
  import { Dialog, DialogContent, IconButton as IconButton2, Stack as Stack3, XIcon } from "@avalabs/core-k2-components";
276
376
 
277
377
  // src/components/SignInContent.tsx
@@ -295,6 +395,7 @@ function PoweredByAvaCloud() {
295
395
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
296
396
  function SignInContent({
297
397
  onEmailLogin,
398
+ onEmailSignup,
298
399
  onProviderLogin,
299
400
  error,
300
401
  isSubmitting,
@@ -303,6 +404,7 @@ function SignInContent({
303
404
  const [email, setEmail] = useState("");
304
405
  const [password, setPassword] = useState("");
305
406
  const [isPasswordStep, setIsPasswordStep] = useState(false);
407
+ const [isSignupMode, setIsSignupMode] = useState(false);
306
408
  const providerConnectionMap = {
307
409
  "google": "google-oauth2",
308
410
  "x": "twitter",
@@ -367,9 +469,18 @@ function SignInContent({
367
469
  if (!password) return;
368
470
  onEmailLogin(email, password);
369
471
  };
472
+ const handleSignupSubmit = (e) => {
473
+ e.preventDefault();
474
+ if (!email || !password) return;
475
+ onEmailSignup(email, password);
476
+ };
370
477
  const handleForgotPassword = () => {
371
478
  console.log("Forgot password clicked");
372
479
  };
480
+ const handleToggleSignup = () => {
481
+ setIsSignupMode(!isSignupMode);
482
+ setIsPasswordStep(false);
483
+ };
373
484
  const titleTypography = {
374
485
  alignSelf: "stretch",
375
486
  color: (theme) => theme.palette.mode === "dark" ? "#FFFFFF" : "rgba(0, 0, 0, 0.80)",
@@ -379,6 +490,182 @@ function SignInContent({
379
490
  fontWeight: 700,
380
491
  lineHeight: "150%"
381
492
  };
493
+ if (isSignupMode) {
494
+ return /* @__PURE__ */ jsxs2(Stack2, { gap: 3, children: [
495
+ /* @__PURE__ */ jsx2(Typography2, { variant: "h6", sx: titleTypography, children: "Sign up with" }),
496
+ /* @__PURE__ */ jsx2(Stack2, { direction: "row", spacing: 3, sx: { justifyContent: "center" }, children: socialLogins.map((loginType) => renderSocialLoginButton(loginType)) }),
497
+ /* @__PURE__ */ jsx2(Divider, { children: /* @__PURE__ */ jsx2(Typography2, { variant: "body2", color: "text.secondary", children: "or" }) }),
498
+ /* @__PURE__ */ jsx2("form", { onSubmit: handleSignupSubmit, children: /* @__PURE__ */ jsxs2(Stack2, { gap: 2, children: [
499
+ /* @__PURE__ */ jsx2(
500
+ TextField,
501
+ {
502
+ placeholder: "Enter email",
503
+ type: "email",
504
+ value: email,
505
+ onChange: (e) => setEmail(e.target.value),
506
+ fullWidth: true,
507
+ required: true,
508
+ disabled: isSubmitting,
509
+ error: !!error,
510
+ helperText: error,
511
+ sx: {
512
+ "& .MuiOutlinedInput-root": {
513
+ backgroundColor: (theme) => theme.palette.mode === "dark" ? "rgba(255, 255, 255, 0.05)" : "grey.50"
514
+ }
515
+ }
516
+ }
517
+ ),
518
+ /* @__PURE__ */ jsx2(
519
+ TextField,
520
+ {
521
+ placeholder: "Create password",
522
+ type: "password",
523
+ value: password,
524
+ onChange: (e) => setPassword(e.target.value),
525
+ fullWidth: true,
526
+ required: true,
527
+ disabled: isSubmitting,
528
+ sx: {
529
+ "& .MuiOutlinedInput-root": {
530
+ backgroundColor: (theme) => theme.palette.mode === "dark" ? "rgba(255, 255, 255, 0.05)" : "grey.50"
531
+ }
532
+ }
533
+ }
534
+ ),
535
+ /* @__PURE__ */ jsx2(
536
+ Button,
537
+ {
538
+ type: "submit",
539
+ variant: "contained",
540
+ fullWidth: true,
541
+ disabled: isSubmitting || !email || !password,
542
+ sx: {
543
+ height: 48,
544
+ backgroundColor: "#3A65FF",
545
+ borderRadius: 24,
546
+ textTransform: "none",
547
+ "&:hover": {
548
+ backgroundColor: "#2952E6"
549
+ }
550
+ },
551
+ children: "Sign up"
552
+ }
553
+ ),
554
+ /* @__PURE__ */ jsxs2(
555
+ Typography2,
556
+ {
557
+ variant: "body2",
558
+ sx: {
559
+ textAlign: "center",
560
+ "& a": {
561
+ color: "#3A65FF",
562
+ textDecoration: "none",
563
+ cursor: "pointer",
564
+ "&:hover": {
565
+ textDecoration: "underline"
566
+ }
567
+ }
568
+ },
569
+ children: [
570
+ "Already have an account?",
571
+ " ",
572
+ /* @__PURE__ */ jsx2(
573
+ Button,
574
+ {
575
+ variant: "text",
576
+ onClick: handleToggleSignup,
577
+ sx: {
578
+ color: "#3A65FF",
579
+ textTransform: "none",
580
+ padding: "0 4px",
581
+ minWidth: "auto",
582
+ fontWeight: 600,
583
+ "&:hover": {
584
+ textDecoration: "underline",
585
+ backgroundColor: "transparent"
586
+ }
587
+ },
588
+ children: "Sign in"
589
+ }
590
+ )
591
+ ]
592
+ }
593
+ )
594
+ ] }) }),
595
+ /* @__PURE__ */ jsx2(PoweredByAvaCloud, {}),
596
+ /* @__PURE__ */ jsxs2(
597
+ Typography2,
598
+ {
599
+ variant: "body2",
600
+ sx: {
601
+ textAlign: "center",
602
+ color: "text.secondary",
603
+ fontSize: "0.75rem",
604
+ "& a": {
605
+ color: "inherit",
606
+ textDecoration: "none",
607
+ "&:hover": {
608
+ textDecoration: "underline"
609
+ }
610
+ }
611
+ },
612
+ children: [
613
+ "By connecting, you agree to the",
614
+ " ",
615
+ /* @__PURE__ */ jsx2(
616
+ Button,
617
+ {
618
+ variant: "text",
619
+ component: "a",
620
+ href: "https://avacloud.io/terms",
621
+ target: "_blank",
622
+ rel: "noopener noreferrer",
623
+ sx: {
624
+ color: "inherit",
625
+ p: 0,
626
+ minWidth: "auto",
627
+ textTransform: "none",
628
+ fontSize: "inherit",
629
+ fontWeight: "inherit",
630
+ "&:hover": {
631
+ textDecoration: "underline",
632
+ backgroundColor: "transparent"
633
+ }
634
+ },
635
+ children: "Terms of Service"
636
+ }
637
+ ),
638
+ " ",
639
+ "and",
640
+ " ",
641
+ /* @__PURE__ */ jsx2(
642
+ Button,
643
+ {
644
+ variant: "text",
645
+ component: "a",
646
+ href: "https://avacloud.io/privacy",
647
+ target: "_blank",
648
+ rel: "noopener noreferrer",
649
+ sx: {
650
+ color: "inherit",
651
+ p: 0,
652
+ minWidth: "auto",
653
+ textTransform: "none",
654
+ fontSize: "inherit",
655
+ fontWeight: "inherit",
656
+ "&:hover": {
657
+ textDecoration: "underline",
658
+ backgroundColor: "transparent"
659
+ }
660
+ },
661
+ children: "Privacy Policy"
662
+ }
663
+ )
664
+ ]
665
+ }
666
+ )
667
+ ] });
668
+ }
382
669
  if (isPasswordStep) {
383
670
  return /* @__PURE__ */ jsxs2(Stack2, { gap: 3, children: [
384
671
  /* @__PURE__ */ jsx2(Typography2, { variant: "h6", sx: titleTypography, children: "Sign in with" }),
@@ -480,7 +767,7 @@ function SignInContent({
480
767
  {
481
768
  variant: "text",
482
769
  component: "a",
483
- href: "https://avacloud.io/terms",
770
+ href: "https://app.avacloud.io/legal/generalterms/",
484
771
  target: "_blank",
485
772
  rel: "noopener noreferrer",
486
773
  sx: {
@@ -506,7 +793,7 @@ function SignInContent({
506
793
  {
507
794
  variant: "text",
508
795
  component: "a",
509
- href: "https://avacloud.io/privacy",
796
+ href: "https://www.avalabs.org/privacy-policy",
510
797
  target: "_blank",
511
798
  rel: "noopener noreferrer",
512
799
  sx: {
@@ -571,6 +858,46 @@ function SignInContent({
571
858
  },
572
859
  children: "Continue"
573
860
  }
861
+ ),
862
+ /* @__PURE__ */ jsxs2(
863
+ Typography2,
864
+ {
865
+ variant: "body2",
866
+ sx: {
867
+ textAlign: "center",
868
+ "& a": {
869
+ color: "#3A65FF",
870
+ textDecoration: "none",
871
+ cursor: "pointer",
872
+ "&:hover": {
873
+ textDecoration: "underline"
874
+ }
875
+ }
876
+ },
877
+ children: [
878
+ "Don't have an account?",
879
+ " ",
880
+ /* @__PURE__ */ jsx2(
881
+ Button,
882
+ {
883
+ variant: "text",
884
+ onClick: handleToggleSignup,
885
+ sx: {
886
+ color: "#3A65FF",
887
+ textTransform: "none",
888
+ padding: "0 4px",
889
+ minWidth: "auto",
890
+ fontWeight: 600,
891
+ "&:hover": {
892
+ textDecoration: "underline",
893
+ backgroundColor: "transparent"
894
+ }
895
+ },
896
+ children: "Sign up"
897
+ }
898
+ )
899
+ ]
900
+ }
574
901
  )
575
902
  ] }) }),
576
903
  /* @__PURE__ */ jsx2(PoweredByAvaCloud, {}),
@@ -598,7 +925,7 @@ function SignInContent({
598
925
  {
599
926
  variant: "text",
600
927
  component: "a",
601
- href: "https://avacloud.io/terms",
928
+ href: "https://app.avacloud.io/legal/generalterms/",
602
929
  target: "_blank",
603
930
  rel: "noopener noreferrer",
604
931
  sx: {
@@ -624,7 +951,7 @@ function SignInContent({
624
951
  {
625
952
  variant: "text",
626
953
  component: "a",
627
- href: "https://avacloud.io/privacy",
954
+ href: "https://www.avalabs.org/privacy-policy",
628
955
  target: "_blank",
629
956
  rel: "noopener noreferrer",
630
957
  sx: {
@@ -652,54 +979,138 @@ function SignInContent({
652
979
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
653
980
  function LoginModal({ open, onClose }) {
654
981
  var _a;
655
- const { iframe, orgConfig } = useAvaCloudWallet();
982
+ const { iframe, orgConfig, signup } = useAvaCloudWallet();
656
983
  const [isSubmitting, setIsSubmitting] = useState2(false);
657
984
  const [error, setError] = useState2("");
985
+ const timeoutIdRef = useRef2(null);
986
+ const signupInProgressRef = useRef2(false);
987
+ const lastSignupAttemptRef = useRef2(0);
658
988
  const socialLogins = (_a = orgConfig == null ? void 0 : orgConfig.adminPortalSettings) == null ? void 0 : _a.socialLogins;
659
989
  useEffect2(() => {
990
+ let requestInProgress = false;
660
991
  const handleMessage = (event) => {
992
+ if (!event.data || typeof event.data.type !== "string") {
993
+ return;
994
+ }
995
+ console.log(
996
+ "Modal received message from iframe:",
997
+ event.data.type,
998
+ event.data.payload ? "has payload" : "no payload"
999
+ );
661
1000
  if (event.data.type === "ERROR") {
1001
+ if (event.data.payload === "User not authenticated in iframe") {
1002
+ console.log("Ignoring transient auth error during signup process");
1003
+ return;
1004
+ }
662
1005
  setError(event.data.payload);
663
1006
  setIsSubmitting(false);
1007
+ signupInProgressRef.current = false;
1008
+ if (timeoutIdRef.current) {
1009
+ clearTimeout(timeoutIdRef.current);
1010
+ timeoutIdRef.current = null;
1011
+ }
664
1012
  } else if (event.data.type === "AUTH_STATUS" && event.data.isAuthenticated) {
1013
+ console.log("Auth successful, resetting state and closing modal");
665
1014
  setIsSubmitting(false);
1015
+ signupInProgressRef.current = false;
1016
+ requestInProgress = false;
1017
+ if (timeoutIdRef.current) {
1018
+ clearTimeout(timeoutIdRef.current);
1019
+ timeoutIdRef.current = null;
1020
+ }
666
1021
  onClose();
1022
+ } else if (event.data.type === "RECEIVE_OIDC") {
1023
+ signupInProgressRef.current = false;
1024
+ requestInProgress = false;
667
1025
  }
668
1026
  };
669
1027
  window.addEventListener("message", handleMessage);
670
- return () => window.removeEventListener("message", handleMessage);
1028
+ return () => {
1029
+ window.removeEventListener("message", handleMessage);
1030
+ if (timeoutIdRef.current) {
1031
+ clearTimeout(timeoutIdRef.current);
1032
+ timeoutIdRef.current = null;
1033
+ }
1034
+ };
671
1035
  }, [onClose]);
672
1036
  const handleProviderLogin = (provider) => {
673
1037
  var _a2;
674
1038
  setError("");
675
- if (iframe) {
676
- console.log(`Sending LOGIN_REQUEST to auth service iframe with ${provider} connection`);
677
- (_a2 = iframe.contentWindow) == null ? void 0 : _a2.postMessage({
678
- type: "LOGIN_REQUEST",
679
- connection: provider
680
- }, "*");
681
- onClose();
682
- } else {
1039
+ if (!iframe) {
683
1040
  console.error("Auth service iframe not found");
684
1041
  setError("Authentication service not available");
1042
+ return;
685
1043
  }
1044
+ console.log(`Sending LOGIN_REQUEST to auth service iframe with ${provider} connection`);
1045
+ (_a2 = iframe.contentWindow) == null ? void 0 : _a2.postMessage({
1046
+ type: "LOGIN_REQUEST",
1047
+ connection: provider,
1048
+ requestId: `login-${Date.now()}`
1049
+ }, "*");
1050
+ onClose();
686
1051
  };
687
1052
  const handleEmailLogin = (email, password) => {
688
1053
  var _a2;
689
1054
  setError("");
690
1055
  setIsSubmitting(true);
691
- if (iframe) {
692
- console.log("Sending email/password LOGIN_REQUEST to auth service iframe");
693
- (_a2 = iframe.contentWindow) == null ? void 0 : _a2.postMessage({
694
- type: "LOGIN_REQUEST",
695
- email,
696
- password
697
- }, "*");
698
- } else {
1056
+ if (!iframe) {
699
1057
  console.error("Auth service iframe not found");
700
1058
  setError("Authentication service not available");
701
1059
  setIsSubmitting(false);
1060
+ return;
1061
+ }
1062
+ if (timeoutIdRef.current) {
1063
+ clearTimeout(timeoutIdRef.current);
1064
+ timeoutIdRef.current = null;
1065
+ }
1066
+ console.log("Sending email/password LOGIN_REQUEST to auth service iframe");
1067
+ (_a2 = iframe.contentWindow) == null ? void 0 : _a2.postMessage({
1068
+ type: "LOGIN_REQUEST",
1069
+ email,
1070
+ password,
1071
+ requestId: `login-${Date.now()}`
1072
+ }, "*");
1073
+ timeoutIdRef.current = setTimeout(() => {
1074
+ console.log("No response received from auth service iframe");
1075
+ setError("Authentication service timed out");
1076
+ setIsSubmitting(false);
1077
+ timeoutIdRef.current = null;
1078
+ }, 1e4);
1079
+ };
1080
+ const handleEmailSignup = (email, password) => {
1081
+ if (signupInProgressRef.current) {
1082
+ console.log("Signup already in progress, ignoring duplicate request");
1083
+ return;
1084
+ }
1085
+ const now = Date.now();
1086
+ if (now - lastSignupAttemptRef.current < 2e3) {
1087
+ console.log("Ignoring duplicate signup attempt (debounce)");
1088
+ return;
1089
+ }
1090
+ lastSignupAttemptRef.current = now;
1091
+ setError("");
1092
+ setIsSubmitting(true);
1093
+ signupInProgressRef.current = true;
1094
+ if (timeoutIdRef.current) {
1095
+ clearTimeout(timeoutIdRef.current);
1096
+ timeoutIdRef.current = null;
1097
+ }
1098
+ try {
1099
+ signup(email, password);
1100
+ } catch (error2) {
1101
+ console.error("Error initiating signup:", error2);
1102
+ setError("Failed to initiate signup");
1103
+ setIsSubmitting(false);
1104
+ signupInProgressRef.current = false;
1105
+ return;
702
1106
  }
1107
+ timeoutIdRef.current = setTimeout(() => {
1108
+ console.log("No response received from auth service iframe");
1109
+ setError("Authentication service timed out");
1110
+ setIsSubmitting(false);
1111
+ signupInProgressRef.current = false;
1112
+ timeoutIdRef.current = null;
1113
+ }, 1e4);
703
1114
  };
704
1115
  return /* @__PURE__ */ jsxs3(
705
1116
  Dialog,
@@ -772,6 +1183,7 @@ function LoginModal({ open, onClose }) {
772
1183
  SignInContent,
773
1184
  {
774
1185
  onEmailLogin: handleEmailLogin,
1186
+ onEmailSignup: handleEmailSignup,
775
1187
  onProviderLogin: handleProviderLogin,
776
1188
  error,
777
1189
  isSubmitting,
@@ -1187,7 +1599,9 @@ var queryClient = new QueryClient({
1187
1599
  }
1188
1600
  }
1189
1601
  });
1190
- var CUBIST_ENV = envs.gamma;
1602
+ function getCubistEnv(environment) {
1603
+ return environment === "production" ? envs.prod : envs.gamma;
1604
+ }
1191
1605
  function ViemProviderWrapper({ children, chainId }) {
1192
1606
  const { data: blockchain } = useBlockchain(chainId.toString());
1193
1607
  if (!(blockchain == null ? void 0 : blockchain.rpcUrl)) {
@@ -1205,15 +1619,16 @@ function ViemProviderWrapper({ children, chainId }) {
1205
1619
  }
1206
1620
  function AvaCloudWalletProvider({
1207
1621
  children,
1208
- authServiceUrl = "https://ac-auth-service.vercel.app/",
1209
1622
  orgId,
1210
1623
  chainId = 43113,
1211
1624
  darkMode = false,
1212
- environment = "development",
1625
+ env = "production",
1213
1626
  onAuthSuccess,
1214
1627
  onAuthError,
1215
1628
  onWalletUpdate
1216
1629
  }) {
1630
+ const authServiceUrl = env === "development" ? "http://localhost:3000" : env === "staging" ? "https://ac-auth-service-env-staging-ava-labs.vercel.app" : "https://ac-auth-service.vercel.app";
1631
+ const environment = env;
1217
1632
  const [isAuthenticated, setIsAuthenticated] = useState7(false);
1218
1633
  const [isCubistLoading, setIsCubistLoading] = useState7(true);
1219
1634
  const [isLoading, setIsLoading] = useState7(true);
@@ -1225,7 +1640,7 @@ function AvaCloudWalletProvider({
1225
1640
  const [cubistClient, setCubistClient] = useState7(null);
1226
1641
  const [cubistError, setCubistError] = useState7(null);
1227
1642
  const [pendingOidcToken, setPendingOidcToken] = useState7(null);
1228
- const iframeRef = useRef2(null);
1643
+ const iframeRef = useRef3(null);
1229
1644
  useEffect5(() => {
1230
1645
  setIsLoading(isCubistLoading || isAuthenticated && !wallet.address);
1231
1646
  }, [isCubistLoading, isAuthenticated, wallet.address]);
@@ -1288,7 +1703,7 @@ function AvaCloudWalletProvider({
1288
1703
  try {
1289
1704
  console.log(`[loginWithCubist] Attempting CubeSignerClient.createOidcSession for Org: ${orgConfig.walletProviderOrgID}`);
1290
1705
  const resp = await CubeSignerClient.createOidcSession(
1291
- CUBIST_ENV,
1706
+ getCubistEnv(environment),
1292
1707
  orgConfig.walletProviderOrgID,
1293
1708
  accessToken,
1294
1709
  ["sign:*", "manage:*", "export:*"],
@@ -1350,7 +1765,7 @@ function AvaCloudWalletProvider({
1350
1765
  console.log("[loginWithCubist] Setting isCubistLoading to false.");
1351
1766
  setIsCubistLoading(false);
1352
1767
  }
1353
- }, [wallet, onWalletUpdate, onAuthError, getWalletInfo, orgConfig]);
1768
+ }, [wallet, onWalletUpdate, onAuthError, getWalletInfo, orgConfig, environment]);
1354
1769
  const { sendMessage } = usePostMessage({
1355
1770
  authServiceUrl,
1356
1771
  orgId,
@@ -1372,6 +1787,12 @@ function AvaCloudWalletProvider({
1372
1787
  },
1373
1788
  onAuthError: (error) => {
1374
1789
  console.log("[onAuthError] Called with error:", error);
1790
+ const errorMessage = (error == null ? void 0 : error.message) || "";
1791
+ if (errorMessage === "User not authenticated in iframe" || errorMessage === "Unknown error" || // Generic error that often appears during signup
1792
+ errorMessage.includes("OIDC user not found")) {
1793
+ console.log("[onAuthError] Ignoring expected error during auth flow:", errorMessage);
1794
+ return;
1795
+ }
1375
1796
  setIsCubistLoading(false);
1376
1797
  onAuthError == null ? void 0 : onAuthError(error);
1377
1798
  },
@@ -1423,6 +1844,22 @@ function AvaCloudWalletProvider({
1423
1844
  console.error("[login] No iframe available for login");
1424
1845
  }
1425
1846
  }, [iframe, sendMessage]);
1847
+ const signup = useCallback5((email, password) => {
1848
+ console.log("[signup] Called with email:", email);
1849
+ if (iframe == null ? void 0 : iframe.contentWindow) {
1850
+ setIsCubistLoading(true);
1851
+ sendMessage({
1852
+ type: "SIGNUP_REQUEST",
1853
+ payload: {
1854
+ email,
1855
+ password
1856
+ },
1857
+ requestId: `signup-${Date.now()}`
1858
+ });
1859
+ } else {
1860
+ console.error("[signup] No iframe available for signup");
1861
+ }
1862
+ }, [iframe, sendMessage]);
1426
1863
  const logout = useCallback5(() => {
1427
1864
  console.log("[logout] Called");
1428
1865
  sendMessage({ type: "LOGOUT_REQUEST" });
@@ -1436,14 +1873,14 @@ function AvaCloudWalletProvider({
1436
1873
  localStorage.removeItem(AUTH0_STORAGE_KEYS.EXPIRES_AT);
1437
1874
  localStorage.removeItem(CUBIST_USER_ID_KEY);
1438
1875
  if (orgId) {
1439
- const cachedConfigKey = `${ORG_CONFIG_CACHE_KEY}-${orgId}-${environment}`;
1876
+ const cachedConfigKey = `${ORG_CONFIG_CACHE_KEY}-${orgId}-${env}`;
1440
1877
  localStorage.removeItem(cachedConfigKey);
1441
1878
  }
1442
1879
  sessionStorage.removeItem(OIDC_TOKEN_KEY);
1443
1880
  setCubistClient(null);
1444
1881
  setCubistError(null);
1445
1882
  setPendingOidcToken(null);
1446
- }, [sendMessage, orgId, environment]);
1883
+ }, [sendMessage, orgId, env]);
1447
1884
  const addAccount = useCallback5(async (accountIndex) => {
1448
1885
  console.log("[addAccount] Called with accountIndex:", accountIndex);
1449
1886
  if (!isAuthenticated || !user || !wallet.mnemonicId) {
@@ -1520,6 +1957,34 @@ function AvaCloudWalletProvider({
1520
1957
  }
1521
1958
  };
1522
1959
  }, [authServiceUrl]);
1960
+ useEffect5(() => {
1961
+ if (typeof window === "undefined") {
1962
+ return;
1963
+ }
1964
+ const isAuthenticatedInStorage = localStorage.getItem(AUTH0_STORAGE_KEYS.IS_AUTHENTICATED) === "true";
1965
+ if (!isAuthenticatedInStorage) {
1966
+ return;
1967
+ }
1968
+ const existingOidcToken = sessionStorage.getItem(OIDC_TOKEN_KEY);
1969
+ if (existingOidcToken) {
1970
+ console.log("[useEffect Init] Found existing OIDC token in sessionStorage");
1971
+ setPendingOidcToken(existingOidcToken);
1972
+ } else {
1973
+ try {
1974
+ const tokensJson = localStorage.getItem(AUTH_TOKENS_KEY);
1975
+ if (tokensJson) {
1976
+ const tokens = JSON.parse(tokensJson);
1977
+ if (tokens.access_token) {
1978
+ console.log("[useEffect Init] Using access_token from localStorage as OIDC token");
1979
+ sessionStorage.setItem(OIDC_TOKEN_KEY, tokens.access_token);
1980
+ setPendingOidcToken(tokens.access_token);
1981
+ }
1982
+ }
1983
+ } catch (error) {
1984
+ console.error("[useEffect Init] Error parsing tokens from localStorage:", error);
1985
+ }
1986
+ }
1987
+ }, []);
1523
1988
  const contextValue = {
1524
1989
  isAuthenticated,
1525
1990
  isLoading,
@@ -1531,6 +1996,7 @@ function AvaCloudWalletProvider({
1531
1996
  cubistClient,
1532
1997
  cubistError,
1533
1998
  login,
1999
+ signup,
1534
2000
  addAccount,
1535
2001
  queryClient,
1536
2002
  iframe,