shogun-button-react 6.9.4 → 6.9.6
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.
|
@@ -34,14 +34,14 @@ type ShogunButtonProviderProps = {
|
|
|
34
34
|
userPub: string;
|
|
35
35
|
username: string;
|
|
36
36
|
password?: string;
|
|
37
|
-
authMethod?: "password" | "web3" | "webauthn" | "nostr" | "
|
|
37
|
+
authMethod?: "password" | "web3" | "webauthn" | "nostr" | "challenge" | "seed" | "pair";
|
|
38
38
|
}) => void;
|
|
39
39
|
onSignupSuccess?: (data: {
|
|
40
40
|
userPub: string;
|
|
41
41
|
username: string;
|
|
42
42
|
password?: string;
|
|
43
43
|
seedPhrase?: string;
|
|
44
|
-
authMethod?: "password" | "web3" | "webauthn" | "nostr" | "
|
|
44
|
+
authMethod?: "password" | "web3" | "webauthn" | "nostr" | "challenge" | "seed" | "pair";
|
|
45
45
|
}) => void;
|
|
46
46
|
onError?: (error: string) => void;
|
|
47
47
|
};
|
|
@@ -3,7 +3,9 @@ import { Observable } from "rxjs";
|
|
|
3
3
|
import "../styles/index.css";
|
|
4
4
|
// Helper type to check if core is ShogunCore
|
|
5
5
|
function isShogunCore(core) {
|
|
6
|
-
return core &&
|
|
6
|
+
return (core &&
|
|
7
|
+
typeof core.isLoggedIn === "function" &&
|
|
8
|
+
typeof core.gun !== "undefined");
|
|
7
9
|
}
|
|
8
10
|
// Default context
|
|
9
11
|
const defaultShogunContext = {
|
|
@@ -174,24 +176,6 @@ export function ShogunButtonProvider({ children, core, options, onLoginSuccess,
|
|
|
174
176
|
throw new Error("Nostr requires ShogunCore");
|
|
175
177
|
}
|
|
176
178
|
break;
|
|
177
|
-
case "zkproof":
|
|
178
|
-
const trapdoor = args[0];
|
|
179
|
-
if (!trapdoor || typeof trapdoor !== "string") {
|
|
180
|
-
throw new Error("Invalid trapdoor provided");
|
|
181
|
-
}
|
|
182
|
-
if (isShogunCore(core)) {
|
|
183
|
-
const zkproof = core.getPlugin("zkproof");
|
|
184
|
-
if (!zkproof)
|
|
185
|
-
throw new Error("ZK-Proof plugin not available");
|
|
186
|
-
const zkLoginResult = await zkproof.login(trapdoor);
|
|
187
|
-
result = zkLoginResult;
|
|
188
|
-
username = zkLoginResult.username || zkLoginResult.alias || `zk_${(zkLoginResult.userPub || "").slice(0, 16)}`;
|
|
189
|
-
authMethod = "zkproof";
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
throw new Error("ZK-Proof requires ShogunCore");
|
|
193
|
-
}
|
|
194
|
-
break;
|
|
195
179
|
case "challenge":
|
|
196
180
|
username = args[0];
|
|
197
181
|
if (!username)
|
|
@@ -351,21 +335,6 @@ export function ShogunButtonProvider({ children, core, options, onLoginSuccess,
|
|
|
351
335
|
throw new Error("Nostr requires ShogunCore");
|
|
352
336
|
}
|
|
353
337
|
break;
|
|
354
|
-
case "zkproof":
|
|
355
|
-
if (isShogunCore(core)) {
|
|
356
|
-
const zkproofPlugin = core.getPlugin("zkproof");
|
|
357
|
-
if (!zkproofPlugin)
|
|
358
|
-
throw new Error("ZK-Proof plugin not available");
|
|
359
|
-
const seed = args[0]; // Optional seed
|
|
360
|
-
const zkSignupResult = await zkproofPlugin.signUp(seed);
|
|
361
|
-
result = zkSignupResult;
|
|
362
|
-
username = zkSignupResult.username || zkSignupResult.alias || `zk_${(zkSignupResult.userPub || "").slice(0, 16)}`;
|
|
363
|
-
authMethod = "zkproof";
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
throw new Error("ZK-Proof requires ShogunCore");
|
|
367
|
-
}
|
|
368
|
-
break;
|
|
369
338
|
default:
|
|
370
339
|
throw new Error("Unsupported signup method");
|
|
371
340
|
}
|
|
@@ -543,7 +512,7 @@ export function ShogunButtonProvider({ children, core, options, onLoginSuccess,
|
|
|
543
512
|
put: async (path, data) => {
|
|
544
513
|
if (isShogunCore(core)) {
|
|
545
514
|
if (!core.gun)
|
|
546
|
-
throw new Error(
|
|
515
|
+
throw new Error("Gun instance not available");
|
|
547
516
|
return new Promise((resolve, reject) => {
|
|
548
517
|
core.gun.get(path).put(data, (ack) => {
|
|
549
518
|
if (ack.err)
|
|
@@ -554,7 +523,7 @@ export function ShogunButtonProvider({ children, core, options, onLoginSuccess,
|
|
|
554
523
|
});
|
|
555
524
|
}
|
|
556
525
|
else {
|
|
557
|
-
throw new Error(
|
|
526
|
+
throw new Error("Core not available");
|
|
558
527
|
}
|
|
559
528
|
},
|
|
560
529
|
get: (path) => {
|
|
@@ -568,7 +537,7 @@ export function ShogunButtonProvider({ children, core, options, onLoginSuccess,
|
|
|
568
537
|
remove: async (path) => {
|
|
569
538
|
if (isShogunCore(core)) {
|
|
570
539
|
if (!core.gun)
|
|
571
|
-
throw new Error(
|
|
540
|
+
throw new Error("Gun instance not available");
|
|
572
541
|
return new Promise((resolve, reject) => {
|
|
573
542
|
core.gun.get(path).put(null, (ack) => {
|
|
574
543
|
if (ack.err)
|
|
@@ -579,7 +548,7 @@ export function ShogunButtonProvider({ children, core, options, onLoginSuccess,
|
|
|
579
548
|
});
|
|
580
549
|
}
|
|
581
550
|
else {
|
|
582
|
-
throw new Error(
|
|
551
|
+
throw new Error("Core not available");
|
|
583
552
|
}
|
|
584
553
|
},
|
|
585
554
|
}), [
|
|
@@ -637,10 +606,6 @@ const ImportIcon = () => (React.createElement("svg", { xmlns: "http://www.w3.org
|
|
|
637
606
|
React.createElement("polyline", { points: "14,2 14,8 20,8" }),
|
|
638
607
|
React.createElement("line", { x1: "16", y1: "13", x2: "8", y2: "13" }),
|
|
639
608
|
React.createElement("line", { x1: "12", y1: "17", x2: "12", y2: "9" })));
|
|
640
|
-
const ZkProofIcon = () => (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
|
|
641
|
-
React.createElement("path", { d: "M12 2L2 7l10 5 10-5-10-5z" }),
|
|
642
|
-
React.createElement("path", { d: "M2 17l10 5 10-5" }),
|
|
643
|
-
React.createElement("path", { d: "M2 12l10 5 10-5" })));
|
|
644
609
|
const ChallengeIcon = () => (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
|
|
645
610
|
React.createElement("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" })));
|
|
646
611
|
const ExportIcon = () => (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
|
|
@@ -657,24 +622,17 @@ export const ShogunButton = (() => {
|
|
|
657
622
|
const [formUsername, setFormUsername] = useState("");
|
|
658
623
|
const [formPassword, setFormPassword] = useState("");
|
|
659
624
|
const [formPasswordConfirm, setFormPasswordConfirm] = useState("");
|
|
660
|
-
const [formHint, setFormHint] = useState("");
|
|
661
|
-
const [formSecurityQuestion] = useState("What is your favorite color?"); // Hardcoded for now
|
|
662
|
-
const [formSecurityAnswer, setFormSecurityAnswer] = useState("");
|
|
663
625
|
const [formMode, setFormMode] = useState("login");
|
|
664
626
|
const [authView, setAuthView] = useState("options");
|
|
665
627
|
const [error, setError] = useState("");
|
|
666
628
|
const [loading, setLoading] = useState(false);
|
|
667
629
|
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
668
|
-
const [recoveredHint, setRecoveredHint] = useState("");
|
|
669
630
|
const [exportPassword, setExportPassword] = useState("");
|
|
670
631
|
const [importPassword, setImportPassword] = useState("");
|
|
671
632
|
const [importPairData, setImportPairData] = useState("");
|
|
672
633
|
const [exportedPair, setExportedPair] = useState("");
|
|
673
634
|
const [showCopySuccess, setShowCopySuccess] = useState(false);
|
|
674
635
|
const [showImportSuccess, setShowImportSuccess] = useState(false);
|
|
675
|
-
const [zkTrapdoor, setZkTrapdoor] = useState("");
|
|
676
|
-
const [zkSignupTrapdoor, setZkSignupTrapdoor] = useState("");
|
|
677
|
-
const [showZkTrapdoorCopySuccess, setShowZkTrapdoorCopySuccess] = useState(false);
|
|
678
636
|
const [webauthnSeedPhrase, setWebauthnSeedPhrase] = useState("");
|
|
679
637
|
const [webauthnRecoverySeed, setWebauthnRecoverySeed] = useState("");
|
|
680
638
|
const [formMnemonic, setFormMnemonic] = useState("");
|
|
@@ -697,17 +655,13 @@ export const ShogunButton = (() => {
|
|
|
697
655
|
useEffect(() => {
|
|
698
656
|
if (hasPendingSignup) {
|
|
699
657
|
setModalIsOpen(true);
|
|
700
|
-
if (authView !== "webauthn-signup-result"
|
|
701
|
-
authView !== "zkproof-signup-result") {
|
|
658
|
+
if (authView !== "webauthn-signup-result") {
|
|
702
659
|
if (webauthnSeedPhrase) {
|
|
703
660
|
setAuthView("webauthn-signup-result");
|
|
704
661
|
}
|
|
705
|
-
else if (zkSignupTrapdoor) {
|
|
706
|
-
setAuthView("zkproof-signup-result");
|
|
707
|
-
}
|
|
708
662
|
}
|
|
709
663
|
}
|
|
710
|
-
}, [hasPendingSignup, authView, webauthnSeedPhrase
|
|
664
|
+
}, [hasPendingSignup, authView, webauthnSeedPhrase]);
|
|
711
665
|
// If already logged in, show only logout button
|
|
712
666
|
if (isLoggedIn && username && !modalIsOpen) {
|
|
713
667
|
return (React.createElement("div", { className: "shogun-logged-in-container" },
|
|
@@ -784,26 +738,6 @@ export const ShogunButton = (() => {
|
|
|
784
738
|
if (formMode === "signup") {
|
|
785
739
|
const result = await signUp("password", formUsername, formPassword, formPasswordConfirm);
|
|
786
740
|
if (result && result.success) {
|
|
787
|
-
// Password hint functionality has been removed from shogun-core
|
|
788
|
-
// Users should store hints manually in their own data structures if needed
|
|
789
|
-
if (isShogunCore(core) && core.db && formHint) {
|
|
790
|
-
try {
|
|
791
|
-
// Store hint manually in user data
|
|
792
|
-
const user = core.gun.user();
|
|
793
|
-
if (user && user.is) {
|
|
794
|
-
core.db.gun.get('users').get(formUsername).get('hint').put(formHint);
|
|
795
|
-
if (formSecurityAnswer) {
|
|
796
|
-
core.db.gun.get('users').get(formUsername).get('security').put({
|
|
797
|
-
question: formSecurityQuestion,
|
|
798
|
-
answer: formSecurityAnswer
|
|
799
|
-
});
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
catch (error) {
|
|
804
|
-
console.warn('Failed to store password hint:', error);
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
741
|
setModalIsOpen(false);
|
|
808
742
|
}
|
|
809
743
|
else if (result && result.error) {
|
|
@@ -863,63 +797,6 @@ export const ShogunButton = (() => {
|
|
|
863
797
|
setLoading(false);
|
|
864
798
|
}
|
|
865
799
|
};
|
|
866
|
-
const handleZkProofAuth = () => {
|
|
867
|
-
if (!hasPlugin("zkproof")) {
|
|
868
|
-
setError("ZK-Proof plugin not available");
|
|
869
|
-
return;
|
|
870
|
-
}
|
|
871
|
-
if (formMode === "login") {
|
|
872
|
-
setAuthView("zkproof-login");
|
|
873
|
-
}
|
|
874
|
-
else {
|
|
875
|
-
// For signup, directly call signUp and show trapdoor
|
|
876
|
-
handleZkProofSignup();
|
|
877
|
-
}
|
|
878
|
-
};
|
|
879
|
-
const handleZkProofLogin = async () => {
|
|
880
|
-
setError("");
|
|
881
|
-
setLoading(true);
|
|
882
|
-
try {
|
|
883
|
-
if (!zkTrapdoor.trim()) {
|
|
884
|
-
throw new Error("Please enter your trapdoor");
|
|
885
|
-
}
|
|
886
|
-
await handleAuth("zkproof", zkTrapdoor);
|
|
887
|
-
setModalIsOpen(false);
|
|
888
|
-
}
|
|
889
|
-
catch (e) {
|
|
890
|
-
setError(e.message || "ZK-Proof login failed");
|
|
891
|
-
}
|
|
892
|
-
finally {
|
|
893
|
-
setLoading(false);
|
|
894
|
-
}
|
|
895
|
-
};
|
|
896
|
-
const handleZkProofSignup = async () => {
|
|
897
|
-
setError("");
|
|
898
|
-
setLoading(true);
|
|
899
|
-
try {
|
|
900
|
-
const result = await signUp("zkproof");
|
|
901
|
-
if (!result || !result.success) {
|
|
902
|
-
throw new Error((result === null || result === void 0 ? void 0 : result.error) || "ZK-Proof signup failed");
|
|
903
|
-
}
|
|
904
|
-
const trapdoorValue = result.seedPhrase || result.trapdoor || "";
|
|
905
|
-
if (trapdoorValue) {
|
|
906
|
-
setZkSignupTrapdoor(trapdoorValue);
|
|
907
|
-
setShowZkTrapdoorCopySuccess(false);
|
|
908
|
-
setAuthView("zkproof-signup-result");
|
|
909
|
-
setHasPendingSignup(true);
|
|
910
|
-
}
|
|
911
|
-
else {
|
|
912
|
-
setAuthView("options");
|
|
913
|
-
setModalIsOpen(false);
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
catch (e) {
|
|
917
|
-
setError(e.message || "ZK-Proof signup failed");
|
|
918
|
-
}
|
|
919
|
-
finally {
|
|
920
|
-
setLoading(false);
|
|
921
|
-
}
|
|
922
|
-
};
|
|
923
800
|
const handleChallengeAuth = () => {
|
|
924
801
|
if (!hasPlugin("challenge")) {
|
|
925
802
|
setError("Challenge plugin not available");
|
|
@@ -964,51 +841,9 @@ export const ShogunButton = (() => {
|
|
|
964
841
|
setLoading(false);
|
|
965
842
|
}
|
|
966
843
|
};
|
|
967
|
-
const
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
try {
|
|
971
|
-
if (isShogunCore(core) && core.db) {
|
|
972
|
-
// Password recovery functionality has been removed from shogun-core
|
|
973
|
-
// Users should implement their own recovery logic using Gun's get operations
|
|
974
|
-
try {
|
|
975
|
-
const hintNode = await new Promise((resolve) => {
|
|
976
|
-
core.db.gun.get('users').get(formUsername).get('hint').once((hint) => {
|
|
977
|
-
resolve(hint || null);
|
|
978
|
-
});
|
|
979
|
-
});
|
|
980
|
-
const securityNode = await new Promise((resolve) => {
|
|
981
|
-
core.db.gun.get('users').get(formUsername).get('security').once((security) => {
|
|
982
|
-
resolve(security || null);
|
|
983
|
-
});
|
|
984
|
-
});
|
|
985
|
-
if (securityNode && securityNode.answer === formSecurityAnswer) {
|
|
986
|
-
if (hintNode) {
|
|
987
|
-
setRecoveredHint(hintNode);
|
|
988
|
-
setAuthView("showHint");
|
|
989
|
-
}
|
|
990
|
-
else {
|
|
991
|
-
setError("No hint found for this user.");
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
else {
|
|
995
|
-
setError("Security answer is incorrect.");
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
catch (error) {
|
|
999
|
-
setError(error.message || "Could not recover hint.");
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
else {
|
|
1003
|
-
setError("Password recovery requires ShogunCore");
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
catch (e) {
|
|
1007
|
-
setError(e.message || "An unexpected error occurred.");
|
|
1008
|
-
}
|
|
1009
|
-
finally {
|
|
1010
|
-
setLoading(false);
|
|
1011
|
-
}
|
|
844
|
+
const handleForgotPassword = async (e) => {
|
|
845
|
+
e.preventDefault();
|
|
846
|
+
setError("Password recovery is no longer supported.");
|
|
1012
847
|
};
|
|
1013
848
|
const handleExportPair = async () => {
|
|
1014
849
|
setError("");
|
|
@@ -1061,8 +896,6 @@ export const ShogunButton = (() => {
|
|
|
1061
896
|
setFormUsername("");
|
|
1062
897
|
setFormPassword("");
|
|
1063
898
|
setFormPasswordConfirm("");
|
|
1064
|
-
setFormHint("");
|
|
1065
|
-
setFormSecurityAnswer("");
|
|
1066
899
|
setError("");
|
|
1067
900
|
setLoading(false);
|
|
1068
901
|
setAuthView("options");
|
|
@@ -1072,10 +905,7 @@ export const ShogunButton = (() => {
|
|
|
1072
905
|
setExportedPair("");
|
|
1073
906
|
setShowCopySuccess(false);
|
|
1074
907
|
setShowImportSuccess(false);
|
|
1075
|
-
|
|
1076
|
-
setZkTrapdoor("");
|
|
1077
|
-
setZkSignupTrapdoor("");
|
|
1078
|
-
setShowZkTrapdoorCopySuccess(false);
|
|
908
|
+
// Additional reset code if needed
|
|
1079
909
|
setWebauthnSeedPhrase("");
|
|
1080
910
|
setWebauthnRecoverySeed("");
|
|
1081
911
|
setFormMnemonic("");
|
|
@@ -1090,7 +920,7 @@ export const ShogunButton = (() => {
|
|
|
1090
920
|
setModalIsOpen(false);
|
|
1091
921
|
setHasPendingSignup(false);
|
|
1092
922
|
};
|
|
1093
|
-
const
|
|
923
|
+
const finalizeSignup = () => {
|
|
1094
924
|
setError("");
|
|
1095
925
|
resetForm();
|
|
1096
926
|
setModalIsOpen(false);
|
|
@@ -1125,12 +955,6 @@ export const ShogunButton = (() => {
|
|
|
1125
955
|
formMode === "login"
|
|
1126
956
|
? "Login with Challenge"
|
|
1127
957
|
: "Signup with Challenge (N/A)"))),
|
|
1128
|
-
options.showZkProof !== false && hasPlugin("zkproof") && (React.createElement("div", { className: "shogun-auth-option-group" },
|
|
1129
|
-
React.createElement("button", { type: "button", className: "shogun-auth-option-button", onClick: handleZkProofAuth, disabled: loading },
|
|
1130
|
-
React.createElement(ZkProofIcon, null),
|
|
1131
|
-
formMode === "login"
|
|
1132
|
-
? "Login with ZK-Proof"
|
|
1133
|
-
: "Signup with ZK-Proof"))),
|
|
1134
958
|
React.createElement("div", { className: "shogun-divider" },
|
|
1135
959
|
React.createElement("span", null, "or")),
|
|
1136
960
|
React.createElement("button", { type: "button", className: "shogun-auth-option-button", onClick: () => setAuthView("password"), disabled: loading },
|
|
@@ -1160,22 +984,7 @@ export const ShogunButton = (() => {
|
|
|
1160
984
|
React.createElement("label", { htmlFor: "passwordConfirm" },
|
|
1161
985
|
React.createElement(KeyIcon, null),
|
|
1162
986
|
React.createElement("span", null, "Confirm Password")),
|
|
1163
|
-
React.createElement("input", { type: "password", id: "passwordConfirm", value: formPasswordConfirm, onChange: (e) => setFormPasswordConfirm(e.target.value), disabled: loading, required: true, placeholder: "Confirm your password" })),
|
|
1164
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1165
|
-
React.createElement("label", { htmlFor: "hint" },
|
|
1166
|
-
React.createElement(UserIcon, null),
|
|
1167
|
-
React.createElement("span", null, "Password Hint")),
|
|
1168
|
-
React.createElement("input", { type: "text", id: "hint", value: formHint, onChange: (e) => setFormHint(e.target.value), disabled: loading, required: true, placeholder: "Enter your password hint" })),
|
|
1169
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1170
|
-
React.createElement("label", { htmlFor: "securityQuestion" },
|
|
1171
|
-
React.createElement(UserIcon, null),
|
|
1172
|
-
React.createElement("span", null, "Security Question")),
|
|
1173
|
-
React.createElement("input", { type: "text", id: "securityQuestion", value: formSecurityQuestion, disabled: true })),
|
|
1174
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1175
|
-
React.createElement("label", { htmlFor: "securityAnswer" },
|
|
1176
|
-
React.createElement(UserIcon, null),
|
|
1177
|
-
React.createElement("span", null, "Security Answer")),
|
|
1178
|
-
React.createElement("input", { type: "text", id: "securityAnswer", value: formSecurityAnswer, onChange: (e) => setFormSecurityAnswer(e.target.value), disabled: loading, required: true, placeholder: "Enter your security answer" })))),
|
|
987
|
+
React.createElement("input", { type: "password", id: "passwordConfirm", value: formPasswordConfirm, onChange: (e) => setFormPasswordConfirm(e.target.value), disabled: loading, required: true, placeholder: "Confirm your password" })))),
|
|
1179
988
|
React.createElement("button", { type: "submit", className: "shogun-submit-button", disabled: loading }, loading
|
|
1180
989
|
? "Processing..."
|
|
1181
990
|
: formMode === "login"
|
|
@@ -1184,8 +993,7 @@ export const ShogunButton = (() => {
|
|
|
1184
993
|
React.createElement("div", { className: "shogun-form-footer" },
|
|
1185
994
|
React.createElement("button", { type: "button", className: "shogun-toggle-mode shogun-prominent-toggle", onClick: toggleMode, disabled: loading }, formMode === "login"
|
|
1186
995
|
? "Don't have an account? Sign up"
|
|
1187
|
-
: "Already have an account? Log in")
|
|
1188
|
-
formMode === "login" && (React.createElement("button", { type: "button", className: "shogun-toggle-mode", onClick: () => setAuthView("recover"), disabled: loading }, "Forgot password?")))));
|
|
996
|
+
: "Already have an account? Log in"))));
|
|
1189
997
|
const renderWebAuthnUsernameForm = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1190
998
|
React.createElement("h3", null, formMode === "login"
|
|
1191
999
|
? "Login with WebAuthn"
|
|
@@ -1261,31 +1069,6 @@ export const ShogunButton = (() => {
|
|
|
1261
1069
|
setError("");
|
|
1262
1070
|
setAuthView("webauthn-username");
|
|
1263
1071
|
}, disabled: loading }, "\u2190 Back to WebAuthn"))));
|
|
1264
|
-
const renderRecoveryForm = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1265
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1266
|
-
React.createElement("label", { htmlFor: "username" },
|
|
1267
|
-
React.createElement(UserIcon, null),
|
|
1268
|
-
React.createElement("span", null, "Username")),
|
|
1269
|
-
React.createElement("input", { type: "text", id: "username", value: formUsername, onChange: (e) => setFormUsername(e.target.value), disabled: loading, required: true, placeholder: "Enter your username" })),
|
|
1270
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1271
|
-
React.createElement("label", null, "Security Question"),
|
|
1272
|
-
React.createElement("p", null, formSecurityQuestion)),
|
|
1273
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1274
|
-
React.createElement("label", { htmlFor: "securityAnswer" },
|
|
1275
|
-
React.createElement(KeyIcon, null),
|
|
1276
|
-
React.createElement("span", null, "Answer")),
|
|
1277
|
-
React.createElement("input", { type: "text", id: "securityAnswer", value: formSecurityAnswer, onChange: (e) => setFormSecurityAnswer(e.target.value), disabled: loading, required: true, placeholder: "Enter your answer" })),
|
|
1278
|
-
React.createElement("button", { type: "button", className: "shogun-submit-button", onClick: handleRecover, disabled: loading }, loading ? "Recovering..." : "Get Hint"),
|
|
1279
|
-
React.createElement("div", { className: "shogun-form-footer" },
|
|
1280
|
-
React.createElement("button", { className: "shogun-toggle-mode", onClick: () => setAuthView("password"), disabled: loading }, "Back to Login"))));
|
|
1281
|
-
const renderHint = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1282
|
-
React.createElement("h3", null, "Your Password Hint"),
|
|
1283
|
-
React.createElement("p", { className: "shogun-hint" }, recoveredHint),
|
|
1284
|
-
React.createElement("button", { className: "shogun-submit-button", onClick: () => {
|
|
1285
|
-
setAuthView("password");
|
|
1286
|
-
resetForm();
|
|
1287
|
-
setFormMode("login");
|
|
1288
|
-
} }, "Back to Login")));
|
|
1289
1072
|
const renderExportForm = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1290
1073
|
React.createElement("h3", null, "Export Gun Pair"),
|
|
1291
1074
|
React.createElement("div", { style: {
|
|
@@ -1342,86 +1125,6 @@ export const ShogunButton = (() => {
|
|
|
1342
1125
|
setExportedPair("");
|
|
1343
1126
|
}
|
|
1344
1127
|
}, disabled: loading }, "Back"))));
|
|
1345
|
-
const renderZkProofLoginForm = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1346
|
-
React.createElement("h3", null, "Login with ZK-Proof"),
|
|
1347
|
-
React.createElement("div", { style: {
|
|
1348
|
-
backgroundColor: "#f0f9ff",
|
|
1349
|
-
padding: "12px",
|
|
1350
|
-
borderRadius: "8px",
|
|
1351
|
-
marginBottom: "16px",
|
|
1352
|
-
border: "1px solid #0ea5e9",
|
|
1353
|
-
} },
|
|
1354
|
-
React.createElement("p", { style: {
|
|
1355
|
-
fontSize: "14px",
|
|
1356
|
-
color: "#0c4a6e",
|
|
1357
|
-
margin: "0",
|
|
1358
|
-
fontWeight: "500",
|
|
1359
|
-
} }, "\uD83D\uDD12 Anonymous Authentication"),
|
|
1360
|
-
React.createElement("p", { style: { fontSize: "13px", color: "#075985", margin: "4px 0 0 0" } }, "Enter your trapdoor (recovery phrase) to login anonymously using Zero-Knowledge Proofs. Your identity remains private.")),
|
|
1361
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1362
|
-
React.createElement("label", { htmlFor: "zkTrapdoor" },
|
|
1363
|
-
React.createElement(KeyIcon, null),
|
|
1364
|
-
React.createElement("span", null, "Trapdoor / Recovery Phrase")),
|
|
1365
|
-
React.createElement("textarea", { id: "zkTrapdoor", value: zkTrapdoor, onChange: (e) => setZkTrapdoor(e.target.value), disabled: loading, placeholder: "Enter your trapdoor...", rows: 4, style: {
|
|
1366
|
-
fontFamily: "monospace",
|
|
1367
|
-
fontSize: "12px",
|
|
1368
|
-
width: "100%",
|
|
1369
|
-
padding: "8px",
|
|
1370
|
-
border: "1px solid #ccc",
|
|
1371
|
-
borderRadius: "4px",
|
|
1372
|
-
} })),
|
|
1373
|
-
React.createElement("button", { type: "button", className: "shogun-submit-button", onClick: handleZkProofLogin, disabled: loading || !zkTrapdoor.trim() }, loading ? "Processing..." : "Login Anonymously"),
|
|
1374
|
-
React.createElement("div", { className: "shogun-form-footer" },
|
|
1375
|
-
React.createElement("button", { className: "shogun-toggle-mode", onClick: () => setAuthView("options"), disabled: loading }, "Back to Login Options"))));
|
|
1376
|
-
const renderZkProofSignupResult = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1377
|
-
React.createElement("h3", null, "ZK-Proof Account Created!"),
|
|
1378
|
-
React.createElement("div", { style: {
|
|
1379
|
-
backgroundColor: "#fef3c7",
|
|
1380
|
-
padding: "12px",
|
|
1381
|
-
borderRadius: "8px",
|
|
1382
|
-
marginBottom: "16px",
|
|
1383
|
-
border: "1px solid #f59e0b",
|
|
1384
|
-
} },
|
|
1385
|
-
React.createElement("p", { style: {
|
|
1386
|
-
fontSize: "14px",
|
|
1387
|
-
color: "#92400e",
|
|
1388
|
-
margin: "0",
|
|
1389
|
-
fontWeight: "500",
|
|
1390
|
-
} }, "\u26A0\uFE0F Important: Save Your Trapdoor"),
|
|
1391
|
-
React.createElement("p", { style: { fontSize: "13px", color: "#a16207", margin: "4px 0 0 0" } }, "This trapdoor lets you restore your anonymous identity on new devices. Store it securely and never share it.")),
|
|
1392
|
-
React.createElement("div", { className: "shogun-form-group" },
|
|
1393
|
-
React.createElement("label", null, "Your Trapdoor (Recovery Phrase):"),
|
|
1394
|
-
React.createElement("textarea", { value: zkSignupTrapdoor, readOnly: true, rows: 4, style: {
|
|
1395
|
-
fontFamily: "monospace",
|
|
1396
|
-
fontSize: "12px",
|
|
1397
|
-
width: "100%",
|
|
1398
|
-
padding: "8px",
|
|
1399
|
-
border: "2px solid #f59e0b",
|
|
1400
|
-
borderRadius: "4px",
|
|
1401
|
-
backgroundColor: "#fffbeb",
|
|
1402
|
-
} }),
|
|
1403
|
-
React.createElement("button", { type: "button", className: "shogun-submit-button", style: { marginTop: "8px" }, onClick: async () => {
|
|
1404
|
-
if (!zkSignupTrapdoor) {
|
|
1405
|
-
return;
|
|
1406
|
-
}
|
|
1407
|
-
try {
|
|
1408
|
-
if (navigator.clipboard) {
|
|
1409
|
-
await navigator.clipboard.writeText(zkSignupTrapdoor);
|
|
1410
|
-
setShowZkTrapdoorCopySuccess(true);
|
|
1411
|
-
setTimeout(() => setShowZkTrapdoorCopySuccess(false), 3000);
|
|
1412
|
-
}
|
|
1413
|
-
}
|
|
1414
|
-
catch (copyError) {
|
|
1415
|
-
console.warn("Failed to copy trapdoor:", copyError);
|
|
1416
|
-
}
|
|
1417
|
-
}, disabled: !zkSignupTrapdoor }, "Copy Trapdoor"),
|
|
1418
|
-
showZkTrapdoorCopySuccess && (React.createElement("p", { style: {
|
|
1419
|
-
color: "#047857",
|
|
1420
|
-
fontSize: "12px",
|
|
1421
|
-
marginTop: "6px",
|
|
1422
|
-
} }, "Trapdoor copied to clipboard!"))),
|
|
1423
|
-
React.createElement("div", { className: "shogun-form-footer" },
|
|
1424
|
-
React.createElement("button", { type: "button", className: "shogun-submit-button", onClick: finalizeZkProofSignup }, "I Saved My Trapdoor"))));
|
|
1425
1128
|
const renderWebauthnSignupResult = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1426
1129
|
React.createElement("h3", null, "WebAuthn Account Created!"),
|
|
1427
1130
|
React.createElement("div", { style: {
|
|
@@ -1467,7 +1170,7 @@ export const ShogunButton = (() => {
|
|
|
1467
1170
|
border: "1px solid #22c55e",
|
|
1468
1171
|
textAlign: "center",
|
|
1469
1172
|
} }, "\u2705 You're now logged in with WebAuthn!"),
|
|
1470
|
-
React.createElement("button", { type: "button", className: "shogun-submit-button", style: { marginTop: "16px" }, onClick:
|
|
1173
|
+
React.createElement("button", { type: "button", className: "shogun-submit-button", style: { marginTop: "16px" }, onClick: finalizeSignup }, "Close and Start Using App")));
|
|
1471
1174
|
const renderChallengeForm = () => (React.createElement("div", { className: "shogun-auth-form" },
|
|
1472
1175
|
React.createElement("div", { className: "shogun-form-group" },
|
|
1473
1176
|
React.createElement("label", { htmlFor: "challenge-username" },
|
|
@@ -1559,23 +1262,17 @@ export const ShogunButton = (() => {
|
|
|
1559
1262
|
modalIsOpen && (React.createElement("div", { className: "shogun-modal-overlay", onClick: closeModal },
|
|
1560
1263
|
React.createElement("div", { className: "shogun-modal", onClick: (e) => e.stopPropagation() },
|
|
1561
1264
|
React.createElement("div", { className: "shogun-modal-header" },
|
|
1562
|
-
React.createElement("h2", null, authView === "
|
|
1563
|
-
? "
|
|
1564
|
-
: authView === "
|
|
1565
|
-
? "
|
|
1566
|
-
: authView === "
|
|
1567
|
-
? "
|
|
1568
|
-
: authView === "
|
|
1569
|
-
? "
|
|
1570
|
-
:
|
|
1571
|
-
? "
|
|
1572
|
-
:
|
|
1573
|
-
? "ZK-Proof Login"
|
|
1574
|
-
: authView === "seed-login"
|
|
1575
|
-
? "Login with Seed"
|
|
1576
|
-
: formMode === "login"
|
|
1577
|
-
? "Login"
|
|
1578
|
-
: "Sign Up"),
|
|
1265
|
+
React.createElement("h2", null, authView === "export"
|
|
1266
|
+
? "Export Gun Pair"
|
|
1267
|
+
: authView === "import"
|
|
1268
|
+
? "Import Gun Pair"
|
|
1269
|
+
: authView === "webauthn-username"
|
|
1270
|
+
? "WebAuthn"
|
|
1271
|
+
: authView === "seed-login"
|
|
1272
|
+
? "Login with Seed"
|
|
1273
|
+
: formMode === "login"
|
|
1274
|
+
? "Login"
|
|
1275
|
+
: "Sign Up"),
|
|
1579
1276
|
React.createElement("button", { className: "shogun-close-button", onClick: closeModal, "aria-label": "Close" },
|
|
1580
1277
|
React.createElement(CloseIcon, null))),
|
|
1581
1278
|
React.createElement("div", { className: "shogun-modal-content" },
|
|
@@ -1590,8 +1287,6 @@ export const ShogunButton = (() => {
|
|
|
1590
1287
|
authView === "password" && (React.createElement(React.Fragment, null,
|
|
1591
1288
|
React.createElement("button", { className: "shogun-back-button", onClick: () => setAuthView("options") }, "\u2190 Back"),
|
|
1592
1289
|
renderPasswordForm())),
|
|
1593
|
-
authView === "recover" && renderRecoveryForm(),
|
|
1594
|
-
authView === "showHint" && renderHint(),
|
|
1595
1290
|
authView === "export" && renderExportForm(),
|
|
1596
1291
|
authView === "import" && renderImportForm(),
|
|
1597
1292
|
authView === "webauthn-username" &&
|
|
@@ -1600,11 +1295,7 @@ export const ShogunButton = (() => {
|
|
|
1600
1295
|
renderWebauthnRecoveryForm(),
|
|
1601
1296
|
authView === "webauthn-signup-result" &&
|
|
1602
1297
|
renderWebauthnSignupResult(),
|
|
1603
|
-
authView === "
|
|
1604
|
-
authView === "zkproof-signup-result" &&
|
|
1605
|
-
renderZkProofSignupResult(),
|
|
1606
|
-
authView === "challenge-username" &&
|
|
1607
|
-
renderChallengeForm()))))));
|
|
1298
|
+
authView === "challenge-username" && renderChallengeForm()))))));
|
|
1608
1299
|
};
|
|
1609
1300
|
Button.displayName = "ShogunButton";
|
|
1610
1301
|
return Object.assign(Button, {
|
package/dist/connector.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ShogunCore } from "shogun-core";
|
|
2
2
|
export async function shogunConnector(options) {
|
|
3
|
-
const { gunInstance, appName, timeouts, webauthn, nostr, web3,
|
|
3
|
+
const { gunInstance, appName, timeouts, webauthn, nostr, web3, challenge, showWebauthn, showNostr, showMetamask, showChallenge, darkMode, enableGunDebug = true, enableConnectionMonitoring = true, defaultPageSize = 20, connectionTimeout = 10000, debounceInterval = 100, crypto, ...restOptions } = options;
|
|
4
4
|
let core = null;
|
|
5
5
|
let gun = null;
|
|
6
6
|
gun = gunInstance;
|
|
@@ -14,10 +14,6 @@ export async function shogunConnector(options) {
|
|
|
14
14
|
} : undefined,
|
|
15
15
|
web3: (web3 === null || web3 === void 0 ? void 0 : web3.enabled) ? { enabled: true } : undefined,
|
|
16
16
|
nostr: (nostr === null || nostr === void 0 ? void 0 : nostr.enabled) ? { enabled: true } : undefined,
|
|
17
|
-
zkproof: (zkproof === null || zkproof === void 0 ? void 0 : zkproof.enabled) ? {
|
|
18
|
-
enabled: true,
|
|
19
|
-
defaultGroupId: zkproof.defaultGroupId || "shogun-users",
|
|
20
|
-
} : undefined,
|
|
21
17
|
challenge: (challenge === null || challenge === void 0 ? void 0 : challenge.enabled) ? { enabled: true } : undefined,
|
|
22
18
|
timeouts,
|
|
23
19
|
silent: false, // Enable console logs for debugging
|