convert number

This commit is contained in:
hamid zarghami
2025-07-14 09:29:54 +03:30
parent a324ab55e7
commit 2b6946e0b2
5 changed files with 70 additions and 12 deletions
+2
View File
@@ -14,6 +14,7 @@ import ToastContainer from './components/Toast';
import { getRefreshToken, removeRefreshToken, removeToken, setRefreshToken, setToken } from './config/func';
import { refreshToken } from './pages/auth/service/Service';
import BuySpace from './shared/components/BuySpace'
import useConvertNumbers from './hooks/useConvertNumbers'
declare global {
interface Window {
@@ -96,6 +97,7 @@ const queryClient = new QueryClient({
});
const App: FC = () => {
useConvertNumbers()
return (
<BrowserRouter>
<I18nextProvider i18n={i18next}>
+38
View File
@@ -0,0 +1,38 @@
import { useEffect } from "react";
const toPersianDigits = (text: string): string => {
return text.replace(/\d/g, (d) => "۰۱۲۳۴۵۶۷۸۹"[parseInt(d, 10)]);
};
const convertNumbersInDOM = (node: Node): void => {
if (node.nodeType === Node.TEXT_NODE) {
node.nodeValue = toPersianDigits(node.nodeValue || "");
} else if (node.nodeType === Node.ELEMENT_NODE) {
// Skip conversion if element has 'en' class
if ((node as Element).classList?.contains("en")) {
return;
}
node.childNodes.forEach(convertNumbersInDOM);
}
};
const useConvertNumbers = (): void => {
useEffect(() => {
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === "childList") {
mutation.addedNodes.forEach(convertNumbersInDOM);
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
// اجرای اولیه روی کل صفحه
convertNumbersInDOM(document.body);
return () => observer.disconnect();
}, []);
};
export default useConvertNumbers;
+4 -1
View File
@@ -17,7 +17,10 @@
"add_space": "اضافه کردن فضا"
},
"space": {
"title": "خرید فضای ذخیره سازی"
"title": "خرید فضای ذخیره سازی",
"select_space": "لطفا یک فضا انتخاب کنید",
"enter_space": "فضای دلخواه‌",
"price": "قیمت :"
},
"header": {
"search": "جستجو"
+1 -10
View File
@@ -42,7 +42,7 @@ const Home: FC = () => {
onClick={() => handleChangeWorkspace(item.id)}
>
<div className='mt-5'>
{item.businessName}
{item.businessName + ' ( ' + item.slug + ' )'}
</div>
<div className='mt-5'>
@@ -58,15 +58,6 @@ const Home: FC = () => {
</div>
<div className='mt-5 flex justify-end w-full'>
<a onClick={(e) => {
e.stopPropagation()
}} target='_blank' href={`${import.meta.env.VITE_DZONE_URL}/${item.slug}`}>
{`${import.meta.env.VITE_DZONE_URL}/${item.slug}`}
</a>
</div>
</div>
)
+25 -1
View File
@@ -2,6 +2,8 @@ import DefaulModal from '@/components/DefaulModal'
import { useSharedStore } from '@/shared/store/sharedStore'
import { useTranslation } from 'react-i18next'
import { FC } from 'react'
import { clx } from '@/helpers/utils'
import Input from '@/components/Input'
const BuySpace: FC = () => {
@@ -16,8 +18,30 @@ const BuySpace: FC = () => {
isHeader={true}
title_header={t('space.title')}
>
<div className='mt-5'>
<div>
<div className='mt-8 text-sm'>
{t('space.select_space')}
</div>
<div className='mt-4 flex gap-4 flex-wrap'>
<div className={clx(
'bg-[#EBEDF5] border border-[#EBEDF5] cursor-pointer flex items-center text-xs h-10 px-6 rounded-lg',
// amountSelected === amount && 'border-black'
)}>
{'1000000'.toLocaleString()} تومان
</div>
</div>
<div className='mt-8'>
<Input
label={t('space.enter_space')}
className='bg-white/50'
/>
</div>
<div className='mt-6 flex gap-1'>
<div className='text-xs'>{t('space.price')}</div>
<div className='font-bold text-xs'>{'1000000'.toLocaleString()} تومان</div>
</div>
</div>
</DefaulModal >
)