diff --git a/package.json b/package.json index 6cc268d..834e71e 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", @@ -48,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", @@ -60,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", @@ -99,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", @@ -124,7 +115,9 @@ "@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", + "@tailwindcss/typography": "0.5.15", "@types/node": "18.11.3", "@types/qs": "^6.9.15", "@types/react": "18.2.0", @@ -132,16 +125,20 @@ "@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", "postcss": "^8.4.18", "prettier": "^2.5.1", + "sass": "^1.64.2", "semver": "^7.6.3", "tailwindcss": "3.4.16" } diff --git a/src/app/(uc)/signin/page.js b/src/app/(uc)/signin/page.js index e272054..2a5200c 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/bounties/[id]/AppliedModal.js b/src/app/bounties/[id]/AppliedModal.js index c1e4f64..1b63833 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 8e2da4d..c23de7e 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 51525d6..6e79249 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 48fed9c..a72ee00 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 4ddcc18..a6030a6 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/creator/learn/[type]/[id]/Chllenges.js b/src/app/creator/learn/[type]/[id]/Chllenges.js index 717ae85..dea96e3 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/dashboard/hire/DepositModal.js b/src/app/dashboard/hire/DepositModal.js index 674fe68..0e50dfe 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 8476f81..f421249 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 a1f0aee..248353d 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/home/Contributor.js b/src/app/home/Contributor.js index 0037eef..16ad8af 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/app/learn/[type]/[id]/RightCard.js b/src/app/learn/[type]/[id]/RightCard.js index 2eba5bd..7ebf8d9 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/domain/auth/hooks/useAuthGuard.js b/src/domain/auth/hooks/useAuthGuard.js index 8c68560..9c4f62a 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 3b9e05a..032707f 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 0447dc0..061cc7a 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 48be0e5..c7e0561 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 7fc855d..d3ba263 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 b5c7580..7460711 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 3b3203c..42c243a 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 8f6d35d..f4668c2 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 282a7f5..29aa10a 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 1ceea85..ec74ff3 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/views/quiz-question-list/QuizCore.js b/src/domain/quiz/views/quiz-question-list/QuizCore.js index d97ea54..199105a 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 (