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)}
- {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 (