/** * WordPress dependencies */ import { createSelector } from '@safe-wordpress/data'; import { addQueryArgs } from '@safe-wordpress/url'; /** * External dependencies */ import { keys, values } from 'lodash'; import { make } from 'ts-brand'; import type { ECommercePlugin, Maybe, Menu, MenuId, NabCapability, SubscriptionPlan, Theme, Url, } from '@nab/types'; /** * Internal dependencies */ import { ECommerceSettings, State } from '../types'; import { isDefined, isPlan } from '@nab/utils'; export function getToday( state: State ): string { return state.settings.today; } export function getSiteLanguage( state: State ): string { return state.settings.language; } export function getActivePlugins( state: State ): ReadonlyArray< string > { return state.settings.plugins; } export function hasMenus( state: State ): boolean { return !! keys( state.settings.menus ).length; } export function getMenu( state: State, id: MenuId ): Maybe< Menu > { return state.settings.menus[ id ]; } export function getTemplateContexts( state: State ): State[ 'settings' ][ 'templateContexts' ] { return state.settings.templateContexts; } export function getTemplates( state: State ): State[ 'settings' ][ 'templates' ] { return state.settings.templates; } export const getThemes = createSelector( ( state: State ): ReadonlyArray< Theme > => values( state.settings.themes ).filter( isDefined ), ( state: State ) => [ state.settings.themes ] ); export function getAdminUrl( state: State, path: string, args?: Record< string, string | boolean | number > ): string { const adminUrl = getPluginSetting( state, 'adminUrl' ); return addQueryArgs( `${ adminUrl }${ path }`, args ); } export function hasCapability( state: State, capability: NabCapability ): boolean { return state.settings.nelio.capabilities.includes( capability ); } type GetPluginSetting = typeof _getPluginSetting & { CurriedSignature: < K extends keyof State[ 'settings' ][ 'nelio' ] >( name: K ) => State[ 'settings' ][ 'nelio' ][ K ]; }; export const getPluginSetting = _getPluginSetting as GetPluginSetting; function _getPluginSetting< K extends keyof State[ 'settings' ][ 'nelio' ] >( state: State, name: K ): State[ 'settings' ][ 'nelio' ][ K ] { return state.settings.nelio[ name ]; } export function getRestUrl( state: State, path = '/' ): Url { const url = state.settings.nelio.restUrl; return make< Url >()( url.includes( 'rest_route=' ) ? url.replace( 'rest_route=', `rest_route=${ path }` ) : `${ url }${ path }` ); } type GetECommerceSetting = typeof _getECommerceSetting & { CurriedSignature: < K extends keyof ECommerceSettings >( plugin: ECommercePlugin, name: K ) => ECommerceSettings[ K ]; }; export const getECommerceSetting = _getECommerceSetting as GetECommerceSetting; function _getECommerceSetting< K extends keyof ECommerceSettings >( state: State, plugin: ECommercePlugin, name: K ): ECommerceSettings[ K ] { return state.settings.ecommerce[ plugin ][ name ]; } export function canLimitSiteQuota( state: State ): boolean { return isSubscribedTo( state, 'professional', 'or-above' ); } export function isSubscribedTo( state: State, expectedPlan: SubscriptionPlan, mode: 'exactly' | 'or-above' = 'or-above' ): boolean { const actualPlan = getPluginSetting( state, 'subscription' ); return 'exactly' === mode ? isPlan( actualPlan, 'exactly', expectedPlan ) : isPlan( actualPlan, 'exactly-or-above', expectedPlan ); }