diff --git a/apps/user/app/(main)/(user)/affiliate/page.tsx b/apps/user/app/(main)/(user)/affiliate/page.tsx
index 3515168..69b4080 100644
--- a/apps/user/app/(main)/(user)/affiliate/page.tsx
+++ b/apps/user/app/(main)/(user)/affiliate/page.tsx
@@ -1,5 +1,6 @@
'use client';
import { Display } from '@/components/display';
+import { Empty } from '@/components/empty';
import { ProList } from '@/components/pro-list';
import useGlobalStore from '@/config/use-global';
import { queryUserAffiliate } from '@/services/user/user';
@@ -70,6 +71,7 @@ export default function Page() {
);
}}
+ empty={}
/>
);
diff --git a/apps/user/app/(main)/(user)/announcement/page.tsx b/apps/user/app/(main)/(user)/announcement/page.tsx
index a5aaca9..0a6c230 100644
--- a/apps/user/app/(main)/(user)/announcement/page.tsx
+++ b/apps/user/app/(main)/(user)/announcement/page.tsx
@@ -1,10 +1,9 @@
'use client';
+import { Empty } from '@/components/empty';
import { queryAnnouncement } from '@/services/user/announcement';
-import Empty from '@repo/ui/empty';
import { Markdown } from '@repo/ui/markdown';
-import { formatDate } from '@repo/ui/utils';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@shadcn/ui/card';
+import { Timeline } from '@shadcn/ui/timeline';
import { useQuery } from '@tanstack/react-query';
export default function Page() {
@@ -18,23 +17,16 @@ export default function Page() {
return data.data?.announcements || [];
},
});
- return (
-
- {data?.length ? (
- data.map((item) => (
-
-
- {item.title}
- {formatDate(item.updated_at)}
-
-
- {item.content}
-
-
- ))
- ) : (
-
- )}
-
+ return data && data.length > 0 ? (
+ ({
+ title: item.title,
+ content: {item.content},
+ })) || []
+ }
+ />
+ ) : (
+
);
}
diff --git a/apps/user/app/(main)/(user)/dashboard/announcemnet.tsx b/apps/user/app/(main)/(user)/dashboard/announcemnet.tsx
index fb45fc7..b78b666 100644
--- a/apps/user/app/(main)/(user)/dashboard/announcemnet.tsx
+++ b/apps/user/app/(main)/(user)/dashboard/announcemnet.tsx
@@ -1,8 +1,8 @@
'use client';
+import { Empty } from '@/components/empty';
import { queryAnnouncement } from '@/services/user/announcement';
import { Icon } from '@iconify/react';
-import Empty from '@repo/ui/empty';
import { Markdown } from '@repo/ui/markdown';
import { Card } from '@shadcn/ui/card';
import { useQuery } from '@tanstack/react-query';
diff --git a/apps/user/app/(main)/(user)/order/page.tsx b/apps/user/app/(main)/(user)/order/page.tsx
index 8f2740c..6391f55 100644
--- a/apps/user/app/(main)/(user)/order/page.tsx
+++ b/apps/user/app/(main)/(user)/order/page.tsx
@@ -1,6 +1,7 @@
'use client';
import { Display } from '@/components/display';
+import { Empty } from '@/components/empty';
import { ProList, ProListActions } from '@/components/pro-list';
import { closeOrder, queryOrderList } from '@/services/user/order';
import { formatDate } from '@repo/ui/utils';
@@ -91,6 +92,7 @@ export default function Page() {
);
}}
+ empty={}
/>
);
}
diff --git a/apps/user/app/(main)/(user)/subscribe/page.tsx b/apps/user/app/(main)/(user)/subscribe/page.tsx
index 1b9b06a..8d4e7eb 100644
--- a/apps/user/app/(main)/(user)/subscribe/page.tsx
+++ b/apps/user/app/(main)/(user)/subscribe/page.tsx
@@ -12,6 +12,7 @@ import { useQuery } from '@tanstack/react-query';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
+import { Empty } from '@/components/empty';
import Purchase from '../order/purchase';
import { SubscribeDetail } from './detail';
@@ -133,6 +134,7 @@ export default function Page() {
))}
+ {data?.length === 0 && }
>
diff --git a/apps/user/app/(main)/(user)/ticket/page.tsx b/apps/user/app/(main)/(user)/ticket/page.tsx
index 5451c8b..565310b 100644
--- a/apps/user/app/(main)/(user)/ticket/page.tsx
+++ b/apps/user/app/(main)/(user)/ticket/page.tsx
@@ -1,5 +1,6 @@
'use client';
+import { Empty } from '@/components/empty';
import { ProList, ProListActions } from '@/components/pro-list';
import {
createUserTicket,
@@ -217,6 +218,7 @@ export default function Page() {
);
}}
+ empty={}
/>
);
}}
+ empty={}
/>
>
);
diff --git a/apps/user/components/empty.tsx b/apps/user/components/empty.tsx
new file mode 100644
index 0000000..9362887
--- /dev/null
+++ b/apps/user/components/empty.tsx
@@ -0,0 +1,18 @@
+'use client';
+
+import { default as _Empty } from '@repo/ui/empty';
+import { useTranslations } from 'next-intl';
+import { useEffect, useState } from 'react';
+
+export function Empty() {
+ const t = useTranslations('common');
+
+ const [description, setDescription] = useState('');
+
+ useEffect(() => {
+ const random = Math.floor(Math.random() * 10);
+ setDescription(t(`empty.${random}`));
+ }, []);
+
+ return <_Empty description={description} />;
+}
diff --git a/packages/ui/src/empty.tsx b/packages/ui/src/empty.tsx
index 018ee03..83c9700 100644
--- a/packages/ui/src/empty.tsx
+++ b/packages/ui/src/empty.tsx
@@ -1,4 +1,4 @@
-export default function Empty() {
+export default function Empty({ description }: { description?: React.ReactNode }) {
return (
);
}
diff --git a/packages/ui/src/pro-list/pro-list.tsx b/packages/ui/src/pro-list/pro-list.tsx
index 1aaec91..d2d3746 100644
--- a/packages/ui/src/pro-list/pro-list.tsx
+++ b/packages/ui/src/pro-list/pro-list.tsx
@@ -38,6 +38,7 @@ export interface ProListProps {
textPageOf: (current: number, total: number) => string;
selectedRowsText: (total: number) => string;
}>;
+ empty?: React.ReactNode;
}
export interface ProListActions {
refresh: () => void;
@@ -52,6 +53,7 @@ export function ProList>({
renderItem,
action,
texts,
+ empty,
}: ProListProps) {
const [columnFilters, setColumnFilters] = useState([]);
const [rowSelection, setRowSelection] = useState<{ [key: number]: boolean }>({});
@@ -187,9 +189,7 @@ export function ProList>({
return {renderItem(item, checkbox)}
;
})
) : (
-
-
-
+ {empty || }
)}
diff --git a/packages/ui/src/pro-table/pro-table.tsx b/packages/ui/src/pro-table/pro-table.tsx
index 64ee4fb..012b62b 100644
--- a/packages/ui/src/pro-table/pro-table.tsx
+++ b/packages/ui/src/pro-table/pro-table.tsx
@@ -52,6 +52,7 @@ export interface ProTableProps {
textPageOf: (current: number, total: number) => string;
selectedRowsText: (total: number) => string;
}>;
+ empty?: React.ReactNode;
}
export interface ProTableActions {
refresh: () => void;
@@ -66,6 +67,7 @@ export function ProTable>({
actions,
action,
texts,
+ empty,
}: ProTableProps) {
const [sorting, setSorting] = useState([]);
const [columnFilters, setColumnFilters] = useState([]);
@@ -240,7 +242,7 @@ export function ProTable>({
) : (
-
+ {empty || }
)}