From 9a90f96170270c8b21157c6745a64469f7de5064 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 25 Oct 2025 11:26:12 +0330 Subject: [PATCH] announcement --- src/App.tsx | 13 +- src/components/PageLoading.tsx | 14 ++ src/components/StatusWithText.tsx | 29 ++++ src/config/Paths.tsx | 1 + src/index.css | 2 +- src/locale/fa.ts | 10 +- src/pages/annoncement/Detail.tsx | 54 +++++++ src/pages/annoncement/List.tsx | 146 ++++++++++++++++++ .../components/AnouncementSkeleton.tsx | 41 +++++ .../annoncement/hooks/useAnnoncementData.ts | 17 ++ .../annoncement/service/AnnoncementService.ts | 130 ++++++++++++++++ .../annoncement/types/AnnoncementTypes.ts | 18 +++ src/pages/ticket/TicketList.tsx | 3 +- src/router/MainRouter.tsx | 4 + src/shared/Sidebar.tsx | 2 +- 15 files changed, 476 insertions(+), 8 deletions(-) create mode 100644 src/components/PageLoading.tsx create mode 100644 src/components/StatusWithText.tsx create mode 100644 src/pages/annoncement/Detail.tsx create mode 100644 src/pages/annoncement/List.tsx create mode 100644 src/pages/annoncement/components/AnouncementSkeleton.tsx create mode 100644 src/pages/annoncement/hooks/useAnnoncementData.ts create mode 100644 src/pages/annoncement/service/AnnoncementService.ts create mode 100644 src/pages/annoncement/types/AnnoncementTypes.ts diff --git a/src/App.tsx b/src/App.tsx index f6c0015..a14b315 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,19 +3,24 @@ import '@/assets/fonts/irancell/style.css' import 'swiper/swiper-bundle.css'; import 'react-loading-skeleton/dist/skeleton.css' import { BrowserRouter } from 'react-router-dom' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' // import { getToken } from './config/func' import MainRouter from './router/MainRouter' // import AuthRouter from './router/AuthRouter' +const queryClient = new QueryClient() + const App: FC = () => { // const isLoggedIn = getToken() return ( - - {/* {isLoggedIn ? : } */} - - + + + {/* {isLoggedIn ? : } */} + + + ) } diff --git a/src/components/PageLoading.tsx b/src/components/PageLoading.tsx new file mode 100644 index 0000000..e94ebad --- /dev/null +++ b/src/components/PageLoading.tsx @@ -0,0 +1,14 @@ +import { type FC } from 'react' + +const PageLoading: FC = () => { + return ( +
+
+
+
در حال بارگذاری...
+
+
+ ) +} + +export default PageLoading diff --git a/src/components/StatusWithText.tsx b/src/components/StatusWithText.tsx new file mode 100644 index 0000000..02a40cf --- /dev/null +++ b/src/components/StatusWithText.tsx @@ -0,0 +1,29 @@ +import { type FC } from 'react' +import { clx } from '../helpers/utils' + +type Props = { + variant: 'error' | 'success' | 'warning' | 'info' + text: string + className?: string +} + +const StatusWithText: FC = ({ variant, text, className }) => { + const variantStyles = { + error: 'bg-red-50 text-red-600', + success: 'bg-green-50 text-green-600', + warning: 'bg-orange-50 text-orange-600', + info: 'bg-blue-50 text-blue-600', + } + + return ( +
+ {text} +
+ ) +} + +export default StatusWithText diff --git a/src/config/Paths.tsx b/src/config/Paths.tsx index 98d50ac..ae9c50d 100644 --- a/src/config/Paths.tsx +++ b/src/config/Paths.tsx @@ -11,6 +11,7 @@ export const Paths = { }, announcement: { list: '/announcement', + detail: '/announcement/', }, criticisms: '/criticisms', learning: '/learning', diff --git a/src/index.css b/src/index.css index a0e1f33..ed8974a 100644 --- a/src/index.css +++ b/src/index.css @@ -42,7 +42,7 @@ textarea::placeholder { @theme { --color-primary: #ffa800; - --color-border: #f5f7fc; + --color-border: #d0d0d0; --color-secondary: #ebedf5; --color-description: #c3c7dd; --color-desc: #8c90a3; diff --git a/src/locale/fa.ts b/src/locale/fa.ts index e7e1d3c..136fbea 100644 --- a/src/locale/fa.ts +++ b/src/locale/fa.ts @@ -7,13 +7,21 @@ export const fa = { myOrders: "سفارشات من", preFactors: "پیش فاکتورها", tickets: "تیکت ها", - announcement: "انتشارات", + announcement: "اطلاعیه", criticisms: "انتقادات", learning: "آموزش", submitYourOrder: "سفارش خودرا ثبت کنید", submitYourOrderDescription: "کارت ویزیت ، کاتالوگ ، بروشور و...", newOrder: "سفارش جدید", }, + announcement: { + announcements: "اطلاعیه ها", + search: "جستجو", + important: "مهم", + new: "جدید", + text_announcement: "متن اطلاعیه", + }, + back: "بازگشت", notif: { natification: "اعلان‌ها", all_read: "خواندن همه", diff --git a/src/pages/annoncement/Detail.tsx b/src/pages/annoncement/Detail.tsx new file mode 100644 index 0000000..eb7487e --- /dev/null +++ b/src/pages/annoncement/Detail.tsx @@ -0,0 +1,54 @@ +import { type FC } from 'react' +import StatusWithText from '../../components/StatusWithText' +import { useNavigate, useParams } from 'react-router-dom' +import { ArrowLeft2 } from 'iconsax-react' +import { useGetAnnoncementDetail } from './hooks/useAnnoncementData' +import PageLoading from '../../components/PageLoading' +import { t } from '@/locale' + +const AnnouncementDetail: FC = () => { + + const { id } = useParams() + const navigate = useNavigate() + const getAnnoncementDetail = useGetAnnoncementDetail(id ? id : '') + + return ( +
+
+
+ {t('announcement.text_announcement')} +
+
navigate(-1)} className='text-xs flex gap-0.5 items-center font-extralight'> + {t('back')} + +
+
+ + { + getAnnoncementDetail.isPending ? + + : +
+
+
+ {getAnnoncementDetail.data?.data?.announcement?.title} +
+ { + getAnnoncementDetail.data?.data?.announcement.isImportant && + + } +
+ +
+ +
+
+ } +
+ ) +} + +export default AnnouncementDetail \ No newline at end of file diff --git a/src/pages/annoncement/List.tsx b/src/pages/annoncement/List.tsx new file mode 100644 index 0000000..7bc1906 --- /dev/null +++ b/src/pages/annoncement/List.tsx @@ -0,0 +1,146 @@ +import { type FC, Fragment, useState } from 'react' +import Input from '@/components/Input' +import StatusWithText from '@/components/StatusWithText' +import { clx } from '@/helpers/utils' +import { useNavigate } from 'react-router-dom' +import { Paths } from '@/config/Paths' +import { useGetAnnoncement, useGetAnnoncementDetail } from './hooks/useAnnoncementData' +import type { AnnoncementItemType } from './types/AnnoncementTypes' +import moment from 'moment-jalaali' +import AnouncementSkeleton from './components/AnouncementSkeleton' +import { t } from '@/locale' + +const AnnouncementtList: FC = () => { + + const navigate = useNavigate() + const [search, setSearch] = useState('') + const [itemSelected, setItemSelected] = useState() + const getAnnoncements = useGetAnnoncement(search) + useGetAnnoncementDetail(itemSelected ? itemSelected.announcement.id : '') + + + const handleChange = (item: AnnoncementItemType) => { + if (window.innerWidth < 1280) { + navigate(Paths.announcement.detail + item.announcement.id) + } else { + setItemSelected(item) + } + } + + return ( +
+
+ {t('announcement.announcements')} +
+ +
+
+
+
+ setSearch(value)} + /> +
+ + {/*
+