/** * WordPress dependencies */ import { createSelector } from '@safe-wordpress/data'; /** * External dependencies */ import { EMPTY_ARRAY } from '@nelio-content/constants'; import { isEmpty } from '@nelio-content/utils'; import type { AuthorId, Maybe, PostId, PostTypeName, } from '@nelio-content/types'; /** * Internal dependencies */ import { stringifyCriteria } from './utils'; import type { FilterCriteria, PeriodMode, PeriodValue, SortCriterion, State, } from './types'; export function getSortingCriterion( state: State ): SortCriterion { return state.sortBy; } export function getPeriodFilterMode( state: State ): PeriodMode { return state.filters.period.mode; } export function getPeriodFilterValue( state: State ): PeriodValue { return state.filters.period.value; } export function getAuthorFilter( state: State ): Maybe< AuthorId > { return state.filters.author; } export function getPostTypeFilter( state: State ): Maybe< PostTypeName > { return state.filters.postType; } export const getFilterCriteria = createSelector( ( state: State ): FilterCriteria => ( { sortBy: getSortingCriterion( state ), author: getAuthorFilter( state ), postType: getPostTypeFilter( state ), periodMode: getPeriodFilterMode( state ), periodValue: getPeriodFilterValue( state ), } ), ( state: State ) => [ getSortingCriterion( state ), getAuthorFilter( state ), getPostTypeFilter( state ), getPeriodFilterMode( state ), getPeriodFilterValue( state ), ] ); export function getPostIdsMatchingCriteria( state: State, criteria: FilterCriteria ): ReadonlyArray< PostId > { return ( state.postsByCriteria[ stringifyCriteria( criteria ) ] || EMPTY_ARRAY ); } export function isLoadingPostsWithCriteria( state: State, criteria: FilterCriteria ): boolean { return state.status.loading.includes( stringifyCriteria( criteria ) ); } export function arePostsWithCriteriaFullyLoaded( state: State, criteria: FilterCriteria ): boolean { const pagination = state.status.pagination[ stringifyCriteria( criteria ) ]; if ( isEmpty( pagination ) ) { return false; } return !! pagination.isFullyLoaded; } export function getNextPageToLoad( state: State, criteria: FilterCriteria ): number { const pagination = state.status.pagination[ stringifyCriteria( criteria ) ]; return ( pagination?.lastLoadedPage ?? 0 ) + 1; } export function getPostIds( state: State ): ReadonlyArray< PostId > { const criteria = getFilterCriteria( state ); return getPostIdsMatchingCriteria( state, criteria ); } export function isLoadingPosts( state: State ): boolean { const criteria = getFilterCriteria( state ); return isLoadingPostsWithCriteria( state, criteria ); } export function arePostsFullyLoaded( state: State ): boolean { const criteria = getFilterCriteria( state ); return arePostsWithCriteriaFullyLoaded( state, criteria ); }