// @flow import * as React from 'react'; import { InlineNotice } from '@box/blueprint-web'; import { useCallback } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; // $FlowFixMe import { BoxAiAdvancedLogo24, BoxAiLogo24 } from '@box/blueprint-web-assets/icons/Logo'; import { type AgentType } from '@box/box-ai-agent-selector'; // $FlowFixMe import { BoxAiAgentSelectorWithApiContainer } from '@box/box-ai-agent-selector'; import Toggle from '../../components/toggle'; import { RadioButton, RadioGroup } from '../../components/radio'; import Link from '../../components/link/Link'; import IconAlertDefault from '../../icons/general/IconAlertDefault'; import messages from './messages'; import './CascadePolicy.scss'; import { STANDARD_AGENT_ID, ENHANCED_AGENT_ID, ENHANCED_AGENT_CONFIGURATION } from './constants'; import type { MetadataCascadePolicyConfiguration } from '../../common/types/metadata'; const COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders'; const AI_LINK = 'https://www.box.com/ai'; type Props = { canEdit: boolean, canUseAIFolderExtraction: boolean, cascadePolicyConfiguration?: MetadataCascadePolicyConfiguration, isAIFolderExtractionEnabled: boolean, isCascadingEnabled: boolean, isCascadingOverwritten: boolean, isCustomMetadata: boolean, isExistingCascadePolicy: boolean, onAIFolderExtractionToggle: (value: boolean) => void, onAIAgentSelect?: (agent: AgentType | null) => void, onCascadeModeChange: (value: boolean) => void, onCascadeToggle: (value: boolean) => void, shouldShowCascadeOptions: boolean, }; const CascadePolicy = ({ canEdit, canUseAIFolderExtraction, cascadePolicyConfiguration, isCascadingEnabled, isCascadingOverwritten, isCustomMetadata, isAIFolderExtractionEnabled, isExistingCascadePolicy, onAIFolderExtractionToggle, onAIAgentSelect, onCascadeToggle, onCascadeModeChange, shouldShowCascadeOptions, }: Props) => { const { formatMessage } = useIntl(); const readOnlyState = isCascadingEnabled ? (
) : null; const isEnhancedAgentSelected = cascadePolicyConfiguration?.agent === ENHANCED_AGENT_CONFIGURATION; const agents = React.useMemo( () => [ { id: STANDARD_AGENT_ID, name: formatMessage(messages.standardAgentName), isEnterpriseDefault: true, }, { id: ENHANCED_AGENT_ID, name: formatMessage(messages.enhancedAgentName), isEnterpriseDefault: false, customIcon: BoxAiAdvancedLogo24, isSelected: isEnhancedAgentSelected, }, ], [formatMessage, isEnhancedAgentSelected], ); // BoxAiAgentSelectorWithApiContainer expects a function that returns a Promise // Since we're passing in our own agents, we don't need to make an API call, // so we wrap the store data in a Promise to satisfy the component's interface requirements. const agentFetcher = useCallback(() => { return Promise.resolve({ agents }); }, [agents]); const handleAgentSelect = useCallback( (agent: AgentType | null) => { if (onAIAgentSelect) { onAIAgentSelect(agent); } }, [onAIAgentSelect], ); return canEdit ? ( <> {isExistingCascadePolicy && ( )}
{!isCustomMetadata && ( onCascadeToggle(e.target.checked)} /> )}
{!isCustomMetadata ? (
 
) : (
)}
{shouldShowCascadeOptions && (
onCascadeModeChange(e.target.value === 'overwrite')} value={isCascadingOverwritten ? 'overwrite' : 'skip'} > } value="skip" /> } value="overwrite" />
)} {shouldShowCascadeOptions && canUseAIFolderExtraction && (
onAIFolderExtractionToggle(e.target.checked)} />
 
{isAIFolderExtractionEnabled && (
{}} selectorAlignment="left" />
)}
)} ) : ( readOnlyState ); }; export default CascadePolicy;