+ )
+}
+
+export default AnnouncementtList
\ No newline at end of file
diff --git a/src/pages/annoncement/components/AnouncementSkeleton.tsx b/src/pages/annoncement/components/AnouncementSkeleton.tsx
new file mode 100644
index 0000000..8f30138
--- /dev/null
+++ b/src/pages/annoncement/components/AnouncementSkeleton.tsx
@@ -0,0 +1,41 @@
+import { type FC } from 'react'
+import Skeleton from 'react-loading-skeleton'
+
+const AnouncementSkeleton: FC = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default AnouncementSkeleton
\ No newline at end of file
diff --git a/src/pages/annoncement/hooks/useAnnoncementData.ts b/src/pages/annoncement/hooks/useAnnoncementData.ts
new file mode 100644
index 0000000..87ab3e5
--- /dev/null
+++ b/src/pages/annoncement/hooks/useAnnoncementData.ts
@@ -0,0 +1,17 @@
+import * as api from "../service/AnnoncementService";
+import { useQuery } from "@tanstack/react-query";
+
+export const useGetAnnoncement = (search: string) => {
+ return useQuery({
+ queryKey: ["announcements", search],
+ queryFn: () => api.getAnnoncements(search),
+ });
+};
+
+export const useGetAnnoncementDetail = (id: string) => {
+ return useQuery({
+ queryKey: ["announcement", id],
+ queryFn: () => api.getAnnoncementDetail(id),
+ enabled: !!id,
+ });
+};
diff --git a/src/pages/annoncement/service/AnnoncementService.ts b/src/pages/annoncement/service/AnnoncementService.ts
new file mode 100644
index 0000000..30a8734
--- /dev/null
+++ b/src/pages/annoncement/service/AnnoncementService.ts
@@ -0,0 +1,130 @@
+// import axios from "../../../config/axios";
+
+// دادههای استاتیک برای نمایش
+const mockAnnoncementsData = {
+ data: {
+ announcements: [
+ {
+ id: "1",
+ createdAt: "2024-01-15T10:00:00Z",
+ updatedAt: "2024-01-15T10:00:00Z",
+ announcement: {
+ id: "ann1",
+ createdAt: "2024-01-15T10:00:00Z",
+ title: "بهروزرسانی سیستم اطلاعرسانی",
+ content:
+ "سیستم اطلاعرسانی با ویژگیهای جدید بهروزرسانی شد. لطفاً از طریق بخش تنظیمات، تنظیمات خود را بررسی کنید.",
+ publishAt: "2024-01-15T10:00:00Z",
+ targetService: {
+ id: "1",
+ name: "سرویس عمومی",
+ },
+ isImportant: true,
+ },
+ isRead: false,
+ },
+ {
+ id: "2",
+ createdAt: "2024-01-14T08:00:00Z",
+ updatedAt: "2024-01-14T08:00:00Z",
+ announcement: {
+ id: "ann2",
+ createdAt: "2024-01-14T08:00:00Z",
+ title: "نگهداری برنامهریزی شده",
+ content:
+ "در تاریخ ۲۰ دی ماه، بهدلیل انجام نگهداری برنامهریزی شده، سرویسها به مدت ۲ ساعت در دسترس نخواهند بود.",
+ publishAt: "2024-01-14T08:00:00Z",
+ targetService: {
+ id: "1",
+ name: "سرویس عمومی",
+ },
+ isImportant: false,
+ },
+ isRead: false,
+ },
+ {
+ id: "3",
+ createdAt: "2024-01-13T15:30:00Z",
+ updatedAt: "2024-01-13T15:30:00Z",
+ announcement: {
+ id: "ann3",
+ createdAt: "2024-01-13T15:30:00Z",
+ title: "ویژگی جدید: پشتیبانی از پرداخت آنلاین",
+ content:
+ "ویژگی پرداخت آنلاین به سیستم اضافه شد. از این پس میتوانید بهراحتی از طریق درگاههای بانکی پرداخت خود را انجام دهید.",
+ publishAt: "2024-01-13T15:30:00Z",
+ targetService: {
+ id: "2",
+ name: "سرویس پرداخت",
+ },
+ isImportant: false,
+ },
+ isRead: true,
+ },
+ ],
+ },
+};
+
+const mockAnnoncementDetailData = (id: string) => {
+ const announcement = mockAnnoncementsData.data.announcements.find(
+ (item) => item.announcement.id === id
+ );
+
+ if (!announcement) {
+ return {
+ data: {
+ announcement: {
+ id: id,
+ createdAt: "2024-01-15T10:00:00Z",
+ title: "اطلاعیه نمونه",
+ content:
+ "
این یک اطلاعیه نمونه است. محتوای این اطلاعیه برای نمایش داده شده است.
",
+ publishAt: "2024-01-15T10:00:00Z",
+ targetService: {
+ id: "1",
+ name: "سرویس عمومی",
+ },
+ isImportant: false,
+ },
+ },
+ };
+ }
+
+ return {
+ data: {
+ announcement: announcement.announcement,
+ },
+ };
+};
+
+export const getAnnoncements = async (search: string) => {
+ // ارتباط با سرور کامنت شده - از داده استاتیک استفاده میشود
+ // const { data } = await axios.get(`/announcements/user?q=${search}`);
+ // return data;
+
+ // شبیهسازی تاخیر شبکه
+ await new Promise((resolve) => setTimeout(resolve, 500));
+
+ // فیلتر بر اساس جستجو
+ let filteredData = { ...mockAnnoncementsData };
+ if (search && search.trim()) {
+ filteredData.data.announcements = mockAnnoncementsData.data.announcements.filter(
+ (item) =>
+ item.announcement.title.includes(search) ||
+ item.announcement.content.includes(search)
+ );
+ }
+
+ return filteredData;
+};
+
+export const getAnnoncementDetail = async (id: string) => {
+ // ارتباط با سرور کامنت شده - از داده استاتیک استفاده میشود
+ // const { data } = await axios.get(`/announcements/${id}`);
+ // return data;
+
+ // شبیهسازی تاخیر شبکه
+ await new Promise((resolve) => setTimeout(resolve, 500));
+
+ return mockAnnoncementDetailData(id);
+};
diff --git a/src/pages/annoncement/types/AnnoncementTypes.ts b/src/pages/annoncement/types/AnnoncementTypes.ts
new file mode 100644
index 0000000..6ebe9bf
--- /dev/null
+++ b/src/pages/annoncement/types/AnnoncementTypes.ts
@@ -0,0 +1,18 @@
+export type AnnoncementItemType = {
+ id: string;
+ createdAt: string;
+ updatedAt: string;
+ announcement: {
+ id: string;
+ createdAt: string;
+ title: string;
+ content: string;
+ publishAt: string;
+ targetService: {
+ id: string;
+ name: string;
+ };
+ isImportant: boolean;
+ };
+ isRead: boolean;
+};
diff --git a/src/pages/ticket/TicketList.tsx b/src/pages/ticket/TicketList.tsx
index f4717a2..e6449ad 100644
--- a/src/pages/ticket/TicketList.tsx
+++ b/src/pages/ticket/TicketList.tsx
@@ -8,6 +8,7 @@ import { staticTicketsData } from './data/staticData'
import { t } from '@/locale'
import moment from 'moment-jalaali'
import type { ColumnType } from '@/components/types/TableTypes'
+import { Paths } from '@/config/Paths'
// تعریف type برای تیکت
interface TicketItem {
@@ -89,7 +90,7 @@ const TicketList: FC = () => {
title: t('ticket.detail'),
key: 'actions',
render: (item) => (
-
+
)
diff --git a/src/router/MainRouter.tsx b/src/router/MainRouter.tsx
index f1f34ec..1e951c1 100644
--- a/src/router/MainRouter.tsx
+++ b/src/router/MainRouter.tsx
@@ -11,6 +11,8 @@ import OrderDetail from '@/pages/order/OrderDetail'
import TicketList from '@/pages/ticket/TicketList'
import CreateTicket from '@/pages/ticket/CreateTicket'
import TicketDetail from '@/pages/ticket/Detail'
+import AnnouncementList from '@/pages/annoncement/List'
+import AnnouncementDetail from '@/pages/annoncement/Detail'
const MainRouter: FC = () => {
return (
@@ -31,6 +33,8 @@ const MainRouter: FC = () => {
} />
} />
} />
+ } />
+ } />
diff --git a/src/shared/Sidebar.tsx b/src/shared/Sidebar.tsx
index 62a9273..ec24bfc 100644
--- a/src/shared/Sidebar.tsx
+++ b/src/shared/Sidebar.tsx
@@ -32,7 +32,7 @@ const SideBar: FC = () => {
)}
>