import { VisibilityCallbackOptions } from 'config.types' import { visibilityStates } from './constants' export const calculateVisibility = ({ hasResponded, previousVisibility, requestedVisibility, config, }: VisibilityCallbackOptions) => { const { defaults, layoutMode, hideOnNoUserResponse } = config const { visible: defaultVisibility } = defaults || {} // The app layout should always be open by default. if (layoutMode === 'app' && !previousVisibility) { return visibilityStates.open } // Requesting open should override the responded check. if ( layoutMode === 'window' && hideOnNoUserResponse && requestedVisibility !== visibilityStates.open ) { return hasResponded ? requestedVisibility || previousVisibility || visibilityStates.open : visibilityStates.hidden } // Allow users to continue a conversation (if they have responded and no visibility is requested) // when switching from the window layout to the inline layout if (layoutMode === 'inline' && hasResponded && !requestedVisibility) { return previousVisibility || visibilityStates.open } const baseVisibility = visibilityStates.minimized return ( requestedVisibility || previousVisibility || defaultVisibility || baseVisibility ) }