feat: add website view count in website list
This commit is contained in:
parent
4e8d7613a4
commit
8ac5b11d49
@ -9,6 +9,7 @@ import { useFuseSearch } from '@/hooks/useFuseSearch';
|
|||||||
import { Empty } from 'antd';
|
import { Empty } from 'antd';
|
||||||
import { globalEventBus } from '@/utils/event';
|
import { globalEventBus } from '@/utils/event';
|
||||||
import { Spinner } from './ui/spinner';
|
import { Spinner } from './ui/spinner';
|
||||||
|
import { formatNumber } from '@/utils/common';
|
||||||
|
|
||||||
export interface CommonListItem {
|
export interface CommonListItem {
|
||||||
id: string;
|
id: string;
|
||||||
@ -99,7 +100,9 @@ export const CommonList: React.FC<CommonListProps> = React.memo((props) => {
|
|||||||
<div className="font-semibold">{item.title}</div>
|
<div className="font-semibold">{item.title}</div>
|
||||||
|
|
||||||
{item.number && item.number > 0 && (
|
{item.number && item.number > 0 && (
|
||||||
<span className="opacity-60">{item.number}</span>
|
<span className="opacity-60" title={String(item.number)}>
|
||||||
|
{formatNumber(item.number)}
|
||||||
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
import { trpc } from '@/api/trpc';
|
import { trpc } from '@/api/trpc';
|
||||||
import { CommonHeader } from '@/components/CommonHeader';
|
import { CommonHeader } from '@/components/CommonHeader';
|
||||||
import { CommonList } from '@/components/CommonList';
|
import { CommonList, CommonListItem } from '@/components/CommonList';
|
||||||
import { CommonWrapper } from '@/components/CommonWrapper';
|
import { CommonWrapper } from '@/components/CommonWrapper';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { useDataReady } from '@/hooks/useDataReady';
|
|
||||||
import { useEvent } from '@/hooks/useEvent';
|
import { useEvent } from '@/hooks/useEvent';
|
||||||
import { Layout } from '@/components/layout';
|
import { Layout } from '@/components/layout';
|
||||||
import { useCurrentWorkspaceId } from '@/store/user';
|
import { useCurrentWorkspaceId } from '@/store/user';
|
||||||
@ -29,15 +28,19 @@ function WebsiteComponent() {
|
|||||||
const { data = [], isLoading } = trpc.website.all.useQuery({
|
const { data = [], isLoading } = trpc.website.all.useQuery({
|
||||||
workspaceId,
|
workspaceId,
|
||||||
});
|
});
|
||||||
|
const { data: overviewData = {} } = trpc.website.allOverview.useQuery({
|
||||||
|
workspaceId,
|
||||||
|
});
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const pathname = useRouterState({
|
const pathname = useRouterState({
|
||||||
select: (state) => state.location.pathname,
|
select: (state) => state.location.pathname,
|
||||||
});
|
});
|
||||||
|
|
||||||
const items = data.map((item) => ({
|
const items: CommonListItem[] = data.map((item) => ({
|
||||||
id: item.id,
|
id: item.id,
|
||||||
title: item.name,
|
title: item.name,
|
||||||
content: item.domain,
|
content: item.domain,
|
||||||
|
number: overviewData[item.id] ?? 0,
|
||||||
href: `/website/${item.id}`,
|
href: `/website/${item.id}`,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -84,6 +84,51 @@ export const websiteRouter = router({
|
|||||||
|
|
||||||
return websites;
|
return websites;
|
||||||
}),
|
}),
|
||||||
|
allOverview: workspaceProcedure
|
||||||
|
.meta({
|
||||||
|
openapi: {
|
||||||
|
method: 'GET',
|
||||||
|
path: '/workspace/{workspaceId}/website/allOverview',
|
||||||
|
tags: [OPENAPI_TAG.WEBSITE],
|
||||||
|
protect: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.output(z.record(z.string(), z.number()))
|
||||||
|
.query(async ({ input }) => {
|
||||||
|
const { workspaceId } = input;
|
||||||
|
|
||||||
|
const websiteIds = (
|
||||||
|
await prisma.website.findMany({
|
||||||
|
where: {
|
||||||
|
workspaceId,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).map((item) => item.id);
|
||||||
|
|
||||||
|
const res = await prisma.websiteEvent.groupBy({
|
||||||
|
by: ['websiteId'],
|
||||||
|
where: {
|
||||||
|
websiteId: {
|
||||||
|
in: [...websiteIds],
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
gte: dayjs().subtract(1, 'day').toDate(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
_count: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.reduce<Record<string, number>>((prev, item) => {
|
||||||
|
if (item.websiteId) {
|
||||||
|
prev[item.websiteId] = item._count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prev;
|
||||||
|
}, {});
|
||||||
|
}),
|
||||||
info: workspaceProcedure
|
info: workspaceProcedure
|
||||||
.meta(
|
.meta(
|
||||||
buildWebsiteOpenapi({
|
buildWebsiteOpenapi({
|
||||||
|
Loading…
Reference in New Issue
Block a user