From 7a4e8ecaa590691aced528127376a4cb50572c3c Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 26 Feb 2025 14:57:11 +0330 Subject: [PATCH] titles --- index.html | 2 +- package-lock.json | 49 ++++++- package.json | 2 + src/App.tsx | 22 +-- src/config/Pages.ts | 1 + src/langs/fa.json | 9 +- src/main.tsx | 7 +- src/pages/annoncement/Detail.tsx | 6 + src/pages/annoncement/List.tsx | 6 + src/pages/criticisms/Add.tsx | 6 + src/pages/financial/components/Legal.tsx | 4 +- src/pages/financial/components/Personal.tsx | 4 + src/pages/home/Home.tsx | 4 + src/pages/learning/Detail.tsx | 6 + src/pages/learning/List.tsx | 6 + src/pages/receipts/Detail.tsx | 6 + src/pages/receipts/List.tsx | 6 + src/pages/service/BuyService.tsx | 27 ++++ src/pages/service/DetailService.tsx | 6 - src/pages/service/MyServices.tsx | 6 + src/pages/service/OtherServices.tsx | 5 + src/pages/service/components/HeaderBuy.tsx | 134 ++++++++++++++++++ .../service/components/ServiceHeader.tsx | 33 +++-- src/pages/setting/Setting.tsx | 6 + src/pages/ticket/CreateTicket.tsx | 6 + src/pages/ticket/Detail.tsx | 6 + src/pages/ticket/TicketList.tsx | 6 + src/pages/transaction/List.tsx | 6 + src/router/Main.tsx | 2 + 29 files changed, 350 insertions(+), 39 deletions(-) create mode 100644 src/pages/service/BuyService.tsx create mode 100644 src/pages/service/components/HeaderBuy.tsx diff --git a/index.html b/index.html index 7a826dc..6d80cee 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ - Vite + React + TS + کنسول داناک diff --git a/package-lock.json b/package-lock.json index 643d755..89ee98d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-dropzone": "^14.3.5", + "react-helmet-async": "^2.0.5", "react-i18next": "^15.2.0", "react-infinite-scroll-component": "^6.1.0", "react-loading": "^2.0.3", @@ -39,6 +40,7 @@ "@types/moment-jalaali": "^0.7.9", "@types/react": "^18.3.17", "@types/react-dom": "^18.3.5", + "@types/react-helmet": "^6.1.11", "@types/swiper": "^5.4.3", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", @@ -1881,6 +1883,16 @@ "@types/react": "^18.0.0" } }, + "node_modules/@types/react-helmet": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", + "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/swiper": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/@types/swiper/-/swiper-5.4.3.tgz", @@ -3411,6 +3423,15 @@ "node": ">=0.8.19" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4371,6 +4392,26 @@ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", "license": "MIT" }, + "node_modules/react-helmet-async": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz", + "integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-helmet-async/node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, "node_modules/react-i18next": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.2.0.tgz", @@ -4683,6 +4724,12 @@ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "license": "MIT" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5102,7 +5149,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 51527d0..e12364b 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-dropzone": "^14.3.5", + "react-helmet-async": "^2.0.5", "react-i18next": "^15.2.0", "react-infinite-scroll-component": "^6.1.0", "react-loading": "^2.0.3", @@ -41,6 +42,7 @@ "@types/moment-jalaali": "^0.7.9", "@types/react": "^18.3.17", "@types/react-dom": "^18.3.5", + "@types/react-helmet": "^6.1.11", "@types/swiper": "^5.4.3", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", diff --git a/src/App.tsx b/src/App.tsx index 3288e17..d32d196 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,6 +14,7 @@ import MainRouter from './router/Main' import AuthRouter from './router/Auth' import { Pages } from './config/Pages' import useConvertNumbers from './hooks/useConvertNumbers'; +import { Helmet, HelmetProvider } from 'react-helmet-async'; i18next.init({ interpolation: { escapeValue: false }, @@ -66,15 +67,20 @@ const App: FC = () => { - { - isLogin === 'checking' ? - null - : - isLogin === 'isLogin' ? - + + + کنسول داناک + + { + isLogin === 'checking' ? + null : - - } + isLogin === 'isLogin' ? + + : + + } + diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 052f25b..abbeecd 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -9,6 +9,7 @@ export const Pages = { mine: "/services", other: "/other-service", detail: "/services/detail/", + buy: "/other-service/buy/", }, transactions: "/transactions", receipts: { diff --git a/src/langs/fa.json b/src/langs/fa.json index 6b161a1..8abe465 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -122,7 +122,14 @@ "your_comment": "نظر شما", "write_your_comment": "نظر خود را راجع به این سرویس بنویسید", "users_comments": "نظرات کاربران", - "detail": "جزییات بیشتر" + "detail": "جزییات بیشتر", + "back": "بازگشت", + "info_business": "اطلاعات کسب و کار", + "enter_info_business": "اطلاعت کسب و کار خود را با دقت وارد کنید.", + "business_name": "نام کسب و کار", + "phone_business": "شماره تماس کسب و کار", + "short_description": "توضیح کوتاه", + "confrim_and_invoice": "تایید و صدور صورت حساب" }, "loading": "در حال بارگذاری", "footer": { diff --git a/src/main.tsx b/src/main.tsx index 51478d9..e2ef576 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,11 +1,10 @@ -import { StrictMode } from 'react' +// import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './assets/fonts/irancell/style.css' import './index.css' import App from './App.tsx' createRoot(document.getElementById('root')!).render( - - - , + + , ) diff --git a/src/pages/annoncement/Detail.tsx b/src/pages/annoncement/Detail.tsx index 4ded27e..3abba7c 100644 --- a/src/pages/annoncement/Detail.tsx +++ b/src/pages/annoncement/Detail.tsx @@ -5,6 +5,7 @@ import { useNavigate, useParams } from 'react-router-dom' import { ArrowLeft2 } from 'iconsax-react' import { useGetAnnoncementDetail } from './hooks/useAnnoncementData' import PageLoading from '../../components/PageLoading' +import { Helmet } from 'react-helmet-async' const AnnouncementDetail: FC = () => { @@ -15,6 +16,11 @@ const AnnouncementDetail: FC = () => { return (
+ + + داناک | اطلاعیه + +
{t('announcement.text_announcement')} diff --git a/src/pages/annoncement/List.tsx b/src/pages/annoncement/List.tsx index f395ee0..82ac9e8 100644 --- a/src/pages/annoncement/List.tsx +++ b/src/pages/annoncement/List.tsx @@ -9,6 +9,7 @@ import { useGetAnnoncement } from './hooks/useAnnoncementData' import PageLoading from '../../components/PageLoading' import { AnnoncementItemType } from './types/AnnoncementTypes' import moment from 'moment-jalaali' +import { Helmet } from 'react-helmet-async' const AnnouncementtList: FC = () => { @@ -28,6 +29,11 @@ const AnnouncementtList: FC = () => { return (
+ + + داناک | اطلاعیه ها + +
{t('announcement.announcements')}
diff --git a/src/pages/criticisms/Add.tsx b/src/pages/criticisms/Add.tsx index 0cf2198..ce45bd9 100644 --- a/src/pages/criticisms/Add.tsx +++ b/src/pages/criticisms/Add.tsx @@ -12,6 +12,7 @@ import * as Yup from 'yup' import { toast } from 'react-toastify' import { ErrorType } from '../../helpers/types' import { useCreateCriticisms } from './hooks/useCriticismsData' +import { Helmet } from 'react-helmet-async' const AddCriticisms: FC = () => { @@ -66,6 +67,11 @@ const AddCriticisms: FC = () => { return (
+ + + داناک | انتقادات + +
{t('criticisms.criticisms')}
diff --git a/src/pages/financial/components/Legal.tsx b/src/pages/financial/components/Legal.tsx index 2f75111..71f6a96 100644 --- a/src/pages/financial/components/Legal.tsx +++ b/src/pages/financial/components/Legal.tsx @@ -59,8 +59,10 @@ const Legal: FC = () => { useEffect(() => { - if (getFinancialInfo.data?.data?.user?.legalUser) { + if (getFinancialInfo.data?.data?.user?.legalUser || getFinancialInfo.data?.data?.user?.realUser) { setIsReadOnly(true) + } + if (getFinancialInfo.data?.data?.user?.legalUser) { const data = getFinancialInfo.data.data?.user formik.setValues({ address: data?.address.address, diff --git a/src/pages/financial/components/Personal.tsx b/src/pages/financial/components/Personal.tsx index 1e5fc03..1631869 100644 --- a/src/pages/financial/components/Personal.tsx +++ b/src/pages/financial/components/Personal.tsx @@ -55,6 +55,10 @@ const Personal: FC = () => { useEffect(() => { + + if (getFinancialInfo.data?.data?.user?.legalUser || getFinancialInfo.data?.data?.user?.realUser) { + setIsReadOnly(true) + } if (getFinancialInfo.data?.data?.user?.realUser) { const data = getFinancialInfo.data?.data?.user setIsReadOnly(true) diff --git a/src/pages/home/Home.tsx b/src/pages/home/Home.tsx index 260d17f..870d69d 100644 --- a/src/pages/home/Home.tsx +++ b/src/pages/home/Home.tsx @@ -14,6 +14,7 @@ import { useGetQuikAccess } from './hooks/useHomeData' import { QuikAccessItemType } from './types/HomeTypes' import ServiceItem from '../../components/ServiceItem' import PageLoading from '../../components/PageLoading' +import { Helmet } from 'react-helmet-async'; const Home: FC = () => { @@ -24,6 +25,9 @@ const Home: FC = () => { return ( + + داناک | پیشخوان + { getAds.isPending || getQuikAccess.isPending ?
diff --git a/src/pages/learning/Detail.tsx b/src/pages/learning/Detail.tsx index c6bfd36..0c8a59c 100644 --- a/src/pages/learning/Detail.tsx +++ b/src/pages/learning/Detail.tsx @@ -5,6 +5,7 @@ import PageLoading from '../../components/PageLoading' import DanakLearning from '../home/components/DanakLearning' import { Calendar2, Clock, Element3 } from 'iconsax-react' import moment from 'moment-jalaali' +import { Helmet } from 'react-helmet-async' const LearningDetail: FC = () => { @@ -13,6 +14,11 @@ const LearningDetail: FC = () => { return (
+ + + داناک | آموزش + + { getLearningDetail.isPending ? diff --git a/src/pages/learning/List.tsx b/src/pages/learning/List.tsx index 6622ddc..f60e7a1 100644 --- a/src/pages/learning/List.tsx +++ b/src/pages/learning/List.tsx @@ -8,6 +8,7 @@ import { LearningItemType } from './types/LearningTypes' import moment from 'moment-jalaali' import { Link } from 'react-router-dom' import { Pages } from '../../config/Pages' +import { Helmet } from 'react-helmet-async' const LearningList: FC = () => { @@ -17,6 +18,11 @@ const LearningList: FC = () => { return (
+ + + داناک | آموزش + +
{t('learning.learning')} diff --git a/src/pages/receipts/Detail.tsx b/src/pages/receipts/Detail.tsx index d5f599e..be0cca8 100644 --- a/src/pages/receipts/Detail.tsx +++ b/src/pages/receipts/Detail.tsx @@ -15,6 +15,7 @@ import Button from '../../components/Button' import ApproveInvoice from './components/ApproveInvoice' import PayInvoice from './components/PayInvoice' import Input from '../../components/Input' +import { Helmet } from 'react-helmet-async' const ReceiptsDetail: FC = () => { @@ -25,6 +26,11 @@ const ReceiptsDetail: FC = () => { return (
+ + + داناک | صورتحساب + +
{t('receip.detail_account')}
diff --git a/src/pages/receipts/List.tsx b/src/pages/receipts/List.tsx index 79fcfda..afb28a6 100644 --- a/src/pages/receipts/List.tsx +++ b/src/pages/receipts/List.tsx @@ -10,6 +10,7 @@ import PageLoading from '../../components/PageLoading' import { NumberFormat } from '../../config/func' import { ReceiptItemType } from './types/ReceiptTypes' import moment from 'moment-jalaali' +import { Helmet } from 'react-helmet-async' const ReceiptsList: FC = () => { @@ -19,6 +20,11 @@ const ReceiptsList: FC = () => { return (
+ + + داناک | صورتحساب ها + +
{t('receip.receip_list')}
diff --git a/src/pages/service/BuyService.tsx b/src/pages/service/BuyService.tsx new file mode 100644 index 0000000..d7d4705 --- /dev/null +++ b/src/pages/service/BuyService.tsx @@ -0,0 +1,27 @@ +import { FC } from 'react' +import { useParams } from 'react-router-dom' +import { useGetDetailService } from './hooks/useServiceData' +import ServiceHeader from './components/ServiceHeader' +import HeaderBuy from './components/HeaderBuy' +import PageLoading from '../../components/PageLoading' + +const BuyService: FC = () => { + + const { serviceId, planId } = useParams() + const getDetailService = useGetDetailService(serviceId ? serviceId : '') + + return ( +
+ { + getDetailService.isPending ? + + : +
+ +
+ } +
+ ) +} + +export default BuyService \ No newline at end of file diff --git a/src/pages/service/DetailService.tsx b/src/pages/service/DetailService.tsx index c764f7a..d7d6845 100644 --- a/src/pages/service/DetailService.tsx +++ b/src/pages/service/DetailService.tsx @@ -111,12 +111,6 @@ const DetailService: FC = () => { />
-
- -
{ @@ -19,6 +20,11 @@ const MyServices: FC = () => { return (
+ + + داناک | سرویس های من + +
{t('service.my_service')} diff --git a/src/pages/service/OtherServices.tsx b/src/pages/service/OtherServices.tsx index 63445df..ee08277 100644 --- a/src/pages/service/OtherServices.tsx +++ b/src/pages/service/OtherServices.tsx @@ -10,6 +10,7 @@ import ServiceItem from '../../components/ServiceItem' import OtherServicesComponent from './components/OtherServices' import { useGetAds } from '../ads/hooks/useAdsData' import { AdsDisplayLocation, AdsItemType } from '../ads/types/AdsTypes' +import { Helmet } from 'react-helmet-async' const OtherServices: FC = () => { @@ -22,6 +23,10 @@ const OtherServices: FC = () => { return (
+ + داناک | لیست سرویس ها + +
{ getSuggestedServices.isPending || getAdsLeft.isPending ? diff --git a/src/pages/service/components/HeaderBuy.tsx b/src/pages/service/components/HeaderBuy.tsx new file mode 100644 index 0000000..bb07de8 --- /dev/null +++ b/src/pages/service/components/HeaderBuy.tsx @@ -0,0 +1,134 @@ +import { FC, useEffect, useState } from 'react' +import Button from '../../../components/Button' +import { ArrowRight, TickCircle } from 'iconsax-react' +import { ServiceDetailDataType } from '../types/ServiecTypes' +import { NumberFormat } from '../../../config/func' +import { useTranslation } from 'react-i18next' +import Input from '../../../components/Input' +import Textarea from '../../../components/Textarea' +import { useNavigate } from 'react-router-dom' +import { Pages } from '../../../config/Pages' + +type Props = { + data: ServiceDetailDataType, + planId?: string +} + +const HeaderBuy: FC = ({ data, planId }) => { + + const navigate = useNavigate() + const { t } = useTranslation('global') + const [planSelected] = useState(planId ? planId : '') + const [price, setPrice] = useState(data?.subscriptionPlans[0]?.price) + const [finalPrice, setFinalPrice] = useState(0) + const [planText, setPlanText] = useState('') + + useEffect(() => { + + const plan = data?.subscriptionPlans.find((item) => item.id === planSelected) + + setPlanText(plan.name) + setFinalPrice(plan.finalPrice) + setPrice(plan?.price) + + }, [data]) + + + return ( +
+
+
+
navigate(Pages.services.detail + data.id)} className='flex cursor-pointer gap-1.5'> + +
+ {t('service.back')} +
+
+ +
+ {planText} +
+
+
+
+
+ +
+
+
+ {data?.name} +
+
+ {data?.title} +
+

+ {data?.description} +

+
+
+ +
+
+
+
+ { + finalPrice !== price && +
+ {NumberFormat(Number(price))} +
+ } +
{NumberFormat(Number(finalPrice))}
+
+
+
+
+
+
+ +
+
+
+ {t('service.info_business')} +
+ +
+ {t('service.enter_info_business')} +
+
+ +
+
+ +
+
+ +
+
+