From f287c00316f60dac4040e5f4f9f3aad665d79244 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Thu, 10 Oct 2024 15:58:34 +0800 Subject: [PATCH 01/27] coretime, init page #4832 (#4844) * bump icons * init coretime * bump icons * revert --- packages/kintsugi-next/package.json | 2 +- packages/next-common/package.json | 2 +- .../next-common/utils/consts/menu/coretime.jsx | 18 ++++++++++++++++++ .../next-common/utils/consts/menu/index.js | 2 ++ .../utils/consts/settings/common/modules.js | 1 + .../utils/consts/settings/polkadot/index.js | 1 + packages/next/package.json | 2 +- packages/next/pages/coretime/index.jsx | 8 ++++++++ yarn.lock | 14 +++++++------- 9 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 packages/next-common/utils/consts/menu/coretime.jsx create mode 100644 packages/next/pages/coretime/index.jsx diff --git a/packages/kintsugi-next/package.json b/packages/kintsugi-next/package.json index 25e5a1ed1c..d17138983f 100644 --- a/packages/kintsugi-next/package.json +++ b/packages/kintsugi-next/package.json @@ -12,7 +12,7 @@ "dependencies": { "@interlay/monetary-js": "^0.5.3", "@next/env": "^13.3.0", - "@osn/icons": "^1.139.0", + "@osn/icons": "^1.141.0", "@polkadot/util-crypto": "^13.1.1", "@svgr/webpack": "^7.0.0", "bignumber.js": "^9.0.2", diff --git a/packages/next-common/package.json b/packages/next-common/package.json index 8cee9fd600..489d0544ff 100644 --- a/packages/next-common/package.json +++ b/packages/next-common/package.json @@ -16,7 +16,7 @@ "@interlay/monetary-js": "0.5.4", "@mimirdev/apps-inject": "^0.3.0", "@mimirdev/apps-sdk": "^0.2.0", - "@osn/icons": "^1.139.0", + "@osn/icons": "^1.141.0", "@osn/polkadot-react-identicon": "^1.0.8", "@osn/previewer": "^1.4.3", "@osn/provider-options": "1.1.0", diff --git a/packages/next-common/utils/consts/menu/coretime.jsx b/packages/next-common/utils/consts/menu/coretime.jsx new file mode 100644 index 0000000000..fbc335c7b1 --- /dev/null +++ b/packages/next-common/utils/consts/menu/coretime.jsx @@ -0,0 +1,18 @@ +import { ArrowRight, MenuCoretime, MenuOverview } from "@osn/icons/subsquare"; + +export const coretimeMenu = { + name: "Coretime", + value: "coretime", + pathname: "/coretime", + icon: , + extra: , + type: "subspace", + items: [ + { + name: "Overview", + value: "overview", + pathname: "/coretime", + icon: , + }, + ], +}; diff --git a/packages/next-common/utils/consts/menu/index.js b/packages/next-common/utils/consts/menu/index.js index b33c4c2b85..3459535197 100644 --- a/packages/next-common/utils/consts/menu/index.js +++ b/packages/next-common/utils/consts/menu/index.js @@ -18,6 +18,7 @@ import isAssetHub from "next-common/utils/isAssetHub"; import { getCommunityTreasuryMenu } from "./communityTreasury"; import getChainSettings from "../settings"; import { getMoreMenu } from "./more"; +import { coretimeMenu } from "./coretime"; export function getHomeMenu({ summary = {}, @@ -41,6 +42,7 @@ export function getHomeMenu({ modules?.alliance && getAllianceMenu(summary), modules?.communityCouncil && getCommunityCouncilMenu(summary), modules?.preimages && preImages, + ...(modules?.coretime ? [{ type: "divider" }, coretimeMenu] : []), ].filter(Boolean); } diff --git a/packages/next-common/utils/consts/settings/common/modules.js b/packages/next-common/utils/consts/settings/common/modules.js index d336b46bb4..7108590adb 100644 --- a/packages/next-common/utils/consts/settings/common/modules.js +++ b/packages/next-common/utils/consts/settings/common/modules.js @@ -37,6 +37,7 @@ const base = { advisoryCommittee: false, alliance: false, preimages: true, + coretime: false, }; /** diff --git a/packages/next-common/utils/consts/settings/polkadot/index.js b/packages/next-common/utils/consts/settings/polkadot/index.js index 86e12edcd1..70f5cdf630 100644 --- a/packages/next-common/utils/consts/settings/polkadot/index.js +++ b/packages/next-common/utils/consts/settings/polkadot/index.js @@ -74,6 +74,7 @@ const polkadot = { technicalCommittee: { archived: true, }, + coretime: true, }), integrations: { doTreasury: true, diff --git a/packages/next/package.json b/packages/next/package.json index 05cde8417c..5541ccd304 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@next/env": "^13.3.0", - "@osn/icons": "^1.139.0", + "@osn/icons": "^1.141.0", "@svgr/webpack": "^7.0.0", "bignumber.js": "^9.0.2", "chartjs-plugin-gradient": "^0.6.1", diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx new file mode 100644 index 0000000000..002ceb7568 --- /dev/null +++ b/packages/next/pages/coretime/index.jsx @@ -0,0 +1,8 @@ +import ListLayout from "next-common/components/layout/ListLayout"; +import { withCommonProps } from "next-common/lib"; + +export default function CoretimePage() { + return Page coretime; +} + +export const getServerSideProps = withCommonProps(); diff --git a/yarn.lock b/yarn.lock index 77768eb89c..1ac5ab45d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3261,10 +3261,10 @@ __metadata: languageName: node linkType: hard -"@osn/icons@npm:^1.139.0": - version: 1.139.0 - resolution: "@osn/icons@npm:1.139.0" - checksum: c5ed98446f2434a3c1951e0ce452a93dc617bf500e25339dd023b7a8c155a8208d5c486af4749580adc5ef9db57f72fc90c711df653375c8d3103e9d6451de4b +"@osn/icons@npm:^1.141.0": + version: 1.141.0 + resolution: "@osn/icons@npm:1.141.0" + checksum: 4d54cdeb637cdbacdb255de9925abada6bbfa742fad2ea45bd5bf6f47a2b578c2bf6194d7d0cd28d1fec3c59cb9fb68d96b8f257e1aaa49599e0f24ac8773ab5 languageName: node linkType: hard @@ -5880,7 +5880,7 @@ __metadata: "@interlay/monetary-js": ^0.5.3 "@next/env": ^13.3.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.139.0 + "@osn/icons": ^1.141.0 "@polkadot/util-crypto": ^13.1.1 "@svgr/webpack": ^7.0.0 "@types/lodash-es": ^4.17.12 @@ -5916,7 +5916,7 @@ __metadata: "@next/bundle-analyzer": ^14.2.4 "@next/env": ^13.3.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.139.0 + "@osn/icons": ^1.141.0 "@svgr/webpack": ^7.0.0 "@types/lodash-es": ^4.17.12 bignumber.js: ^9.0.2 @@ -13401,7 +13401,7 @@ __metadata: "@mimirdev/apps-inject": ^0.3.0 "@mimirdev/apps-sdk": ^0.2.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.139.0 + "@osn/icons": ^1.141.0 "@osn/polkadot-react-identicon": ^1.0.8 "@osn/previewer": ^1.4.3 "@osn/provider-options": 1.1.0 From b8ba730837a85665e475c35c1ab0e1f8d5316986 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 11 Oct 2024 02:54:16 +0100 Subject: [PATCH 02/27] fix: nav menu, if back to homepage, switch back to main menu --- packages/next-common/components/nav/menu/index.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/next-common/components/nav/menu/index.jsx b/packages/next-common/components/nav/menu/index.jsx index 5b6425035c..e9d99e7af5 100644 --- a/packages/next-common/components/nav/menu/index.jsx +++ b/packages/next-common/components/nav/menu/index.jsx @@ -4,6 +4,8 @@ import { usePageProps } from "next-common/context/page"; import { getMainMenu } from "next-common/utils/consts/menu"; import { createGlobalState } from "react-use"; import NavMenuItem from "./item"; +import { useRouter } from "next/router"; +import { useEffect } from "react"; export const useNavMenuView = createGlobalState({ view: "main", @@ -16,6 +18,13 @@ export default function NavMenu() { const { tracks, fellowshipTracks, summary, detail, ambassadorTracks } = usePageProps(); + const router = useRouter(); + useEffect(() => { + if (router.pathname === "/") { + setNavMenuView({ view: "main" }); + } + }, [router.pathname]); + const mainMenu = getMainMenu({ tracks, fellowshipTracks, From be45671f021e93feaacb958cd514968120655b68 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 11 Oct 2024 03:01:35 +0100 Subject: [PATCH 03/27] fix useeffect deps --- packages/next-common/components/nav/menu/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-common/components/nav/menu/index.jsx b/packages/next-common/components/nav/menu/index.jsx index e9d99e7af5..e85c6750b2 100644 --- a/packages/next-common/components/nav/menu/index.jsx +++ b/packages/next-common/components/nav/menu/index.jsx @@ -23,7 +23,7 @@ export default function NavMenu() { if (router.pathname === "/") { setNavMenuView({ view: "main" }); } - }, [router.pathname]); + }, [router.pathname, setNavMenuView]); const mainMenu = getMainMenu({ tracks, From efcdaa34fa87a59a2bea35df07e27becdbafabab Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 11 Oct 2024 06:18:04 +0100 Subject: [PATCH 04/27] fill overview page content --- .../components/coretime/salePanel.jsx | 60 +++++++++++++++++++ .../coretime/salesHistorySection.jsx | 24 ++++++++ packages/next/pages/coretime/index.jsx | 15 ++++- 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 packages/next-common/components/coretime/salePanel.jsx create mode 100644 packages/next-common/components/coretime/salesHistorySection.jsx diff --git a/packages/next-common/components/coretime/salePanel.jsx b/packages/next-common/components/coretime/salePanel.jsx new file mode 100644 index 0000000000..92b93d6274 --- /dev/null +++ b/packages/next-common/components/coretime/salePanel.jsx @@ -0,0 +1,60 @@ +import { useChainSettings } from "next-common/context/chain"; +import { NeutralPanel } from "../styled/containers/neutralPanel"; +import Divider from "../styled/layout/divider"; +import SummaryItem from "../summary/layout/item"; +import SummaryLayout from "../summary/layout/layout"; +import ValueDisplay from "../valueDisplay"; +import { toPrecision } from "next-common/utils"; + +export default function CoretimeSalePanel() { + const { decimals, symbol } = useChainSettings(); + + return ( + +

Coretime Sale #1

+ + + + + + +
52
+
+ +
Interlude Phase
+
+ +
[time]
+
+ + +
+
System Reserved 0
+
Leased 0
+
Renewal 4
+
+
+ +
+
End in [time]
+
+
+ +
+
Start Block: [block]
+
End Block: [block]
+
+
+
+ +
+ +
+
chart
+
+
+ ); +} diff --git a/packages/next-common/components/coretime/salesHistorySection.jsx b/packages/next-common/components/coretime/salesHistorySection.jsx new file mode 100644 index 0000000000..7d7f58d5f9 --- /dev/null +++ b/packages/next-common/components/coretime/salesHistorySection.jsx @@ -0,0 +1,24 @@ +import DataList from "../dataList"; +import { NeutralPanel } from "../styled/containers/neutralPanel"; +import { TitleContainer } from "../styled/containers/titleContainer"; + +export default function CoretimeSalesHistorySection() { + return ( +
+ Sales History + + + +
+ ); +} diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index 002ceb7568..f1c17b08b2 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -1,8 +1,19 @@ import ListLayout from "next-common/components/layout/ListLayout"; import { withCommonProps } from "next-common/lib"; - +import CoretimeSalePanel from "next-common/components/coretime/salePanel"; +import CoretimeSalesHistorySection from "next-common/components/coretime/salesHistorySection"; export default function CoretimePage() { - return Page coretime; + return ( + +
+ + +
+
+ ); } export const getServerSideProps = withCommonProps(); From bf5c672b85e551a236dca4ca55d07570fcbc956d Mon Sep 17 00:00:00 2001 From: 2nthony Date: Mon, 14 Oct 2024 17:41:11 +0800 Subject: [PATCH 05/27] add coretime chain setting [skip ci] --- packages/next-common/utils/consts/chains.js | 1 + .../utils/consts/settings/coretime.js | 23 +++++++++++++++++++ .../utils/consts/settings/index.js | 2 ++ 3 files changed, 26 insertions(+) create mode 100644 packages/next-common/utils/consts/settings/coretime.js diff --git a/packages/next-common/utils/consts/chains.js b/packages/next-common/utils/consts/chains.js index de69d8fda2..8dcf5d02e7 100644 --- a/packages/next-common/utils/consts/chains.js +++ b/packages/next-common/utils/consts/chains.js @@ -39,6 +39,7 @@ const Chains = { shibuya: "shibuya", astar: "astar", zkverifyTestnet: "zkverify-testnet", + coretime: "coretime", }; export default Chains; diff --git a/packages/next-common/utils/consts/settings/coretime.js b/packages/next-common/utils/consts/settings/coretime.js new file mode 100644 index 0000000000..2347ccaebf --- /dev/null +++ b/packages/next-common/utils/consts/settings/coretime.js @@ -0,0 +1,23 @@ +import polkadot from "./polkadot"; + +const endpoints = [ + { + name: "Parity", + url: "wss://polkadot-coretime-rpc.polkadot.io", + }, + { + name: "IBP2", + url: "wss://coretime-polkadot.dotters.network", + }, +]; + +const coretime = { + ...polkadot, + value: "coretime", + name: "Coretime", + description: + "A revolutionary approach to accessing the right amount of blockspace for every stage of growth.", + endpoints, +}; + +export default coretime; diff --git a/packages/next-common/utils/consts/settings/index.js b/packages/next-common/utils/consts/settings/index.js index 437e492e6c..a13e34eb85 100644 --- a/packages/next-common/utils/consts/settings/index.js +++ b/packages/next-common/utils/consts/settings/index.js @@ -37,6 +37,7 @@ import shibuya from "./shibuya"; import astar from "./astar"; import { isNil } from "lodash-es"; import zkverifyTestnet from "./zkverifyTestnet"; +import coretime from "./coretime"; const settingsMap = { polkadot, @@ -76,6 +77,7 @@ const settingsMap = { vara, shibuya, [zkverifyTestnet.value]: zkverifyTestnet, + coretime, ...(process.env.NEXT_PUBLIC_DEVELOPMENT === "true" ? { development } : {}), }; From 439a6abab13dfcf2a5c1e88d0873afd180a76d55 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 16 Oct 2024 11:41:35 +0800 Subject: [PATCH 06/27] revert main format [skip ci] --- .../hooks/referenda/useReferendaVotingBalance.js | 3 +-- .../components/gov2/votePopup/popupContent.js | 15 ++++++--------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/next-common/hooks/referenda/useReferendaVotingBalance.js b/packages/next-common/hooks/referenda/useReferendaVotingBalance.js index 939df9331b..045d5fff77 100644 --- a/packages/next-common/hooks/referenda/useReferendaVotingBalance.js +++ b/packages/next-common/hooks/referenda/useReferendaVotingBalance.js @@ -14,8 +14,7 @@ export default function useReferendaVotingBalance(api, address) { }; } - const balanceBig = - result.data.free.toBigInt() + result.data.reserved.toBigInt(); + const balanceBig = result.data.free.toBigInt() + result.data.reserved.toBigInt(); return { isLoading: loading, balance: balanceBig.toString(), diff --git a/packages/next/components/gov2/votePopup/popupContent.js b/packages/next/components/gov2/votePopup/popupContent.js index 838c88f7ed..08cbfeb0eb 100644 --- a/packages/next/components/gov2/votePopup/popupContent.js +++ b/packages/next/components/gov2/votePopup/popupContent.js @@ -12,13 +12,8 @@ import SplitAbstainVoteStatus from "./splitAbstainVoteStatus"; import VStack from "next-common/components/styled/vStack"; import VoteTypeTab, { Aye, Nay, Split, SplitAbstain } from "./tab"; import PrimaryButton from "next-common/lib/button/primary"; -import useSubMyReferendaVote, { - getReferendaDirectVote, -} from "next-common/hooks/referenda/useSubMyReferendaVote"; -import { - usePopupParams, - useSignerAccount, -} from "next-common/components/popupWithSigner/context"; +import useSubMyReferendaVote, { getReferendaDirectVote } from "next-common/hooks/referenda/useSubMyReferendaVote"; +import { usePopupParams, useSignerAccount } from "next-common/components/popupWithSigner/context"; import { LoadingPanel } from "components/referenda/popup/popupContent"; import { normalizeOnchainVote } from "next-common/utils/vote"; import { useShowVoteSuccessful } from "next-common/components/vote"; @@ -138,8 +133,10 @@ export default function PopupContent() { const signerAccount = useSignerAccount(); const api = useContextApi(); - const { isLoading: votingIsLoading, balance: votingBalance } = - useReferendaVotingBalance(api, signerAccount?.realAddress); + const { + isLoading: votingIsLoading, + balance: votingBalance, + } = useReferendaVotingBalance(api, signerAccount?.realAddress); const { vote: addressVote, From 7e946c5b4c47265b16fbc5a29adea0c07dbb6837 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 16 Oct 2024 11:42:58 +0800 Subject: [PATCH 07/27] revert main format [skip ci] --- packages/next/components/childBounty/sidebar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/components/childBounty/sidebar.jsx b/packages/next/components/childBounty/sidebar.jsx index 503d011c4b..33b0f3eb0a 100644 --- a/packages/next/components/childBounty/sidebar.jsx +++ b/packages/next/components/childBounty/sidebar.jsx @@ -17,7 +17,7 @@ export default function ChildBountySidebar() { childBountyId, ]); - const { status } = (result?.isSome && result?.unwrap?.()) || {}; + const { status } = result?.isSome && result?.unwrap?.() || {}; const showActionTip = status?.isCuratorProposed || status?.isPendingPayout || status?.isAdded; From 7c5d7ee67fa8356ff347700dd58c8f04871694d5 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 16 Oct 2024 16:14:46 +0800 Subject: [PATCH 08/27] coretime, overview page connect api #4832 (#4876) * refactor store to support nested * coretime overview connect api * refactor: store, separate common and business slices * coretime, overview page store * refactor: store, remove editor slice * refactor: store, detail slice, remove multiTabs * refactor: store, detail slice, remove comments merging * refactor: store, remove layout slice * chore: store tweak comments * refactor: store, fix import * refactor: nav menu, convert to hook * refactor: store, remove cmdk slice * revert cherry picked --- packages/next/pages/coretime/index.jsx | 31 ++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index f1c17b08b2..1b587b31fa 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -2,12 +2,35 @@ import ListLayout from "next-common/components/layout/ListLayout"; import { withCommonProps } from "next-common/lib"; import CoretimeSalePanel from "next-common/components/coretime/salePanel"; import CoretimeSalesHistorySection from "next-common/components/coretime/salesHistorySection"; +import { createStore } from "next-common/store"; +import ChainProvider, { useChainSettings } from "next-common/context/chain"; +import ApiProvider from "next-common/context/api"; +import { Provider } from "react-redux"; +import { commonReducers } from "next-common/store/reducers"; + +const chain = "coretime"; +const store = createStore({ + chain, + reducer: commonReducers, +}); + export default function CoretimePage() { return ( - + + + + + + + + ); +} + +function CoretimePageImpl() { + const { name, description } = useChainSettings(); + + return ( +
From 2107cdd79b30524b020c7f4a6e24be39f2588363 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Thu, 17 Oct 2024 17:24:51 +0800 Subject: [PATCH 09/27] kusama coretime module --- packages/next-common/utils/consts/settings/kusama/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/next-common/utils/consts/settings/kusama/index.js b/packages/next-common/utils/consts/settings/kusama/index.js index 849684b362..174fbb75b6 100644 --- a/packages/next-common/utils/consts/settings/kusama/index.js +++ b/packages/next-common/utils/consts/settings/kusama/index.js @@ -60,6 +60,7 @@ const kusama = { technicalCommittee: { archived: true, }, + coretime: true, }), integrations: { doTreasury: true, From 896b5ad386e9684f800015b6870455df57038d53 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 18 Oct 2024 16:36:30 +0800 Subject: [PATCH 10/27] coretime, separate coretime chain settings files #4832 (#4898) * coretime, separate chain settings #4895 * sort endpoints --- packages/next-common/utils/consts/chains.js | 3 +- .../utils/consts/settings/coretime.js | 23 ------------ .../utils/consts/settings/index.js | 6 ++- .../consts/settings/kusamaCoretime/index.js | 37 +++++++++++++++++++ .../consts/settings/polkadotCoretime/index.js | 21 +++++++++++ packages/next/pages/coretime/index.jsx | 7 ++-- 6 files changed, 68 insertions(+), 29 deletions(-) delete mode 100644 packages/next-common/utils/consts/settings/coretime.js create mode 100644 packages/next-common/utils/consts/settings/kusamaCoretime/index.js create mode 100644 packages/next-common/utils/consts/settings/polkadotCoretime/index.js diff --git a/packages/next-common/utils/consts/chains.js b/packages/next-common/utils/consts/chains.js index 591fb4e461..fade20751c 100644 --- a/packages/next-common/utils/consts/chains.js +++ b/packages/next-common/utils/consts/chains.js @@ -39,8 +39,9 @@ const Chains = { shibuya: "shibuya", astar: "astar", zkverifyTestnet: "zkverify-testnet", - coretime: "coretime", paseo: "paseo", + kusamaCoretime: "kusama-coretime", + polkadotCoretime: "polkadot-coretime", }; export default Chains; diff --git a/packages/next-common/utils/consts/settings/coretime.js b/packages/next-common/utils/consts/settings/coretime.js deleted file mode 100644 index 2347ccaebf..0000000000 --- a/packages/next-common/utils/consts/settings/coretime.js +++ /dev/null @@ -1,23 +0,0 @@ -import polkadot from "./polkadot"; - -const endpoints = [ - { - name: "Parity", - url: "wss://polkadot-coretime-rpc.polkadot.io", - }, - { - name: "IBP2", - url: "wss://coretime-polkadot.dotters.network", - }, -]; - -const coretime = { - ...polkadot, - value: "coretime", - name: "Coretime", - description: - "A revolutionary approach to accessing the right amount of blockspace for every stage of growth.", - endpoints, -}; - -export default coretime; diff --git a/packages/next-common/utils/consts/settings/index.js b/packages/next-common/utils/consts/settings/index.js index c5c175e1dc..8cbde5da22 100644 --- a/packages/next-common/utils/consts/settings/index.js +++ b/packages/next-common/utils/consts/settings/index.js @@ -37,8 +37,9 @@ import shibuya from "./shibuya"; import astar from "./astar"; import { isNil } from "lodash-es"; import zkverifyTestnet from "./zkverifyTestnet"; -import coretime from "./coretime"; import paseo from "./paseo"; +import kusamaCoretime from "./kusamaCoretime"; +import polkadotCoretime from "./polkadotCoretime"; const settingsMap = { polkadot, @@ -78,8 +79,9 @@ const settingsMap = { vara, shibuya, [zkverifyTestnet.value]: zkverifyTestnet, - coretime, paseo, + [polkadotCoretime.value]: polkadotCoretime, + [kusamaCoretime.value]: kusamaCoretime, ...(process.env.NEXT_PUBLIC_DEVELOPMENT === "true" ? { development } : {}), }; diff --git a/packages/next-common/utils/consts/settings/kusamaCoretime/index.js b/packages/next-common/utils/consts/settings/kusamaCoretime/index.js new file mode 100644 index 0000000000..64bea83e73 --- /dev/null +++ b/packages/next-common/utils/consts/settings/kusamaCoretime/index.js @@ -0,0 +1,37 @@ +import Chains from "../../chains"; +import kusama from "../kusama"; + +const kusamaCoretime = { + ...kusama, + value: Chains.kusamaCoretime, + description: + "A revolutionary approach to accessing the right amount of blockspace for every stage of growth.", + endpoints: [ + { + name: "Parity", + url: "wss://kusama-coretime-rpc.polkadot.io", + }, + { + name: "IBP1", + url: "wss://sys.ibp.network/coretime-kusama", + }, + { + name: "Stakeworld", + url: "wss://ksm-rpc.stakeworld.io/coretime", + }, + { + name: "IBP2", + url: "wss://coretime-kusama.dotters.network", + }, + { + name: "LuckyFriday", + url: "wss://rpc-coretime-kusama.luckyfriday.io", + }, + { + name: "Dwellir", + url: "wss://coretime-kusama-rpc.dwellir.com", + }, + ], +}; + +export default kusamaCoretime; diff --git a/packages/next-common/utils/consts/settings/polkadotCoretime/index.js b/packages/next-common/utils/consts/settings/polkadotCoretime/index.js new file mode 100644 index 0000000000..9fc294f1b1 --- /dev/null +++ b/packages/next-common/utils/consts/settings/polkadotCoretime/index.js @@ -0,0 +1,21 @@ +import Chains from "../../chains"; +import polkadot from "../polkadot"; + +const polkadotCoretime = { + ...polkadot, + value: Chains.polkadotCoretime, + description: + "A revolutionary approach to accessing the right amount of blockspace for every stage of growth.", + endpoints: [ + { + name: "Parity", + url: "wss://polkadot-coretime-rpc.polkadot.io", + }, + { + name: "IBP2", + url: "wss://coretime-polkadot.dotters.network", + }, + ], +}; + +export default polkadotCoretime; diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index 1b587b31fa..bc0068e0b6 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -7,8 +7,9 @@ import ChainProvider, { useChainSettings } from "next-common/context/chain"; import ApiProvider from "next-common/context/api"; import { Provider } from "react-redux"; import { commonReducers } from "next-common/store/reducers"; +import { CHAIN } from "next-common/utils/constants"; -const chain = "coretime"; +const chain = `${CHAIN}-coretime`; const store = createStore({ chain, reducer: commonReducers, @@ -27,10 +28,10 @@ export default function CoretimePage() { } function CoretimePageImpl() { - const { name, description } = useChainSettings(); + const { description } = useChainSettings(); return ( - +
From aa907651e644f65cf527faa5a6bded2f6f0a1b84 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 18 Oct 2024 16:57:28 +0800 Subject: [PATCH 11/27] coretime, sale purchases data #4832 (#4897) * coretime gql client * fetch id * coretime, sale purchases list data * rename gql * display sales count * safe set coretime gql client * add types * tweak --- .../coretime/salesHistorySection.jsx | 24 ---- .../coretime/salesHistorySection/index.jsx | 38 ++++++ .../coretime/salesHistorySection/purchase.jsx | 125 ++++++++++++++++++ .../coretime/salesHistorySection/renewal.jsx | 3 + packages/next-common/hooks/apollo/coretime.js | 23 ++++ .../hooks/{apollo.js => apollo/index.js} | 2 + packages/next-common/services/gql/coretime.js | 34 +++++ packages/next/pages/coretime/index.jsx | 22 ++- 8 files changed, 246 insertions(+), 25 deletions(-) delete mode 100644 packages/next-common/components/coretime/salesHistorySection.jsx create mode 100644 packages/next-common/components/coretime/salesHistorySection/index.jsx create mode 100644 packages/next-common/components/coretime/salesHistorySection/purchase.jsx create mode 100644 packages/next-common/components/coretime/salesHistorySection/renewal.jsx create mode 100644 packages/next-common/hooks/apollo/coretime.js rename packages/next-common/hooks/{apollo.js => apollo/index.js} (96%) create mode 100644 packages/next-common/services/gql/coretime.js diff --git a/packages/next-common/components/coretime/salesHistorySection.jsx b/packages/next-common/components/coretime/salesHistorySection.jsx deleted file mode 100644 index 7d7f58d5f9..0000000000 --- a/packages/next-common/components/coretime/salesHistorySection.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import DataList from "../dataList"; -import { NeutralPanel } from "../styled/containers/neutralPanel"; -import { TitleContainer } from "../styled/containers/titleContainer"; - -export default function CoretimeSalesHistorySection() { - return ( -
- Sales History - - - -
- ); -} diff --git a/packages/next-common/components/coretime/salesHistorySection/index.jsx b/packages/next-common/components/coretime/salesHistorySection/index.jsx new file mode 100644 index 0000000000..caf7d3dda0 --- /dev/null +++ b/packages/next-common/components/coretime/salesHistorySection/index.jsx @@ -0,0 +1,38 @@ +import Tabs from "next-common/components/tabs"; +import { NeutralPanel } from "../../styled/containers/neutralPanel"; +import { TitleContainer } from "../../styled/containers/titleContainer"; +import SalesHistoryPurchase from "./purchase"; +import SalesHistoryRenewal from "./renewal"; +import { useState } from "react"; +import { usePageProps } from "next-common/context/page"; + +export default function CoretimeSalesHistorySection() { + const { purchaseCount, renewalCount } = usePageProps(); + const [activeTabLabel, setActiveTabLabel] = useState("Purchase"); + + return ( +
+ Sales History + + { + setActiveTabLabel(tab.label); + }} + tabs={[ + { + label: "Purchase", + activeCount: purchaseCount, + content: , + }, + { + label: "Renewal", + activeCount: renewalCount, + content: , + }, + ]} + /> + +
+ ); +} diff --git a/packages/next-common/components/coretime/salesHistorySection/purchase.jsx b/packages/next-common/components/coretime/salesHistorySection/purchase.jsx new file mode 100644 index 0000000000..74d0acffcf --- /dev/null +++ b/packages/next-common/components/coretime/salesHistorySection/purchase.jsx @@ -0,0 +1,125 @@ +import dayjs from "dayjs"; +import { MapDataList } from "next-common/components/dataList"; +import Duration from "next-common/components/duration"; +import Pagination from "next-common/components/pagination"; +import AddressUser from "next-common/components/user/addressUser"; +import ValueDisplay from "next-common/components/valueDisplay"; +import { useChainSettings } from "next-common/context/chain"; +import { usePageProps } from "next-common/context/page"; +import { useCoretimeQuery } from "next-common/hooks/apollo"; +import { GET_CORETIME_SALE_PURCHASES } from "next-common/services/gql/coretime"; +import { toPrecision } from "next-common/utils"; +import { defaultPageSize } from "next-common/utils/constants"; +import { useRouter } from "next/router"; +import { useState } from "react"; + +export default function SalesHistoryPurchase() { + const { decimals, symbol } = useChainSettings(); + const { id } = usePageProps(); + const router = useRouter(); + const page = Number(router.query.page) || 1; + const [isTime, setIsTime] = useState(true); + + const pageSize = defaultPageSize; + + const { data, loading } = useCoretimeQuery(GET_CORETIME_SALE_PURCHASES, { + variables: { + saleId: id, + offset: (page - 1) * pageSize, + limit: pageSize, + }, + }); + + const columns = [ + { + name: "Extrinsic ID", + className: "w-40", + render(data) { + return ( +
+ {data?.indexer?.blockHeight}-{data?.indexer?.extrinsicIndex} +
+ ); + }, + }, + { + name: "Core", + className: "w-[120px]", + render(data) { + return
#{data?.regionId?.core}
; + }, + }, + { + name: "Purchased By", + className: "w-60", + render(data) { + return ( +
+ +
+ ); + }, + }, + // TODO: coretime, to the browser + { + name: ( + + ), + className: "w-40", + render(data) { + const time = data?.indexer?.blockTime; + + return ( +
+ {isTime ? ( + dayjs(time).format("YYYY-MM-DD HH:mm:ss") + ) : ( + + )} +
+ ); + }, + }, + { + name: "Price", + className: "text-right", + render(data) { + return ( +
+ +
+ ); + }, + }, + ]; + + return ( +
+ + +
+ +
+
+ ); +} diff --git a/packages/next-common/components/coretime/salesHistorySection/renewal.jsx b/packages/next-common/components/coretime/salesHistorySection/renewal.jsx new file mode 100644 index 0000000000..427d9a0c0b --- /dev/null +++ b/packages/next-common/components/coretime/salesHistorySection/renewal.jsx @@ -0,0 +1,3 @@ +export default function SalesHistoryRenewal() { + return
Renewal
; +} diff --git a/packages/next-common/hooks/apollo/coretime.js b/packages/next-common/hooks/apollo/coretime.js new file mode 100644 index 0000000000..6e13bfecca --- /dev/null +++ b/packages/next-common/hooks/apollo/coretime.js @@ -0,0 +1,23 @@ +import { ApolloClient, InMemoryCache, useQuery } from "@apollo/client"; +import { CHAIN } from "next-common/utils/constants"; +import getChainSettings from "next-common/utils/consts/settings"; + +const { modules } = getChainSettings(CHAIN); + +/** @type {ApolloClient | undefined} */ +export let coretimeClient; + +if (modules?.coretime) { + coretimeClient = new ApolloClient({ + uri: `https://${CHAIN}-gh-api.subsquare.io/graphql`, + cache: new InMemoryCache(), + }); +} + +/** + * @type {typeof useQuery} + */ +export function useCoretimeQuery(query, options = {}, ...args) { + options.client = options.client || coretimeClient; + return useQuery(query, options, ...args); +} diff --git a/packages/next-common/hooks/apollo.js b/packages/next-common/hooks/apollo/index.js similarity index 96% rename from packages/next-common/hooks/apollo.js rename to packages/next-common/hooks/apollo/index.js index 4106f5048b..8fc26052cd 100644 --- a/packages/next-common/hooks/apollo.js +++ b/packages/next-common/hooks/apollo/index.js @@ -5,6 +5,8 @@ import { useLazyQuery, } from "@apollo/client"; +export * from "./coretime"; + const doTreasuryEcoClient = new ApolloClient({ uri: "https://eco-api.dotreasury.com/graphql", cache: new InMemoryCache(), diff --git a/packages/next-common/services/gql/coretime.js b/packages/next-common/services/gql/coretime.js new file mode 100644 index 0000000000..1965cc7f6a --- /dev/null +++ b/packages/next-common/services/gql/coretime.js @@ -0,0 +1,34 @@ +import { gql } from "@apollo/client"; + +export const GET_CORETIME_CURRENT_SALE = gql` + query MyQuery { + coretimeCurrentSale { + id + purchaseCount + renewalCount + } + } +`; + +export const GET_CORETIME_SALE_PURCHASES = gql` + query MyQuery($limit: Int!, $offset: Int!, $saleId: Int!) { + coretimeSalePurchases(limit: $limit, offset: $offset, saleId: $saleId) { + limit + offset + total + items { + regionId { + core + } + indexer { + blockHeight + blockTime + extrinsicIndex + eventIndex + } + price + who + } + } + } +`; diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index bc0068e0b6..549498cdc5 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -7,6 +7,8 @@ import ChainProvider, { useChainSettings } from "next-common/context/chain"; import ApiProvider from "next-common/context/api"; import { Provider } from "react-redux"; import { commonReducers } from "next-common/store/reducers"; +import { coretimeClient } from "next-common/hooks/apollo"; +import { GET_CORETIME_CURRENT_SALE } from "next-common/services/gql/coretime"; import { CHAIN } from "next-common/utils/constants"; const chain = `${CHAIN}-coretime`; @@ -40,4 +42,22 @@ function CoretimePageImpl() { ); } -export const getServerSideProps = withCommonProps(); +export const getServerSideProps = withCommonProps(async () => { + let data; + try { + const result = await coretimeClient?.query?.({ + query: GET_CORETIME_CURRENT_SALE, + }); + data = result?.data; + } catch (_error) { + /* empty */ + } + + return { + props: { + id: data?.coretimeCurrentSale?.id, + purchaseCount: data?.coretimeCurrentSale?.purchaseCount, + renewalCount: data?.coretimeCurrentSale?.renewalCount, + }, + }; +}); From dcb5f07ba2fbb419c2f62e2742c44503f084bae1 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 18 Oct 2024 17:49:13 +0800 Subject: [PATCH 12/27] coretime, sale renewal data #4832 (#4900) * coretime, renewals data #4832 * fix no nodata text --- .../coretime/salesHistorySection/renewal.jsx | 121 +++++++++++++++++- packages/next-common/services/gql/coretime.js | 23 ++++ 2 files changed, 143 insertions(+), 1 deletion(-) diff --git a/packages/next-common/components/coretime/salesHistorySection/renewal.jsx b/packages/next-common/components/coretime/salesHistorySection/renewal.jsx index 427d9a0c0b..910c948733 100644 --- a/packages/next-common/components/coretime/salesHistorySection/renewal.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/renewal.jsx @@ -1,3 +1,122 @@ +import dayjs from "dayjs"; +import { MapDataList } from "next-common/components/dataList"; +import Duration from "next-common/components/duration"; +import Pagination from "next-common/components/pagination"; +import AddressUser from "next-common/components/user/addressUser"; +import ValueDisplay from "next-common/components/valueDisplay"; +import { useChainSettings } from "next-common/context/chain"; +import { usePageProps } from "next-common/context/page"; +import { useCoretimeQuery } from "next-common/hooks/apollo"; +import { GET_CORETIME_SALE_RENEWALS } from "next-common/services/gql/coretime"; +import { toPrecision } from "next-common/utils"; +import { defaultPageSize } from "next-common/utils/constants"; +import { useState } from "react"; + export default function SalesHistoryRenewal() { - return
Renewal
; + const { decimals, symbol } = useChainSettings(); + const { id } = usePageProps(); + const [page, setPage] = useState(1); + const [isTime, setIsTime] = useState(true); + + const pageSize = defaultPageSize; + + const { data, loading } = useCoretimeQuery(GET_CORETIME_SALE_RENEWALS, { + variables: { + saleId: id, + offset: (page - 1) * pageSize, + limit: pageSize, + }, + }); + + const columns = [ + { + name: "Core", + className: "w-[120px]", + render(data) { + return
#{data?.core}
; + }, + }, + { + name: "Old Core", + className: "w-[120px]", + render(data) { + return
#{data?.oldCore}
; + }, + }, + { + name: "Renewed By", + className: "w-80", + render(data) { + return ( +
+ +
+ ); + }, + }, + // TODO: coretime, to the browser + { + name: ( + + ), + className: "min-w-[160px]", + render(data) { + const time = data?.indexer?.blockTime; + + return ( +
+ {isTime ? ( + dayjs(time).format("YYYY-MM-DD HH:mm:ss") + ) : ( + + )} +
+ ); + }, + }, + { + name: "Price", + className: "w-40 text-right", + render(data) { + return ( +
+ +
+ ); + }, + }, + ]; + + return ( +
+ + +
+ { + e.preventDefault(); + setPage(newPage); + }} + /> +
+
+ ); } diff --git a/packages/next-common/services/gql/coretime.js b/packages/next-common/services/gql/coretime.js index 1965cc7f6a..d975d3c014 100644 --- a/packages/next-common/services/gql/coretime.js +++ b/packages/next-common/services/gql/coretime.js @@ -32,3 +32,26 @@ export const GET_CORETIME_SALE_PURCHASES = gql` } } `; + +export const GET_CORETIME_SALE_RENEWALS = gql` + query MyQuery($limit: Int!, $offset: Int!, $saleId: Int!) { + coretimeSaleRenewals(limit: $limit, offset: $offset, saleId: $saleId) { + limit + offset + total + items { + core + oldCore + who + workload + price + indexer { + blockHeight + blockTime + extrinsicIndex + eventIndex + } + } + } + } +`; From e4fbf6a9d05eb0795cac5a56733eb192b552a65c Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 18 Oct 2024 18:21:12 +0800 Subject: [PATCH 13/27] coretime, should check parent chain support coretime #4832 #4895 (#4902) * coretime, should check parent chain support coretime #4832 #4895 * rename var --- packages/next/pages/coretime/index.jsx | 64 +++++++++++++++++--------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index 549498cdc5..6b10003393 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -10,14 +10,26 @@ import { commonReducers } from "next-common/store/reducers"; import { coretimeClient } from "next-common/hooks/apollo"; import { GET_CORETIME_CURRENT_SALE } from "next-common/services/gql/coretime"; import { CHAIN } from "next-common/utils/constants"; +import getChainSettings from "next-common/utils/consts/settings"; -const chain = `${CHAIN}-coretime`; -const store = createStore({ - chain, - reducer: commonReducers, -}); +const isCoretimeSupported = !!getChainSettings(CHAIN).modules?.coretime; + +let chain; +let store; + +if (isCoretimeSupported) { + chain = `${CHAIN}-coretime`; + store = createStore({ + chain, + reducer: commonReducers, + }); +} export default function CoretimePage() { + if (!isCoretimeSupported) { + return null; + } + return ( @@ -42,22 +54,30 @@ function CoretimePageImpl() { ); } -export const getServerSideProps = withCommonProps(async () => { - let data; - try { - const result = await coretimeClient?.query?.({ - query: GET_CORETIME_CURRENT_SALE, - }); - data = result?.data; - } catch (_error) { - /* empty */ +export const getServerSideProps = async (ctx) => { + if (!isCoretimeSupported) { + return { + notFound: true, + }; } - return { - props: { - id: data?.coretimeCurrentSale?.id, - purchaseCount: data?.coretimeCurrentSale?.purchaseCount, - renewalCount: data?.coretimeCurrentSale?.renewalCount, - }, - }; -}); + return withCommonProps(async () => { + let data; + try { + const result = await coretimeClient?.query?.({ + query: GET_CORETIME_CURRENT_SALE, + }); + data = result?.data; + } catch (_error) { + /* empty */ + } + + return { + props: { + id: data?.coretimeCurrentSale?.id, + purchaseCount: data?.coretimeCurrentSale?.purchaseCount, + renewalCount: data?.coretimeCurrentSale?.renewalCount, + }, + }; + })(ctx); +}; From 34483657e81201bdd24f95cbbbaccce8ecfbf6fc Mon Sep 17 00:00:00 2001 From: 2nthony Date: Fri, 18 Oct 2024 18:34:34 +0800 Subject: [PATCH 14/27] coretime, rename sales section files and components #4832 (#4903) * no need to persist url * coretime, rename sales section files and components #4832 --- .../coretime/salesHistorySection/index.jsx | 14 +++++++------- .../{purchase.jsx => purchases.jsx} | 13 +++++++------ .../{renewal.jsx => renewals.jsx} | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) rename packages/next-common/components/coretime/salesHistorySection/{purchase.jsx => purchases.jsx} (92%) rename packages/next-common/components/coretime/salesHistorySection/{renewal.jsx => renewals.jsx} (98%) diff --git a/packages/next-common/components/coretime/salesHistorySection/index.jsx b/packages/next-common/components/coretime/salesHistorySection/index.jsx index caf7d3dda0..38f83b6848 100644 --- a/packages/next-common/components/coretime/salesHistorySection/index.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/index.jsx @@ -1,14 +1,14 @@ import Tabs from "next-common/components/tabs"; import { NeutralPanel } from "../../styled/containers/neutralPanel"; import { TitleContainer } from "../../styled/containers/titleContainer"; -import SalesHistoryPurchase from "./purchase"; -import SalesHistoryRenewal from "./renewal"; +import SalesHistoryPurchases from "./purchases"; +import SalesHistoryRenewals from "./renewals"; import { useState } from "react"; import { usePageProps } from "next-common/context/page"; export default function CoretimeSalesHistorySection() { const { purchaseCount, renewalCount } = usePageProps(); - const [activeTabLabel, setActiveTabLabel] = useState("Purchase"); + const [activeTabLabel, setActiveTabLabel] = useState("Purchases"); return (
@@ -21,14 +21,14 @@ export default function CoretimeSalesHistorySection() { }} tabs={[ { - label: "Purchase", + label: "Purchases", activeCount: purchaseCount, - content: , + content: , }, { - label: "Renewal", + label: "Renewals", activeCount: renewalCount, - content: , + content: , }, ]} /> diff --git a/packages/next-common/components/coretime/salesHistorySection/purchase.jsx b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx similarity index 92% rename from packages/next-common/components/coretime/salesHistorySection/purchase.jsx rename to packages/next-common/components/coretime/salesHistorySection/purchases.jsx index 74d0acffcf..b80a198c6a 100644 --- a/packages/next-common/components/coretime/salesHistorySection/purchase.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx @@ -10,14 +10,12 @@ import { useCoretimeQuery } from "next-common/hooks/apollo"; import { GET_CORETIME_SALE_PURCHASES } from "next-common/services/gql/coretime"; import { toPrecision } from "next-common/utils"; import { defaultPageSize } from "next-common/utils/constants"; -import { useRouter } from "next/router"; import { useState } from "react"; -export default function SalesHistoryPurchase() { +export default function SalesHistoryPurchases() { const { decimals, symbol } = useChainSettings(); const { id } = usePageProps(); - const router = useRouter(); - const page = Number(router.query.page) || 1; + const [page, setPage] = useState(1); const [isTime, setIsTime] = useState(true); const pageSize = defaultPageSize; @@ -107,17 +105,20 @@ export default function SalesHistoryPurchase() {
{ + e.preventDefault(); + setPage(newPage); + }} />
diff --git a/packages/next-common/components/coretime/salesHistorySection/renewal.jsx b/packages/next-common/components/coretime/salesHistorySection/renewals.jsx similarity index 98% rename from packages/next-common/components/coretime/salesHistorySection/renewal.jsx rename to packages/next-common/components/coretime/salesHistorySection/renewals.jsx index 910c948733..fe5be6f75a 100644 --- a/packages/next-common/components/coretime/salesHistorySection/renewal.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/renewals.jsx @@ -12,7 +12,7 @@ import { toPrecision } from "next-common/utils"; import { defaultPageSize } from "next-common/utils/constants"; import { useState } from "react"; -export default function SalesHistoryRenewal() { +export default function SalesHistoryRenewals() { const { decimals, symbol } = useChainSettings(); const { id } = usePageProps(); const [page, setPage] = useState(1); From 544a7a955742290ee2528aa9549fae5c691900b0 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Mon, 21 Oct 2024 14:11:59 +0800 Subject: [PATCH 15/27] coretime, tweak sales history #4832 (#4913) * fix: datalist for case nav collapsed * coretime integrate subscan * fix browser link * swap table --- .../coretime/salesHistorySection/index.jsx | 10 +++--- .../salesHistorySection/purchases.jsx | 34 +++++++------------ .../coretime/salesHistorySection/renewals.jsx | 18 +++++----- .../next-common/components/dataList/index.jsx | 2 +- .../next-common/components/dataList/item.jsx | 24 ++++++++++--- .../consts/settings/kusamaCoretime/index.js | 5 +++ .../consts/settings/polkadotCoretime/index.js | 5 +++ 7 files changed, 57 insertions(+), 41 deletions(-) diff --git a/packages/next-common/components/coretime/salesHistorySection/index.jsx b/packages/next-common/components/coretime/salesHistorySection/index.jsx index 38f83b6848..b19c8f9ee3 100644 --- a/packages/next-common/components/coretime/salesHistorySection/index.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/index.jsx @@ -20,16 +20,16 @@ export default function CoretimeSalesHistorySection() { setActiveTabLabel(tab.label); }} tabs={[ - { - label: "Purchases", - activeCount: purchaseCount, - content: , - }, { label: "Renewals", activeCount: renewalCount, content: , }, + { + label: "Purchases", + activeCount: purchaseCount, + content: , + }, ]} /> diff --git a/packages/next-common/components/coretime/salesHistorySection/purchases.jsx b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx index b80a198c6a..e4382548e4 100644 --- a/packages/next-common/components/coretime/salesHistorySection/purchases.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx @@ -1,6 +1,7 @@ import dayjs from "dayjs"; import { MapDataList } from "next-common/components/dataList"; import Duration from "next-common/components/duration"; +import ExplorerLink from "next-common/components/links/explorerLink"; import Pagination from "next-common/components/pagination"; import AddressUser from "next-common/components/user/addressUser"; import ValueDisplay from "next-common/components/valueDisplay"; @@ -29,17 +30,6 @@ export default function SalesHistoryPurchases() { }); const columns = [ - { - name: "Extrinsic ID", - className: "w-40", - render(data) { - return ( -
- {data?.indexer?.blockHeight}-{data?.indexer?.extrinsicIndex} -
- ); - }, - }, { name: "Core", className: "w-[120px]", @@ -49,7 +39,7 @@ export default function SalesHistoryPurchases() { }, { name: "Purchased By", - className: "w-60", + className: "w-80", render(data) { return (
@@ -58,7 +48,6 @@ export default function SalesHistoryPurchases() { ); }, }, - // TODO: coretime, to the browser { name: (
+ +
+ {isTime ? ( + dayjs(time).format("YYYY-MM-DD HH:mm:ss") + ) : ( + + )} +
+
); }, }, diff --git a/packages/next-common/components/dataList/index.jsx b/packages/next-common/components/dataList/index.jsx index 318f415428..eb7a9975af 100644 --- a/packages/next-common/components/dataList/index.jsx +++ b/packages/next-common/components/dataList/index.jsx @@ -118,7 +118,7 @@ export default function DataList({ "datalist-head", "flex items-center pb-3", "border-b border-neutral300", - "max-sm:hidden", + navCollapsed ? "max-sm:hidden" : "max-md:hidden", )} > {columns.map((column, idx) => ( diff --git a/packages/next-common/components/dataList/item.jsx b/packages/next-common/components/dataList/item.jsx index 1143eb9988..73145f51c8 100644 --- a/packages/next-common/components/dataList/item.jsx +++ b/packages/next-common/components/dataList/item.jsx @@ -3,6 +3,7 @@ import { cn } from "next-common/utils"; import Descriptions from "../Descriptions"; import { last } from "lodash-es"; import { isNil } from "lodash-es"; +import { useNavCollapsed } from "next-common/context/nav"; export default function DataListItem({ columns, @@ -12,6 +13,7 @@ export default function DataListItem({ highlighted, }) { const { onClick } = row ?? {}; + const [navCollapsed] = useNavCollapsed(); return (
); } -function DesktopContent({ row, columnClassNames, columnStyles }) { +function DesktopContent({ row, columnClassNames, columnStyles, navCollapsed }) { return ( -
+
{row?.map((item, idx) => (
{ return { name: col.name, @@ -102,7 +111,12 @@ function MobileContent({ row = [], columns }) { .filter(Boolean); return ( -
+
{first.value} diff --git a/packages/next-common/utils/consts/settings/kusamaCoretime/index.js b/packages/next-common/utils/consts/settings/kusamaCoretime/index.js index 64bea83e73..060da05d5a 100644 --- a/packages/next-common/utils/consts/settings/kusamaCoretime/index.js +++ b/packages/next-common/utils/consts/settings/kusamaCoretime/index.js @@ -32,6 +32,11 @@ const kusamaCoretime = { url: "wss://coretime-kusama-rpc.dwellir.com", }, ], + integrations: { + subscan: { + domain: "coretime-kusama", + }, + }, }; export default kusamaCoretime; diff --git a/packages/next-common/utils/consts/settings/polkadotCoretime/index.js b/packages/next-common/utils/consts/settings/polkadotCoretime/index.js index 9fc294f1b1..38c5796644 100644 --- a/packages/next-common/utils/consts/settings/polkadotCoretime/index.js +++ b/packages/next-common/utils/consts/settings/polkadotCoretime/index.js @@ -16,6 +16,11 @@ const polkadotCoretime = { url: "wss://coretime-polkadot.dotters.network", }, ], + integrations: { + subscan: { + domain: "coretime-polkadot", + }, + }, }; export default polkadotCoretime; From 3d50daee21f000336096730be683551fd8d29061 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Mon, 21 Oct 2024 15:31:58 +0800 Subject: [PATCH 16/27] bump icons --- packages/kintsugi-next/package.json | 2 +- packages/next-common/package.json | 2 +- packages/next/package.json | 2 +- yarn.lock | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/kintsugi-next/package.json b/packages/kintsugi-next/package.json index d17138983f..12c491cbb8 100644 --- a/packages/kintsugi-next/package.json +++ b/packages/kintsugi-next/package.json @@ -12,7 +12,7 @@ "dependencies": { "@interlay/monetary-js": "^0.5.3", "@next/env": "^13.3.0", - "@osn/icons": "^1.141.0", + "@osn/icons": "^1.144.0", "@polkadot/util-crypto": "^13.1.1", "@svgr/webpack": "^7.0.0", "bignumber.js": "^9.0.2", diff --git a/packages/next-common/package.json b/packages/next-common/package.json index cafb7a20a2..ef46272cf3 100644 --- a/packages/next-common/package.json +++ b/packages/next-common/package.json @@ -16,7 +16,7 @@ "@interlay/monetary-js": "0.5.4", "@mimirdev/apps-inject": "^0.3.0", "@mimirdev/apps-sdk": "^0.2.0", - "@osn/icons": "^1.141.0", + "@osn/icons": "^1.144.0", "@osn/polkadot-react-identicon": "^1.0.8", "@osn/previewer": "^1.4.3", "@osn/provider-options": "1.1.0", diff --git a/packages/next/package.json b/packages/next/package.json index 5541ccd304..c283dd8768 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@next/env": "^13.3.0", - "@osn/icons": "^1.141.0", + "@osn/icons": "^1.144.0", "@svgr/webpack": "^7.0.0", "bignumber.js": "^9.0.2", "chartjs-plugin-gradient": "^0.6.1", diff --git a/yarn.lock b/yarn.lock index 4be290c12c..0e33e99d1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2887,10 +2887,10 @@ __metadata: languageName: node linkType: hard -"@osn/icons@npm:^1.141.0": - version: 1.141.0 - resolution: "@osn/icons@npm:1.141.0" - checksum: 4d54cdeb637cdbacdb255de9925abada6bbfa742fad2ea45bd5bf6f47a2b578c2bf6194d7d0cd28d1fec3c59cb9fb68d96b8f257e1aaa49599e0f24ac8773ab5 +"@osn/icons@npm:^1.144.0": + version: 1.144.0 + resolution: "@osn/icons@npm:1.144.0" + checksum: 2bb5f1b87c068bea0fe1248f8b159d4923acd93f2d68a1f5d62a00323f6aa266be07af0da5729e8c6fecd07ed33d63d26481b7e2c27136fe2d11e63caa0270ad languageName: node linkType: hard @@ -5527,7 +5527,7 @@ __metadata: "@interlay/monetary-js": ^0.5.3 "@next/env": ^13.3.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.141.0 + "@osn/icons": ^1.144.0 "@polkadot/util-crypto": ^13.1.1 "@svgr/webpack": ^7.0.0 "@types/lodash-es": ^4.17.12 @@ -5563,7 +5563,7 @@ __metadata: "@next/bundle-analyzer": ^14.2.4 "@next/env": ^13.3.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.141.0 + "@osn/icons": ^1.144.0 "@svgr/webpack": ^7.0.0 "@types/lodash-es": ^4.17.12 bignumber.js: ^9.0.2 @@ -13001,7 +13001,7 @@ __metadata: "@mimirdev/apps-inject": ^0.3.0 "@mimirdev/apps-sdk": ^0.2.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.141.0 + "@osn/icons": ^1.144.0 "@osn/polkadot-react-identicon": ^1.0.8 "@osn/previewer": ^1.4.3 "@osn/provider-options": 1.1.0 From 7f18ae2a57e6affda9cef9a5cf77483695a57118 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Tue, 22 Oct 2024 17:18:55 +0800 Subject: [PATCH 17/27] coretime, sale panel data, stage 1 #4832 (#4921) * sale panel revenue data * stash * ssr --- .../components/coretime/salePanel.jsx | 60 --------- .../components/coretime/salePanel/index.jsx | 22 ++++ .../components/coretime/salePanel/summary.jsx | 114 ++++++++++++++++++ packages/next-common/services/gql/coretime.js | 21 ++++ packages/next/pages/coretime/index.jsx | 53 ++++++-- 5 files changed, 199 insertions(+), 71 deletions(-) delete mode 100644 packages/next-common/components/coretime/salePanel.jsx create mode 100644 packages/next-common/components/coretime/salePanel/index.jsx create mode 100644 packages/next-common/components/coretime/salePanel/summary.jsx diff --git a/packages/next-common/components/coretime/salePanel.jsx b/packages/next-common/components/coretime/salePanel.jsx deleted file mode 100644 index 92b93d6274..0000000000 --- a/packages/next-common/components/coretime/salePanel.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useChainSettings } from "next-common/context/chain"; -import { NeutralPanel } from "../styled/containers/neutralPanel"; -import Divider from "../styled/layout/divider"; -import SummaryItem from "../summary/layout/item"; -import SummaryLayout from "../summary/layout/layout"; -import ValueDisplay from "../valueDisplay"; -import { toPrecision } from "next-common/utils"; - -export default function CoretimeSalePanel() { - const { decimals, symbol } = useChainSettings(); - - return ( - -

Coretime Sale #1

- - - - - - -
52
-
- -
Interlude Phase
-
- -
[time]
-
- - -
-
System Reserved 0
-
Leased 0
-
Renewal 4
-
-
- -
-
End in [time]
-
-
- -
-
Start Block: [block]
-
End Block: [block]
-
-
-
- -
- -
-
chart
-
-
- ); -} diff --git a/packages/next-common/components/coretime/salePanel/index.jsx b/packages/next-common/components/coretime/salePanel/index.jsx new file mode 100644 index 0000000000..5b07893f6a --- /dev/null +++ b/packages/next-common/components/coretime/salePanel/index.jsx @@ -0,0 +1,22 @@ +import { usePageProps } from "next-common/context/page"; +import { NeutralPanel } from "../../styled/containers/neutralPanel"; +import Divider from "../../styled/layout/divider"; +import CoretimeSaleSummary from "./summary"; + +export default function CoretimeSalePanel() { + const { id, coretimeSale } = usePageProps(); + + return ( + +

Coretime Sale #{id}

+ + + +
+ +
+
chart
+
+
+ ); +} diff --git a/packages/next-common/components/coretime/salePanel/summary.jsx b/packages/next-common/components/coretime/salePanel/summary.jsx new file mode 100644 index 0000000000..d88733147a --- /dev/null +++ b/packages/next-common/components/coretime/salePanel/summary.jsx @@ -0,0 +1,114 @@ +import SummaryItem from "next-common/components/summary/layout/item"; +import SummaryLayout from "next-common/components/summary/layout/layout"; +import ValueDisplay from "next-common/components/valueDisplay"; +import { useChainSettings } from "next-common/context/chain"; +import { usePageProps } from "next-common/context/page"; +import { toPrecision } from "next-common/utils"; + +function Item({ label = "", value }) { + return ( +
+
{label}
+
{value}
+
+ ); +} + +export default function CoretimeSaleSummary({ data }) { + const { renewalCount, purchaseCount } = usePageProps(); + const { decimals, symbol } = useChainSettings(); + + return ( +
+ + + {data?.info?.price ? ( + + ) : ( +
-
+ )} +
+ + + {data?.info ? ( +
+ {data?.info?.coresSold} + + {" "} + / {data?.info?.coresOffered} + +
+ ) : ( +
-
+ )} +
+ + +
Interlude
+
+ + +
[time]
+
+ + +
+ + } + /> + + } + /> + + } + /> +
+
+ + +
+ + + +
+
+ + +
+ +
+
+ + +
+ +
+
+
+
+ ); +} diff --git a/packages/next-common/services/gql/coretime.js b/packages/next-common/services/gql/coretime.js index d975d3c014..6c6a92717c 100644 --- a/packages/next-common/services/gql/coretime.js +++ b/packages/next-common/services/gql/coretime.js @@ -10,6 +10,27 @@ export const GET_CORETIME_CURRENT_SALE = gql` } `; +export const GET_CORETIME_SALE = gql` + query MyQuery($id: Int!) { + coretimeSale(id: $id) { + id + purchaseRevenue + renewalRevenue + totalRevenue + info { + firstCore + price + coresSold + coresOffered + regionBegin + regionEnd + saleStart + selloutPrice + } + } + } +`; + export const GET_CORETIME_SALE_PURCHASES = gql` query MyQuery($limit: Int!, $offset: Int!, $saleId: Int!) { coretimeSalePurchases(limit: $limit, offset: $offset, saleId: $saleId) { diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index 6b10003393..fe8c266d49 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -8,9 +8,13 @@ import ApiProvider from "next-common/context/api"; import { Provider } from "react-redux"; import { commonReducers } from "next-common/store/reducers"; import { coretimeClient } from "next-common/hooks/apollo"; -import { GET_CORETIME_CURRENT_SALE } from "next-common/services/gql/coretime"; +import { + GET_CORETIME_CURRENT_SALE, + GET_CORETIME_SALE, +} from "next-common/services/gql/coretime"; import { CHAIN } from "next-common/utils/constants"; import getChainSettings from "next-common/utils/consts/settings"; +import { isNil } from "lodash-es"; const isCoretimeSupported = !!getChainSettings(CHAIN).modules?.coretime; @@ -62,22 +66,49 @@ export const getServerSideProps = async (ctx) => { } return withCommonProps(async () => { - let data; + let props = {}; + try { - const result = await coretimeClient?.query?.({ - query: GET_CORETIME_CURRENT_SALE, - }); - data = result?.data; + const { + data: { coretimeCurrentSale = null }, + } = + (await coretimeClient?.query?.({ + query: GET_CORETIME_CURRENT_SALE, + })) || {}; + + const id = coretimeCurrentSale?.id || null; + + props = { + id, + purchaseCount: coretimeCurrentSale?.purchaseCount || null, + renewalCount: coretimeCurrentSale?.renewalCount || null, + }; + + if (!isNil(id)) { + const { + data: { coretimeSale = null }, + } = + (await coretimeClient?.query?.({ + query: GET_CORETIME_SALE, + variables: { + id, + }, + })) || {}; + + if (coretimeSale) { + props.coretimeSale = coretimeSale; + } + } + + return { + props, + }; } catch (_error) { /* empty */ } return { - props: { - id: data?.coretimeCurrentSale?.id, - purchaseCount: data?.coretimeCurrentSale?.purchaseCount, - renewalCount: data?.coretimeCurrentSale?.renewalCount, - }, + props, }; })(ctx); }; From 59863ac338a39cbe9e6791c9877466ae60766ece Mon Sep 17 00:00:00 2001 From: Yongfeng LI Date: Wed, 23 Oct 2024 13:05:17 +0800 Subject: [PATCH 18/27] Refactor the code to query current coretime sale, #4832 (#4923) --- .../components/coretime/salePanel/index.jsx | 4 +- packages/next-common/services/gql/coretime.js | 31 ----------- .../next-common/services/gql/currentSale.js | 36 +++++++++++++ packages/next-common/services/gql/sale.js | 0 packages/next/pages/coretime/index.jsx | 53 ++----------------- 5 files changed, 43 insertions(+), 81 deletions(-) create mode 100644 packages/next-common/services/gql/currentSale.js create mode 100644 packages/next-common/services/gql/sale.js diff --git a/packages/next-common/components/coretime/salePanel/index.jsx b/packages/next-common/components/coretime/salePanel/index.jsx index 5b07893f6a..e2504d6f0b 100644 --- a/packages/next-common/components/coretime/salePanel/index.jsx +++ b/packages/next-common/components/coretime/salePanel/index.jsx @@ -4,11 +4,11 @@ import Divider from "../../styled/layout/divider"; import CoretimeSaleSummary from "./summary"; export default function CoretimeSalePanel() { - const { id, coretimeSale } = usePageProps(); + const { coretimeSale } = usePageProps(); return ( -

Coretime Sale #{id}

+

Coretime Sale #{coretimeSale.id}

diff --git a/packages/next-common/services/gql/coretime.js b/packages/next-common/services/gql/coretime.js index 6c6a92717c..bbd42c15e1 100644 --- a/packages/next-common/services/gql/coretime.js +++ b/packages/next-common/services/gql/coretime.js @@ -1,36 +1,5 @@ import { gql } from "@apollo/client"; -export const GET_CORETIME_CURRENT_SALE = gql` - query MyQuery { - coretimeCurrentSale { - id - purchaseCount - renewalCount - } - } -`; - -export const GET_CORETIME_SALE = gql` - query MyQuery($id: Int!) { - coretimeSale(id: $id) { - id - purchaseRevenue - renewalRevenue - totalRevenue - info { - firstCore - price - coresSold - coresOffered - regionBegin - regionEnd - saleStart - selloutPrice - } - } - } -`; - export const GET_CORETIME_SALE_PURCHASES = gql` query MyQuery($limit: Int!, $offset: Int!, $saleId: Int!) { coretimeSalePurchases(limit: $limit, offset: $offset, saleId: $saleId) { diff --git a/packages/next-common/services/gql/currentSale.js b/packages/next-common/services/gql/currentSale.js new file mode 100644 index 0000000000..c744b8074b --- /dev/null +++ b/packages/next-common/services/gql/currentSale.js @@ -0,0 +1,36 @@ +import { coretimeClient } from "next-common/hooks/apollo"; +import { gql } from "@apollo/client"; + +const GET_CORETIME_CURRENT_SALE = gql` + query MyQuery { + coretimeCurrentSale { + id + purchaseCount + renewalCount + renewalRevenue + purchaseRevenue + totalRevenue + info { + firstCore + price + coresSold + coresOffered + regionBegin + regionEnd + saleStart + selloutPrice + } + } + } +`; + +export default async function queryCoretimeCurrentSale() { + const { + data: { coretimeCurrentSale = null }, + } = + (await coretimeClient?.query?.({ + query: GET_CORETIME_CURRENT_SALE, + })) || {}; + + return coretimeCurrentSale; +} diff --git a/packages/next-common/services/gql/sale.js b/packages/next-common/services/gql/sale.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index fe8c266d49..630b2d3af0 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -7,14 +7,9 @@ import ChainProvider, { useChainSettings } from "next-common/context/chain"; import ApiProvider from "next-common/context/api"; import { Provider } from "react-redux"; import { commonReducers } from "next-common/store/reducers"; -import { coretimeClient } from "next-common/hooks/apollo"; -import { - GET_CORETIME_CURRENT_SALE, - GET_CORETIME_SALE, -} from "next-common/services/gql/coretime"; import { CHAIN } from "next-common/utils/constants"; import getChainSettings from "next-common/utils/consts/settings"; -import { isNil } from "lodash-es"; +import queryCoretimeCurrentSale from "next-common/services/gql/currentSale"; const isCoretimeSupported = !!getChainSettings(CHAIN).modules?.coretime; @@ -66,49 +61,11 @@ export const getServerSideProps = async (ctx) => { } return withCommonProps(async () => { - let props = {}; - - try { - const { - data: { coretimeCurrentSale = null }, - } = - (await coretimeClient?.query?.({ - query: GET_CORETIME_CURRENT_SALE, - })) || {}; - - const id = coretimeCurrentSale?.id || null; - - props = { - id, - purchaseCount: coretimeCurrentSale?.purchaseCount || null, - renewalCount: coretimeCurrentSale?.renewalCount || null, - }; - - if (!isNil(id)) { - const { - data: { coretimeSale = null }, - } = - (await coretimeClient?.query?.({ - query: GET_CORETIME_SALE, - variables: { - id, - }, - })) || {}; - - if (coretimeSale) { - props.coretimeSale = coretimeSale; - } - } - - return { - props, - }; - } catch (_error) { - /* empty */ - } - + const sale = await queryCoretimeCurrentSale(); return { - props, + props: { + coretimeSale: sale, + }, }; })(ctx); }; From db6fe3af1bc48036346f531f436544720efd1e40 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 23 Oct 2024 14:34:03 +0800 Subject: [PATCH 19/27] fix: refactored data #4832 (#4926) --- .../next-common/components/coretime/salePanel/summary.jsx | 6 ++---- .../components/coretime/salesHistorySection/index.jsx | 6 +++--- .../components/coretime/salesHistorySection/purchases.jsx | 4 ++-- .../components/coretime/salesHistorySection/renewals.jsx | 4 ++-- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/next-common/components/coretime/salePanel/summary.jsx b/packages/next-common/components/coretime/salePanel/summary.jsx index d88733147a..190045d227 100644 --- a/packages/next-common/components/coretime/salePanel/summary.jsx +++ b/packages/next-common/components/coretime/salePanel/summary.jsx @@ -2,7 +2,6 @@ import SummaryItem from "next-common/components/summary/layout/item"; import SummaryLayout from "next-common/components/summary/layout/layout"; import ValueDisplay from "next-common/components/valueDisplay"; import { useChainSettings } from "next-common/context/chain"; -import { usePageProps } from "next-common/context/page"; import { toPrecision } from "next-common/utils"; function Item({ label = "", value }) { @@ -15,7 +14,6 @@ function Item({ label = "", value }) { } export default function CoretimeSaleSummary({ data }) { - const { renewalCount, purchaseCount } = usePageProps(); const { decimals, symbol } = useChainSettings(); return ( @@ -92,8 +90,8 @@ export default function CoretimeSaleSummary({ data }) {
- - + +
diff --git a/packages/next-common/components/coretime/salesHistorySection/index.jsx b/packages/next-common/components/coretime/salesHistorySection/index.jsx index b19c8f9ee3..62bca07f87 100644 --- a/packages/next-common/components/coretime/salesHistorySection/index.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/index.jsx @@ -7,7 +7,7 @@ import { useState } from "react"; import { usePageProps } from "next-common/context/page"; export default function CoretimeSalesHistorySection() { - const { purchaseCount, renewalCount } = usePageProps(); + const { coretimeSale } = usePageProps(); const [activeTabLabel, setActiveTabLabel] = useState("Purchases"); return ( @@ -22,12 +22,12 @@ export default function CoretimeSalesHistorySection() { tabs={[ { label: "Renewals", - activeCount: renewalCount, + activeCount: coretimeSale?.renewalCount, content: , }, { label: "Purchases", - activeCount: purchaseCount, + activeCount: coretimeSale?.purchaseCount, content: , }, ]} diff --git a/packages/next-common/components/coretime/salesHistorySection/purchases.jsx b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx index e4382548e4..7c011957c1 100644 --- a/packages/next-common/components/coretime/salesHistorySection/purchases.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx @@ -15,7 +15,7 @@ import { useState } from "react"; export default function SalesHistoryPurchases() { const { decimals, symbol } = useChainSettings(); - const { id } = usePageProps(); + const { coretimeSale } = usePageProps(); const [page, setPage] = useState(1); const [isTime, setIsTime] = useState(true); @@ -23,7 +23,7 @@ export default function SalesHistoryPurchases() { const { data, loading } = useCoretimeQuery(GET_CORETIME_SALE_PURCHASES, { variables: { - saleId: id, + saleId: coretimeSale?.id, offset: (page - 1) * pageSize, limit: pageSize, }, diff --git a/packages/next-common/components/coretime/salesHistorySection/renewals.jsx b/packages/next-common/components/coretime/salesHistorySection/renewals.jsx index e4411280a2..de2ac16ba0 100644 --- a/packages/next-common/components/coretime/salesHistorySection/renewals.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/renewals.jsx @@ -15,7 +15,7 @@ import { useState } from "react"; export default function SalesHistoryRenewals() { const { decimals, symbol } = useChainSettings(); - const { id } = usePageProps(); + const { coretimeSale } = usePageProps(); const [page, setPage] = useState(1); const [isTime, setIsTime] = useState(true); @@ -23,7 +23,7 @@ export default function SalesHistoryRenewals() { const { data, loading } = useCoretimeQuery(GET_CORETIME_SALE_RENEWALS, { variables: { - saleId: id, + saleId: coretimeSale?.id, offset: (page - 1) * pageSize, limit: pageSize, }, From 6158527d1334f80781e477cb2df5f6711dfe7bf0 Mon Sep 17 00:00:00 2001 From: Yongfeng LI Date: Wed, 23 Oct 2024 15:19:29 +0800 Subject: [PATCH 20/27] Add a context to hold coretime sale data, #4832 (#4928) * Add a context to hold sale data, #4832 * Replace coretime sale data with that from context, #4832 * Remove useCoretimeSaleId, #4832 --- .../components/coretime/salePanel/index.jsx | 4 ++-- .../context/coretime/sale/activeSubscriber.js | 6 ++++++ .../coretime/sale/hooks/useCoretimeSale.js | 6 ++++++ .../next-common/context/coretime/sale/index.js | 15 +++++++++++++++ .../next-common/context/coretime/sale/provider.js | 13 +++++++++++++ packages/next/pages/coretime/index.jsx | 7 +++++-- 6 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 packages/next-common/context/coretime/sale/activeSubscriber.js create mode 100644 packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js create mode 100644 packages/next-common/context/coretime/sale/index.js create mode 100644 packages/next-common/context/coretime/sale/provider.js diff --git a/packages/next-common/components/coretime/salePanel/index.jsx b/packages/next-common/components/coretime/salePanel/index.jsx index e2504d6f0b..965a08667f 100644 --- a/packages/next-common/components/coretime/salePanel/index.jsx +++ b/packages/next-common/components/coretime/salePanel/index.jsx @@ -1,10 +1,10 @@ -import { usePageProps } from "next-common/context/page"; import { NeutralPanel } from "../../styled/containers/neutralPanel"; import Divider from "../../styled/layout/divider"; import CoretimeSaleSummary from "./summary"; +import useCoretimeSale from "next-common/context/coretime/sale/hooks/useCoretimeSale"; export default function CoretimeSalePanel() { - const { coretimeSale } = usePageProps(); + const coretimeSale = useCoretimeSale(); return ( diff --git a/packages/next-common/context/coretime/sale/activeSubscriber.js b/packages/next-common/context/coretime/sale/activeSubscriber.js new file mode 100644 index 0000000000..8b6bbc5d4b --- /dev/null +++ b/packages/next-common/context/coretime/sale/activeSubscriber.js @@ -0,0 +1,6 @@ +export default function CoretimeActiveSaleSubscriber({ children }) { + // todo: 1. subscribe current sale from graphql API + // todo: 2. subscribe on chain sale info and update info field + // const [, setActiveSale] = useCoretimeActiveSale(); + return children; +} diff --git a/packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js b/packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js new file mode 100644 index 0000000000..dd0e931bb0 --- /dev/null +++ b/packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js @@ -0,0 +1,6 @@ +import useCoretimeActiveSale from "next-common/context/coretime/sale/provider"; + +export default function useCoretimeSale() { + const [sale] = useCoretimeActiveSale(); + return sale; +} diff --git a/packages/next-common/context/coretime/sale/index.js b/packages/next-common/context/coretime/sale/index.js new file mode 100644 index 0000000000..b2400e00b0 --- /dev/null +++ b/packages/next-common/context/coretime/sale/index.js @@ -0,0 +1,15 @@ +import CoretimeActiveSaleSubscriber from "next-common/context/coretime/sale/activeSubscriber"; +import { usePageProps } from "next-common/context/page"; +import { CoretimeSaleProvider } from "next-common/context/coretime/sale/provider"; + +export function CoretimeActiveSaleProvider({ children }) { + const { coretimeSale } = usePageProps(); + + return ( + + + {children} + + + ) +} diff --git a/packages/next-common/context/coretime/sale/provider.js b/packages/next-common/context/coretime/sale/provider.js new file mode 100644 index 0000000000..cc32ff1c1d --- /dev/null +++ b/packages/next-common/context/coretime/sale/provider.js @@ -0,0 +1,13 @@ +import { createStateContext } from "react-use"; + +const [useCoretimeActiveSale, Provider] = createStateContext({}); + +export function CoretimeSaleProvider({ value, children }) { + return ( + + {children} + + ); +} + +export default useCoretimeActiveSale; diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index 630b2d3af0..b389089a3e 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -10,6 +10,7 @@ import { commonReducers } from "next-common/store/reducers"; import { CHAIN } from "next-common/utils/constants"; import getChainSettings from "next-common/utils/consts/settings"; import queryCoretimeCurrentSale from "next-common/services/gql/currentSale"; +import { CoretimeActiveSaleProvider } from "next-common/context/coretime/sale"; const isCoretimeSupported = !!getChainSettings(CHAIN).modules?.coretime; @@ -33,14 +34,16 @@ export default function CoretimePage() { - + + + ); } -function CoretimePageImpl() { +function CoretimeOverviewPageImpl() { const { description } = useChainSettings(); return ( From 547d657dda6fb04d8b4ccfcd904c360ec892d0d2 Mon Sep 17 00:00:00 2001 From: Yongfeng LI Date: Wed, 23 Oct 2024 16:33:00 +0800 Subject: [PATCH 21/27] Query and subscribe configuration and status, #4832 (#4930) * Rename coretime qql consts file, #4832 * Move current sale query file, #4832 * Query coretime configuration and status, #4832 * Subscribe coretime configuration and status, #4832 * Remove useless comment, #4832 --- .../salesHistorySection/purchases.jsx | 2 +- .../coretime/salesHistorySection/renewals.jsx | 2 +- .../next-common/context/coretime/common.js | 12 +++++++ .../context/coretime/configuration.js | 31 +++++++++++++++++++ .../next-common/context/coretime/status.js | 30 ++++++++++++++++++ .../services/gql/coretime/configuration.js | 28 +++++++++++++++++ .../gql/{coretime.js => coretime/consts.js} | 0 .../gql/{ => coretime}/currentSale.js | 0 .../services/gql/coretime/status.js | 25 +++++++++++++++ packages/next-common/services/gql/sale.js | 0 packages/next/pages/coretime/index.jsx | 17 +++++++--- 11 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 packages/next-common/context/coretime/common.js create mode 100644 packages/next-common/context/coretime/configuration.js create mode 100644 packages/next-common/context/coretime/status.js create mode 100644 packages/next-common/services/gql/coretime/configuration.js rename packages/next-common/services/gql/{coretime.js => coretime/consts.js} (100%) rename packages/next-common/services/gql/{ => coretime}/currentSale.js (100%) create mode 100644 packages/next-common/services/gql/coretime/status.js delete mode 100644 packages/next-common/services/gql/sale.js diff --git a/packages/next-common/components/coretime/salesHistorySection/purchases.jsx b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx index 7c011957c1..b133ccad91 100644 --- a/packages/next-common/components/coretime/salesHistorySection/purchases.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/purchases.jsx @@ -8,10 +8,10 @@ import ValueDisplay from "next-common/components/valueDisplay"; import { useChainSettings } from "next-common/context/chain"; import { usePageProps } from "next-common/context/page"; import { useCoretimeQuery } from "next-common/hooks/apollo"; -import { GET_CORETIME_SALE_PURCHASES } from "next-common/services/gql/coretime"; import { toPrecision } from "next-common/utils"; import { defaultPageSize } from "next-common/utils/constants"; import { useState } from "react"; +import { GET_CORETIME_SALE_PURCHASES } from "next-common/services/gql/coretime/consts"; export default function SalesHistoryPurchases() { const { decimals, symbol } = useChainSettings(); diff --git a/packages/next-common/components/coretime/salesHistorySection/renewals.jsx b/packages/next-common/components/coretime/salesHistorySection/renewals.jsx index de2ac16ba0..ee66a29b93 100644 --- a/packages/next-common/components/coretime/salesHistorySection/renewals.jsx +++ b/packages/next-common/components/coretime/salesHistorySection/renewals.jsx @@ -8,10 +8,10 @@ import ValueDisplay from "next-common/components/valueDisplay"; import { useChainSettings } from "next-common/context/chain"; import { usePageProps } from "next-common/context/page"; import { useCoretimeQuery } from "next-common/hooks/apollo"; -import { GET_CORETIME_SALE_RENEWALS } from "next-common/services/gql/coretime"; import { toPrecision } from "next-common/utils"; import { defaultPageSize } from "next-common/utils/constants"; import { useState } from "react"; +import { GET_CORETIME_SALE_RENEWALS } from "next-common/services/gql/coretime/consts"; export default function SalesHistoryRenewals() { const { decimals, symbol } = useChainSettings(); diff --git a/packages/next-common/context/coretime/common.js b/packages/next-common/context/coretime/common.js new file mode 100644 index 0000000000..e4f853aeba --- /dev/null +++ b/packages/next-common/context/coretime/common.js @@ -0,0 +1,12 @@ +import { CoretimeConfigurationProvider } from "next-common/context/coretime/configuration"; +import { CoretimeStatusProvider } from "next-common/context/coretime/status"; + +export default function CoretimeCommonProvider({ children }) { + return ( + + + {children} + + + ); +} diff --git a/packages/next-common/context/coretime/configuration.js b/packages/next-common/context/coretime/configuration.js new file mode 100644 index 0000000000..08f6fd0e3b --- /dev/null +++ b/packages/next-common/context/coretime/configuration.js @@ -0,0 +1,31 @@ +import { createStateContext } from "react-use"; +import { usePageProps } from "next-common/context/page"; +import useSubStorage from "next-common/hooks/common/useSubStorage"; +import { useEffect } from "react"; + +const [useCoretimeConfiguration, Provider] = createStateContext({}); + +function DataUpdater({ children }) { + const [, setConfiguration] = useCoretimeConfiguration(); + const { result: option } = useSubStorage("broker", "configuration"); + + useEffect(() => { + if (option?.isSome) { + setConfiguration(option.unwrap().toJSON()); + } + }, [option]); + + return children; +} + +export function CoretimeConfigurationProvider({ children }) { + const { configuration } = usePageProps(); + + return ( + + + {children} + + + ); +} diff --git a/packages/next-common/context/coretime/status.js b/packages/next-common/context/coretime/status.js new file mode 100644 index 0000000000..34dca21d45 --- /dev/null +++ b/packages/next-common/context/coretime/status.js @@ -0,0 +1,30 @@ +import { createStateContext } from "react-use"; +import { usePageProps } from "next-common/context/page"; +import useSubStorage from "next-common/hooks/common/useSubStorage"; +import { useEffect } from "react"; + +const [useCoretimeStatus, Provider] = createStateContext({}); + +function DataUpdater({ children }) { + const [, setStatus] = useCoretimeStatus(); + const { result: option } = useSubStorage("broker", "status"); + + useEffect(() => { + if (option?.isSome) { + setStatus(option.unwrap().toJSON()); + } + }, [option]); + + return children; +} + +export function CoretimeStatusProvider({ children }) { + const { status } = usePageProps(); + return ( + + + {children} + + + ); +} diff --git a/packages/next-common/services/gql/coretime/configuration.js b/packages/next-common/services/gql/coretime/configuration.js new file mode 100644 index 0000000000..dac454555e --- /dev/null +++ b/packages/next-common/services/gql/coretime/configuration.js @@ -0,0 +1,28 @@ +import { coretimeClient } from "next-common/hooks/apollo"; +import { gql } from "@apollo/client"; + +const GET_CORETIME_CONFIGURATION = gql` + query MyQuery { + coretimeConfiguration { + advanceNotice + interludeLength + leadinLength + regionLength + idealBulkProportion + limitCoresOffered + renewalBump + contributionTimeout + } + } +`; + +export default async function queryCoretimeConfiguration() { + const { + data: { coretimeConfiguration = null }, + } = + (await coretimeClient?.query?.({ + query: GET_CORETIME_CONFIGURATION, + })) || {}; + + return coretimeConfiguration; +} diff --git a/packages/next-common/services/gql/coretime.js b/packages/next-common/services/gql/coretime/consts.js similarity index 100% rename from packages/next-common/services/gql/coretime.js rename to packages/next-common/services/gql/coretime/consts.js diff --git a/packages/next-common/services/gql/currentSale.js b/packages/next-common/services/gql/coretime/currentSale.js similarity index 100% rename from packages/next-common/services/gql/currentSale.js rename to packages/next-common/services/gql/coretime/currentSale.js diff --git a/packages/next-common/services/gql/coretime/status.js b/packages/next-common/services/gql/coretime/status.js new file mode 100644 index 0000000000..71116b951a --- /dev/null +++ b/packages/next-common/services/gql/coretime/status.js @@ -0,0 +1,25 @@ +import { coretimeClient } from "next-common/hooks/apollo"; +import { gql } from "@apollo/client"; + +const GET_CORETIME_STATUS = gql` + query MyQuery { + coretimeStatus { + coreCount + privatePoolSize + systemPoolSize + lastCommittedTimeslice + lastTimeslice + } + } +`; + +export default async function queryCoretimeStatus() { + const { + data: { coretimeStatus = null }, + } = + (await coretimeClient?.query?.({ + query: GET_CORETIME_STATUS, + })) || {}; + + return coretimeStatus; +} diff --git a/packages/next-common/services/gql/sale.js b/packages/next-common/services/gql/sale.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index b389089a3e..c3773a636f 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -9,8 +9,11 @@ import { Provider } from "react-redux"; import { commonReducers } from "next-common/store/reducers"; import { CHAIN } from "next-common/utils/constants"; import getChainSettings from "next-common/utils/consts/settings"; -import queryCoretimeCurrentSale from "next-common/services/gql/currentSale"; +import queryCoretimeCurrentSale from "next-common/services/gql/coretime/currentSale"; import { CoretimeActiveSaleProvider } from "next-common/context/coretime/sale"; +import queryCoretimeConfiguration from "next-common/services/gql/coretime/configuration"; +import queryCoretimeStatus from "next-common/services/gql/coretime/status"; +import CoretimeCommonProvider from "next-common/context/coretime/common"; const isCoretimeSupported = !!getChainSettings(CHAIN).modules?.coretime; @@ -34,9 +37,11 @@ export default function CoretimePage() { - - - + + + + + @@ -65,9 +70,13 @@ export const getServerSideProps = async (ctx) => { return withCommonProps(async () => { const sale = await queryCoretimeCurrentSale(); + const configuration = await queryCoretimeConfiguration(); + const status = await queryCoretimeStatus(); return { props: { coretimeSale: sale, + configuration, + status, }, }; })(ctx); From 777f3a27b4e7b405635de0708cd4b361416038ef Mon Sep 17 00:00:00 2001 From: Yongfeng LI Date: Wed, 23 Oct 2024 17:00:27 +0800 Subject: [PATCH 22/27] Add hooks to get coretime configuration and status, #4832 (#4932) * Add hooks to get coretime configuration and status, #4832 * Remove useless file, #4832 --- .../next-common/components/coretime/salePanel/index.jsx | 2 +- packages/next-common/context/coretime/configuration.js | 9 +++++++-- .../context/coretime/sale/hooks/useCoretimeSale.js | 6 ------ packages/next-common/context/coretime/sale/provider.js | 7 +++++-- packages/next-common/context/coretime/status.js | 9 +++++++-- 5 files changed, 20 insertions(+), 13 deletions(-) delete mode 100644 packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js diff --git a/packages/next-common/components/coretime/salePanel/index.jsx b/packages/next-common/components/coretime/salePanel/index.jsx index 965a08667f..0e47be2bfd 100644 --- a/packages/next-common/components/coretime/salePanel/index.jsx +++ b/packages/next-common/components/coretime/salePanel/index.jsx @@ -1,7 +1,7 @@ import { NeutralPanel } from "../../styled/containers/neutralPanel"; import Divider from "../../styled/layout/divider"; import CoretimeSaleSummary from "./summary"; -import useCoretimeSale from "next-common/context/coretime/sale/hooks/useCoretimeSale"; +import useCoretimeSale from "next-common/context/coretime/sale/provider"; export default function CoretimeSalePanel() { const coretimeSale = useCoretimeSale(); diff --git a/packages/next-common/context/coretime/configuration.js b/packages/next-common/context/coretime/configuration.js index 08f6fd0e3b..d01d371485 100644 --- a/packages/next-common/context/coretime/configuration.js +++ b/packages/next-common/context/coretime/configuration.js @@ -3,10 +3,10 @@ import { usePageProps } from "next-common/context/page"; import useSubStorage from "next-common/hooks/common/useSubStorage"; import { useEffect } from "react"; -const [useCoretimeConfiguration, Provider] = createStateContext({}); +const [useSharedCoretimeConfiguration, Provider] = createStateContext({}); function DataUpdater({ children }) { - const [, setConfiguration] = useCoretimeConfiguration(); + const [, setConfiguration] = useSharedCoretimeConfiguration(); const { result: option } = useSubStorage("broker", "configuration"); useEffect(() => { @@ -29,3 +29,8 @@ export function CoretimeConfigurationProvider({ children }) { ); } + +export default function useCoretimeConfiguration() { + const [configuration] = useSharedCoretimeConfiguration(); + return configuration; +} diff --git a/packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js b/packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js deleted file mode 100644 index dd0e931bb0..0000000000 --- a/packages/next-common/context/coretime/sale/hooks/useCoretimeSale.js +++ /dev/null @@ -1,6 +0,0 @@ -import useCoretimeActiveSale from "next-common/context/coretime/sale/provider"; - -export default function useCoretimeSale() { - const [sale] = useCoretimeActiveSale(); - return sale; -} diff --git a/packages/next-common/context/coretime/sale/provider.js b/packages/next-common/context/coretime/sale/provider.js index cc32ff1c1d..79c6862cd0 100644 --- a/packages/next-common/context/coretime/sale/provider.js +++ b/packages/next-common/context/coretime/sale/provider.js @@ -1,6 +1,6 @@ import { createStateContext } from "react-use"; -const [useCoretimeActiveSale, Provider] = createStateContext({}); +const [useSharedCoretimeSale, Provider] = createStateContext({}); export function CoretimeSaleProvider({ value, children }) { return ( @@ -10,4 +10,7 @@ export function CoretimeSaleProvider({ value, children }) { ); } -export default useCoretimeActiveSale; +export default function useCoretimeSale() { + const [sale] = useSharedCoretimeSale(); + return sale; +}; diff --git a/packages/next-common/context/coretime/status.js b/packages/next-common/context/coretime/status.js index 34dca21d45..5f4ed0e4d4 100644 --- a/packages/next-common/context/coretime/status.js +++ b/packages/next-common/context/coretime/status.js @@ -3,10 +3,10 @@ import { usePageProps } from "next-common/context/page"; import useSubStorage from "next-common/hooks/common/useSubStorage"; import { useEffect } from "react"; -const [useCoretimeStatus, Provider] = createStateContext({}); +const [useSharedCoretimeStatus, Provider] = createStateContext({}); function DataUpdater({ children }) { - const [, setStatus] = useCoretimeStatus(); + const [, setStatus] = useSharedCoretimeStatus(); const { result: option } = useSubStorage("broker", "status"); useEffect(() => { @@ -28,3 +28,8 @@ export function CoretimeStatusProvider({ children }) { ); } + +export default function useCoretimeStatus() { + const [status] = useSharedCoretimeStatus(); + return status; +} From c389e3f5ac2a75ec2ba3dca983b6d89a41f21e9d Mon Sep 17 00:00:00 2001 From: Yongfeng LI Date: Wed, 23 Oct 2024 17:46:25 +0800 Subject: [PATCH 23/27] Add hook to loop query coretime scan height, #4832 (#4933) * Add hook to loop query coretime scan height, #4832 * Remove lint errors, #4832 --- .../context/coretime/configuration.js | 2 +- .../context/coretime/sale/index.js | 2 +- .../context/coretime/sale/provider.js | 2 +- .../next-common/context/coretime/status.js | 2 +- .../coretime/useLoopCoretimeScanHeight.js | 27 +++++++++++++++++++ .../services/gql/coretime/scanHeight.js | 19 +++++++++++++ packages/next/pages/coretime/index.jsx | 2 ++ 7 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 packages/next-common/hooks/coretime/useLoopCoretimeScanHeight.js create mode 100644 packages/next-common/services/gql/coretime/scanHeight.js diff --git a/packages/next-common/context/coretime/configuration.js b/packages/next-common/context/coretime/configuration.js index d01d371485..edc29edb79 100644 --- a/packages/next-common/context/coretime/configuration.js +++ b/packages/next-common/context/coretime/configuration.js @@ -13,7 +13,7 @@ function DataUpdater({ children }) { if (option?.isSome) { setConfiguration(option.unwrap().toJSON()); } - }, [option]); + }, [option, setConfiguration]); return children; } diff --git a/packages/next-common/context/coretime/sale/index.js b/packages/next-common/context/coretime/sale/index.js index b2400e00b0..6a12196655 100644 --- a/packages/next-common/context/coretime/sale/index.js +++ b/packages/next-common/context/coretime/sale/index.js @@ -11,5 +11,5 @@ export function CoretimeActiveSaleProvider({ children }) { {children} - ) + ); } diff --git a/packages/next-common/context/coretime/sale/provider.js b/packages/next-common/context/coretime/sale/provider.js index 79c6862cd0..30164ddbb5 100644 --- a/packages/next-common/context/coretime/sale/provider.js +++ b/packages/next-common/context/coretime/sale/provider.js @@ -13,4 +13,4 @@ export function CoretimeSaleProvider({ value, children }) { export default function useCoretimeSale() { const [sale] = useSharedCoretimeSale(); return sale; -}; +} diff --git a/packages/next-common/context/coretime/status.js b/packages/next-common/context/coretime/status.js index 5f4ed0e4d4..da65fd6294 100644 --- a/packages/next-common/context/coretime/status.js +++ b/packages/next-common/context/coretime/status.js @@ -13,7 +13,7 @@ function DataUpdater({ children }) { if (option?.isSome) { setStatus(option.unwrap().toJSON()); } - }, [option]); + }, [option, setStatus]); return children; } diff --git a/packages/next-common/hooks/coretime/useLoopCoretimeScanHeight.js b/packages/next-common/hooks/coretime/useLoopCoretimeScanHeight.js new file mode 100644 index 0000000000..65fee638e0 --- /dev/null +++ b/packages/next-common/hooks/coretime/useLoopCoretimeScanHeight.js @@ -0,0 +1,27 @@ +import { setNodeBlockHeight } from "next-common/store/reducers/nodeSlice"; +import { useDispatch } from "react-redux"; +import queryCoretimeScanHeight from "next-common/services/gql/coretime/scanHeight"; +import { useChainSettings } from "next-common/context/chain"; +import { useCallback, useEffect } from "react"; + +export default function useLoopCoretimeScanHeight() { + const dispatch = useDispatch(); + const { blockTime } = useChainSettings(); + + const fetchAndUpdateHeight = useCallback(async () => { + const scanHeight = await queryCoretimeScanHeight(); + dispatch(setNodeBlockHeight(scanHeight)); + }, [dispatch]); + + useEffect(() => { + const interval = setInterval( + () => { + fetchAndUpdateHeight().then(() => { + // scan height updated + }); + }, + parseInt(blockTime) || 12000, + ); + return () => clearInterval(interval); + }, [fetchAndUpdateHeight, blockTime]); +} diff --git a/packages/next-common/services/gql/coretime/scanHeight.js b/packages/next-common/services/gql/coretime/scanHeight.js new file mode 100644 index 0000000000..07adabd86b --- /dev/null +++ b/packages/next-common/services/gql/coretime/scanHeight.js @@ -0,0 +1,19 @@ +import { coretimeClient } from "next-common/hooks/apollo"; +import { gql } from "@apollo/client"; + +const GET_CORETIME_SCAN_HEIGHT = gql` + query MyQuery { + coretimeScanHeight + } +`; + +export default async function queryCoretimeScanHeight() { + const { + data: { coretimeScanHeight = null }, + } = + (await coretimeClient?.query?.({ + query: GET_CORETIME_SCAN_HEIGHT, + })) || {}; + + return coretimeScanHeight; +} diff --git a/packages/next/pages/coretime/index.jsx b/packages/next/pages/coretime/index.jsx index c3773a636f..11f9bb30da 100644 --- a/packages/next/pages/coretime/index.jsx +++ b/packages/next/pages/coretime/index.jsx @@ -14,6 +14,7 @@ import { CoretimeActiveSaleProvider } from "next-common/context/coretime/sale"; import queryCoretimeConfiguration from "next-common/services/gql/coretime/configuration"; import queryCoretimeStatus from "next-common/services/gql/coretime/status"; import CoretimeCommonProvider from "next-common/context/coretime/common"; +import useLoopCoretimeScanHeight from "next-common/hooks/coretime/useLoopCoretimeScanHeight"; const isCoretimeSupported = !!getChainSettings(CHAIN).modules?.coretime; @@ -50,6 +51,7 @@ export default function CoretimePage() { function CoretimeOverviewPageImpl() { const { description } = useChainSettings(); + useLoopCoretimeScanHeight(); return ( From 5b8265e8b02c48ed6ae9ceb2c42983f1eba45e13 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 23 Oct 2024 18:07:47 +0800 Subject: [PATCH 24/27] fix: nav, improve UX for subspace #4833 (#4929) * fix: nav UX for subspace #4833 * fix: init menu type for subspace --- .../next-common/components/nav/menu/index.jsx | 36 ++++++++------- .../components/nav/menu/item/index.jsx | 3 +- .../components/nav/menu/item/item.jsx | 25 +++++++---- packages/next-common/context/global.js | 2 + packages/next-common/context/nav/index.jsx | 45 +++++++++++++++++-- packages/next-common/lib/index.js | 2 + packages/next-common/utils/constants.js | 6 +++ .../utils/consts/menu/coretime.jsx | 3 +- .../next-common/utils/consts/menu/more.jsx | 3 +- packages/next/pages/_app.js | 2 + 10 files changed, 96 insertions(+), 31 deletions(-) diff --git a/packages/next-common/components/nav/menu/index.jsx b/packages/next-common/components/nav/menu/index.jsx index a5182c3ef7..f88055a4cb 100644 --- a/packages/next-common/components/nav/menu/index.jsx +++ b/packages/next-common/components/nav/menu/index.jsx @@ -1,27 +1,17 @@ import { ArrowCircleLeft } from "@osn/icons/subsquare"; import { usePageProps } from "next-common/context/page"; import { getMainMenu } from "next-common/utils/consts/menu"; -import { createGlobalState } from "react-use"; import NavMenuItem from "./item"; import { useRouter } from "next/router"; -import { useEffect } from "react"; - -export const useNavMenuView = createGlobalState({ - view: "main", - menu: null, -}); +import { useNavMenuType } from "next-common/context/nav"; +import { NAV_MENU_TYPE } from "next-common/utils/constants"; export default function NavMenu({ collapsed }) { - const [navMenuView, setNavMenuView] = useNavMenuView(); + const [navMenuType, setNavMenuType] = useNavMenuType(); const { tracks, fellowshipTracks, summary, detail, ambassadorTracks } = usePageProps(); const router = useRouter(); - useEffect(() => { - if (router.pathname === "/") { - setNavMenuView({ view: "main" }); - } - }, [router.pathname, setNavMenuView]); const mainMenu = getMainMenu({ tracks, @@ -32,19 +22,31 @@ export default function NavMenu({ collapsed }) { }); let menu = []; - if (navMenuView.view === "main") { + if (navMenuType.type === NAV_MENU_TYPE.main) { menu = mainMenu; - } else if (navMenuView.view === "subspace") { + } else if (navMenuType.type === NAV_MENU_TYPE.subspace) { + menu = [ + { + name: "Back", + icon: , + onClick() { + router.push("/"); + }, + }, + { type: "divider" }, + ...(navMenuType.menu || []), + ]; + } else if (navMenuType.type === NAV_MENU_TYPE.archived) { menu = [ { name: "Back", icon: , onClick() { - setNavMenuView({ view: "main" }); + setNavMenuType({ type: NAV_MENU_TYPE.main, menu: null }); }, }, { type: "divider" }, - ...(navMenuView.menu || []), + ...(navMenuType.menu || []), ]; } diff --git a/packages/next-common/components/nav/menu/item/index.jsx b/packages/next-common/components/nav/menu/item/index.jsx index 06dea3f2a7..664a51d404 100644 --- a/packages/next-common/components/nav/menu/item/index.jsx +++ b/packages/next-common/components/nav/menu/item/index.jsx @@ -3,6 +3,7 @@ import NavMenuItemGroup from "./group"; import NavMenuItemItem from "./item"; import NavMenuDivider from "../../divider"; import { useNavSubmenuVisible } from "next-common/context/nav"; +import { NAV_MENU_TYPE } from "next-common/utils/constants"; export default function NavMenuItem({ collapsed, ...menu } = {}) { const { type, items } = menu || {}; @@ -14,7 +15,7 @@ export default function NavMenuItem({ collapsed, ...menu } = {}) { return ; } - if (type === "subspace") { + if (type === NAV_MENU_TYPE.subspace) { return ; } diff --git a/packages/next-common/components/nav/menu/item/item.jsx b/packages/next-common/components/nav/menu/item/item.jsx index fb761d3fa1..3440f4b06c 100644 --- a/packages/next-common/components/nav/menu/item/item.jsx +++ b/packages/next-common/components/nav/menu/item/item.jsx @@ -2,9 +2,10 @@ import Link from "next/link"; import { isExternalLink } from "next-common/utils"; import Tooltip from "next-common/components/tooltip"; import NavMenuItemGroup from "./group"; -import { useNavSubmenuVisible } from "next-common/context/nav"; -import { useNavMenuView } from ".."; +import { useNavMenuType, useNavSubmenuVisible } from "next-common/context/nav"; import NavMenuItemTemplate from "./itemTemplate"; +import { useRouter } from "next/router"; +import { NAV_MENU_TYPE } from "next-common/utils/constants"; export default function NavMenuItemItem({ item, @@ -18,9 +19,13 @@ export default function NavMenuItemItem({ }) { const isExternal = isExternalLink(item?.pathname); const [navSubmenuVisible, setNavSubmenuVisible] = useNavSubmenuVisible(); - const [, setNavMenuView] = useNavMenuView(); + const [, setNavMenuType] = useNavMenuType(); + const router = useRouter(); - if (item?.type === "subspace") { + if ( + item?.type === NAV_MENU_TYPE.subspace || + item?.type === NAV_MENU_TYPE.archived + ) { return ( { - setNavMenuView({ - view: "subspace", - menu: item?.items, - }); + if (item?.type === NAV_MENU_TYPE.archived) { + setNavMenuType({ + type: NAV_MENU_TYPE.archived, + menu: item?.items, + }); + } else if (item?.type === NAV_MENU_TYPE.subspace) { + router.push(item?.pathname); + } }} /> ); diff --git a/packages/next-common/context/global.js b/packages/next-common/context/global.js index 7b8f3ae012..3d83c19be6 100644 --- a/packages/next-common/context/global.js +++ b/packages/next-common/context/global.js @@ -22,6 +22,7 @@ export default function GlobalProvider({ pageProperties, navCollapsed, navSubmenuVisible, + pathname, }) { return ( @@ -34,6 +35,7 @@ export default function GlobalProvider({ diff --git a/packages/next-common/context/nav/index.jsx b/packages/next-common/context/nav/index.jsx index 81cab7fbbd..8f4f29ffd1 100644 --- a/packages/next-common/context/nav/index.jsx +++ b/packages/next-common/context/nav/index.jsx @@ -1,19 +1,26 @@ -import { CACHE_KEY } from "next-common/utils/constants"; +import { find } from "lodash-es"; +import { CACHE_KEY, NAV_MENU_TYPE } from "next-common/utils/constants"; +import { getMainMenu } from "next-common/utils/consts/menu"; import { useCookieValue } from "next-common/utils/hooks/useCookieValue"; -import { createContext, useContext } from "react"; +import { createContext, useCallback, useContext, useState } from "react"; +import { useIsomorphicLayoutEffect } from "react-use"; const NavCollapsedContext = createContext([]); const NavSubmenuVisibleContext = createContext([]); +const NavMenuTypeContext = createContext([]); export default function NavProvider({ navCollapsed, navSubmenuVisible = "{}", + pathname, children, }) { return ( - {children} + + {children} + ); @@ -63,3 +70,35 @@ function NavSubmenuVisibleProvider({ children, value }) { ); } + +const menu = getMainMenu(); +export function useNavMenuType() { + return useContext(NavMenuTypeContext); +} +function NavMenuTypeProvider({ pathname, children }) { + const getMatchedMenuType = useCallback((p) => { + const matchedMenu = find(menu, { pathname: p }); + if (matchedMenu?.type === NAV_MENU_TYPE.subspace) { + return { + type: NAV_MENU_TYPE.subspace, + menu: matchedMenu.items, + }; + } + + return { type: NAV_MENU_TYPE.main, menu: null }; + }, []); + + const [navMenuType, setNavMenuType] = useState(getMatchedMenuType(pathname)); + + useIsomorphicLayoutEffect(() => { + if (navMenuType.type !== NAV_MENU_TYPE.archived) { + setNavMenuType(getMatchedMenuType(pathname)); + } + }, [getMatchedMenuType, pathname]); + + return ( + + {children} + + ); +} diff --git a/packages/next-common/lib/index.js b/packages/next-common/lib/index.js index 59533c1ee4..d7d7a5dd87 100644 --- a/packages/next-common/lib/index.js +++ b/packages/next-common/lib/index.js @@ -32,6 +32,7 @@ export function withCommonProps( const listPageProperties = getListPageProperties(context); const detailPageProperties = getDetailPageProperties(context); const connectedAccount = getConnectedAccount(cookies); + const pathname = context.resolvedUrl?.split("?")?.[0]; const [ props, @@ -57,6 +58,7 @@ export function withCommonProps( ...props, props: { ...(props?.props || {}), + pathname, chain: process.env.CHAIN, user: user ?? null, userStatus: userStatus ?? null, diff --git a/packages/next-common/utils/constants.js b/packages/next-common/utils/constants.js index f2140bb368..405de016ac 100644 --- a/packages/next-common/utils/constants.js +++ b/packages/next-common/utils/constants.js @@ -151,3 +151,9 @@ export const FELLOWSHIP_RANK_LEVEL_NAMES = [ "Master Constant", "Grand Master", ]; + +export const NAV_MENU_TYPE = { + main: "main", + subspace: "subspace", + archived: "archived", +}; diff --git a/packages/next-common/utils/consts/menu/coretime.jsx b/packages/next-common/utils/consts/menu/coretime.jsx index fbc335c7b1..9f9b6cda23 100644 --- a/packages/next-common/utils/consts/menu/coretime.jsx +++ b/packages/next-common/utils/consts/menu/coretime.jsx @@ -1,4 +1,5 @@ import { ArrowRight, MenuCoretime, MenuOverview } from "@osn/icons/subsquare"; +import { NAV_MENU_TYPE } from "next-common/utils/constants"; export const coretimeMenu = { name: "Coretime", @@ -6,7 +7,7 @@ export const coretimeMenu = { pathname: "/coretime", icon: , extra: , - type: "subspace", + type: NAV_MENU_TYPE.subspace, items: [ { name: "Overview", diff --git a/packages/next-common/utils/consts/menu/more.jsx b/packages/next-common/utils/consts/menu/more.jsx index bc60cb7af5..4f201f5710 100644 --- a/packages/next-common/utils/consts/menu/more.jsx +++ b/packages/next-common/utils/consts/menu/more.jsx @@ -3,6 +3,7 @@ import { useIsMacOS } from "next-common/context/page"; import { useCmdkPaletteVisible } from "next-common/components/cmdk/cmdkPalette"; import { cn } from "next-common/utils"; import isAssetHub from "next-common/utils/isAssetHub"; +import { NAV_MENU_TYPE } from "next-common/utils/constants"; const space = process.env.NEXT_PUBLIC_OFF_CHAIN_SPACE; @@ -28,7 +29,7 @@ export function getMoreMenu({ archivedMenu = [] }) { archivedMenu?.length && { value: "archived", name: "Archived", - type: "subspace", + type: NAV_MENU_TYPE.archived, extra: , items: archivedMenu, }, diff --git a/packages/next/pages/_app.js b/packages/next/pages/_app.js index 72091461c7..981c24c21e 100644 --- a/packages/next/pages/_app.js +++ b/packages/next/pages/_app.js @@ -54,6 +54,7 @@ function MyApp({ Component, pageProps }) { pageProperties, navCollapsed, navSubmenuVisible, + pathname, ...otherProps } = pageProps; return ( @@ -72,6 +73,7 @@ function MyApp({ Component, pageProps }) { pageProperties={pageProperties} navCollapsed={navCollapsed} navSubmenuVisible={navSubmenuVisible} + pathname={pathname} > From 7310ab9876c05a1d66165483cdcd6c62dfe55f71 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 23 Oct 2024 18:08:33 +0800 Subject: [PATCH 25/27] bump icons [skip ci] --- packages/kintsugi-next/package.json | 2 +- packages/next-common/package.json | 2 +- packages/next/package.json | 2 +- yarn.lock | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/kintsugi-next/package.json b/packages/kintsugi-next/package.json index 12c491cbb8..d8fa48b44e 100644 --- a/packages/kintsugi-next/package.json +++ b/packages/kintsugi-next/package.json @@ -12,7 +12,7 @@ "dependencies": { "@interlay/monetary-js": "^0.5.3", "@next/env": "^13.3.0", - "@osn/icons": "^1.144.0", + "@osn/icons": "^1.145.0", "@polkadot/util-crypto": "^13.1.1", "@svgr/webpack": "^7.0.0", "bignumber.js": "^9.0.2", diff --git a/packages/next-common/package.json b/packages/next-common/package.json index ef46272cf3..5985d51e09 100644 --- a/packages/next-common/package.json +++ b/packages/next-common/package.json @@ -16,7 +16,7 @@ "@interlay/monetary-js": "0.5.4", "@mimirdev/apps-inject": "^0.3.0", "@mimirdev/apps-sdk": "^0.2.0", - "@osn/icons": "^1.144.0", + "@osn/icons": "^1.145.0", "@osn/polkadot-react-identicon": "^1.0.8", "@osn/previewer": "^1.4.3", "@osn/provider-options": "1.1.0", diff --git a/packages/next/package.json b/packages/next/package.json index c283dd8768..810ad017ee 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@next/env": "^13.3.0", - "@osn/icons": "^1.144.0", + "@osn/icons": "^1.145.0", "@svgr/webpack": "^7.0.0", "bignumber.js": "^9.0.2", "chartjs-plugin-gradient": "^0.6.1", diff --git a/yarn.lock b/yarn.lock index b2c1dfeee3..55c56797d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2887,10 +2887,10 @@ __metadata: languageName: node linkType: hard -"@osn/icons@npm:^1.144.0": - version: 1.144.0 - resolution: "@osn/icons@npm:1.144.0" - checksum: 2bb5f1b87c068bea0fe1248f8b159d4923acd93f2d68a1f5d62a00323f6aa266be07af0da5729e8c6fecd07ed33d63d26481b7e2c27136fe2d11e63caa0270ad +"@osn/icons@npm:^1.145.0": + version: 1.145.0 + resolution: "@osn/icons@npm:1.145.0" + checksum: 2b1e9c6d6afc57ce763974a6874f8e8694e5a077b258457553f8ecd8ffb99c77393d0012b4c65c3afcd90e3b68c53782f576b62ce7400186becf43637d5b5810 languageName: node linkType: hard @@ -5527,7 +5527,7 @@ __metadata: "@interlay/monetary-js": ^0.5.3 "@next/env": ^13.3.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.144.0 + "@osn/icons": ^1.145.0 "@polkadot/util-crypto": ^13.1.1 "@svgr/webpack": ^7.0.0 "@types/lodash-es": ^4.17.12 @@ -5563,7 +5563,7 @@ __metadata: "@next/bundle-analyzer": ^14.2.4 "@next/env": ^13.3.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.144.0 + "@osn/icons": ^1.145.0 "@svgr/webpack": ^7.0.0 "@types/lodash-es": ^4.17.12 bignumber.js: ^9.0.2 @@ -13001,7 +13001,7 @@ __metadata: "@mimirdev/apps-inject": ^0.3.0 "@mimirdev/apps-sdk": ^0.2.0 "@osn/eslint-config": ^1.0.2 - "@osn/icons": ^1.144.0 + "@osn/icons": ^1.145.0 "@osn/polkadot-react-identicon": ^1.0.8 "@osn/previewer": ^1.4.3 "@osn/provider-options": 1.1.0 From a2abdb7941a212bf7c9e78adf212ce36fe6de0e1 Mon Sep 17 00:00:00 2001 From: 2nthony Date: Wed, 23 Oct 2024 18:16:28 +0800 Subject: [PATCH 26/27] fix: coretime project icon in network selector #4832 (#4935) --- .../utils/consts/settings/kusamaCoretime/index.js | 6 ++++++ .../utils/consts/settings/polkadotCoretime/index.js | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/next-common/utils/consts/settings/kusamaCoretime/index.js b/packages/next-common/utils/consts/settings/kusamaCoretime/index.js index 060da05d5a..51e8bd5e11 100644 --- a/packages/next-common/utils/consts/settings/kusamaCoretime/index.js +++ b/packages/next-common/utils/consts/settings/kusamaCoretime/index.js @@ -1,11 +1,17 @@ +import dynamic from "next/dynamic"; import Chains from "../../chains"; import kusama from "../kusama"; +const ProjectIconKusamaCoretime = dynamic(() => + import("@osn/icons/subsquare/ProjectIconKusamaCoretime"), +); + const kusamaCoretime = { ...kusama, value: Chains.kusamaCoretime, description: "A revolutionary approach to accessing the right amount of blockspace for every stage of growth.", + avatar: ProjectIconKusamaCoretime, endpoints: [ { name: "Parity", diff --git a/packages/next-common/utils/consts/settings/polkadotCoretime/index.js b/packages/next-common/utils/consts/settings/polkadotCoretime/index.js index 38c5796644..d31891e26d 100644 --- a/packages/next-common/utils/consts/settings/polkadotCoretime/index.js +++ b/packages/next-common/utils/consts/settings/polkadotCoretime/index.js @@ -1,11 +1,17 @@ +import dynamic from "next/dynamic"; import Chains from "../../chains"; import polkadot from "../polkadot"; +const ProjectIconPolkadotCoretime = dynamic(() => + import("@osn/icons/subsquare/ProjectIconPolkadotCoretime"), +); + const polkadotCoretime = { ...polkadot, value: Chains.polkadotCoretime, description: "A revolutionary approach to accessing the right amount of blockspace for every stage of growth.", + avatar: ProjectIconPolkadotCoretime, endpoints: [ { name: "Parity", From bb9ff2852499cb591dfe63c7c785e0b2bd1265a8 Mon Sep 17 00:00:00 2001 From: Yongfeng LI Date: Wed, 23 Oct 2024 19:34:00 +0800 Subject: [PATCH 27/27] Add a hook to get coretime phase data, #4832 (#4936) * Add hook to get coretime phase, #4832 * Add isLoading to phase hook, #4832 --- .../{summary.jsx => summary/index.jsx} | 5 +-- .../coretime/salePanel/summary/phase.jsx | 13 ++++++ .../coretime/hooks/useCoretimeSalePhase.js | 40 +++++++++++++++++++ .../services/gql/coretime/currentSale.js | 10 +++-- 4 files changed, 61 insertions(+), 7 deletions(-) rename packages/next-common/components/coretime/salePanel/{summary.jsx => summary/index.jsx} (96%) create mode 100644 packages/next-common/components/coretime/salePanel/summary/phase.jsx create mode 100644 packages/next-common/context/coretime/hooks/useCoretimeSalePhase.js diff --git a/packages/next-common/components/coretime/salePanel/summary.jsx b/packages/next-common/components/coretime/salePanel/summary/index.jsx similarity index 96% rename from packages/next-common/components/coretime/salePanel/summary.jsx rename to packages/next-common/components/coretime/salePanel/summary/index.jsx index 190045d227..192a5d83ad 100644 --- a/packages/next-common/components/coretime/salePanel/summary.jsx +++ b/packages/next-common/components/coretime/salePanel/summary/index.jsx @@ -3,6 +3,7 @@ import SummaryLayout from "next-common/components/summary/layout/layout"; import ValueDisplay from "next-common/components/valueDisplay"; import { useChainSettings } from "next-common/context/chain"; import { toPrecision } from "next-common/utils"; +import PhaseItem from "next-common/components/coretime/salePanel/summary/phase"; function Item({ label = "", value }) { return ( @@ -44,9 +45,7 @@ export default function CoretimeSaleSummary({ data }) { )} - -
Interlude
-
+
[time]
diff --git a/packages/next-common/components/coretime/salePanel/summary/phase.jsx b/packages/next-common/components/coretime/salePanel/summary/phase.jsx new file mode 100644 index 0000000000..6aa8502036 --- /dev/null +++ b/packages/next-common/components/coretime/salePanel/summary/phase.jsx @@ -0,0 +1,13 @@ +import SummaryItem from "next-common/components/summary/layout/item"; +import useCoretimeSalePhase from "next-common/context/coretime/hooks/useCoretimeSalePhase"; +import FieldLoading from "next-common/components/icons/fieldLoading"; + +export default function PhaseItem() { + const {phase, isLoading} = useCoretimeSalePhase(); + + return ( + +
{isLoading ? : phase}
+
+ ) +} diff --git a/packages/next-common/context/coretime/hooks/useCoretimeSalePhase.js b/packages/next-common/context/coretime/hooks/useCoretimeSalePhase.js new file mode 100644 index 0000000000..fb891464b6 --- /dev/null +++ b/packages/next-common/context/coretime/hooks/useCoretimeSalePhase.js @@ -0,0 +1,40 @@ +import chainOrScanHeightSelector from "next-common/store/reducers/selectors/height"; +import { useSelector } from "react-redux"; +import useCoretimeSale from "next-common/context/coretime/sale/provider"; +import { isNil } from "lodash-es"; + +const Phases = Object.freeze({ + Interlude: "Interlude", + Leadin: "Leadin", + FixedPrice: "Fixed Price", +}); + +export default function useCoretimeSalePhase() { + const chainHeight = useSelector(chainOrScanHeightSelector); + const sale = useCoretimeSale(); + const { initIndexer: { blockHeight: initBlockHeight } = {}, info: { saleStart, leadinLength } = {} } = sale; + + const isLoading = isNil(chainHeight); + if (sale.isFinal) { + return { + isLoading: false, + phase: null, + } + } else if (isLoading) { + return { + isLoading, + phase: null, + } + } + + let phase; + if (chainHeight >= initBlockHeight && chainHeight <= saleStart) { + phase = Phases.Interlude; + } else if (chainHeight > saleStart && chainHeight < saleStart + leadinLength) { + phase = Phases.Leadin; + } else { + phase = Phases.FixedPrice; + } + + return { isLoading, phase }; +} diff --git a/packages/next-common/services/gql/coretime/currentSale.js b/packages/next-common/services/gql/coretime/currentSale.js index c744b8074b..666e29c9c0 100644 --- a/packages/next-common/services/gql/coretime/currentSale.js +++ b/packages/next-common/services/gql/coretime/currentSale.js @@ -11,14 +11,16 @@ const GET_CORETIME_CURRENT_SALE = gql` purchaseRevenue totalRevenue info { - firstCore + saleStart + leadinLength price - coresSold - coresOffered regionBegin regionEnd - saleStart + idealCoresSold + coresOffered + firstCore selloutPrice + coresSold } } }