Просмотр исходного кода

Merge pull request #10397 from growilabs/feat/172382-data-hook-recent-activities

feat: Hook for fetching recent activities
Yuki Takei 5 месяцев назад
Родитель
Сommit
659b54a05d

+ 5 - 0
apps/app/src/interfaces/activity.ts

@@ -1,4 +1,5 @@
 import type { HasObjectId, IUser, Ref } from '@growi/core';
+import type { PaginateResult } from './mongoose-utils';
 
 // Model
 const MODEL_PAGE = 'Page';
@@ -679,3 +680,7 @@ export type ISearchFilter = {
   dates?: { startDate: string | null; endDate: string | null };
   actions?: SupportedActionType[];
 };
+
+export interface UserActivitiesResult {
+  serializedPaginationResult: PaginateResult<IActivityHasId>;
+}

+ 11 - 2
apps/app/src/server/routes/apiv3/user-activities.ts

@@ -3,7 +3,7 @@ import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import type { Request, Router } from 'express';
 import express from 'express';
 import { query } from 'express-validator';
-import type { PipelineStage } from 'mongoose';
+import type { PipelineStage, PaginateResult } from 'mongoose';
 import { Types } from 'mongoose';
 
 import type { IActivity } from '~/interfaces/activity';
@@ -47,6 +47,8 @@ type CustomRequest<
 
 type AuthorizedRequest = CustomRequest<StrictActivityQuery>;
 
+type ActivityPaginationResult = PaginateResult<IActivity>;
+
 
 /**
  * @swagger
@@ -252,7 +254,11 @@ module.exports = (crowi: Crowi): Router => {
         const totalPages = Math.ceil(totalDocs / limit);
         const page = Math.floor(offset / limit) + 1;
 
-        const serializedPaginationResult = {
+        const nextPage = page < totalPages ? page + 1 : null;
+        const prevPage = page > 1 ? page - 1 : null;
+        const pagingCounter = offset + 1;
+
+        const serializedPaginationResult: ActivityPaginationResult = {
           docs: serializedResults,
           totalDocs,
           limit,
@@ -261,6 +267,9 @@ module.exports = (crowi: Crowi): Router => {
           totalPages,
           hasPrevPage: page > 1,
           hasNextPage: page < totalPages,
+          nextPage,
+          prevPage,
+          pagingCounter,
         };
 
         return res.apiv3({ serializedPaginationResult });

+ 33 - 0
apps/app/src/stores/recent-activity.ts

@@ -0,0 +1,33 @@
+import type { SWRResponse } from 'swr';
+import useSWRImmutable from 'swr/immutable';
+
+import { apiv3Get } from '~/client/util/apiv3-client';
+import type { UserActivitiesResult, IActivityHasId } from '~/interfaces/activity';
+import type { PaginateResult } from '~/interfaces/mongoose-utils';
+
+export const useSWRxRecentActivity = (
+    limit?: number,
+    offset?: number,
+): SWRResponse<PaginateResult<IActivityHasId>, Error> => {
+
+  const key = ['/user-activities', limit, offset];
+
+  const fetcher = ([
+    endpoint,
+    limitParam,
+    offsetParam,
+    filterParam,
+  ]) => {
+
+    const promise = apiv3Get<UserActivitiesResult>(endpoint, {
+      limit: limitParam,
+      offset: offsetParam,
+      searchFilter: filterParam,
+    });
+
+    return promise.then(result => result.data.serializedPaginationResult);
+  };
+
+
+  return useSWRImmutable(key, fetcher);
+};