diff --git a/src/webapp/features/collections/components/collectionFilters/CollectionFilters.tsx b/src/webapp/features/collections/components/collectionFilters/CollectionFilters.tsx index d93ba8d7..a608577d 100644 --- a/src/webapp/features/collections/components/collectionFilters/CollectionFilters.tsx +++ b/src/webapp/features/collections/components/collectionFilters/CollectionFilters.tsx @@ -88,6 +88,15 @@ export function CollectionFiltersSortSelect() { > Last Updated + onChange(CollectionSortField.CREATED_AT)} + rightSection={ + optimisticSort === CollectionSortField.CREATED_AT && + } + closeMenuOnClick={false} + > + Date Created + onChange(CollectionSortField.CARD_COUNT)} rightSection={ @@ -97,6 +106,15 @@ export function CollectionFiltersSortSelect() { > Card Count + {/* onChange(CollectionSortField.NAME)} + rightSection={ + optimisticSort === CollectionSortField.NAME && + } + closeMenuOnClick={false} + > + Name + */} ); } diff --git a/src/webapp/features/collections/lib/dal.ts b/src/webapp/features/collections/lib/dal.ts index d2b40d3f..cc286063 100644 --- a/src/webapp/features/collections/lib/dal.ts +++ b/src/webapp/features/collections/lib/dal.ts @@ -27,13 +27,14 @@ interface SearchParams { } export const getCollectionsForUrl = cache( - async (url: string, params?: PageParams) => { + async (url: string, params?: PageParams & { sortOrder?: SortOrder }) => { const client = createSembleClient(); const response = await client.getCollectionsForUrl({ url, page: params?.page, limit: params?.limit, sortBy: params?.collectionSortBy, + sortOrder: params?.sortOrder, }); return response; diff --git a/src/webapp/features/collections/lib/queries/useCollectionSearch.tsx b/src/webapp/features/collections/lib/queries/useCollectionSearch.tsx index 52f41a2d..448d0221 100644 --- a/src/webapp/features/collections/lib/queries/useCollectionSearch.tsx +++ b/src/webapp/features/collections/lib/queries/useCollectionSearch.tsx @@ -1,7 +1,8 @@ import { useQuery } from '@tanstack/react-query'; import { getMyCollections } from '../dal'; import { collectionKeys } from '../collectionKeys'; -import { SortOrder } from '@semble/types'; +import { CollectionSortField } from '@semble/types'; +import { getCollectionsSortParams } from '../utils'; interface Props { query: string; @@ -17,8 +18,7 @@ export default function useCollectionSearch(props: Props) { queryFn: () => getMyCollections({ limit: props.params?.limit ?? 10, - sortBy: 'updatedAt', - sortOrder: SortOrder.DESC, + ...getCollectionsSortParams(CollectionSortField.UPDATED_AT), searchText: props.query || undefined, }), enabled: !!props.query, diff --git a/src/webapp/features/collections/lib/queries/useGemCollectionSearch.tsx b/src/webapp/features/collections/lib/queries/useGemCollectionSearch.tsx index 6af3ca5d..0c74320f 100644 --- a/src/webapp/features/collections/lib/queries/useGemCollectionSearch.tsx +++ b/src/webapp/features/collections/lib/queries/useGemCollectionSearch.tsx @@ -1,7 +1,8 @@ import { useQuery } from '@tanstack/react-query'; import { getMyGemCollections } from '../dal'; import { collectionKeys } from '../collectionKeys'; -import { SortOrder } from '@semble/types'; +import { CollectionSortField } from '@semble/types'; +import { getCollectionsSortParams } from '../utils'; export default function useGemCollectionSearch() { const QUERY = '💎'; @@ -11,8 +12,7 @@ export default function useGemCollectionSearch() { queryFn: () => getMyGemCollections({ limit: 5, - sortBy: 'updatedAt', - sortOrder: SortOrder.DESC, + ...getCollectionsSortParams(CollectionSortField.UPDATED_AT), searchText: QUERY, }), enabled: !!QUERY, diff --git a/src/webapp/features/collections/lib/queries/useSearchCollections.tsx b/src/webapp/features/collections/lib/queries/useSearchCollections.tsx index 70a53b5d..c3ef160a 100644 --- a/src/webapp/features/collections/lib/queries/useSearchCollections.tsx +++ b/src/webapp/features/collections/lib/queries/useSearchCollections.tsx @@ -8,7 +8,9 @@ import { CollectionSortField, CollectionAccessType, GetCollectionsResponse, + SortOrder, } from '@semble/types'; +import { getCollectionsSortParams } from '../utils'; interface Props { searchText: string; limit?: number; @@ -35,6 +37,8 @@ export default function useSearchCollections(props: Props) { limit, page: pageParam as number, collectionSortBy: props.sortBy, + sortOrder: + props.sortBy && getCollectionsSortParams(props.sortBy).sortOrder, accessType: props.accessType, identifier: props.identifier, }), diff --git a/src/webapp/features/collections/lib/queries/useSembleCollectionts.tsx b/src/webapp/features/collections/lib/queries/useSembleCollectionts.tsx index c552d2f0..5d0cec00 100644 --- a/src/webapp/features/collections/lib/queries/useSembleCollectionts.tsx +++ b/src/webapp/features/collections/lib/queries/useSembleCollectionts.tsx @@ -1,10 +1,13 @@ import { useSuspenseInfiniteQuery } from '@tanstack/react-query'; import { getCollectionsForUrl } from '../dal'; import { collectionKeys } from '../collectionKeys'; +import { CollectionSortField } from '@semble/types'; +import { getCollectionsSortParams } from '../utils'; interface Props { url: string; limit?: number; + sortBy?: CollectionSortField; } export default function useSembleCollections(props: Props) { @@ -14,7 +17,13 @@ export default function useSembleCollections(props: Props) { queryKey: collectionKeys.bySembleUrl(props.url), initialPageParam: 1, queryFn: ({ pageParam = 1 }) => { - return getCollectionsForUrl(props.url, { page: pageParam, limit }); + return getCollectionsForUrl(props.url, { + page: pageParam, + limit, + collectionSortBy: props.sortBy, + sortOrder: + props.sortBy && getCollectionsSortParams(props.sortBy).sortOrder, + }); }, getNextPageParam: (lastPage) => { if (lastPage.pagination.hasMore) { diff --git a/src/webapp/features/collections/lib/utils/index.ts b/src/webapp/features/collections/lib/utils/index.ts new file mode 100644 index 00000000..e377f179 --- /dev/null +++ b/src/webapp/features/collections/lib/utils/index.ts @@ -0,0 +1,35 @@ +import { CollectionSortField, SortOrder } from '@semble/types'; + +export const getCollectionsSortParams = (field: CollectionSortField) => { + switch (field) { + case CollectionSortField.NAME: + return { + sortBy: CollectionSortField.NAME, + sortOrder: SortOrder.ASC, + }; + + case CollectionSortField.CREATED_AT: + return { + sortBy: CollectionSortField.CREATED_AT, + sortOrder: SortOrder.DESC, + }; + + case CollectionSortField.UPDATED_AT: + return { + sortBy: CollectionSortField.UPDATED_AT, + sortOrder: SortOrder.DESC, + }; + + case CollectionSortField.CARD_COUNT: + return { + sortBy: CollectionSortField.CARD_COUNT, + sortOrder: SortOrder.DESC, + }; + + default: + return { + sortBy: CollectionSortField.UPDATED_AT, + sortOrder: SortOrder.DESC, + }; + } +}; diff --git a/src/webapp/next-env.d.ts b/src/webapp/next-env.d.ts index c4b7818f..9edff1c7 100644 --- a/src/webapp/next-env.d.ts +++ b/src/webapp/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.