From 6b158a6c07d04fdebbda53a7c6a92c5de2dd4e6b Mon Sep 17 00:00:00 2001 From: wendychaung <101249461+doraemonSakura@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:53:20 +0800 Subject: [PATCH 01/12] update icp & icp modals --- src/assets/icons/Running-1.svg | 12 + src/assets/icons/icp.svg | 85 +++++ src/assets/images/Canisters.png | Bin 0 -> 1622 bytes src/assets/images/Cycles.png | Bin 0 -> 3287 bytes src/assets/images/ICPTips.png | Bin 0 -> 31108 bytes src/assets/images/ICPs.png | Bin 0 -> 2733 bytes src/router/middleware.ts | 31 ++ src/views/chainLink/dashboard/dashboard.vue | 36 ++- src/views/chainLink/dashboard/index.vue | 3 +- src/views/chainLink/icp/Install.vue | 181 +++++++++++ src/views/chainLink/icp/addCanister.vue | 128 ++++++++ src/views/chainLink/icp/addControllers.vue | 161 ++++++++++ src/views/chainLink/icp/deleteTips.vue | 177 +++++++++++ src/views/chainLink/icp/detail.vue | 291 ++++++++++++++++++ src/views/chainLink/icp/index.vue | 235 ++++++++++++++ .../chainLink/miwaspace/components/icp.vue | 52 ++++ src/views/chainLink/miwaspace/index.vue | 9 +- 17 files changed, 1396 insertions(+), 5 deletions(-) create mode 100644 src/assets/icons/Running-1.svg create mode 100644 src/assets/icons/icp.svg create mode 100644 src/assets/images/Canisters.png create mode 100644 src/assets/images/Cycles.png create mode 100644 src/assets/images/ICPTips.png create mode 100644 src/assets/images/ICPs.png create mode 100644 src/views/chainLink/icp/Install.vue create mode 100644 src/views/chainLink/icp/addCanister.vue create mode 100644 src/views/chainLink/icp/addControllers.vue create mode 100644 src/views/chainLink/icp/deleteTips.vue create mode 100644 src/views/chainLink/icp/detail.vue create mode 100644 src/views/chainLink/icp/index.vue create mode 100644 src/views/chainLink/miwaspace/components/icp.vue diff --git a/src/assets/icons/Running-1.svg b/src/assets/icons/Running-1.svg new file mode 100644 index 00000000..6440eb4e --- /dev/null +++ b/src/assets/icons/Running-1.svg @@ -0,0 +1,12 @@ + + + Running-1 + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/icp.svg b/src/assets/icons/icp.svg new file mode 100644 index 00000000..f0e28e8e --- /dev/null +++ b/src/assets/icons/icp.svg @@ -0,0 +1,85 @@ + + + + diff --git a/src/assets/images/Canisters.png b/src/assets/images/Canisters.png new file mode 100644 index 0000000000000000000000000000000000000000..127405a3e9cdb1c36fad55a6a32d6ab5dcd58775 GIT binary patch literal 1622 zcmV-c2C4apP)Px*5J^NqRA>e5T5D`nMHHTMce`7xAfXbV?ec@@4~)1fg3c5rYpzLkwzS zG-v|aEf8)nZHbSls6jvz{Q(NZ5Q5z;h@vJ2qm4wOQTT)DZYhv}BDCGdy>t9#+qr$P zkh^!cO-b0KopWZ+ob#P|oH;YQBwT(HvAXA&sfn4#x$NRejEK&mVnn^6~%GEyHbxh*7 zk^t=(ZoAj*xfuax6aRDA9NU%3%(bOmO-whq={(#rOx)!&e8)!lMt?VMLEQyqKkGny zEV9^^VjH&0gy9C|%^scck@0M0xM4rVo7dmT!fFNhAw6Ne0liu;N(({BeBGCkJ&8t^60v8K40eD|4R2BNhB$T+D*5X$O=;*Bux#43oK+Pz6T00?8E>v%DM&s6-5(Wo2I8?um?eMcfFe3* z7`}(I8xECNQk5)H&F7-#7)K^g0&5?szTAvKxnD|pzi1A$N7qjU!d)0?pTb0felHWj zrIm{s_JMg>=^~R*@@+tin#TeM=eQe+fMR5SH7$I9&%>Z{}FPPK5K(JOn zg&+cb0Ead^K$#y%bSJkud;vtk4ygAdX~`&7`Xq$|K)d|H_fW+Gv#md_s&McXH15}R zSOU+q#Ukr8@3kz*0dCz|(wVvNCD!&G3IM=MVHnFRY8!At8u%eHWx!XiHr`REMe^(M zSp9N`_dpcnK>W+!kZ7r&$5NR64FSy@$@UTTm+DF;AoHkhSKt$|qkmbJXwAw9u|=H?x*Y*_ ztc3{H$GfLIIe=v|u&+W6xS^yaU z3c$;;FtS%vERzxq6idr5^@1>?zq-bBh7VQr@^R`&vM z_MODKp?^stj&q^9e^nuL-cweHv7zXD-GQMP)qHdocLw@B3gb;bqk$OGaA<_gqJHaB zR0oLJxv(I}pVbaXDmkrb6{X@W<~WBhkSLl1i9?ZcLDY9`Wco>CtE}13jy$Pd^TJL) z<E>H^Pc-j2g+d{006w=6KGS?j=~F^&k{sd>kV1v>UG+(&f|tfGgwHK7T@N;AY=99aO2w!4?@il zr^RvDQa>e7scQxggKyz+c7IuE@Xu7btlvJ#N?i6&8lB~KCe;WXPi9r%os`<5k=4lM z-@HuPa|P`Vg&QC58TElmFj#YudLO_(2o7xV$PukELN!z0L1y@^M-@&tb?*h}H$vg5 z%W{ENg7^i>_hk6yVE9iu9X%4T@l6)H>aUWh_LlT28tgJTsNFQhA+K$RW1s=r*fzN0TNt5 U2jI;LZvX%Q07*qoM6N<$f_nZCdjJ3c literal 0 HcmV?d00001 diff --git a/src/assets/images/Cycles.png b/src/assets/images/Cycles.png new file mode 100644 index 0000000000000000000000000000000000000000..aecf89356ca3d50380a0cf32d29e252cf9462c9c GIT binary patch literal 3287 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 V0%hoYW~2ZB002ovPDHLkV1irrEhzv1 literal 0 HcmV?d00001 diff --git a/src/assets/images/ICPTips.png b/src/assets/images/ICPTips.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8e383ef76fde3cbea782b60d2f9670e2c6ec34 GIT binary patch literal 31108 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 b6PEjb&i)!Bv|PXR00000NkvXXu0mjfTy=55 literal 0 HcmV?d00001 diff --git a/src/assets/images/ICPs.png b/src/assets/images/ICPs.png new file mode 100644 index 0000000000000000000000000000000000000000..84ccaf0db88e4434967f37d011656746d714ab99 GIT binary patch literal 2733 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 literal 0 HcmV?d00001 diff --git a/src/router/middleware.ts b/src/router/middleware.ts index 8676df8a..44f89517 100644 --- a/src/router/middleware.ts +++ b/src/router/middleware.ts @@ -113,6 +113,37 @@ const middlewareRoute = [ } ] }, + { + path: "/middleware/dashboard/icp", + name: "Internet Computer", + redirect: "/middleware/dashboard/icp", + meta: { + isShow: true, + }, + children: [ + { + path: "/middleware/dashboard/icp", + name: "Internet Computer", + component: () => import('@/views/chainLink/icp/index.vue'), + meta: { + sidebarMap: ['Internet Computer'], + } + }, + // { + // path: "/middleware/dashboard/node/create", + // name: "createNode", + // component: () => import('@/views/chainLink/Node/createNode.vue'), + // meta: { + // sidebarMap: ['Node'], + // } + // }, + { + path: "/middleware/dashboard/icp/detail", + name: "InternetComputerdetail", + component: () => import('@/views/chainLink/icp/detail.vue'), + }, + ] + }, { path: "/middleware/dashboard/node", name: "Node", diff --git a/src/views/chainLink/dashboard/dashboard.vue b/src/views/chainLink/dashboard/dashboard.vue index 5452b453..177bbba1 100644 --- a/src/views/chainLink/dashboard/dashboard.vue +++ b/src/views/chainLink/dashboard/dashboard.vue @@ -16,6 +16,36 @@ View more + +
+
+
+ + +
+ +
The node has not been created yet
+ +
+
+ View +
+
{{ nodeInfo.nodes }}
+
Nodes
+
+
+
+ Synced + {{ nodeInfo.synced }} +
+
+ Halted + {{ nodeInfo.halted }} +
+
+ +
+
@@ -76,7 +106,7 @@ import { apiGetRpc } from '@/apis/rpcs' import { apiGetNodeStatistics } from '@/apis/node' import { apiGetIfOpenService } from '@/apis/middleWare' import { message } from "ant-design-vue"; -const dashboardList = ref(['RPC','Node', 'Oracle', 'Storage', 'Graph', 'ZKP', 'Others']) +const dashboardList = ref(['RPC','Node',"Internet Computer", 'Oracle', 'Storage', 'Graph', 'ZKP', 'Others']) const RPCList = ref([]); const nodeInfo = ref({}); const router = useRouter(); @@ -195,7 +225,7 @@ onMounted(()=>{ width: 50px; height: 40px; cursor: pointer; - // color:#E2B578; + // color:#E2B578; text-align: right; float: right; top: -40px; @@ -206,4 +236,4 @@ onMounted(()=>{ top: -39px; right: 0; } - \ No newline at end of file + diff --git a/src/views/chainLink/dashboard/index.vue b/src/views/chainLink/dashboard/index.vue index 11811054..955ef02a 100644 --- a/src/views/chainLink/dashboard/index.vue +++ b/src/views/chainLink/dashboard/index.vue @@ -8,7 +8,8 @@
- + + {{ item.name }} coming soon
diff --git a/src/views/chainLink/icp/Install.vue b/src/views/chainLink/icp/Install.vue new file mode 100644 index 00000000..b6c7fe8d --- /dev/null +++ b/src/views/chainLink/icp/Install.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/views/chainLink/icp/addCanister.vue b/src/views/chainLink/icp/addCanister.vue new file mode 100644 index 00000000..84c95d49 --- /dev/null +++ b/src/views/chainLink/icp/addCanister.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/views/chainLink/icp/addControllers.vue b/src/views/chainLink/icp/addControllers.vue new file mode 100644 index 00000000..78fdee59 --- /dev/null +++ b/src/views/chainLink/icp/addControllers.vue @@ -0,0 +1,161 @@ + + + diff --git a/src/views/chainLink/icp/deleteTips.vue b/src/views/chainLink/icp/deleteTips.vue new file mode 100644 index 00000000..79458f80 --- /dev/null +++ b/src/views/chainLink/icp/deleteTips.vue @@ -0,0 +1,177 @@ + + + diff --git a/src/views/chainLink/icp/detail.vue b/src/views/chainLink/icp/detail.vue new file mode 100644 index 00000000..570b625e --- /dev/null +++ b/src/views/chainLink/icp/detail.vue @@ -0,0 +1,291 @@ + + + diff --git a/src/views/chainLink/icp/index.vue b/src/views/chainLink/icp/index.vue new file mode 100644 index 00000000..f9d3c9cb --- /dev/null +++ b/src/views/chainLink/icp/index.vue @@ -0,0 +1,235 @@ + + + diff --git a/src/views/chainLink/miwaspace/components/icp.vue b/src/views/chainLink/miwaspace/components/icp.vue new file mode 100644 index 00000000..a4f4edff --- /dev/null +++ b/src/views/chainLink/miwaspace/components/icp.vue @@ -0,0 +1,52 @@ + + + + diff --git a/src/views/chainLink/miwaspace/index.vue b/src/views/chainLink/miwaspace/index.vue index a06d6f3f..28a9d77a 100644 --- a/src/views/chainLink/miwaspace/index.vue +++ b/src/views/chainLink/miwaspace/index.vue @@ -13,6 +13,9 @@ + + + @@ -44,6 +47,7 @@ import storageMiwaspace from "./components/storageMiwaspace.vue"; import zkpMiwaspace from "./components/zkpMiwaspace.vue"; import nodeService from "./components/nodeService.vue"; + import Icp from "./components/icp.vue"; const router = useRouter() const theme = useThemeStore(); @@ -75,6 +79,9 @@ case '7': activeKey.value = 'Node'; break; + case '9': + activeKey.value = 'ICP'; + break; default: break; } } @@ -138,4 +145,4 @@ font-weight: 400 !important; } } - \ No newline at end of file + From 70e23f2eda29432ea1794e7be4ab1b731fe9496a Mon Sep 17 00:00:00 2001 From: wendychaung <101249461+doraemonSakura@users.noreply.github.com> Date: Fri, 22 Dec 2023 00:09:23 +0800 Subject: [PATCH 02/12] add interface to icp --- src/apis/icp.ts | 29 ++++ src/views/chainLink/dashboard/dashboard.vue | 36 +++-- src/views/chainLink/icp/detail.vue | 11 +- .../{miwaspace/components => icp}/icp.vue | 0 src/views/chainLink/icp/index.vue | 145 ++++++++++++++---- src/views/chainLink/miwaspace/index.vue | 2 +- .../projectsList/components/DeployIC.vue | 12 +- 7 files changed, 180 insertions(+), 55 deletions(-) create mode 100644 src/apis/icp.ts rename src/views/chainLink/{miwaspace/components => icp}/icp.vue (100%) diff --git a/src/apis/icp.ts b/src/apis/icp.ts new file mode 100644 index 00000000..8a23ad91 --- /dev/null +++ b/src/apis/icp.ts @@ -0,0 +1,29 @@ +import httpRequest from "@/request"; + + +export function getCanisterList(params:any) { + return httpRequest({ + url: "/api/icp/account/canisters", + method: "get", + params: params, + }); +} + +export function getCanisterOverview() { + return httpRequest({ + url: "/api/icp/account/overview", + method: "get", + }); +} +export function getIcpDetail(id:string) { + return httpRequest({ + url: `/api/icp/canister/${id}/overview`, + method: "get", + }); +} +export function getICpStatistics() { + return httpRequest({ + url: `/api/icp/account/brief`, + method: "get", + }); +} diff --git a/src/views/chainLink/dashboard/dashboard.vue b/src/views/chainLink/dashboard/dashboard.vue index 177bbba1..21525f55 100644 --- a/src/views/chainLink/dashboard/dashboard.vue +++ b/src/views/chainLink/dashboard/dashboard.vue @@ -18,29 +18,29 @@
-
+
-
The node has not been created yet
- + +
- View + View
-
{{ nodeInfo.nodes }}
-
Nodes
+
{{ icpInfo.canisters }}
+
Canisters
- Synced - {{ nodeInfo.synced }} + Running + {{ icpInfo.running }}
- Halted - {{ nodeInfo.halted }} + Stopped + {{ icpInfo.stopped }}
@@ -106,9 +106,11 @@ import { apiGetRpc } from '@/apis/rpcs' import { apiGetNodeStatistics } from '@/apis/node' import { apiGetIfOpenService } from '@/apis/middleWare' import { message } from "ant-design-vue"; +import {getICpStatistics} from "@/apis/icp"; const dashboardList = ref(['RPC','Node',"Internet Computer", 'Oracle', 'Storage', 'Graph', 'ZKP', 'Others']) const RPCList = ref([]); const nodeInfo = ref({}); +const icpInfo = ref({}); const router = useRouter(); // 用来记录跳转的具体页面 const index = ref() @@ -118,6 +120,8 @@ const oracleList = ref([]) // 已经开通 rpc 信息 const rpcSer = ref('') + + const networkClick = (val: any) => { console.log('networkClick',val) router.push(`/middleware/dashboard/RPC/home`) @@ -187,16 +191,28 @@ const openService = async()=>{ const goNode = (item:any)=>{ router.push('/middleware/dashboard/node') } +const goICP = ()=>{ + router.push('/middleware/dashboard/icp') +} const getNodeStatistics = async()=>{ const { data } = await apiGetNodeStatistics() if (data.halted > 0 || data.nodes > 0 || data.synced > 0) { nodeInfo.value = data; } } + +const getIcpInfo = async()=>{ + const { data } = await getICpStatistics() + icpInfo.value = data; + +} + + onMounted(()=>{ getRpc() openService() getNodeStatistics(); + getIcpInfo(); }) \ No newline at end of file + From 0f8d25c486783b19da865c876db7ab40c05fbb09 Mon Sep 17 00:00:00 2001 From: wendychaung <101249461+doraemonSakura@users.noreply.github.com> Date: Mon, 25 Dec 2023 17:03:08 +0800 Subject: [PATCH 03/12] update modal --- src/apis/icp.ts | 32 +++ src/views/chainLink/icp/Install.vue | 60 ++++-- src/views/chainLink/icp/addCanister.vue | 78 +++---- src/views/chainLink/icp/addControllers.vue | 2 +- src/views/chainLink/icp/deleteTips.vue | 18 +- src/views/chainLink/icp/detail.vue | 200 +++++++++++++----- src/views/chainLink/icp/index.vue | 21 +- .../projectsList/components/DeployIC.vue | 1 - .../components/AddCycles.vue | 8 +- .../components/BuyCycles.vue | 5 +- 10 files changed, 290 insertions(+), 135 deletions(-) diff --git a/src/apis/icp.ts b/src/apis/icp.ts index 8a23ad91..132f7222 100644 --- a/src/apis/icp.ts +++ b/src/apis/icp.ts @@ -27,3 +27,35 @@ export function getICpStatistics() { method: "get", }); } +export function addCanister(params:any) { + return httpRequest({ + url: `/api/icp/account/add-canister`, + method: "post", + params: params, + }); +} +export function getControllers (params:any,id:string){ + + return httpRequest({ + url: `/api/icp/canister/${id}/controllers`, + method: "get", + params, + }); +} +export function getCs (params:any,id:string){ + + return httpRequest({ + url: `/api/icp/canister/${id}/consumption`, + method: "get", + params, + }); +} + +export function handleStatus (params:any){ + + return httpRequest({ + url: `/api/icp/canister/change-status`, + method: "post", + params, + }); +} diff --git a/src/views/chainLink/icp/Install.vue b/src/views/chainLink/icp/Install.vue index b6c7fe8d..a2b12cae 100644 --- a/src/views/chainLink/icp/Install.vue +++ b/src/views/chainLink/icp/Install.vue @@ -19,23 +19,33 @@ - - avatar -
- - -
- - Please drag and drop files here to upload -
+ + + + + + + + + + + + + + + + + @@ -52,7 +62,7 @@
- \ No newline at end of file + diff --git a/src/views/projects/projectsListDetails/components/BuyCycles.vue b/src/views/projects/projectsListDetails/components/BuyCycles.vue index c8b2005d..80a3bb17 100644 --- a/src/views/projects/projectsListDetails/components/BuyCycles.vue +++ b/src/views/projects/projectsListDetails/components/BuyCycles.vue @@ -77,7 +77,8 @@ import { apiAccountInfo, apiWalletInfo, apiRechargeWallet } from '@/apis/caniste import { message } from 'ant-design-vue'; const route = useRoute() -const id:any = route.params.id +const id:any = route.query.id || route.params.id ; + const props = defineProps({ visible:{ type:Boolean, @@ -163,4 +164,4 @@ onMounted(()=>{ :deep(.ant-radio-wrapper){ color: #73706E; } - \ No newline at end of file + From e8d8260559e7ca922eb82ff7b73e937fc6412d94 Mon Sep 17 00:00:00 2001 From: wendychaung <101249461+doraemonSakura@users.noreply.github.com> Date: Wed, 27 Dec 2023 22:34:16 +0800 Subject: [PATCH 04/12] Update icp.ts --- src/apis/icp.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apis/icp.ts b/src/apis/icp.ts index 132f7222..405687e3 100644 --- a/src/apis/icp.ts +++ b/src/apis/icp.ts @@ -31,7 +31,7 @@ export function addCanister(params:any) { return httpRequest({ url: `/api/icp/account/add-canister`, method: "post", - params: params, + data: params, }); } export function getControllers (params:any,id:string){ @@ -56,6 +56,6 @@ export function handleStatus (params:any){ return httpRequest({ url: `/api/icp/canister/change-status`, method: "post", - params, + data:params, }); } From a8ba38778614de0389eeb06646ec89ad48365d3f Mon Sep 17 00:00:00 2001 From: wendychaung <101249461+doraemonSakura@users.noreply.github.com> Date: Thu, 4 Jan 2024 00:41:26 +0800 Subject: [PATCH 05/12] Update index.vue --- src/views/chainLink/icp/index.vue | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/views/chainLink/icp/index.vue b/src/views/chainLink/icp/index.vue index 0d07688d..a3d3679d 100644 --- a/src/views/chainLink/icp/index.vue +++ b/src/views/chainLink/icp/index.vue @@ -60,7 +60,7 @@ - +
@@ -73,7 +73,7 @@ import { apiGetNodeList } from "@/apis/node"; import BuyCycles from "@/views/projects/projectsListDetails/components/BuyCycles.vue"; import AddCanister from "@/views/chainLink/icp/addCanister.vue"; import DeployIC from "@/views/projects/projectsList/components/DeployIC.vue"; -import {apiCreateICPIdentity, apiIcpAccount} from "@/apis/canister"; +import {apiCheckDfx, apiCreateICPIdentity, apiIcpAccount} from "@/apis/canister"; import {getCanisterList, getCanisterOverview} from "@/apis/icp"; import AddCycles from "@/views/projects/projectsListDetails/components/AddCycles.vue"; import CustomMsg from "@/components/CustomMsg.vue"; @@ -215,10 +215,16 @@ const getAccount = async() =>{ const res = await apiIcpAccount(id) accountIdFlag.value = res.data.accountIdFlag; walletIdFlag.value = res.data.walletIdFlag; - addIdToCurrentUrl(id); + + + if (!res.data.accountIdFlag || !res.data.walletIdFlag) { + if (!res.data.accountIdFlag) { + const res = await apiCreateICPIdentity(id) + } showDeployIC.value = true } + addIdToCurrentUrl(id); } catch (err: any) { console.error(err) From b7c6d28b0139ae68af8c126146636c20ec10001b Mon Sep 17 00:00:00 2001 From: AAA <101249461+doraemonSakura@users.noreply.github.com> Date: Thu, 11 Jan 2024 20:59:19 +0800 Subject: [PATCH 06/12] update icp interface --- src/apis/icp.ts | 46 ++++++++ src/views/chainLink/dashboard/dashboard.vue | 6 +- src/views/chainLink/icp/Install.vue | 119 +++++++++++++------- src/views/chainLink/icp/addControllers.vue | 74 +++++++----- src/views/chainLink/icp/deleteTips.vue | 42 +++---- src/views/chainLink/icp/detail.vue | 46 ++++++-- src/views/chainLink/icp/index.vue | 4 +- 7 files changed, 219 insertions(+), 118 deletions(-) diff --git a/src/apis/icp.ts b/src/apis/icp.ts index 405687e3..1595126a 100644 --- a/src/apis/icp.ts +++ b/src/apis/icp.ts @@ -59,3 +59,49 @@ export function handleStatus (params:any){ data:params, }); } + +export function addController (params:any) { + return httpRequest({ + url: `/api/icp/canister/add-controller`, + method: "post", + data:params, + }); + +} +export function addCycles (params:any) { + return httpRequest({ + url: `/api/icp/canister/add-cycles`, + method: "post", + data:params, + }); + +} + +export function postInstall (params:any) { + return httpRequest({ + url: `/api/icp/canister/install`, + method: "post", + data:params, + }); + +} + +export function uploadWasm (file:any,id:string) { + return httpRequest({ + url: `/api/icp/canister/${id}/upload`, + method: "post", + data:file, + headers:{ + 'Content-Type': 'multipart/form-data' + } + }); +} + +export function deleteController (params:any) { + return httpRequest({ + url: `/api/icp/canister/del-controller`, + method: "post", + data:params, + }); + +} diff --git a/src/views/chainLink/dashboard/dashboard.vue b/src/views/chainLink/dashboard/dashboard.vue index 21525f55..8afd0649 100644 --- a/src/views/chainLink/dashboard/dashboard.vue +++ b/src/views/chainLink/dashboard/dashboard.vue @@ -25,10 +25,10 @@
- +
- View +
{{ icpInfo.canisters }}
Canisters
@@ -43,7 +43,7 @@ {{ icpInfo.stopped }}
- +
diff --git a/src/views/chainLink/icp/Install.vue b/src/views/chainLink/icp/Install.vue index a2b12cae..a0b12d19 100644 --- a/src/views/chainLink/icp/Install.vue +++ b/src/views/chainLink/icp/Install.vue @@ -14,8 +14,12 @@
- - + + + contract + frontend + + @@ -26,32 +30,23 @@ Please drag and drop files here to upload
+
- {{fileUrl}} +
+
{{fileUrl}}
+
+
+ +
- - - - - - - - - - - - - - - - + - - - - Upgrade + + + Upgrade + Reinstall @@ -68,6 +63,7 @@ import { message } from "ant-design-vue"; import { computed, reactive, ref, toRefs, onMounted } from "vue"; import { useRoute } from "vue-router"; import { apiWalletInfo, apiRechargeCanister } from '@/apis/canister' +import {postInstall, uploadWasm} from "@/apis/icp"; const props = defineProps({ visible:{ @@ -78,10 +74,6 @@ const props = defineProps({ type:String, default:'' }, - cycles:{ - type:String, - default:'' - } }); const route = useRoute() const id = route.params.id @@ -89,23 +81,25 @@ const { visible, canisterId, cycles } = toRefs(props) const emit = defineEmits(["handleCancel", 'showBuyCycles', 'showBuyCycleMsg', 'refreshCanister']) const formRef = ref(); const formData = reactive({ - canisterId: '', - amount: 0.1, + canisterId: canisterId.value, + WasmType: 'contract', + mode: 1, }); const walletCanisterId = ref() const walletCyclesBalance = ref() const topLoading = ref(false) +const loading = ref(false) const fileUrl = ref(null); const formRules = computed(() => { - const requiredRule = (message) => ({ required: true, trigger: 'change', message }); - - return { - amount: [requiredRule('Please enter Amount')], - }; + // const requiredRule = (message) => ({ required: true, trigger: 'change', message }); + // + // return { + // amount: [requiredRule('Please enter Amount')], + // }; }); const handleTopUp = async() => { @@ -114,9 +108,10 @@ const handleTopUp = async() => { topLoading.value = true const params = { canisterId: formData.canisterId, - amount: formData.amount + '' + WasmType: formData.WasmType, + mode: formData.mode } - const res = await apiRechargeCanister(id,params) + const res = await postInstall(params) topLoading.value = false message.success(res.message) emit('handleCancel') @@ -147,19 +142,38 @@ const onChange = (newVal) => { const uploadFileList = (e) =>{ const { files } = e.target ; - console.log(files) + fileUrl.value = files[0].name + + handleUpload(files[0]) } -const getWalletInfo = async()=>{ - const res = await apiWalletInfo(id) - walletCanisterId.value = res.data.canisterId - walletCyclesBalance.value = res.data.cyclesBalance +const handleUpload = async(file) =>{ + loading.value = true; + try{ + + const formData = new FormData(); + formData.append('file', file); + + let rt = await uploadWasm (formData,canisterId.value); + console.log(rt) + + }catch (e) { + console.error(e) + }finally { + loading.value = false; + } } +// const getWalletInfo = async()=>{ +// const res = await apiWalletInfo(id) +// walletCanisterId.value = res.data.canisterId +// walletCyclesBalance.value = res.data.cyclesBalance +// } + onMounted(async()=>{ formData.canisterId = canisterId.value // formData.amount = cycles.value - await getWalletInfo() + // await getWalletInfo() }) + diff --git a/src/views/chainLink/icp/addControllers.vue b/src/views/chainLink/icp/addControllers.vue index 63df32f8..dba4f1da 100644 --- a/src/views/chainLink/icp/addControllers.vue +++ b/src/views/chainLink/icp/addControllers.vue @@ -15,19 +15,20 @@
- + - - - - - Read-Write + + + + Read-Write + +
- Install + Add
@@ -38,6 +39,7 @@ import { message } from "ant-design-vue"; import { computed, reactive, ref, toRefs, onMounted } from "vue"; import { useRoute } from "vue-router"; import { apiWalletInfo, apiRechargeCanister } from '@/apis/canister' +import {addController} from "@/apis/icp"; const props = defineProps({ visible:{ @@ -59,10 +61,11 @@ const { visible, canisterId, cycles } = toRefs(props) const emit = defineEmits(["handleCancel", 'showBuyCycles', 'showBuyCycleMsg', 'refreshCanister']) const formRef = ref(); const formData = reactive({ - canisterId: '', - amount: 0.1, + controllerId: '', + scope: "1", }); const walletCanisterId = ref() +const scope = ref("1"); const walletCyclesBalance = ref() const topLoading = ref(false) @@ -70,31 +73,32 @@ const formRules = computed(() => { const requiredRule = (message: string) => ({ required: true, trigger: 'change', message }); - return { - amount: [requiredRule('Please enter Amount')], - }; + // return { + // amount: [requiredRule('Please enter Amount')], + // }; }); const handleTopUp = async() => { - console.log('handleTopUp',formData) + console.log('handleTopUp',formData.controllerId,canisterId.value) + try { topLoading.value = true const params = { - canisterId: formData.canisterId, - amount: formData.amount + '' + controller: formData.controllerId, + canisterId: canisterId.value } - const res = await apiRechargeCanister(id,params) + const res = await addController(params) topLoading.value = false message.success(res.message) emit('handleCancel') emit('refreshCanister') } catch (error:any) { console.log('error:',error) - if(error.response.data.message.indexOf('out of cycles')!=-1){ - emit('showBuyCycleMsg') - }else{ - message.error(error.response.data.message) - } + // if(error.response.data.message.indexOf('out of cycles')!=-1){ + // emit('showBuyCycleMsg') + // }else{ + // message.error(error.response.data.message) + // } topLoading.value = false } } @@ -108,20 +112,20 @@ const handleCancel = ()=>{ emit('handleCancel') } -const onChange = (newVal:string) => { - +const onChange = (e:any) => { + console.log(e) } -const getWalletInfo = async()=>{ - const res = await apiWalletInfo(id) - walletCanisterId.value = res.data.canisterId - walletCyclesBalance.value = res.data.cyclesBalance -} +// const getWalletInfo = async()=>{ +// const res = await apiWalletInfo(id) +// walletCanisterId.value = res.data.canisterId +// walletCyclesBalance.value = res.data.cyclesBalance +// } onMounted(async()=>{ - formData.canisterId = canisterId.value + // formData.amount = cycles.value - await getWalletInfo() + // await getWalletInfo() }) + diff --git a/src/views/chainLink/icp/deleteTips.vue b/src/views/chainLink/icp/deleteTips.vue index a75c2412..4b36e0b1 100644 --- a/src/views/chainLink/icp/deleteTips.vue +++ b/src/views/chainLink/icp/deleteTips.vue @@ -25,7 +25,7 @@
Cancel - Delete + Delete
Done @@ -40,6 +40,7 @@ import { message } from "ant-design-vue"; import { computed, reactive, ref, toRefs, onMounted } from "vue"; import { useRoute } from "vue-router"; import { apiWalletInfo, apiRechargeCanister } from '@/apis/canister' +import {deleteController} from "@/apis/icp"; const props = defineProps({ visible:{ @@ -50,23 +51,23 @@ const props = defineProps({ type:String, default:'' }, + controllerId:{ + type:String, + default:'' + }, type:{ type:String, default:'confirm' }, - cycles:{ - type:String, - default:'' - } }); const route = useRoute() const id:any = route.params.id -const { visible, canisterId, cycles } = toRefs(props) +const { visible, canisterId,controllerId,type } = toRefs(props) const emit = defineEmits(["handleCancel", 'showBuyCycles', 'showBuyCycleMsg', 'refreshCanister']) const formRef = ref(); const formData = reactive({ - canisterId: '', - amount: 0.1, + canisterId: canisterId.value, + controllerId: controllerId.value, }); const walletCanisterId = ref() const walletCyclesBalance = ref() @@ -81,15 +82,15 @@ const formRules = computed(() => { }; }); -const handleTopUp = async() => { - console.log('handleTopUp',formData) +const handleConfirm = async() => { + console.log('handleConfirm',formData) try { topLoading.value = true const params = { canisterId: formData.canisterId, - amount: formData.amount + '' + Controller: formData.controllerId } - const res = await apiRechargeCanister(id,params) + const res = await deleteController(params) topLoading.value = false message.success(res.message) emit('handleCancel') @@ -105,29 +106,12 @@ const handleTopUp = async() => { } } -const showBuyCycles = () => { - emit('handleCancel') - emit('showBuyCycles') -} - const handleCancel = ()=>{ emit('handleCancel') } -const onChange = (newVal:string) => { - -} - -const getWalletInfo = async()=>{ - const res = await apiWalletInfo(id) - walletCanisterId.value = res.data.canisterId - walletCyclesBalance.value = res.data.cyclesBalance -} - onMounted(async()=>{ formData.canisterId = canisterId.value - // formData.amount = cycles.value - await getWalletInfo() })