/** * External dependencies */ import { trim } from 'lodash'; import { createIndexedSelector } from '@nelio-content/utils'; import type { Maybe, ReusableSocialMessage, ReusableSocialMessageId, } from '@nelio-content/types'; /** * Internal dependencies */ import type { State } from '../../config'; import type { ReusableMessageQueryStatus } from './config'; export function getReusableMessage( state: State, id?: ReusableSocialMessageId ): Maybe< ReusableSocialMessage > { return id ? state.entities.reusableMessages.byId[ id ] : undefined; } export const getReusableMessages = createIndexedSelector( ( state: State, query?: string ): ReadonlyArray< ReusableSocialMessage > => { query = trim( query || '' ); return Object.values( state.entities.reusableMessages.byId ).filter( ( m ) => m.textComputed.toLowerCase().includes( query.toLowerCase() ) ); }, ( state: State, query?: string ) => ( { key: query || '', dependants: [ state.entities.reusableMessages.byId ], } ) ); export function getReusableMessageQuery( state: State ): string { return state.entities.reusableMessages.loader.query; } export function getReusableMessageQueryStatus( state: State, query: string ): ReusableMessageQueryStatus { query = trim( query ); const { loader } = state.entities.reusableMessages; if ( loader.isFullyLoaded ) { return 'loaded'; } const status = loader.queryStatus[ query ]; if ( status ) { return status; } const isBroaderQueryLoaded = Object.keys( loader.queryStatus ).some( ( q ) => query.includes( q ) && loader.queryStatus[ q ] === 'loaded' ); return isBroaderQueryLoaded ? 'loaded' : 'pending'; }