diff --git a/launcher/package.json b/launcher/package.json index a4b5cffc1b..2ea3c99180 100755 --- a/launcher/package.json +++ b/launcher/package.json @@ -7,21 +7,21 @@ "scripts": { "serve": "vue-cli-service serve --port 8081", "build": "vue-cli-service build", + "test:unit": "jest '(\\.test|\\.spec)\\.js' --coverage", "lint": "vue-cli-service lint", + "backend:watch": "nodemon --watch 'src/backend' --exec 'npm run electron:serve'", "build-themes": "node-sass src/styles/themes -o public/themes", "electron:build": "vue-cli-service electron:build", "electron:serve": "vue-cli-service electron:serve", + "format": "prettier . --write", + "lint:fix": "eslint --ext .js,.vue --ignore-path ../.gitignore --fix src", "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", - "test:unit": "jest '(\\.test|\\.spec)\\.js' --coverage", - "test:int": "jest '\\.int\\.js'", + "stereum": "concurrently \"npm:electron:serve\" \"npm:watch:css\"", "test": "jest", "test:coverage": "jest --coverage", - "watch:css": "npx tailwindcss -i ./src/main.css -o ./public/output.css --watch", - "lint:fix": "eslint --ext .js,.vue --ignore-path ../.gitignore --fix src", - "stereum": "concurrently \"npm:electron:serve\" \"npm:watch:css\"", - "backend:watch": "nodemon --watch 'src/backend' --exec 'npm run electron:serve'", - "format": "prettier . --write" + "test:int": "jest '\\.int\\.js'", + "watch:css": "npx tailwindcss -i ./src/main.css -o ./public/output.css --watch" }, "dependencies": { "@headlessui/vue": "^1.7.16", @@ -32,6 +32,9 @@ "@vue/cli": "^5.0.8", "@vue/cli-service": "^5.0.8", "@vue/compiler-sfc": "^3.2.33", + "@wagmi/connectors": "^4.1.24", + "@wagmi/core": "^2.6.15", + "@web3modal/wagmi": "^4.1.5", "animate.css": "^4.1.1", "axios": "^1.3.4", "electron-builder": "^23.0.3", @@ -48,7 +51,9 @@ "semver": "^7.6.0", "ssh2": "^1.1.0", "swiper": "^11.0.6", + "viem": "^2.9.9", "vue": "^3.2.33", + "vue-class-component": "^8.0.0-0", "vue-i18n": "9.2.2", "vue-router": "^4.0.15", "vue3-carousel": "^0.3.1", @@ -63,7 +68,6 @@ "@tailwindcss/forms": "^0.5.2", "@tailwindcss/typography": "^0.5.2", "@types/xterm": "^3.0.0", - "@vue/cli-plugin-babel": "~5.0.4", "@vue/test-utils": "^2.3.1", "@vue/vue3-jest": "^29.2.3", "@vueuse/core": "^10.2.1", @@ -83,6 +87,7 @@ "prettier": "^2.8.4", "tailwind-scrollbar": "^3.0.4", "tailwindcss": "^3.2.7", + "typescript": "^5.0.4", "vue-cli-plugin-electron-builder": "^3.0.0-alpha.4", "vue-loader": "^17.0.1", "vue-template-compiler": "^2.6.14" diff --git a/launcher/public/output.css b/launcher/public/output.css index cbcfa20a02..6ccb98cfd5 100755 --- a/launcher/public/output.css +++ b/launcher/public/output.css @@ -1,7 +1,7 @@ @import url("https://fonts.googleapis.com/css2?family=Noto+Sans:wght@100;200;300;400;500;600;700;800;900&display=swap"); /* -! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com +! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com */ /* @@ -217,6 +217,8 @@ textarea { /* 1 */ line-height: inherit; /* 1 */ + letter-spacing: inherit; + /* 1 */ color: inherit; /* 1 */ margin: 0; @@ -240,9 +242,9 @@ select { */ button, -[type='button'], -[type='reset'], -[type='submit'] { +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { -webkit-appearance: button; /* 1 */ background-color: transparent; @@ -524,6 +526,10 @@ video { --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; } ::-ms-backdrop{ @@ -574,6 +580,10 @@ video { --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; } ::backdrop{ @@ -624,6 +634,10 @@ video { --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; } ::-webkit-scrollbar { @@ -757,6 +771,10 @@ video { bottom: -2rem; } +.-left-12{ + left: -3rem; +} + .-left-\[1px\]{ left: -1px; } @@ -789,6 +807,10 @@ video { top: -5rem; } +.-top-7{ + top: -1.75rem; +} + .-top-8{ top: -2rem; } @@ -873,6 +895,10 @@ video { left: 8rem; } +.left-4{ + left: 1rem; +} + .left-\[1\.3rem\]{ left: 1.3rem; } @@ -981,18 +1007,6 @@ video { top: 7rem; } -.-left-12{ - left: -3rem; -} - -.-top-7{ - top: -1.75rem; -} - -.left-4{ - left: 1rem; -} - .-z-10{ z-index: -10; } @@ -1892,6 +1906,10 @@ video { max-height: 450px; } +.max-h-\[491px\]{ + max-height: 491px; +} + .max-h-\[503px\]{ max-height: 503px; } @@ -1904,10 +1922,6 @@ video { max-height: 100%; } -.max-h-\[491px\]{ - max-height: 491px; -} - .min-h-11{ min-height: 2.75rem; } @@ -2088,6 +2102,10 @@ video { width: 75%; } +.w-96{ + width: 24rem; +} + .w-\[100px\]{ width: 100px; } @@ -2287,6 +2305,12 @@ video { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +.translate-x-full{ + --tw-translate-x: 100%; + -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + .-rotate-90{ --tw-rotate: -90deg; -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); @@ -3308,6 +3332,11 @@ video { background-color: rgb(22 23 23 / var(--tw-bg-opacity)); } +.bg-\[\#16181b\]{ + --tw-bg-opacity: 1; + background-color: rgb(22 24 27 / var(--tw-bg-opacity)); +} + .bg-\[\#171D22\]{ --tw-bg-opacity: 1; background-color: rgb(23 29 34 / var(--tw-bg-opacity)); @@ -3368,6 +3397,11 @@ video { background-color: rgb(27 29 31 / var(--tw-bg-opacity)); } +.bg-\[\#1b1d20\]{ + --tw-bg-opacity: 1; + background-color: rgb(27 29 32 / var(--tw-bg-opacity)); +} + .bg-\[\#1b3231\]{ --tw-bg-opacity: 1; background-color: rgb(27 50 49 / var(--tw-bg-opacity)); @@ -3403,6 +3437,11 @@ video { background-color: rgb(31 33 35 / var(--tw-bg-opacity)); } +.bg-\[\#1f2226\]{ + --tw-bg-opacity: 1; + background-color: rgb(31 34 38 / var(--tw-bg-opacity)); +} + .bg-\[\#202123\]{ --tw-bg-opacity: 1; background-color: rgb(32 33 35 / var(--tw-bg-opacity)); @@ -3812,21 +3851,6 @@ video { background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } -.bg-\[\#16181b\]{ - --tw-bg-opacity: 1; - background-color: rgb(22 24 27 / var(--tw-bg-opacity)); -} - -.bg-\[\#1b1d20\]{ - --tw-bg-opacity: 1; - background-color: rgb(27 29 32 / var(--tw-bg-opacity)); -} - -.bg-\[\#1f2226\]{ - --tw-bg-opacity: 1; - background-color: rgb(31 34 38 / var(--tw-bg-opacity)); -} - .bg-opacity-80{ --tw-bg-opacity: 0.8; } @@ -5481,6 +5505,11 @@ html body { --tw-shadow: var(--tw-shadow-colored); } +.hover\:shadow-\[\#1b1d20\]:hover{ + --tw-shadow-color: #1b1d20; + --tw-shadow: var(--tw-shadow-colored); +} + .hover\:shadow-\[\#1e2a29\]:hover{ --tw-shadow-color: #1e2a29; --tw-shadow: var(--tw-shadow-colored); @@ -5501,6 +5530,11 @@ html body { --tw-shadow: var(--tw-shadow-colored); } +.hover\:shadow-gray-800:hover{ + --tw-shadow-color: #1f2937; + --tw-shadow: var(--tw-shadow-colored); +} + .hover\:shadow-gray-900:hover{ --tw-shadow-color: #111827; --tw-shadow: var(--tw-shadow-colored); @@ -5511,16 +5545,6 @@ html body { --tw-shadow: var(--tw-shadow-colored); } -.hover\:shadow-\[\#1b1d20\]:hover{ - --tw-shadow-color: #1b1d20; - --tw-shadow: var(--tw-shadow-colored); -} - -.hover\:shadow-gray-800:hover{ - --tw-shadow-color: #1f2937; - --tw-shadow: var(--tw-shadow-colored); -} - .hover\:brightness-110:hover{ --tw-brightness: brightness(1.1); -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); diff --git a/launcher/src/App.vue b/launcher/src/App.vue index 30232dbf9b..ecc021e2b5 100755 --- a/launcher/src/App.vue +++ b/launcher/src/App.vue @@ -3,9 +3,7 @@ - + diff --git a/launcher/src/components/UI/node-page/components/wallet/WalletBody.vue b/launcher/src/components/UI/node-page/components/wallet/WalletBody.vue new file mode 100644 index 0000000000..48c5db084c --- /dev/null +++ b/launcher/src/components/UI/node-page/components/wallet/WalletBody.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/launcher/src/components/UI/node-page/sections/WalletSection.vue b/launcher/src/components/UI/node-page/sections/WalletSection.vue new file mode 100644 index 0000000000..ad41862f3a --- /dev/null +++ b/launcher/src/components/UI/node-page/sections/WalletSection.vue @@ -0,0 +1,7 @@ + + + diff --git a/launcher/src/components/UI/server-management/components/modals/IpScanner.vue b/launcher/src/components/UI/server-management/components/modals/IpScanner.vue deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/launcher/src/composables/useWeb3.js b/launcher/src/composables/useWeb3.js new file mode 100644 index 0000000000..6440a20ae3 --- /dev/null +++ b/launcher/src/composables/useWeb3.js @@ -0,0 +1,52 @@ +import { ref } from "vue"; +import { createWeb3Modal, defaultWagmiConfig } from "@web3modal/wagmi"; +import { mainnet, arbitrum } from "viem/chains"; +import { reconnect } from "@wagmi/core"; + +export function useWeb3() { + // Configuration details + const projectId = "51f595d21a6e919111f612da72d5ed09"; + const metadata = { + name: "Web3Modal", + description: "Web3Modal Example", + url: "https://web3modal.com", + icons: ["https://avatars.githubusercontent.com/u/37784886"], + }; + + // Define reactive properties if needed + const chains = ref([mainnet]); + const wagmiConfig = ref( + defaultWagmiConfig({ + chains: chains.value, + projectId, + metadata, + }) + ); + + // Methods + const setupWeb3Modal = () => { + reconnect(wagmiConfig.value); + + createWeb3Modal({ + themeMode: "light", + themeVariables: { + "--w3m-color-mix": "#00BB7F", + "--w3m-border-radius-master": "0.5rem", + }, + wagmiConfig: wagmiConfig.value, + projectId, + enableAnalytics: true, + enableOnramp: true, + }); + }; + + // Run setupWeb3Modal or expose it so it can be run from a component + // setupWeb3Modal(); + + // Return reactive properties and methods + return { + chains, + wagmiConfig, + setupWeb3Modal, + }; +} diff --git a/launcher/src/shims-vue.d.ts b/launcher/src/shims-vue.d.ts new file mode 100644 index 0000000000..3804a43e2f --- /dev/null +++ b/launcher/src/shims-vue.d.ts @@ -0,0 +1,6 @@ +/* eslint-disable */ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/launcher/src/store/nodeHeader.js b/launcher/src/store/nodeHeader.js index dd11409c9d..f376894621 100755 --- a/launcher/src/store/nodeHeader.js +++ b/launcher/src/store/nodeHeader.js @@ -20,6 +20,7 @@ export const useNodeHeader = defineStore("nodeHeader", { notificationModalIsActive: false, isStakeGuideActive: false, isTutorialActive: false, + displayWalletConnectModal: false, //Menu Modals end importBoxModel: "", passwordBoxModel: "", @@ -100,6 +101,9 @@ export const useNodeHeader = defineStore("nodeHeader", { }, setMenuModal(name) { switch (name) { + case "Wallet": + this.displayWalletConnectModal = true; + break; case "Available Update": this.displayUpdatePanel = true; break; @@ -129,6 +133,7 @@ export const useNodeHeader = defineStore("nodeHeader", { this.notificationModalIsActive = false; this.isStakeGuideActive = false; this.isTutorialActive = false; + this.displayWalletConnectModal = false; break; default: console.error("No modal"); diff --git a/launcher/tsconfig.json b/launcher/tsconfig.json new file mode 100644 index 0000000000..1a88af5967 --- /dev/null +++ b/launcher/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "useDefineForClassFields": true, + "sourceMap": true, + "baseUrl": ".", + "types": [ + "webpack-env" + ], + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +}