/** * External dependencies */ import moment from 'moment'; import { date, dateI18n, wpifyDateTime } from '@nelio-content/date'; import type { Moment } from 'moment'; import type { Maybe, Url } from '@nelio-content/types'; /** * Internal dependencies */ import type { CalendarMode, CalendarPane } from './config'; import type { State } from '../config'; export function getSettings( state: State ): State[ 'settings' ] { return state.settings; } export function isUnscheduledViewOpen( state: State ): boolean { return 'unscheduled-posts' === state.settings.sidePane; } export function isReusableMessageViewOpen( state: State ): boolean { return 'reusable-messages' === state.settings.sidePane; } export function isFilterPaneOpen( state: State ): boolean { return 'filters' === state.settings.sidePane; } export function isErrorPaneOpen( state: State ): boolean { return 'errors' === state.settings.sidePane; } export function useEditorialCalendarOnly( state: State ): boolean { return state.settings.useEditorialCalendarOnly; } export function formatCalendarTime( state: State, datetime: Date | string | Moment ): string { const time = dateI18n( state.settings.calendarTimeFormat, datetime ); return state.settings.simplifyCalendarTime ? time.replace( ':00', '' ).replace( /m$/i, '' ).replace( /\s/g, '' ) : time; } export function isIcsEnabled( state: State ): boolean { return !! state.settings.icsLinks; } export function getIcsLink( state: State, mode: 'user' | 'all' ): Maybe< Url > { return state.settings.icsLinks?.[ mode ]; } export function getSidePane( state: State ): CalendarPane { return state.settings.sidePane; } export function getCalendarMode( state: State ): CalendarMode { return state.settings.calendarMode; } export function getFocusDay( state: State ): string { return state.settings.focusDay; } export function getFirstDay( state: State, firstDayOfWeek: number ): string { const focusDay = getFocusDay( state ); const calendarMode = getCalendarMode( state ); if ( 'agenda' === calendarMode ) { return focusDay; } const focusMoment = moment( wpifyDateTime( 'c', focusDay, '12:00' ) ); if ( 'month' === calendarMode ) { focusMoment.date( 1 ); } if ( focusMoment.day() === firstDayOfWeek ) { return date( 'Y-m-d', focusMoment ); } return date( 'Y-m-d', focusMoment.isoWeekday( firstDayOfWeek ) ); } export function getLastDay( state: State, firstDayOfWeek: number ): string { const firstDay = getFirstDay( state, firstDayOfWeek ); if ( ! firstDay ) { return ''; } const days = getNumberOfVisibleDays( state ); return date( 'Y-m-d', moment( firstDay ).add( days, 'days' ) ); } export function getNumberOfVisibleDays( state: State ): number { switch ( getCalendarMode( state ) ) { case 'agenda': return 4; case 'week': return 7; case 'month': return 42; case 'two-weeks': default: return 14; } } export function getNumberOfNonCollapsableMessages( state: State ): number { return state.settings.numberOfNonCollapsableMessages; } export function getMinimumRowHeight( state: State ): number { return state.settings.minRowHeight; } export function getCalendarWidth( state: State ): number { return state.settings.calendarWidth; } export function getAdminSidebarWidth( state: State ): number { return state.settings.adminSidebarWidth; }