@n1xyz/wallet-widget 0.0.1
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/.eslintrc.js +29 -0
- package/dist/Common/NIcon.d.ts +1 -0
- package/dist/Common/NIcon.js +7 -0
- package/dist/Logic/getPseudoName.d.ts +1 -0
- package/dist/Logic/getPseudoName.js +5825 -0
- package/dist/Logic/utils.d.ts +20 -0
- package/dist/Logic/utils.js +199 -0
- package/dist/Logic/words.d.ts +9 -0
- package/dist/Logic/words.js +93571 -0
- package/dist/Modal/BackButton.d.ts +3 -0
- package/dist/Modal/BackButton.js +13 -0
- package/dist/Modal/ConnectView.d.ts +1 -0
- package/dist/Modal/ConnectView.js +71 -0
- package/dist/Modal/CreateSessionView.d.ts +1 -0
- package/dist/Modal/CreateSessionView.js +236 -0
- package/dist/Modal/CreateUserView.d.ts +1 -0
- package/dist/Modal/CreateUserView.js +160 -0
- package/dist/Modal/ModalHeader.d.ts +1 -0
- package/dist/Modal/ModalHeader.js +9 -0
- package/dist/Modal/N1WalletModal.d.ts +1 -0
- package/dist/Modal/N1WalletModal.js +232 -0
- package/dist/Modal/NoWhitelistView.d.ts +1 -0
- package/dist/Modal/NoWhitelistView.js +29 -0
- package/dist/Modal/Sidebar/N1Sidebar.d.ts +1 -0
- package/dist/Modal/Sidebar/N1Sidebar.js +38 -0
- package/dist/Modal/SigningView.d.ts +1 -0
- package/dist/Modal/SigningView.js +5 -0
- package/dist/Modal/SuccessView.d.ts +1 -0
- package/dist/Modal/SuccessView.js +10 -0
- package/dist/Provider/LazyWalletProvider.d.ts +1 -0
- package/dist/Provider/LazyWalletProvider.js +160 -0
- package/dist/Provider/N1WalletProvider.d.ts +2 -0
- package/dist/Provider/N1WalletProvider.js +219 -0
- package/dist/Provider/context.d.ts +5 -0
- package/dist/Provider/context.js +4 -0
- package/dist/Provider/hooks.d.ts +2 -0
- package/dist/Provider/hooks.js +16 -0
- package/dist/Provider/icons/CoinbaseWalletIcon.d.ts +1 -0
- package/dist/Provider/icons/CoinbaseWalletIcon.js +4 -0
- package/dist/Provider/icons/ConnectionDotsSVG.d.ts +1 -0
- package/dist/Provider/icons/ConnectionDotsSVG.js +4 -0
- package/dist/Provider/icons/MetamaskIcon.d.ts +1 -0
- package/dist/Provider/icons/MetamaskIcon.js +4 -0
- package/dist/Provider/icons/PhantomIcon.d.ts +1 -0
- package/dist/Provider/icons/PhantomIcon.js +4 -0
- package/dist/Provider/icons/UserIcon.d.ts +1 -0
- package/dist/Provider/icons/UserIcon.js +4 -0
- package/dist/Provider/icons/WalletConnectIcon.d.ts +1 -0
- package/dist/Provider/icons/WalletConnectIcon.js +4 -0
- package/dist/Provider/index.d.ts +3 -0
- package/dist/Provider/index.js +3 -0
- package/dist/Provider/types.d.ts +68 -0
- package/dist/Provider/types.js +14 -0
- package/dist/WidgetButton/N1ConnectButton.d.ts +5 -0
- package/dist/WidgetButton/N1ConnectButton.js +24 -0
- package/dist/components/AnimatedButton.d.ts +9 -0
- package/dist/components/AnimatedButton.js +5 -0
- package/dist/components/LazyLoadWrapper.d.ts +8 -0
- package/dist/components/LazyLoadWrapper.js +17 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +2 -0
- package/dist/errors/types.d.ts +21 -0
- package/dist/errors/types.js +64 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/main.css +1 -0
- package/dist/utils/lazyLoad.d.ts +3 -0
- package/dist/utils/lazyLoad.js +9 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +106 -0
- package/dist/utils/react-shim.d.ts +2 -0
- package/dist/utils/react-shim.js +6 -0
- package/package.json +46 -0
- package/postcss.config.js +6 -0
- package/src/Logic/getPseudoName.ts +5832 -0
- package/src/Logic/utils.ts +162 -0
- package/src/Logic/words.ts +93571 -0
- package/src/Modal/BackButton.tsx +23 -0
- package/src/Modal/ConnectView.tsx +88 -0
- package/src/Modal/CreateSessionView.tsx +242 -0
- package/src/Modal/CreateUserView.tsx +195 -0
- package/src/Modal/ModalHeader.tsx +64 -0
- package/src/Modal/N1WalletModal.tsx +275 -0
- package/src/Modal/NoWhitelistView.tsx +61 -0
- package/src/Modal/Sidebar/N1Sidebar.tsx +172 -0
- package/src/Modal/SigningView.tsx +18 -0
- package/src/Modal/SuccessView.tsx +36 -0
- package/src/Provider/LazyWalletProvider.tsx +136 -0
- package/src/Provider/N1WalletProvider.tsx +208 -0
- package/src/Provider/context.ts +11 -0
- package/src/Provider/hooks.ts +22 -0
- package/src/Provider/icons/CoinbaseWalletIcon.tsx +27 -0
- package/src/Provider/icons/ConnectionDotsSVG.tsx +19 -0
- package/src/Provider/icons/MetamaskIcon.tsx +58 -0
- package/src/Provider/icons/PhantomIcon.tsx +26 -0
- package/src/Provider/icons/UserIcon.tsx +15 -0
- package/src/Provider/icons/WalletConnectIcon.tsx +15 -0
- package/src/Provider/index.ts +3 -0
- package/src/Provider/types.ts +77 -0
- package/src/WidgetButton/N1ConnectButton.tsx +72 -0
- package/src/components/LazyLoadWrapper.tsx +19 -0
- package/src/config.ts +2 -0
- package/src/errors/types.ts +49 -0
- package/src/index.ts +5 -0
- package/src/main.css +3 -0
- package/src/styles/main.css +3 -0
- package/src/utils/lazyLoad.ts +12 -0
- package/src/utils/logger.ts +98 -0
- package/src/utils/react-shim.js +8 -0
- package/tailwind.config.js +44 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useN1WalletInternalContext } from '../Provider/hooks';
|
|
3
|
+
import { N1ModalViewMode } from '../Provider/types';
|
|
4
|
+
export function BackButton(props) {
|
|
5
|
+
var _a = useN1WalletInternalContext(), setViewMode = _a.setViewMode, dynamicHandleLogOut = _a.dynamicHandleLogOut;
|
|
6
|
+
function back() {
|
|
7
|
+
// todo: disconnect
|
|
8
|
+
console.log('back');
|
|
9
|
+
dynamicHandleLogOut();
|
|
10
|
+
setViewMode(N1ModalViewMode.Connect);
|
|
11
|
+
}
|
|
12
|
+
return (_jsx("button", { className: "w-full py-4 border rounded-[18px] cursor-pointer duration-300 hover:opacity-80 bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-200 dark:border-neutral-700", onClick: props.onClick || back, children: "Back" }));
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ConnectView(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
38
|
+
import { useN1WalletInternalContext } from '../Provider/hooks';
|
|
39
|
+
import { ModalHeader } from './ModalHeader';
|
|
40
|
+
import { WalletError, WalletErrorCode } from '../errors/types';
|
|
41
|
+
import { IoMdWallet } from 'react-icons/io';
|
|
42
|
+
import clsx from 'clsx';
|
|
43
|
+
export function ConnectView() {
|
|
44
|
+
var _this = this;
|
|
45
|
+
var _a = useN1WalletInternalContext(), showDynamicWidget = _a.showDynamicWidget, handleError = _a.handleError;
|
|
46
|
+
var handleConnect = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
47
|
+
return __generator(this, function (_a) {
|
|
48
|
+
try {
|
|
49
|
+
if (!showDynamicWidget) {
|
|
50
|
+
handleError(new WalletError(WalletErrorCode.CONNECTION_FAILED, 'Wallet connection not ready', { reason: 'Dynamic SDK not initialized' }));
|
|
51
|
+
return [2 /*return*/];
|
|
52
|
+
}
|
|
53
|
+
showDynamicWidget(true);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof WalletError) {
|
|
57
|
+
handleError(error);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
handleError(new WalletError(WalletErrorCode.CONNECTION_FAILED, 'Failed to connect to wallet', { originalError: error }));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return [2 /*return*/];
|
|
64
|
+
});
|
|
65
|
+
}); };
|
|
66
|
+
return (_jsxs("div", { className: "rounded-[25px] shadow-lg w-96 p-5 bg-white dark:bg-neutral-900 dark:text-stone-200", children: [_jsx(ModalHeader, {}), _jsx("div", { className: "my-2", children: _jsxs("div", { className: "space-y-2", children: [_jsxs(AnimatedArrowButton, { onClick: handleConnect, buttonClassName: "w-full py-4 border rounded-[18px] text-white bg-neutral-900 dark:bg-white dark:text-black cursor-pointer hover:opacity-80 transition-all flex items-center justify-center group", children: [_jsx(IoMdWallet, { className: "ml-4 mr-2 w-5 h-5" }), "Continue with Wallet"] }), _jsx("button", { className: "w-full py-4 border rounded-[18px] bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-200 dark:border-neutral-700 cursor-not-allowed", disabled: true, children: "Continue with Google (soon)" }), _jsx("button", { className: "w-full py-4 border rounded-[18px] bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-200 dark:border-neutral-700 cursor-not-allowed", disabled: true, children: "Continue with Email (soon)" })] }) })] }));
|
|
67
|
+
}
|
|
68
|
+
function AnimatedArrowButton(_a) {
|
|
69
|
+
var children = _a.children, onClick = _a.onClick, buttonClassName = _a.buttonClassName;
|
|
70
|
+
return (_jsxs("button", { className: clsx(buttonClassName, 'flex flex-row'), onClick: onClick, children: [children, _jsx("span", { className: "ml-4 opacity-0 transform translate-x-[-10px] transition-all duration-200 group-hover:opacity-100 group-hover:translate-x-0", children: "\u2192" })] }));
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function CreateSessionView(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
38
|
+
import { useEffect, useState } from 'react';
|
|
39
|
+
import { useN1WalletContext, useN1WalletInternalContext, } from '../Provider/hooks';
|
|
40
|
+
import { ModalHeader } from './ModalHeader';
|
|
41
|
+
import { N1ModalViewMode } from '../Provider/types';
|
|
42
|
+
import { BackButton } from './BackButton';
|
|
43
|
+
import { createWebSession, generateSessionKeyPair, getUser, storeSessionKeysInLocalStorage, } from '../Logic/utils';
|
|
44
|
+
import { signEd25519 } from '@n1xyz/nts-sdk';
|
|
45
|
+
import { logger } from '../utils/logger';
|
|
46
|
+
import { WalletError, WalletErrorCode } from '../errors/types';
|
|
47
|
+
export function CreateSessionView() {
|
|
48
|
+
var _this = this;
|
|
49
|
+
var _a = useState(null), NTSComponents = _a[0], setNTSComponents = _a[1];
|
|
50
|
+
var _b = useState(null), keyPair = _b[0], setKeyPair = _b[1];
|
|
51
|
+
var _c = useN1WalletInternalContext(), setViewMode = _c.setViewMode, setUsername = _c.setUsername, setStartClosingLogin = _c.setStartClosingLogin, setIsConnected = _c.setIsConnected, dynamicWallet = _c.dynamicWallet, handleError = _c.handleError, setSessionPubKey = _c.setSessionPubKey, setSignMessageWithSessionKey = _c.setSignMessageWithSessionKey, dynamicHandleLogOut = _c.dynamicHandleLogOut, setDynamicWallet = _c.setDynamicWallet, setAddress = _c.setAddress, setSignMessageWithWalletKey = _c.setSignMessageWithWalletKey;
|
|
52
|
+
var _d = useN1WalletContext(), ntsInterface = _d.ntsInterface, walletPubKey = _d.walletPubKey, address = _d.address;
|
|
53
|
+
// Initialize NTS SDK and generate key pair
|
|
54
|
+
useEffect(function () {
|
|
55
|
+
var loadNTSSDK = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
56
|
+
var _a, Transaction, AdminAction, CoreApps, newKeyPair, error_1;
|
|
57
|
+
return __generator(this, function (_b) {
|
|
58
|
+
switch (_b.label) {
|
|
59
|
+
case 0:
|
|
60
|
+
_b.trys.push([0, 3, , 4]);
|
|
61
|
+
return [4 /*yield*/, import('@n1xyz/nts-sdk')];
|
|
62
|
+
case 1:
|
|
63
|
+
_a = _b.sent(), Transaction = _a.Transaction, AdminAction = _a.AdminAction, CoreApps = _a.CoreApps;
|
|
64
|
+
setNTSComponents({ Transaction: Transaction, AdminAction: AdminAction, CoreApps: CoreApps });
|
|
65
|
+
return [4 /*yield*/, generateSessionKeyPair()];
|
|
66
|
+
case 2:
|
|
67
|
+
newKeyPair = _b.sent();
|
|
68
|
+
setKeyPair(newKeyPair);
|
|
69
|
+
return [3 /*break*/, 4];
|
|
70
|
+
case 3:
|
|
71
|
+
error_1 = _b.sent();
|
|
72
|
+
handleError(new WalletError(WalletErrorCode.CONNECTION_FAILED, 'Failed to initialize NTS SDK', { originalError: error_1 }));
|
|
73
|
+
return [3 /*break*/, 4];
|
|
74
|
+
case 4: return [2 /*return*/];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}); };
|
|
78
|
+
loadNTSSDK();
|
|
79
|
+
}, [handleError]);
|
|
80
|
+
var signWithWallet = function (msg) { return __awaiter(_this, void 0, void 0, function () {
|
|
81
|
+
var signature, binaryString, signatureUint8Array, i, sig, error_2;
|
|
82
|
+
return __generator(this, function (_a) {
|
|
83
|
+
switch (_a.label) {
|
|
84
|
+
case 0:
|
|
85
|
+
console.log('zooooooooooooooo', msg);
|
|
86
|
+
_a.label = 1;
|
|
87
|
+
case 1:
|
|
88
|
+
_a.trys.push([1, 5, , 6]);
|
|
89
|
+
if (!dynamicWallet) {
|
|
90
|
+
throw new WalletError(WalletErrorCode.WALLET_NOT_FOUND, 'Wallet not found for signing');
|
|
91
|
+
}
|
|
92
|
+
if (!(dynamicWallet.chain === 'SOL')) return [3 /*break*/, 3];
|
|
93
|
+
return [4 /*yield*/, dynamicWallet.signMessage(msg)];
|
|
94
|
+
case 2:
|
|
95
|
+
signature = _a.sent();
|
|
96
|
+
binaryString = atob(signature);
|
|
97
|
+
signatureUint8Array = new Uint8Array(binaryString.length);
|
|
98
|
+
for (i = 0; i < binaryString.length; i++) {
|
|
99
|
+
signatureUint8Array[i] = binaryString.charCodeAt(i);
|
|
100
|
+
}
|
|
101
|
+
return [2 /*return*/, signatureUint8Array];
|
|
102
|
+
case 3: return [4 /*yield*/, dynamicWallet.signMessage(msg)];
|
|
103
|
+
case 4:
|
|
104
|
+
sig = (_a.sent());
|
|
105
|
+
logger.debug('Wallet signature received', { signature: sig });
|
|
106
|
+
return [2 /*return*/, Uint8Array.from(Buffer.from(sig.slice(2), 'hex'))];
|
|
107
|
+
case 5:
|
|
108
|
+
error_2 = _a.sent();
|
|
109
|
+
throw new WalletError(WalletErrorCode.USER_REJECTED, 'Failed to sign message with wallet', { originalError: error_2 });
|
|
110
|
+
case 6: return [2 /*return*/];
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}); };
|
|
114
|
+
var handleSign = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
115
|
+
var sessionKeyHex, transactionData, tx, txRes, _1, signFn_1, user, error_3;
|
|
116
|
+
var _this = this;
|
|
117
|
+
return __generator(this, function (_a) {
|
|
118
|
+
switch (_a.label) {
|
|
119
|
+
case 0:
|
|
120
|
+
logger.debug('handleSign');
|
|
121
|
+
if (!NTSComponents || !keyPair) {
|
|
122
|
+
logger.warn('Required components not initialized');
|
|
123
|
+
return [2 /*return*/];
|
|
124
|
+
}
|
|
125
|
+
setViewMode(N1ModalViewMode.Signing);
|
|
126
|
+
_a.label = 1;
|
|
127
|
+
case 1:
|
|
128
|
+
_a.trys.push([1, 9, , 10]);
|
|
129
|
+
sessionKeyHex = Buffer.from(keyPair.publicKey).toString('hex');
|
|
130
|
+
logger.debug('Generated session key', { sessionKey: sessionKeyHex });
|
|
131
|
+
transactionData = {
|
|
132
|
+
appId: NTSComponents.CoreApps.Admin,
|
|
133
|
+
action: NTSComponents.AdminAction.addSessionKey,
|
|
134
|
+
framework: 'ts',
|
|
135
|
+
data: [
|
|
136
|
+
{
|
|
137
|
+
sessionKey: sessionKeyHex,
|
|
138
|
+
appId: 'hub',
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
setSignMessageWithWalletKey(signWithWallet);
|
|
143
|
+
tx = new NTSComponents.Transaction(transactionData, walletPubKey);
|
|
144
|
+
return [4 /*yield*/, tx.signWithWalletFunction(signWithWallet)];
|
|
145
|
+
case 2:
|
|
146
|
+
_a.sent();
|
|
147
|
+
_a.label = 3;
|
|
148
|
+
case 3:
|
|
149
|
+
_a.trys.push([3, 5, , 6]);
|
|
150
|
+
return [4 /*yield*/, ntsInterface.sendTransaction(tx, tx.signature, walletPubKey)];
|
|
151
|
+
case 4:
|
|
152
|
+
txRes = _a.sent();
|
|
153
|
+
if (txRes.success) {
|
|
154
|
+
logger.debug('txRes', txRes);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
logger.debug('txRes', txRes);
|
|
158
|
+
throw new WalletError(WalletErrorCode.TRANSACTION_FAILED, 'Transaction failed');
|
|
159
|
+
}
|
|
160
|
+
return [3 /*break*/, 6];
|
|
161
|
+
case 5:
|
|
162
|
+
_1 = _a.sent();
|
|
163
|
+
throw new WalletError(WalletErrorCode.TRANSACTION_FAILED, 'Transaction did not succeed');
|
|
164
|
+
case 6:
|
|
165
|
+
signFn_1 = function (message) { return __awaiter(_this, void 0, void 0, function () {
|
|
166
|
+
var _2;
|
|
167
|
+
return __generator(this, function (_a) {
|
|
168
|
+
switch (_a.label) {
|
|
169
|
+
case 0:
|
|
170
|
+
_a.trys.push([0, 2, , 3]);
|
|
171
|
+
return [4 /*yield*/, signEd25519(message, keyPair.privateKey)];
|
|
172
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
173
|
+
case 2:
|
|
174
|
+
_2 = _a.sent();
|
|
175
|
+
console.log('error', _2);
|
|
176
|
+
throw _2;
|
|
177
|
+
case 3: return [2 /*return*/];
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}); };
|
|
181
|
+
// Store session keys
|
|
182
|
+
logger.debug('Storing session keys');
|
|
183
|
+
storeSessionKeysInLocalStorage({
|
|
184
|
+
privKey: keyPair.privateKey,
|
|
185
|
+
walletPublicKey: address,
|
|
186
|
+
chainName: dynamicWallet.chain,
|
|
187
|
+
});
|
|
188
|
+
setSessionPubKey(keyPair.publicKey);
|
|
189
|
+
setSignMessageWithSessionKey(function () { return signFn_1; });
|
|
190
|
+
// Initialize web session with Argus who verifies that the session is
|
|
191
|
+
// registered with Core, and if so, grants you access to its user metadata db
|
|
192
|
+
return [4 /*yield*/, createWebSession(signFn_1, keyPair.publicKey, walletPubKey)];
|
|
193
|
+
case 7:
|
|
194
|
+
// Initialize web session with Argus who verifies that the session is
|
|
195
|
+
// registered with Core, and if so, grants you access to its user metadata db
|
|
196
|
+
_a.sent();
|
|
197
|
+
return [4 /*yield*/, getUser()];
|
|
198
|
+
case 8:
|
|
199
|
+
user = _a.sent();
|
|
200
|
+
if (user === null || user === void 0 ? void 0 : user.name) {
|
|
201
|
+
logger.info('Existing user found, completing login');
|
|
202
|
+
setUsername(user.name);
|
|
203
|
+
localStorage.setItem("n1_".concat(address, "_username"), user.name);
|
|
204
|
+
setStartClosingLogin(true);
|
|
205
|
+
setIsConnected(true);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
logger.info('No user found, transitioning to user creation');
|
|
209
|
+
setViewMode(N1ModalViewMode.CreatingUser);
|
|
210
|
+
}
|
|
211
|
+
return [3 /*break*/, 10];
|
|
212
|
+
case 9:
|
|
213
|
+
error_3 = _a.sent();
|
|
214
|
+
logger.error('Session creation failed:', error_3);
|
|
215
|
+
if (error_3.name === 'WalletError') {
|
|
216
|
+
handleError(error_3);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
handleError(new WalletError(WalletErrorCode.CONNECTION_FAILED, 'Failed to create session', { originalError: JSON.stringify(error_3) }));
|
|
220
|
+
}
|
|
221
|
+
setViewMode(N1ModalViewMode.CreateSession);
|
|
222
|
+
return [3 /*break*/, 10];
|
|
223
|
+
case 10: return [2 /*return*/];
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}); };
|
|
227
|
+
return (_jsxs("div", { className: "rounded-[25px] shadow-lg w-96 p-5 bg-white dark:bg-neutral-900 text-neutral-900 dark:text-stone-200", children: [_jsx(ModalHeader, {}), _jsx("div", { className: "rounded-[25px] overflow-hidden mb-4", children: _jsx("img", { src: "https://cdn.midjourney.com/17b152e3-2c93-4d00-b4cc-860d787a4994/0_2.png", className: "w-full", alt: "Session creation illustration" }) }), _jsx("div", { className: "my-2", children: _jsxs("div", { className: "space-y-2", children: [_jsx("button", { className: "w-full py-4 border rounded-[18px] cursor-pointer duration-300 hover:opacity-80 text-white bg-neutral-900 dark:bg-white dark:text-black disabled:opacity-50 disabled:cursor-not-allowed", onClick: handleSign, disabled: !NTSComponents || !keyPair, children: "Authenticate" }), _jsx(BackButton, { onClick: function () {
|
|
228
|
+
logger.debug('BackButton clicked');
|
|
229
|
+
// Log out wallet
|
|
230
|
+
setDynamicWallet(null);
|
|
231
|
+
setAddress('');
|
|
232
|
+
dynamicHandleLogOut();
|
|
233
|
+
// Set view mode to connect
|
|
234
|
+
setViewMode(N1ModalViewMode.Connect);
|
|
235
|
+
} })] }) })] }));
|
|
236
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function CreateUserView(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
38
|
+
import BlockiesSvg from 'blockies-react-svg';
|
|
39
|
+
import { useState } from 'react';
|
|
40
|
+
import { getPseudoName } from '../Logic/getPseudoName';
|
|
41
|
+
import { createUser } from '../Logic/utils';
|
|
42
|
+
import { useN1WalletContext, useN1WalletInternalContext, } from '../Provider/hooks';
|
|
43
|
+
import { N1ModalViewMode } from '../Provider/types';
|
|
44
|
+
import { WalletError, WalletErrorCode } from '../errors/types';
|
|
45
|
+
import { logger } from '../utils/logger';
|
|
46
|
+
import { ModalHeader } from './ModalHeader';
|
|
47
|
+
export function CreateUserView() {
|
|
48
|
+
var _a = useN1WalletInternalContext(), setViewMode = _a.setViewMode, setIsConnected = _a.setIsConnected, setUsername = _a.setUsername, setStartClosingLogin = _a.setStartClosingLogin, handleError = _a.handleError;
|
|
49
|
+
var address = useN1WalletContext().address;
|
|
50
|
+
var close = function () {
|
|
51
|
+
setStartClosingLogin(true);
|
|
52
|
+
};
|
|
53
|
+
var _b = useState(getPseudoName(address)), usernameLocal = _b[0], setUsernameLocalLocal = _b[1];
|
|
54
|
+
var _c = useState(''), error = _c[0], setError = _c[1];
|
|
55
|
+
// TODO: not sure what this is for??? so i commented it out for now
|
|
56
|
+
// useEffect(() => {
|
|
57
|
+
// const initializeSession = async () => {
|
|
58
|
+
// try {
|
|
59
|
+
// logger.debug("Initializing session");
|
|
60
|
+
// logger.debug("signMessageWithSessionKey", signMessageWithSessionKey);
|
|
61
|
+
// logger.debug("sessionPubKey", sessionPubKey);
|
|
62
|
+
// logger.debug("walletPubKey", walletPubKey);
|
|
63
|
+
// // Silently return if session keys are not available yet
|
|
64
|
+
// if (!signMessageWithSessionKey || !sessionPubKey || !walletPubKey) {
|
|
65
|
+
// return;
|
|
66
|
+
// }
|
|
67
|
+
// await createWebSession(
|
|
68
|
+
// signMessageWithSessionKey,
|
|
69
|
+
// sessionPubKey,
|
|
70
|
+
// walletPubKey
|
|
71
|
+
// );
|
|
72
|
+
// const user = await getUser();
|
|
73
|
+
// if (user) {
|
|
74
|
+
// const usernameDb = user.name;
|
|
75
|
+
// setIsConnected(true);
|
|
76
|
+
// setUsername(usernameDb);
|
|
77
|
+
// localStorage.setItem("n1_" + address + "_username", usernameDb);
|
|
78
|
+
// }
|
|
79
|
+
// } catch (error) {
|
|
80
|
+
// if (error instanceof WalletError) {
|
|
81
|
+
// handleError(error);
|
|
82
|
+
// } else {
|
|
83
|
+
// handleError(
|
|
84
|
+
// new WalletError(
|
|
85
|
+
// WalletErrorCode.UNKNOWN,
|
|
86
|
+
// "Failed to initialize user session",
|
|
87
|
+
// { originalError: error }
|
|
88
|
+
// )
|
|
89
|
+
// );
|
|
90
|
+
// }
|
|
91
|
+
// }
|
|
92
|
+
// };
|
|
93
|
+
// initializeSession();
|
|
94
|
+
// }, [
|
|
95
|
+
// signMessageWithSessionKey,
|
|
96
|
+
// sessionPubKey,
|
|
97
|
+
// walletPubKey,
|
|
98
|
+
// address,
|
|
99
|
+
// setIsConnected,
|
|
100
|
+
// setUsername,
|
|
101
|
+
// setViewMode,
|
|
102
|
+
// handleError,
|
|
103
|
+
// ]);
|
|
104
|
+
function validateUsername() {
|
|
105
|
+
if (!usernameLocal) {
|
|
106
|
+
setError('Username cannot be blank.');
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
if (!/^[a-zA-Z0-9-]+$/.test(usernameLocal)) {
|
|
110
|
+
setError('Username must be alphanumeric.');
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
setError('');
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
function handleCreate() {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
118
|
+
var error_1;
|
|
119
|
+
return __generator(this, function (_a) {
|
|
120
|
+
switch (_a.label) {
|
|
121
|
+
case 0:
|
|
122
|
+
logger.debug('Creating User');
|
|
123
|
+
_a.label = 1;
|
|
124
|
+
case 1:
|
|
125
|
+
_a.trys.push([1, 3, , 4]);
|
|
126
|
+
// TODO: why is this here?
|
|
127
|
+
// await createWebSession(
|
|
128
|
+
// signMessageWithSessionKey,
|
|
129
|
+
// sessionPubKey,
|
|
130
|
+
// walletPubKey
|
|
131
|
+
// );
|
|
132
|
+
if (!validateUsername()) {
|
|
133
|
+
return [2 /*return*/];
|
|
134
|
+
}
|
|
135
|
+
return [4 /*yield*/, createUser(usernameLocal)];
|
|
136
|
+
case 2:
|
|
137
|
+
_a.sent();
|
|
138
|
+
setViewMode(N1ModalViewMode.Success);
|
|
139
|
+
setIsConnected(true);
|
|
140
|
+
setUsername(usernameLocal);
|
|
141
|
+
localStorage.setItem('n1_' + address + '_username', usernameLocal);
|
|
142
|
+
return [3 /*break*/, 4];
|
|
143
|
+
case 3:
|
|
144
|
+
error_1 = _a.sent();
|
|
145
|
+
if (error_1 instanceof WalletError) {
|
|
146
|
+
handleError(error_1);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
handleError(new WalletError(WalletErrorCode.UNKNOWN, 'Failed to create user', {
|
|
150
|
+
originalError: error_1,
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
return [3 /*break*/, 4];
|
|
154
|
+
case 4: return [2 /*return*/];
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return (_jsxs("div", { className: "rounded-[25px] shadow-lg p-5 m-4 bg-white dark:bg-neutral-900 text-neutral-900 dark:text-stone-200", children: [_jsx(ModalHeader, {}), _jsx("div", { className: "flex flex-col items-center justify-center", children: _jsxs("div", { className: "flex mb-2 justify-center sm:justify-between w-full flex-wrap max-w-screen", children: [_jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "w-80 h-80 sm:w-48 sm:h-48 rounded-[25px] flex items-center justify-center relative bg-neutral-100 dark:bg-neutral-800", children: _jsx("div", { className: "overflow-hidden rounded-lg w-80 h-80 sm:w-48 sm:h-48 p-2", children: _jsx(BlockiesSvg, { address: address, className: "drop-shadow w-full h-full rounded-[20px]" }) }) }), _jsx("div", { className: "my-4 w-80 sm:w-48 p-2 border rounded-[15px] text-sm duration-300 bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-200 dark:border-neutral-700", children: "You are creating an account that you can use across all N1." })] }), _jsxs("div", { className: "w-80 flex flex-col items-center sm:items-end justify-between h-full my-2", children: [_jsxs("div", { className: "flex flex-col relative bg-neutral-100 dark:bg-neutral-800 border-neutral-200 dark:border-neutral-700 rounded-[15px] border w-72", children: [_jsx("input", { type: "text", id: "username", placeholder: "Enter your username", value: usernameLocal, onChange: function (e) { return setUsernameLocalLocal(e.target.value); }, className: "p-3 py-4 outline-none focus:ring focus:ring-orange-200 bg-neutral-100 dark:bg-neutral-800 text-neutral-900 dark:text-stone-200 rounded-[15px] border ".concat(error ? 'border-red-500' : 'border-neutral-200 dark:border-neutral-700') }), _jsxs("div", { className: "p-2 flex w-full justify-between text-xs text-neutral-500 dark:text-neutral-400", children: [_jsx("span", { className: "font-bold", children: "Username:" }), " ", usernameLocal] }), _jsxs("div", { className: "px-2 pb-2 flex w-full justify-between text-xs text-neutral-500 dark:text-neutral-400", children: [_jsx("span", { className: "font-bold", children: "Wallet:" }), ' ', address.substring(0, 9) + '...' + address.slice(-3)] })] }), error && (_jsx("div", { className: "mt-2 w-72 p-2 text-red-600 bg-red-100 dark:bg-red-900/20 dark:text-red-400 border border-red-400 rounded-[15px] text-center", children: error })), _jsx("button", { className: "my-4 w-72 py-4 border rounded-[15px] text-white bg-neutral-900 dark:bg-white dark:text-black cursor-pointer duration-300 hover:opacity-80", onClick: handleCreate, children: "Create" }), _jsx("div", { className: "w-72", children: _jsx("button", { className: "w-full py-4 border rounded-[18px] cursor-pointer duration-300 hover:opacity-80 bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-200 dark:border-neutral-700 hover:opacity-80", onClick: close, children: "Close" }) })] })] }) })] }));
|
|
160
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ModalHeader(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useN1WalletInternalContext } from '../Provider/hooks';
|
|
3
|
+
export function ModalHeader() {
|
|
4
|
+
var setStartClosingLogin = useN1WalletInternalContext().setStartClosingLogin;
|
|
5
|
+
var close = function () {
|
|
6
|
+
setStartClosingLogin(true);
|
|
7
|
+
};
|
|
8
|
+
return (_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("div", { className: "w-10", children: _jsxs("svg", { viewBox: "0 0 236 125", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsxs("g", { clipPath: "url(#clip0_239_935)", children: [_jsx("path", { d: "M181.737 0H152.268V29.4694H181.737V0Z", fill: "currentColor" }), _jsx("path", { d: "M57.0683 0H29.4694L0 29.4694V124.674H29.4694V29.4694H44.8619L140.066 124.674H181.74L86.5377 29.4694L57.0683 0Z", fill: "currentColor" }), _jsx("path", { d: "M206.531 29.4694V124.674H236.001V0L206.531 29.4694Z", fill: "currentColor" })] }), _jsx("defs", { children: _jsx("clipPath", { id: "clip0_239_935", children: _jsx("rect", { width: "236", height: "124.674", fill: "white" }) }) })] }) }), _jsx("h2", { className: "text-lg text-neutral-900 dark:text-stone-200", children: "Sign in with N1" })] }), _jsx("button", { onClick: close, className: "text-neutral-400 hover:text-neutral-800 dark:text-neutral-500 dark:hover:text-neutral-300 cursor-pointer text-3xl rounded-full hover:bg-neutral-200 dark:hover:bg-neutral-700 h-10 w-10 p-1 flex items-center justify-center", children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M1 13L13 1M1 1L13 13", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) })] }));
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function N1WalletModal(): import("react/jsx-runtime").JSX.Element | null;
|