Skip to content

Commit

Permalink
refactor: remove params in use recycled
Browse files Browse the repository at this point in the history
  • Loading branch information
pyphilia committed Oct 3, 2024
1 parent 06a7a36 commit 1764f82
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 140 deletions.
4 changes: 1 addition & 3 deletions src/item/recycled/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@ import { Paginated, Pagination, RecycledItemData } from '@graasp/sdk';

import { verifyAuthentication } from '../../api/axios.js';
import { PartialQueryConfigForApi } from '../../types.js';
import { ItemSearchParams } from '../types.js';
import { buildGetOwnRecycledItemDataRoute } from './routes.js';

export const getOwnRecycledItemsData = async (
params: ItemSearchParams,
pagination: Partial<Pagination>,
{ API_HOST, axios }: PartialQueryConfigForApi,
) =>
verifyAuthentication(() =>
axios
.get<
Paginated<RecycledItemData>
>(`${API_HOST}/${buildGetOwnRecycledItemDataRoute(params, pagination)}`)
>(`${API_HOST}/${buildGetOwnRecycledItemDataRoute(pagination)}`)
.then(({ data }) => data),
);
71 changes: 4 additions & 67 deletions src/item/recycled/hooks.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import {
DiscriminatedItem,
ItemType,
Paginated,
RecycledItemData,
} from '@graasp/sdk';
import { Paginated, RecycledItemData } from '@graasp/sdk';

import { waitFor } from '@testing-library/dom';
import { act, renderHook } from '@testing-library/react';
import { StatusCodes } from 'http-status-codes';
import nock from 'nock';
import { useState } from 'react';
import { afterEach, describe, expect, it } from 'vitest';

import {
Expand All @@ -28,13 +22,12 @@ describe('useInfiniteOwnRecycledItemData', () => {
queryClient.clear();
});

const params = {};
const pagination = { page: 1 };
const route = `/${buildGetOwnRecycledItemDataRoute(params, pagination)}`;
const route = `/${buildGetOwnRecycledItemDataRoute(pagination)}`;
const items = generateFolders();
const response = { data: items, totalCount: items.length };
const hook = () => hooks.useInfiniteOwnRecycledItemData(params);
const key = memberKeys.current().infiniteRecycledItemData(params);
const hook = () => hooks.useInfiniteOwnRecycledItemData(pagination);
const key = memberKeys.current().infiniteRecycledItemData();

it(`Receive recycled item data`, async () => {
const endpoints = [{ route, response }];
Expand Down Expand Up @@ -62,53 +55,6 @@ describe('useInfiniteOwnRecycledItemData', () => {
act(() => {
result.current.fetchNextPage();
});

// expect(result.current.data.length).toEqual(items.length * 2);
});

it(`Reset on change param`, async () => {
const types: DiscriminatedItem['type'][] = [ItemType.FOLDER];
const route1 = `/${buildGetOwnRecycledItemDataRoute({ ...params, types }, pagination)}`;
const route2 = `/${buildGetOwnRecycledItemDataRoute({ ...params, types }, { page: 2 })}`;
const newTypes: DiscriminatedItem['type'][] = [ItemType.APP];
const route3 = `/${buildGetOwnRecycledItemDataRoute({ ...params, types: newTypes }, pagination)}`;
const endpoints = [
{ route: route1, response },
{ route: route2, response },
{ route: route3, response },
];
// cannot use mockHook because it prevents getting updated data
mockEndpoints(endpoints);

// // wait for rendering hook
const { result } = renderHook(
() => {
const [t, setTypes] = useState(types);
const res = hooks.useInfiniteOwnRecycledItemData({
types: t,
});
return { ...res, setTypes };
},
{ wrapper },
);

await waitFor(() =>
expect(result.current.isSuccess || result.current.isError).toBe(true),
);

act(() => {
result.current.fetchNextPage();
});
await waitFor(() => {
expect(result.current.data!.pages.length).toEqual(2);
});

// changing creator id reset items
act(() => {
result.current.setTypes(newTypes);
});

await waitFor(() => expect(result.current.data!.pages.length).toEqual(1));
});

it(`Unauthorized`, async () => {
Expand All @@ -127,13 +73,4 @@ describe('useInfiniteOwnRecycledItemData', () => {

expect(isError).toBeTruthy();
});

it(`Route constructed correctly for recycled item data`, async () => {
const typesParams = { types: [ItemType.FOLDER] };
const url = `/${buildGetOwnRecycledItemDataRoute(typesParams, {})}`;
const urlObject = new URL(url, 'https://no-existing-url.tmp');
const queryParams = urlObject.searchParams;
const typesValue = queryParams.get('types');
expect(typesValue).toEqual(ItemType.FOLDER);
});
});
45 changes: 3 additions & 42 deletions src/item/recycled/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,23 @@ import { Pagination } from '@graasp/sdk';

import { useInfiniteQuery } from '@tanstack/react-query';

import useDebounce from '../../hooks/useDebounce.js';
import { memberKeys } from '../../keys.js';
import { QueryClientConfig } from '../../types.js';
import { ItemSearchParams } from '../types.js';
import { getOwnRecycledItemsData } from './api.js';

/**
* Returns paginated own recycled item data
* @param params
* @param pagination default and first page is 1
* @param _options
* @returns
*/
// export const useOwnRecycledItemData =
// (queryConfig: QueryClientConfig) =>
// (params?: ItemSearchParams, pagination?: Partial<Pagination>) => {
// const { defaultQueryOptions } = queryConfig;
// const debouncedKeywords = useDebounce(params?.keywords, 500);
// const finalParams = { ...params, keywords: debouncedKeywords };
// const paginationParams = { ...(pagination ?? {}) };

// return useQuery({
// queryKey: memberKeys
// .current()
// .recycledPage(finalParams, paginationParams),
// queryFn: () =>
// getOwnRecycledItemsData(finalParams, paginationParams, queryConfig),
// meta: {
// routine: getAccessibleItemsRoutine,
// },
// ...defaultQueryOptions,
// });
// };

/**
* Returns paginated own recycled item data
* @param params
* @param pagination default and first page is 1
* @returns
* @returns paginated recycled item data
*/
export const useInfiniteOwnRecycledItemData =
(queryConfig: QueryClientConfig) =>
(
params?: Omit<ItemSearchParams, 'creatorId'>,
pagination?: Partial<Pagination>,
) => {
(queryConfig: QueryClientConfig) => (pagination?: Partial<Pagination>) => {
const { defaultQueryOptions } = queryConfig;

const debouncedKeywords = useDebounce(params?.keywords, 500);
const finalParams = { ...params, keywords: debouncedKeywords };

return useInfiniteQuery({
queryKey: memberKeys.current().infiniteRecycledItemData(finalParams),
queryKey: memberKeys.current().infiniteRecycledItemData(),
queryFn: ({ pageParam }) =>
getOwnRecycledItemsData(
finalParams,
{ page: pageParam ?? 1, ...pagination },
queryConfig,
),
Expand Down
22 changes: 14 additions & 8 deletions src/item/recycled/routes.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
import { Pagination } from '@graasp/sdk';

import { ITEMS_ROUTE, setSearchQueryParams } from '../routes.js';
import { ItemSearchParams } from '../types.js';

export const buildGetOwnRecycledItemDataRoute = (
params: ItemSearchParams,
pagination: Partial<Pagination>,
) => {
const searchParams = setSearchQueryParams(params, pagination);
import { ITEMS_ROUTE } from '../routes.js';

export const buildGetOwnRecycledItemDataRoute = ({
pageSize,
page,
}: Partial<Pagination>) => {
const searchParams = new URLSearchParams();

// pagination params
searchParams.set('page', (page ?? 1).toString());
if (pageSize) {
searchParams.set('pageSize', pageSize.toString());
}

return `${ITEMS_ROUTE}/recycled?${searchParams.toString()}`;
};
36 changes: 18 additions & 18 deletions src/item/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,16 @@ export const ITEMS_ROUTE = 'items';

export const SHARED_ITEM_WITH_ROUTE = `${ITEMS_ROUTE}/shared-with`;

export const setSearchQueryParams = (
{
creatorId,
ordering,
sortBy,
permissions,
types,
keywords,
}: ItemSearchParams,
{ page, pageSize }: Partial<Pagination>,
) => {
export const setSearchQueryParams = ({
creatorId,
ordering,
sortBy,
permissions,
types,
keywords,
}: ItemSearchParams) => {
const searchParams = new URLSearchParams();
// pagination params
searchParams.set('page', (page ?? 1).toString());
if (pageSize) {
searchParams.set('pageSize', pageSize.toString());
}

// searchParams
if (creatorId) {
searchParams.set('creatorId', creatorId);
Expand All @@ -48,9 +41,16 @@ export const setSearchQueryParams = (

export const buildGetAccessibleItems = (
params: ItemSearchParams,
pagination: Partial<Pagination>,
{ page, pageSize }: Partial<Pagination>,
) => {
const searchParams = setSearchQueryParams(params, pagination);
const searchParams = setSearchQueryParams(params);

// pagination params
searchParams.set('page', (page ?? 1).toString());
if (pageSize) {
searchParams.set('pageSize', pageSize.toString());
}

return `${ITEMS_ROUTE}/accessible?${searchParams}`;
};

Expand Down
4 changes: 2 additions & 2 deletions src/keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,8 @@ export const memberKeys = {
This should hold RecycledItemData
*/
allRecycled: () => [...currentBaseKey, 'recycled'] as const,
infiniteRecycledItemData: (params: ItemSearchParams) =>
[...memberKeys.current().allRecycled(), 'infinite', params] as const,
infiniteRecycledItemData: () =>
[...memberKeys.current().allRecycled(), 'infinite'] as const,
// recycledPage: (
// params: ItemSearchParams,
// pagination: Partial<Pagination>,
Expand Down

0 comments on commit 1764f82

Please sign in to comment.