From 9af6dd816c4a1fbc73782037ad03bc8f910f1ca4 Mon Sep 17 00:00:00 2001 From: Ourai Lin Date: Tue, 11 Feb 2025 15:06:41 +0800 Subject: [PATCH 1/3] chore: change imports from `@ethersproject/units` --- package.json | 2 +- src/app/bounties/[id]/AppliedModal.js | 6 +++--- src/app/bounties/[id]/ApplyFinishedModal.js | 5 ++--- src/app/bounties/[id]/TerminateModal.js | 5 ++--- src/app/creator/build/[type]/AppliedModal.js | 6 +++--- src/app/creator/build/[type]/ManageModal.js | 6 ++---- src/app/dashboard/hire/DepositModal.js | 4 ++-- src/app/dashboard/hire/ExpendHireTimeModal.js | 4 ++-- src/app/dashboard/hire/ManageModal.js | 4 ++-- src/app/dashboard/hire/page.js | 10 +++++----- src/app/learn/[type]/[id]/RightCard.js | 4 ++-- src/shared/constants/bounty.js | 6 +++--- src/shared/utils/web3.js | 7 +++++-- 13 files changed, 34 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 6cc268d7..42d1dd79 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "@heroicons/react": "^2.0.16", "@mysten/dapp-kit": "^0.11.1", "@mysten/sui.js": "^0.49.1", - "@next/bundle-analyzer": "^13.1.1", "@nextui-org/input": "^2.1.16", "@nextui-org/pagination": "^2.0.26", "@nextui-org/react": "^2.2.9", @@ -124,6 +123,7 @@ "@commitlint/cli": "19.6.1", "@commitlint/config-conventional": "19.6.0", "@knosys/sdk": "^0.0.3", + "@next/bundle-analyzer": "^13.1.1", "@tailwindcss/line-clamp": "0.4.4", "@types/node": "18.11.3", "@types/qs": "^6.9.15", diff --git a/src/app/bounties/[id]/AppliedModal.js b/src/app/bounties/[id]/AppliedModal.js index c1e4f642..1b638330 100644 --- a/src/app/bounties/[id]/AppliedModal.js +++ b/src/app/bounties/[id]/AppliedModal.js @@ -14,7 +14,6 @@ * limitations under the License. */ -import { parseUnits } from '@ethersproject/units'; import { writeContract } from '@wagmi/core'; import clsx from 'clsx'; import Image from 'next/image'; @@ -32,6 +31,7 @@ import { BOUNTY_SUPPORTED_CHAIN } from '@/constants/chain'; import { contracts, payTokens } from '@/constants/contract'; import { useAllowance, useApprove } from '@/hooks/useERC20'; import { fetcher } from '@/utils/request'; +import { parseTokenUnits } from '@/utils/web3'; import { useBountyEnvCheck } from '#/domain/bounty/hooks'; import { EXPERIENCE_OPTIONS } from '#/lib/user'; @@ -123,7 +123,7 @@ export function AppliedModal({ open, closeModal, bounty }) { bounty.task, currUser?.user_wallet, payToken.address, - parseUnits((bounty.amount / 100).toString(), payToken.decimals), + parseTokenUnits((bounty.amount / 100).toString(), payToken.decimals), ], }); // console.log(hash) @@ -160,7 +160,7 @@ export function AppliedModal({ open, closeModal, bounty }) { setApproveConfirmLoading(true); try { if ( - Number(allowance.toString()) < Number(parseUnits((bounty.amount / 100).toString(), payToken.decimals).toString()) + Number(allowance.toString()) < Number(parseTokenUnits((bounty.amount / 100).toString(), payToken.decimals).toString()) && approveAsync ) { diff --git a/src/app/bounties/[id]/ApplyFinishedModal.js b/src/app/bounties/[id]/ApplyFinishedModal.js index 8e2da4d7..c23de7e7 100644 --- a/src/app/bounties/[id]/ApplyFinishedModal.js +++ b/src/app/bounties/[id]/ApplyFinishedModal.js @@ -14,7 +14,6 @@ * limitations under the License. */ -import { parseUnits } from '@ethersproject/units'; import { useState } from 'react'; import { toast } from 'react-toastify'; import { useNetwork, useWalletClient } from 'wagmi'; @@ -24,7 +23,7 @@ import { Modal } from '@/components/Modal'; import { BOUNTY_SUPPORTED_CHAIN } from '@/constants/chain'; import { contracts, payTokens } from '@/constants/contract'; import { currentTime } from '@/utils/date'; -import { signBounty } from '@/utils/web3'; +import { parseTokenUnits, signBounty } from '@/utils/web3'; import { useBountyEnvCheck } from '#/domain/bounty/hooks'; import { biulderFinish } from '#/services/bounties'; @@ -46,7 +45,7 @@ export function ApplyFinishedModal({open, close, bounty}) { setLoading(true); const _deadline = currentTime() + 7 * 24 * 60 * 60; // bounty withdraw - const _s = await signBounty(chain?.id, _contracts.bounty, walletClient, bounty.task, parseUnits(amount.toString(), payToken.decimals), _deadline); + const _s = await signBounty(chain?.id, _contracts.bounty, walletClient, bounty.task, parseTokenUnits(amount.toString(), payToken.decimals), _deadline); if (_s === 'error') { setLoading(false); return; diff --git a/src/app/bounties/[id]/TerminateModal.js b/src/app/bounties/[id]/TerminateModal.js index 51525d62..6e792496 100644 --- a/src/app/bounties/[id]/TerminateModal.js +++ b/src/app/bounties/[id]/TerminateModal.js @@ -14,7 +14,6 @@ * limitations under the License. */ -import { parseUnits } from '@ethersproject/units'; import { useState } from 'react'; import { toast } from 'react-toastify'; import { useNetwork, useWalletClient } from 'wagmi'; @@ -24,7 +23,7 @@ import { Modal } from '@/components/Modal'; import { BOUNTY_SUPPORTED_CHAIN } from '@/constants/chain'; import { contracts, payTokens } from '@/constants/contract'; import { currentTime } from '@/utils/date'; -import { signBounty } from '@/utils/web3'; +import { parseTokenUnits, signBounty } from '@/utils/web3'; import { termination } from '#/services/bounties'; @@ -51,7 +50,7 @@ export function TerminateModal({open, close, bounty, type}) { _contracts.bounty, walletClient, bounty.task, - parseUnits(amount.toString(), payToken.decimals), + parseTokenUnits(amount.toString(), payToken.decimals), _deadline ); if (_s === 'error') { diff --git a/src/app/creator/build/[type]/AppliedModal.js b/src/app/creator/build/[type]/AppliedModal.js index 48fed9ce..a72ee007 100644 --- a/src/app/creator/build/[type]/AppliedModal.js +++ b/src/app/creator/build/[type]/AppliedModal.js @@ -14,7 +14,6 @@ * limitations under the License. */ -import { parseUnits } from '@ethersproject/units'; import { EyeIcon } from '@heroicons/react/24/outline'; import { useConnectModal } from '@rainbow-me/rainbowkit'; import { writeContract } from '@wagmi/core'; @@ -35,6 +34,7 @@ import { BountyABI } from '@/constants/abis/bounty'; import { BOUNTY_SUPPORTED_CHAIN } from '@/constants/chain'; import { contracts, payTokens } from '@/constants/contract'; import { useAllowance, useApprove } from '@/hooks/useERC20'; +import { parseTokenUnits } from '@/utils/web3'; import { EXPERIENCE_OPTIONS } from '#/lib/user'; import { denyBuilder, approveBuilder } from '#/services/creator'; @@ -165,7 +165,7 @@ export function AppliedModal({ open, closeModal, bounty, applyCallback }) { bounty.task, currUser?.user_wallet, payToken.address, - parseUnits((bounty.amount / 100).toString(), payToken.decimals), + parseTokenUnits((bounty.amount / 100).toString(), payToken.decimals), ], }); @@ -197,7 +197,7 @@ export function AppliedModal({ open, closeModal, bounty, applyCallback }) { } setApproveConfirmLoading(true); if ( - Number(allowance.toString()) < Number(parseUnits((bounty.amount / 100).toString(), payToken.decimals).toString()) + Number(allowance.toString()) < Number(parseTokenUnits((bounty.amount / 100).toString(), payToken.decimals).toString()) && approveAsync ) { diff --git a/src/app/creator/build/[type]/ManageModal.js b/src/app/creator/build/[type]/ManageModal.js index 4ddcc188..a6030a64 100644 --- a/src/app/creator/build/[type]/ManageModal.js +++ b/src/app/creator/build/[type]/ManageModal.js @@ -14,7 +14,6 @@ * limitations under the License. */ -import { parseUnits } from '@ethersproject/units'; import clsx from 'clsx'; import Image from 'next/image'; import { useCallback, useEffect } from 'react'; @@ -30,7 +29,7 @@ import { BOUNTY_SUPPORTED_CHAIN } from '@/constants/chain'; import { contracts, payTokens } from '@/constants/contract'; import { currentTime, fromNow } from '@/utils/date'; import { formatTime } from '@/utils/date'; -import { signBounty } from '@/utils/web3'; +import { parseTokenUnits, signBounty } from '@/utils/web3'; import { getProgressList, @@ -46,7 +45,6 @@ import { AddProgressModal } from './AddProgressModal'; // import { writeContract, prepareWriteContract } from '@wagmi/core' // import { BountyABI } from '@/constants/abis/bounty' -// import { parseUnits } from '@ethersproject/units' export function ManageModal({ open, @@ -107,7 +105,7 @@ export function ManageModal({ _contracts.bounty, walletClient, bounty.task, - parseUnits(amount.toString(), payToken.decimals), + parseTokenUnits(amount.toString(), payToken.decimals), _deadline ); if (_s === 'error') { diff --git a/src/app/dashboard/hire/DepositModal.js b/src/app/dashboard/hire/DepositModal.js index 674fe68b..0e50dfe4 100644 --- a/src/app/dashboard/hire/DepositModal.js +++ b/src/app/dashboard/hire/DepositModal.js @@ -15,7 +15,6 @@ */ // import { writeContract, prepareWriteContract } from '@wagmi/core' -import { formatUnits } from '@ethersproject/units'; import { waitForTransaction } from '@wagmi/core'; import { writeContract } from '@wagmi/core'; import { useMemo, useState } from 'react'; @@ -27,6 +26,7 @@ import { ModalCloseIcon, TipsIcon } from '@/components/Icons'; import { Modal } from '@/components/Modal'; import { MouseoverTooltip } from '@/components/Tooltip'; import { useAllowance, useApprove } from '@/hooks/useERC20'; +import { formatTokenUnits } from '@/utils/web3'; // import { currentTime } from '@/utils/date' import { hireStart } from '#/services/shilling'; @@ -174,7 +174,7 @@ export function DepositModal({ open, closeModal, hireData }) {

Total Fee

-

${formatUnits(hireData.total_cost, coin?.decimals)}

+

${formatTokenUnits(hireData.total_cost, coin?.decimals)}

Total Fees

${totalFees.toFixed(2)}

- {balance?.data?.value.lt(parseUnits(totalFees.toString(), coin?.decimals)) ? ( + {balance?.data?.value.lt(parseTokenUnits(totalFees.toString(), coin?.decimals)) ? ( diff --git a/src/app/dashboard/hire/ManageModal.js b/src/app/dashboard/hire/ManageModal.js index 8476f81d..f421249a 100644 --- a/src/app/dashboard/hire/ManageModal.js +++ b/src/app/dashboard/hire/ManageModal.js @@ -14,7 +14,6 @@ * limitations under the License. */ -import { formatUnits } from '@ethersproject/units'; import BigNumber from 'bignumber.js'; import Image from 'next/image'; @@ -24,6 +23,7 @@ import { OViewer } from '@/components/MarkDown'; import { Modal } from '@/components/Modal'; import { MouseoverTooltip } from '@/components/Tooltip'; import { formatTime } from '@/utils/date'; +import { formatTokenUnits } from '@/utils/web3'; import { useMediaUrl, useAllSkills, useSlillhubChain } from '#/state/application/hooks'; @@ -307,7 +307,7 @@ export function ManageModal({

Claimed Fees

- ${formatUnits(data.claimed_cost, slillhubChain?.use_coins[0].decimals).toString()} + ${formatTokenUnits(data.claimed_cost, slillhubChain?.use_coins[0].decimals).toString()}

diff --git a/src/app/dashboard/hire/page.js b/src/app/dashboard/hire/page.js index a1f0aee2..248353dc 100644 --- a/src/app/dashboard/hire/page.js +++ b/src/app/dashboard/hire/page.js @@ -15,7 +15,7 @@ */ 'use client'; -import { formatUnits } from '@ethersproject/units'; + import { Popover, Transition } from '@headlessui/react'; import { useConnectModal } from '@rainbow-me/rainbowkit'; import { readContract } from '@wagmi/core'; @@ -39,7 +39,7 @@ import Loader from '@/components/Loader'; import { NoData } from '@/components/NoData'; import { Paging } from '@/components/Paging'; import { formatTime, currentTime } from '@/utils/date'; -import { signSkillHub } from '@/utils/web3'; +import { formatTokenUnits, signSkillHub } from '@/utils/web3'; import { useSkillsHireList } from '#/services/dashboard/hooks'; import { permissionsHireStatus, permissionsStatusApprove } from '#/services/shilling'; @@ -164,7 +164,7 @@ export default function DashboardHire() { args: [Number(current.contract_index_id)], }); - setAvailableFund(formatUnits(_available, slillhubChain.use_coins[0].decimals)); + setAvailableFund(formatTokenUnits(_available, slillhubChain.use_coins[0].decimals)); } }, [slillhubChain, current]); @@ -229,12 +229,12 @@ export default function DashboardHire() {
  • - ${formatUnits(i.total_cost, slillhubChain?.use_coins[0].decimals)} + ${formatTokenUnits(i.total_cost, slillhubChain?.use_coins[0].decimals)}

    ${i.hourly_wage.toFixed(2)} / hour

  • -

    ${formatUnits(i.claimed_cost, slillhubChain?.use_coins[0].decimals).toString()}

    +

    ${formatTokenUnits(i.claimed_cost, slillhubChain?.use_coins[0].decimals).toString()}

  • {i.status === -1 && ( diff --git a/src/app/learn/[type]/[id]/RightCard.js b/src/app/learn/[type]/[id]/RightCard.js index 2eba5bd6..7ebf8d9c 100644 --- a/src/app/learn/[type]/[id]/RightCard.js +++ b/src/app/learn/[type]/[id]/RightCard.js @@ -18,7 +18,6 @@ // import { getBalance } from '@wagmi/core' // import { prepareWriteContract, writeContract } from '@wagmi/core' -import { parseUnits } from '@ethersproject/units'; import { Dialog, Transition } from '@headlessui/react'; import { CheckIcon } from '@heroicons/react/20/solid'; import { useConnectModal } from '@rainbow-me/rainbowkit'; @@ -43,6 +42,7 @@ import { USDTIcon } from '@/components/Icons'; import { TwitterIcon, DownloadIcon } from '@/components/Icons'; import { formatTime } from '@/utils/date'; import { resolvePathWithSearch } from '@/utils/url'; +import { parseTokenUnits } from '@/utils/web3'; import { joinChallengesEnrool, pay } from '#/services/learn/'; // import { currentTime } from '@/utils/date' @@ -278,7 +278,7 @@ export function LearnRightCard({ data, type, permission, related }) { switchNetwork?.(chainId); return; } - const _amount = parseUnits(amount.toString(), 18); + const _amount = parseTokenUnits(amount.toString(), 18); setPayLoading(true); try { if (!data.challenges_extra?.course_challenges_extra_feeds_contract || !data.base.course_series_id) return; diff --git a/src/shared/constants/bounty.js b/src/shared/constants/bounty.js index 807afdc8..3593e40c 100644 --- a/src/shared/constants/bounty.js +++ b/src/shared/constants/bounty.js @@ -14,20 +14,20 @@ * limitations under the License. */ -import { parseUnits } from '@ethersproject/units'; import { waitForTransaction, writeContract } from '@wagmi/core'; +import { parseTokenUnits } from '../utils/web3'; import { BountyABI } from './abis/bounty'; import { contracts, payTokens } from './contract'; export async function withdraw(walletClient, chainId, taskId, amount, deadline, signature) { - // console.log([taskId, parseUnits(amount.toString(), payTokens[chainId].usdt.decimals).toString(), deadline, signature]) + // console.log([taskId, parseTokenUnits(amount.toString(), payTokens[chainId].usdt.decimals).toString(), deadline, signature]) try { const { hash } = await writeContract({ address: contracts[chainId].bounty, abi: BountyABI, functionName: 'withdraw', - args: [taskId, parseUnits(amount.toString(), payTokens[chainId].usdt.decimals).toString(), deadline, signature], + args: [taskId, parseTokenUnits(amount.toString(), payTokens[chainId].usdt.decimals).toString(), deadline, signature], }); const wait = await waitForTransaction({ hash }); return { hash, wait }; diff --git a/src/shared/utils/web3.js b/src/shared/utils/web3.js index d2997879..d4d27da9 100644 --- a/src/shared/utils/web3.js +++ b/src/shared/utils/web3.js @@ -14,7 +14,7 @@ * limitations under the License. */ -export async function signBounty(chainId, contractAddress, singer, taskId, amount, deadline) { +async function signBounty(chainId, contractAddress, singer, taskId, amount, deadline) { const domain = { name: 'Task', version: '1', @@ -42,7 +42,7 @@ export async function signBounty(chainId, contractAddress, singer, taskId, amoun } } -export async function signSkillHub(chainId, contractAddress, singer, amount, time, token, deadline) { +async function signSkillHub(chainId, contractAddress, singer, amount, time, token, deadline) { const domain = { name: 'Employment', version: '1', @@ -71,3 +71,6 @@ export async function signSkillHub(chainId, contractAddress, singer, amount, tim return 'error'; } } + +export { signBounty, signSkillHub }; +export { formatUnits as formatTokenUnits, parseUnits as parseTokenUnits } from '@ethersproject/units'; From 61186caf15a59a1c46e6585aa0286493c11e2129 Mon Sep 17 00:00:00 2001 From: Ourai Lin Date: Tue, 11 Feb 2025 16:09:37 +0800 Subject: [PATCH 2/3] chore: change imports from `lodash` --- package.json | 10 ++- src/app/(uc)/signin/page.js | 2 +- .../creator/learn/[type]/[id]/Chllenges.js | 6 +- src/app/home/Contributor.js | 3 +- src/domain/auth/hooks/useAuthGuard.js | 2 +- src/domain/auth/hooks/useBindWallet.js | 3 +- src/domain/auth/hooks/useSignWallet.js | 3 +- src/domain/bounty/repository.js | 3 +- src/domain/challenge/repository.js | 3 +- src/domain/course/repository.js | 3 +- .../widgets/builder-list/BuilderList.js | 2 +- .../widgets/social-info/Web3BioProfile.js | 2 +- src/domain/profile/widgets/tab-bar/TabBar.js | 2 +- src/domain/quiz/repository.js | 3 +- .../quiz/widgets/quiz-limiter/QuizLimiter.js | 2 +- src/shared/components/Modal/index.js | 3 +- src/shared/components/Pagination/index.js | 2 +- src/shared/components/Select/ReactSelect.js | 3 +- .../components/block-editor/BlockEditor.js | 2 +- src/shared/components/block-editor/helper.js | 2 +- src/shared/hooks/useMounted.js | 3 +- src/shared/utils/address.js | 2 +- src/shared/utils/app.js | 2 +- src/shared/utils/index.js | 68 +++---------------- 24 files changed, 44 insertions(+), 92 deletions(-) diff --git a/package.json b/package.json index 42d1dd79..24889f35 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "@radix-ui/react-slot": "1.0.2", "@rainbow-me/rainbowkit": "^1.3.1", "@reduxjs/toolkit": "^1.9.1", - "@tailwindcss/typography": "^0.5.15", "@tanstack/react-query": "^5.17.15", "@tiptap-extend/columns": "2.1.6", "@vercel/speed-insights": "^1.0.12", @@ -59,13 +58,8 @@ "class-variance-authority": "^0.7.1", "clsx": "^1.2.1", "copy-to-clipboard": "^3.3.3", - "cross-env": "^7.0.3", "daisyui": "^4.4.23", "dayjs": "^1.11.7", - "easymde": "^2.18.0", - "eslint-plugin-react": "^7.31.11", - "eslint-plugin-unused-imports": "^3.0.0", - "ethers": "^6.9.0", "file-saver": "^2.0.5", "framer-motion": "^10.16.4", "github-markdown-css": "^5.2.0", @@ -125,6 +119,7 @@ "@knosys/sdk": "^0.0.3", "@next/bundle-analyzer": "^13.1.1", "@tailwindcss/line-clamp": "0.4.4", + "@tailwindcss/typography": "0.5.15", "@types/node": "18.11.3", "@types/qs": "^6.9.15", "@types/react": "18.2.0", @@ -132,11 +127,14 @@ "@types/sha256": "^0.2.0", "astro": "4.16.7", "autoprefixer": "^10.4.12", + "cross-env": "7.0.3", "eslint": "^8.7.0", "eslint-config-next": "^13.1.1", "eslint-plugin-headers": "1.2.1", "eslint-plugin-perfectionist": "4.8.0", + "eslint-plugin-react": "7.31.11", "eslint-plugin-tailwindcss": "3.15.1", + "eslint-plugin-unused-imports": "3.0.0", "husky": "9.1.7", "ksio": "^0.0.3", "lint-staged": "15.3.0", diff --git a/src/app/(uc)/signin/page.js b/src/app/(uc)/signin/page.js index e2720544..2a5200c0 100644 --- a/src/app/(uc)/signin/page.js +++ b/src/app/(uc)/signin/page.js @@ -18,7 +18,6 @@ import { EyeIcon, EyeSlashIcon } from '@heroicons/react/24/outline'; import clsx from 'clsx'; -import { isEmpty } from 'lodash'; import { signIn } from 'next-auth/react'; import Link from 'next/link'; import { useSearchParams } from 'next/navigation'; @@ -27,6 +26,7 @@ import { useForm } from 'react-hook-form'; import { toast } from 'react-toastify'; import Loader from '@/components/Loader'; +import { isEmpty } from '@/utils'; import { wrapOnChange } from '@/utils/form'; import { signin, emailCodeLogin } from '#/services/auth'; diff --git a/src/app/creator/learn/[type]/[id]/Chllenges.js b/src/app/creator/learn/[type]/[id]/Chllenges.js index 717ae855..dea96e36 100644 --- a/src/app/creator/learn/[type]/[id]/Chllenges.js +++ b/src/app/creator/learn/[type]/[id]/Chllenges.js @@ -16,14 +16,16 @@ import { ChevronLeftIcon, ChevronRightIcon, CalendarDaysIcon } from '@heroicons/react/24/outline'; import clsx from 'clsx'; -import range from 'lodash/range'; import { forwardRef } from 'react'; import DatePicker from 'react-datepicker'; -import 'react-datepicker/dist/react-datepicker.css'; import { ReactSelect } from '@/components/Select/ReactSelect'; + +import 'react-datepicker/dist/react-datepicker.css'; + import { BASE_INPUT_STYLE } from '@/constants/config'; import { TIME_ZONE } from '@/constants/timezone'; +import range from '@/utils'; import { getTime } from '@/utils/date'; import { SelectCountry } from '../../../../profile/SelectCountry'; diff --git a/src/app/home/Contributor.js b/src/app/home/Contributor.js index 0037eef0..16ad8afa 100644 --- a/src/app/home/Contributor.js +++ b/src/app/home/Contributor.js @@ -17,7 +17,6 @@ 'use client'; import { clsx } from 'clsx'; -import { chunk } from 'lodash'; import P14 from 'public/images/home/AlongHudson.png'; import P11 from 'public/images/home/Frank.png'; // import { LocationIcon } from '@/components/Icons' @@ -41,6 +40,8 @@ import P6 from 'public/images/home/xhyumiracle.png'; import { createRef } from 'react'; import Slider from 'react-slick'; +import { chunk } from '@/utils'; + const DATAS = [ { name: 'NPC_Leo', picture: P19, x: 'NPC_Leo', title: 'Founder of DevBase @DevBase' }, { name: 'justin', picture: P15, x: 'hiCaptainZ', title: 'Researcher. Focusing on Onchain Game' }, diff --git a/src/domain/auth/hooks/useAuthGuard.js b/src/domain/auth/hooks/useAuthGuard.js index 8c68560d..9c4f62a7 100644 --- a/src/domain/auth/hooks/useAuthGuard.js +++ b/src/domain/auth/hooks/useAuthGuard.js @@ -14,11 +14,11 @@ * limitations under the License. */ -import { isFunction } from 'lodash'; import { useSession } from 'next-auth/react'; import { usePathname, useSearchParams, useRouter } from 'next/navigation'; import { useCallback } from 'react'; +import { isFunction } from '@/utils'; import { resolvePathWithSearch } from '@/utils/url'; const useAuthGuard = () => { diff --git a/src/domain/auth/hooks/useBindWallet.js b/src/domain/auth/hooks/useBindWallet.js index 3b9e05a7..032707f4 100644 --- a/src/domain/auth/hooks/useBindWallet.js +++ b/src/domain/auth/hooks/useBindWallet.js @@ -15,9 +15,10 @@ */ import { useConnectModal } from '@rainbow-me/rainbowkit'; -import { isFunction } from 'lodash'; import { useAccount } from 'wagmi'; +import { isFunction } from '@/utils'; + import { bindWallet } from '../repository'; import useSignWallet from './useSignWallet'; diff --git a/src/domain/auth/hooks/useSignWallet.js b/src/domain/auth/hooks/useSignWallet.js index 0447dc04..061cc7a7 100644 --- a/src/domain/auth/hooks/useSignWallet.js +++ b/src/domain/auth/hooks/useSignWallet.js @@ -14,9 +14,10 @@ * limitations under the License. */ -import { isFunction } from 'lodash'; import { useSignMessage } from 'wagmi'; +import { isFunction } from '@/utils'; + import { signWallet } from '../repository'; import useEnsureRightEnv from './useEnsureRightEnv'; diff --git a/src/domain/bounty/repository.js b/src/domain/bounty/repository.js index 48be0e5c..c7e05619 100644 --- a/src/domain/bounty/repository.js +++ b/src/domain/bounty/repository.js @@ -14,8 +14,7 @@ * limitations under the License. */ -import { merge } from 'lodash'; - +import { merge } from '@/utils'; import httpClient from '@/utils/http'; async function fetchPublishedBountyList(params = {}) { diff --git a/src/domain/challenge/repository.js b/src/domain/challenge/repository.js index 7fc855d2..d3ba2630 100644 --- a/src/domain/challenge/repository.js +++ b/src/domain/challenge/repository.js @@ -14,8 +14,7 @@ * limitations under the License. */ -import { merge } from 'lodash'; - +import { merge } from '@/utils'; import httpClient, { legacyClient } from '@/utils/http'; async function fetchOne(id) { diff --git a/src/domain/course/repository.js b/src/domain/course/repository.js index b5c7580e..74607119 100644 --- a/src/domain/course/repository.js +++ b/src/domain/course/repository.js @@ -14,8 +14,7 @@ * limitations under the License. */ -import { merge } from 'lodash'; - +import { merge } from '@/utils'; import { legacyClient } from '@/utils/http'; async function fetchOne(id) { diff --git a/src/domain/course/widgets/builder-list/BuilderList.js b/src/domain/course/widgets/builder-list/BuilderList.js index 3b3203ca..42c243ad 100644 --- a/src/domain/course/widgets/builder-list/BuilderList.js +++ b/src/domain/course/widgets/builder-list/BuilderList.js @@ -15,9 +15,9 @@ */ import clsx from 'clsx'; -import { isInteger } from 'lodash'; import Image from '@/components/Image'; +import { isInteger } from '@/utils'; const idKey = 'id'; const avatarKey = 'id'; diff --git a/src/domain/profile/widgets/social-info/Web3BioProfile.js b/src/domain/profile/widgets/social-info/Web3BioProfile.js index 8f6d35d9..f4668c29 100644 --- a/src/domain/profile/widgets/social-info/Web3BioProfile.js +++ b/src/domain/profile/widgets/social-info/Web3BioProfile.js @@ -14,7 +14,7 @@ * limitations under the License. */ -import { capitalize } from 'lodash'; +import { capitalize } from '@/utils'; import SocialLink from './SocialLink'; diff --git a/src/domain/profile/widgets/tab-bar/TabBar.js b/src/domain/profile/widgets/tab-bar/TabBar.js index 282a7f51..29aa10ab 100644 --- a/src/domain/profile/widgets/tab-bar/TabBar.js +++ b/src/domain/profile/widgets/tab-bar/TabBar.js @@ -15,9 +15,9 @@ */ import clsx from 'clsx'; -import { isPlainObject } from 'lodash'; import { Button } from '@/components/Button'; +import { isPlainObject } from '@/utils'; function TabBar({ className, tabs, tabClassName, current, onChange }) { const tabBarWrapperMobileClassName = 'justify-center border-b-1 border-b-[#d9d9d9]'; diff --git a/src/domain/quiz/repository.js b/src/domain/quiz/repository.js index 1ceea85b..ec74ff33 100644 --- a/src/domain/quiz/repository.js +++ b/src/domain/quiz/repository.js @@ -14,8 +14,7 @@ * limitations under the License. */ -import { merge } from 'lodash'; - +import { merge } from '@/utils'; import httpClient from '@/utils/http'; async function fetchPublishedQuizList(params = {}) { diff --git a/src/domain/quiz/widgets/quiz-limiter/QuizLimiter.js b/src/domain/quiz/widgets/quiz-limiter/QuizLimiter.js index 2f6cfeee..ce243ba2 100644 --- a/src/domain/quiz/widgets/quiz-limiter/QuizLimiter.js +++ b/src/domain/quiz/widgets/quiz-limiter/QuizLimiter.js @@ -14,13 +14,13 @@ * limitations under the License. */ -import { isFunction } from 'lodash'; import { useSession } from 'next-auth/react'; import { useRouter } from 'next/navigation'; import { useState, useMemo, useCallback, useEffect } from 'react'; import { toast } from 'react-toastify'; import { Confirm } from '@/components/Modal/Confirm'; +import { isFunction } from '@/utils'; import { authWithGoogle, authWithGithub } from '../../../auth/helper'; import { useBindWallet } from '../../../auth/hooks'; diff --git a/src/shared/components/Modal/index.js b/src/shared/components/Modal/index.js index 042c22dd..e1bf1275 100644 --- a/src/shared/components/Modal/index.js +++ b/src/shared/components/Modal/index.js @@ -16,9 +16,10 @@ import { Dialog, Transition } from '@headlessui/react'; import clsx from 'clsx'; -import { isFunction } from 'lodash'; import React, { Fragment } from 'react'; +import { isFunction } from '../../utils'; + export function Modal({ isOpen, closeModal, diff --git a/src/shared/components/Pagination/index.js b/src/shared/components/Pagination/index.js index 3af92e2e..65fd4729 100644 --- a/src/shared/components/Pagination/index.js +++ b/src/shared/components/Pagination/index.js @@ -17,11 +17,11 @@ 'use client'; import { Pagination } from '@nextui-org/pagination'; -import { isInteger } from 'lodash'; import { useSearchParams, usePathname, useRouter } from 'next/navigation'; import { useMemo } from 'react'; import { PAGE_SIZE } from '../../constants/config'; +import { isInteger } from '../../utils'; import { Button } from '../Button'; export function OPagination({ page, pageSize = PAGE_SIZE, total, changeCallback }) { diff --git a/src/shared/components/Select/ReactSelect.js b/src/shared/components/Select/ReactSelect.js index d25e8a77..dc68cc65 100644 --- a/src/shared/components/Select/ReactSelect.js +++ b/src/shared/components/Select/ReactSelect.js @@ -15,12 +15,13 @@ */ import { XMarkIcon, ChevronDownIcon } from '@heroicons/react/20/solid'; -import { isInteger, isFunction } from 'lodash'; import React from 'react'; import Select, { components } from 'react-select'; import { classNames } from '@/utils'; +import { isInteger, isFunction } from '../../utils'; + export const DropdownIndicator = props => { return ( diff --git a/src/shared/components/block-editor/BlockEditor.js b/src/shared/components/block-editor/BlockEditor.js index c3db4823..78f20b45 100644 --- a/src/shared/components/block-editor/BlockEditor.js +++ b/src/shared/components/block-editor/BlockEditor.js @@ -17,13 +17,13 @@ import '@/styles/prosemirror.css'; import clsx from 'clsx'; -import { isFunction } from 'lodash'; import { EditorRoot, EditorContent, EditorCommand, EditorCommandEmpty, EditorCommandList, EditorCommandItem, } from 'novel'; import { ImageResizer, handleCommandNavigation } from 'novel/extensions'; +import { isFunction } from '../../utils'; import BlockEditorBubble from './bubble'; import { defaultExtensions } from './extensions'; import { isBlockDataValid } from './helper'; diff --git a/src/shared/components/block-editor/helper.js b/src/shared/components/block-editor/helper.js index c2525c20..706931de 100644 --- a/src/shared/components/block-editor/helper.js +++ b/src/shared/components/block-editor/helper.js @@ -14,7 +14,7 @@ * limitations under the License. */ -import { isPlainObject } from 'lodash'; +import { isPlainObject } from '../../utils'; const BLOCK_DATA_SPEC_VERSION = '0.0.1'; diff --git a/src/shared/hooks/useMounted.js b/src/shared/hooks/useMounted.js index c9536359..b270a3ca 100644 --- a/src/shared/hooks/useMounted.js +++ b/src/shared/hooks/useMounted.js @@ -14,9 +14,10 @@ * limitations under the License. */ -import { isFunction } from 'lodash'; import { useEffect } from 'react'; +import { isFunction } from '../utils'; + function useMounted(callback) { useEffect(() => { isFunction(callback) && callback(); diff --git a/src/shared/utils/address.js b/src/shared/utils/address.js index c8bea85a..b28f1c47 100644 --- a/src/shared/utils/address.js +++ b/src/shared/utils/address.js @@ -17,7 +17,7 @@ import { getAddress } from '@ethersproject/address'; // returns the checksummed address if the address is valid, otherwise returns false -export function isAddress(value) { +function isAddress(value) { try { // Alphabetical letters must be made lowercase for getAddress to work. // See documentation here: https://docs.ethers.io/v5/api/utils/address/ diff --git a/src/shared/utils/app.js b/src/shared/utils/app.js index e829487c..ec3ffe70 100644 --- a/src/shared/utils/app.js +++ b/src/shared/utils/app.js @@ -14,7 +14,7 @@ * limitations under the License. */ -import { isString, isFunction, get, cloneDeep } from 'lodash'; +import { isString, isFunction, get, cloneDeep } from './index'; function resolveConfigValue(valueFromEnv, defaultValue, resolve) { if (valueFromEnv === undefined) { diff --git a/src/shared/utils/index.js b/src/shared/utils/index.js index db2b2ebe..20608c18 100644 --- a/src/shared/utils/index.js +++ b/src/shared/utils/index.js @@ -16,7 +16,7 @@ import { getAddress } from '@ethersproject/address'; -export function isAddress(value) { +function isAddress(value) { try { // Alphabetical letters must be made lowercase for getAddress to work. // See documentation here: https://docs.ethers.io/v5/api/utils/address/ @@ -40,22 +40,6 @@ export function shorten(string, chars = 4) { return `${string.substring(0, chars + 2)}...${string.substring(42 - chars)}`; } -export function getPathParams(pathname) { - if (!pathname) return ''; - const _pathname = pathname.split('/'); - return _pathname ? _pathname[_pathname.length - 1] : ''; -} - -export function userAgent() { - if (typeof window === 'undefined') { - return ''; - } - const userAgent = typeof window !== 'undefined' ? window.navigator.userAgent : ''; - const isAndroid = /(Android)/i.test(userAgent); - const isIOS = /(iPhone|iPad|iPod|iOS|Mac|Mac)/i.test(userAgent); - return isAndroid ? 'android' : isIOS ? 'ios' : ''; -} - export function classNames(...classes) { return classes.filter(Boolean).join(' '); } @@ -68,39 +52,6 @@ export function arrRemove(arr, val) { return arr; } -export function base64toBlob(data, pdfContentType) { - // Cut the prefix `data:application/pdf;base64` from the raw base 64 - const base64WithoutPrefix = data.substring(`data:${pdfContentType};base64,`.length); - - const bytes = atob(base64WithoutPrefix); - let length = bytes.length; - const out = new Uint8Array(length); - - while (length--) { - out[length] = bytes.charCodeAt(length); - } - - return new Blob([out], { type: pdfContentType }); -} - -export function getRandom(min, max) { - const floatRandom = Math.random(); - - const difference = max - min; - - const random = Math.round(difference * floatRandom); - - const randomWithinRange = random + min; - - return randomWithinRange; -} - -export async function awaitTimeout () { - await new Promise(resolve => { - setTimeout(resolve, 500); - }); -} - export const createQueryString = (name, value, params, replace) => { params.set('page', '1'); if (!replace) { @@ -124,14 +75,11 @@ export const createQueryString = (name, value, params, replace) => { } return params.toString(); }; -export function shortenString(str, chars = 4) { - return `${str.substring(0, chars + 2)}...${str.substring(42 - chars)}`; -} -export function HTMLDecode(text) { +export function HTMLDecode(text) { if (!text) { return ''; - } + } if (typeof text !== 'string') { return String(text); } @@ -139,9 +87,11 @@ export function HTMLDecode(text) { return text.replace(/&(lt|gt);/ig,function(all,t){ return arrEntities[t]; }); - // let temp = document.createElement('div'); - // temp.innerHTML = text; - // const output = temp.textContent || temp.innerText; - // temp = null; + // let temp = document.createElement('div'); + // temp.innerHTML = text; + // const output = temp.textContent || temp.innerText; + // temp = null; // return output; } + +export { isEmpty, isInteger, isString, isFunction, isPlainObject, get, cloneDeep, merge, capitalize, chunk, range } from 'lodash'; From 51e72abe85cf4f1030f2aa0ff998e44ce328e413 Mon Sep 17 00:00:00 2001 From: Ourai Lin Date: Tue, 11 Feb 2025 16:41:19 +0800 Subject: [PATCH 3/3] chore: change imports of string operations --- package.json | 3 +-- .../quiz/views/quiz-question-list/QuizCore.js | 5 +++-- src/services/auth/index.js | 9 ++++----- src/shared/utils/encryption.js | 17 +++++++++++++++++ src/shared/utils/index.js | 1 + 5 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 src/shared/utils/encryption.js diff --git a/package.json b/package.json index 24889f35..834e71e9 100644 --- a/package.json +++ b/package.json @@ -92,9 +92,7 @@ "react-toastify": "^9.1.2", "react-typed": "^1.2.0", "recharts": "^2.7.3", - "sass": "^1.64.2", "sha256": "^0.2.0", - "siwe": "^2.1.4", "slick-carousel": "^1.8.1", "striptags": "3.2.0", "survey-analytics": "^1.9.109", @@ -140,6 +138,7 @@ "lint-staged": "15.3.0", "postcss": "^8.4.18", "prettier": "^2.5.1", + "sass": "^1.64.2", "semver": "^7.6.3", "tailwindcss": "3.4.16" } diff --git a/src/domain/quiz/views/quiz-question-list/QuizCore.js b/src/domain/quiz/views/quiz-question-list/QuizCore.js index d97ea54b..199105af 100644 --- a/src/domain/quiz/views/quiz-question-list/QuizCore.js +++ b/src/domain/quiz/views/quiz-question-list/QuizCore.js @@ -15,7 +15,8 @@ */ import clsx from 'clsx'; -import { nanoid } from 'nanoid'; + +import { generateRandomId } from '@/utils'; import RadioIcon from './RadioIcon'; @@ -72,7 +73,7 @@ export function QuizCore({ return (